From 124cf8964b181d28a85239ed9212fb157855e347 Mon Sep 17 00:00:00 2001 From: jay-dee7 Date: Thu, 21 Dec 2023 14:47:02 +0530 Subject: [PATCH] feat: Vulnerability Scanning via Clair Signed-off-by: jay-dee7 --- protos/services/yor/clair/v1/clair.proto | 17 +- registry/v2/extensions/private_images.go | 18 +- router/helpers.go | 2 +- router/middlewares.go | 5 +- router/router.go | 13 +- router/vuln_scanning_routes.go | 20 +- .../github_actions/v1/server/build_logs.go | 6 +- services/yor/clair/v1/clair.pb.go | 1064 ++++++++++------- services/yor/clair/v1/clair.pb.validate.go | 442 ++++++- .../clair/v1/clairconnect/clair.connect.go | 31 +- services/yor/clair/v1/server/clair.go | 38 +- services/yor/clair/v1/server/interceptors.go | 124 ++ services/yor/clair/v1/server/server.go | 39 +- store/v1/registry/registry_impl.go | 5 +- 14 files changed, 1337 insertions(+), 487 deletions(-) create mode 100644 services/yor/clair/v1/server/interceptors.go diff --git a/protos/services/yor/clair/v1/clair.proto b/protos/services/yor/clair/v1/clair.proto index 4de74470..df920f87 100644 --- a/protos/services/yor/clair/v1/clair.proto +++ b/protos/services/yor/clair/v1/clair.proto @@ -4,10 +4,20 @@ package services.yor.clair.v1; option go_package = "github.com/containerish/OpenRegistry/services/yor/clair/v1;clair"; import "google/protobuf/struct.proto"; import "google/protobuf/timestamp.proto"; +import "common/v1/id.proto"; service ClairService { rpc SubmitManifestToScan(SubmitManifestToScanRequest) returns (SubmitManifestToScanResponse) {} rpc GetVulnerabilityReport(GetVulnerabilityReportRequest) returns (GetVulnerabilityReportResponse) {} + rpc EnableVulnerabilityScanning(EnableVulnerabilityScanningRequest) returns (EnableVulnerabilityScanningResponse) {} +} + +message EnableVulnerabilityScanningRequest { + common.v1.UUID repository_id = 1; +} + +message EnableVulnerabilityScanningResponse { + string message = 1; } message ClairReportPackage { @@ -16,6 +26,7 @@ message ClairReportPackage { string version = 3; string kind = 4; string arch = 5; + ClairPackageSource source = 6; } message SubmitManifestToScanResponse { @@ -37,13 +48,17 @@ message ClairDescriptor { message SubmitManifestToScanRequest { string hash = 1; - repeated ClairDescriptor layers = 2; } message GetVulnerabilityReportRequest { string manifest_id = 1; } +message ClairIndexManifestRequest { + string hash = 1; + repeated ClairDescriptor layers = 2; +} + message ClairPackageSource { string id = 1; string name = 2; diff --git a/registry/v2/extensions/private_images.go b/registry/v2/extensions/private_images.go index 189a0548..38a56fb6 100644 --- a/registry/v2/extensions/private_images.go +++ b/registry/v2/extensions/private_images.go @@ -1,7 +1,6 @@ package extensions import ( - "encoding/json" "net/http" "time" @@ -14,21 +13,28 @@ func (ext *extension) ChangeContainerImageVisibility(ctx echo.Context) error { var body types.ContainerImageVisibilityChangeRequest - if err := json.NewDecoder(ctx.Request().Body).Decode(&body); err != nil { - return ctx.JSON(http.StatusBadRequest, echo.Map{ + if err := ctx.Bind(&body); err != nil { + echoErr := ctx.JSON(http.StatusBadRequest, echo.Map{ "error": "invalid request body", }) + + ext.logger.Log(ctx, err).Send() + return echoErr } defer ctx.Request().Body.Close() - err := ext.store.SetContainerImageVisibility(ctx.Request().Context(), body.ImageManifestUUID, body.Visibility) + err := ext.store.SetContainerImageVisibility(ctx.Request().Context(), body.RepositoryID, body.Visibility) if err != nil { - return ctx.JSON(http.StatusBadRequest, echo.Map{ + echoErr := ctx.JSON(http.StatusBadRequest, echo.Map{ "error": err.Error(), }) + ext.logger.Log(ctx, err).Send() + return echoErr } - return ctx.JSON(http.StatusOK, echo.Map{ + echoErr := ctx.JSON(http.StatusOK, echo.Map{ "message": "container image visibility mode changed successfully", }) + ext.logger.Log(ctx, nil).Send() + return echoErr } diff --git a/router/helpers.go b/router/helpers.go index 0c6351ae..49fef37c 100644 --- a/router/helpers.go +++ b/router/helpers.go @@ -19,7 +19,7 @@ func RegisterAuthRoutes(authRouter *echo.Group, authSvc auth.Authentication) { authRouter.Add(http.MethodGet, "/sessions/me", authSvc.ReadUserWithSession) authRouter.Add(http.MethodDelete, "/sessions", authSvc.ExpireSessions) authRouter.Add(http.MethodGet, "/renew", authSvc.RenewAccessToken) - authRouter.Add(http.MethodPost, "/reset-password", authSvc.ResetPassword, authSvc.JWT()) + authRouter.Add(http.MethodPost, "/reset-password", authSvc.ResetPassword, authSvc.JWTRest()) authRouter.Add(http.MethodPost, "/reset-forgotten-password", authSvc.ResetForgottenPassword, authSvc.JWT()) authRouter.Add(http.MethodGet, "/forgot-password", authSvc.ForgotPassword) } diff --git a/router/middlewares.go b/router/middlewares.go index 55fd2ec7..114a7c08 100644 --- a/router/middlewares.go +++ b/router/middlewares.go @@ -4,6 +4,7 @@ import ( "fmt" "net/http" "regexp" + "strings" "github.com/containerish/OpenRegistry/common" "github.com/containerish/OpenRegistry/registry/v2" @@ -20,12 +21,12 @@ func registryNamespaceValidator(logger telemetry.Logger) echo.MiddlewareFunc { return func(handler echo.HandlerFunc) echo.HandlerFunc { return func(ctx echo.Context) error { // we skip the /v2/ path since it isn't a namespaced path - if ctx.Request().URL.Path == "/v2/" { + if ctx.Request().URL.Path == "/v2/" || strings.HasPrefix(ctx.Request().URL.Path, "/v2/ext/") { return handler(ctx) } namespace := ctx.Param("username") + "/" + ctx.Param("imagename") - if namespace != "/" && !nsRegex.MatchString(namespace) { + if !nsRegex.MatchString(namespace) { registryErr := common.RegistryErrorResponse( registry.RegistryErrorCodeNameInvalid, "invalid user namespace", diff --git a/router/router.go b/router/router.go index 6d90c8b0..792b505f 100644 --- a/router/router.go +++ b/router/router.go @@ -9,6 +9,7 @@ import ( "github.com/containerish/OpenRegistry/auth" auth_server "github.com/containerish/OpenRegistry/auth/server" "github.com/containerish/OpenRegistry/config" + "github.com/containerish/OpenRegistry/dfs" "github.com/containerish/OpenRegistry/orgmode" "github.com/containerish/OpenRegistry/registry/v2" "github.com/containerish/OpenRegistry/registry/v2/extensions" @@ -37,6 +38,7 @@ func Register( registryStore registry_store.RegistryStore, usersStore users_store.UserStore, automationStore automation.BuildAutomationStore, + dfs dfs.DFS, ) *echo.Echo { e := setDefaultEchoOptions(cfg.WebAppConfig, healthCheckApi) @@ -58,10 +60,17 @@ func Register( RegisterUserRoutes(userApiRouter, usersApi) RegisterNSRoutes(nsRouter, registryApi, registryStore, logger) RegisterAuthRoutes(authRouter, authApi) - RegisterExtensionsRoutes(ociRouter, registryApi, extensionsApi) + RegisterExtensionsRoutes(ociRouter, registryApi, extensionsApi, authApi.JWTRest()) RegisterWebauthnRoutes(webauthnRouter, webauthnApi) RegisterOrgModeRoutes(orgModeRouter, orgModeApi) - RegisterVulnScaningRoutes(cfg.Integrations.GetClairConfig(), logger) + RegisterVulnScaningRoutes( + usersStore, + cfg.Integrations.GetClairConfig(), + &cfg.Registry.Auth, + logger, + registryStore.GetLayersLinksForManifest, + dfs.GeneratePresignedURL, + ) if cfg.Integrations.GetGithubConfig() != nil && cfg.Integrations.GetGithubConfig().Enabled { RegisterGitHubRoutes( diff --git a/router/vuln_scanning_routes.go b/router/vuln_scanning_routes.go index a051e142..4f98f0b1 100644 --- a/router/vuln_scanning_routes.go +++ b/router/vuln_scanning_routes.go @@ -7,6 +7,7 @@ import ( "github.com/containerish/OpenRegistry/config" "github.com/containerish/OpenRegistry/services/yor/clair/v1/server" + "github.com/containerish/OpenRegistry/store/v1/users" "github.com/containerish/OpenRegistry/telemetry" "github.com/fatih/color" "golang.org/x/net/http2" @@ -14,13 +15,24 @@ import ( ) func RegisterVulnScaningRoutes( - config *config.ClairIntegration, + userStore users.UserStore, + clairConfig *config.ClairIntegration, + authConfig *config.Auth, logger telemetry.Logger, + layerLinkReader server.LayerLinkReader, + prePresignedURLGenerator server.PresignedURLGenerator, ) { - if config != nil && config.Enabled { - clairApi := server.NewClairClient(config, logger) + if clairConfig != nil && clairConfig.Enabled { + clairApi := server.NewClairClient( + userStore, + clairConfig, + authConfig, + logger, + layerLinkReader, + prePresignedURLGenerator, + ) go func() { - addr := net.JoinHostPort(config.Host, fmt.Sprintf("%d", config.Port)) + addr := net.JoinHostPort(clairConfig.Host, fmt.Sprintf("%d", clairConfig.Port)) color.Green("connect-go Clair gRPC service running on: %s", addr) if err := http.ListenAndServe(addr, h2c.NewHandler(clairApi, &http2.Server{})); err != nil { color.Red("connect-go listen error: %s", err) diff --git a/services/kon/github_actions/v1/server/build_logs.go b/services/kon/github_actions/v1/server/build_logs.go index a9e09a19..dcaafebe 100644 --- a/services/kon/github_actions/v1/server/build_logs.go +++ b/services/kon/github_actions/v1/server/build_logs.go @@ -316,7 +316,11 @@ func (ghs *GitHubActionsServer) waitForJobToFinish( stream *connect_go.ServerStream[github_actions_v1.StreamWorkflowRunLogsResponse], ) error { now := time.Now() - logEvent := ghs.logger.Debug().Str("method", "waitForJobToFinish").Int64("run_id", req.Msg.GetRunId()).Str("repo_name", req.Msg.GetRepoName()).Str("repo_owner", req.Msg.GetRepoOwner()) + logEvent := ghs.logger.Debug(). + Str("method", "waitForJobToFinish"). + Int64("run_id", req.Msg.GetRunId()). + Str("repo_name", req.Msg.GetRepoName()). + Str("repo_owner", req.Msg.GetRepoOwner()) workflowRun, _, err := githubClient.Actions.GetWorkflowRunByID( ctx, diff --git a/services/yor/clair/v1/clair.pb.go b/services/yor/clair/v1/clair.pb.go index 28145af2..c8e704bb 100644 --- a/services/yor/clair/v1/clair.pb.go +++ b/services/yor/clair/v1/clair.pb.go @@ -7,6 +7,7 @@ package clair import ( + v1 "github.com/containerish/OpenRegistry/common/v1" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" structpb "google.golang.org/protobuf/types/known/structpb" @@ -22,22 +23,117 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +type EnableVulnerabilityScanningRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RepositoryId *v1.UUID `protobuf:"bytes,1,opt,name=repository_id,json=repositoryId,proto3" json:"repository_id,omitempty"` +} + +func (x *EnableVulnerabilityScanningRequest) Reset() { + *x = EnableVulnerabilityScanningRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_services_yor_clair_v1_clair_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EnableVulnerabilityScanningRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnableVulnerabilityScanningRequest) ProtoMessage() {} + +func (x *EnableVulnerabilityScanningRequest) ProtoReflect() protoreflect.Message { + mi := &file_services_yor_clair_v1_clair_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 EnableVulnerabilityScanningRequest.ProtoReflect.Descriptor instead. +func (*EnableVulnerabilityScanningRequest) Descriptor() ([]byte, []int) { + return file_services_yor_clair_v1_clair_proto_rawDescGZIP(), []int{0} +} + +func (x *EnableVulnerabilityScanningRequest) GetRepositoryId() *v1.UUID { + if x != nil { + return x.RepositoryId + } + return nil +} + +type EnableVulnerabilityScanningResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` +} + +func (x *EnableVulnerabilityScanningResponse) Reset() { + *x = EnableVulnerabilityScanningResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_services_yor_clair_v1_clair_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EnableVulnerabilityScanningResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnableVulnerabilityScanningResponse) ProtoMessage() {} + +func (x *EnableVulnerabilityScanningResponse) ProtoReflect() protoreflect.Message { + mi := &file_services_yor_clair_v1_clair_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 EnableVulnerabilityScanningResponse.ProtoReflect.Descriptor instead. +func (*EnableVulnerabilityScanningResponse) Descriptor() ([]byte, []int) { + return file_services_yor_clair_v1_clair_proto_rawDescGZIP(), []int{1} +} + +func (x *EnableVulnerabilityScanningResponse) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + type ClairReportPackage 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"` - Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` - Kind string `protobuf:"bytes,4,opt,name=kind,proto3" json:"kind,omitempty"` - Arch string `protobuf:"bytes,5,opt,name=arch,proto3" json:"arch,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"` + Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` + Kind string `protobuf:"bytes,4,opt,name=kind,proto3" json:"kind,omitempty"` + Arch string `protobuf:"bytes,5,opt,name=arch,proto3" json:"arch,omitempty"` + Source *ClairPackageSource `protobuf:"bytes,6,opt,name=source,proto3" json:"source,omitempty"` } func (x *ClairReportPackage) Reset() { *x = ClairReportPackage{} if protoimpl.UnsafeEnabled { - mi := &file_services_yor_clair_v1_clair_proto_msgTypes[0] + mi := &file_services_yor_clair_v1_clair_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -50,7 +146,7 @@ func (x *ClairReportPackage) String() string { func (*ClairReportPackage) ProtoMessage() {} func (x *ClairReportPackage) ProtoReflect() protoreflect.Message { - mi := &file_services_yor_clair_v1_clair_proto_msgTypes[0] + mi := &file_services_yor_clair_v1_clair_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -63,7 +159,7 @@ func (x *ClairReportPackage) ProtoReflect() protoreflect.Message { // Deprecated: Use ClairReportPackage.ProtoReflect.Descriptor instead. func (*ClairReportPackage) Descriptor() ([]byte, []int) { - return file_services_yor_clair_v1_clair_proto_rawDescGZIP(), []int{0} + return file_services_yor_clair_v1_clair_proto_rawDescGZIP(), []int{2} } func (x *ClairReportPackage) GetId() string { @@ -101,6 +197,13 @@ func (x *ClairReportPackage) GetArch() string { return "" } +func (x *ClairReportPackage) GetSource() *ClairPackageSource { + if x != nil { + return x.Source + } + return nil +} + type SubmitManifestToScanResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -119,7 +222,7 @@ type SubmitManifestToScanResponse struct { func (x *SubmitManifestToScanResponse) Reset() { *x = SubmitManifestToScanResponse{} if protoimpl.UnsafeEnabled { - mi := &file_services_yor_clair_v1_clair_proto_msgTypes[1] + mi := &file_services_yor_clair_v1_clair_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -132,7 +235,7 @@ func (x *SubmitManifestToScanResponse) String() string { func (*SubmitManifestToScanResponse) ProtoMessage() {} func (x *SubmitManifestToScanResponse) ProtoReflect() protoreflect.Message { - mi := &file_services_yor_clair_v1_clair_proto_msgTypes[1] + mi := &file_services_yor_clair_v1_clair_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -145,7 +248,7 @@ func (x *SubmitManifestToScanResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SubmitManifestToScanResponse.ProtoReflect.Descriptor instead. func (*SubmitManifestToScanResponse) Descriptor() ([]byte, []int) { - return file_services_yor_clair_v1_clair_proto_rawDescGZIP(), []int{1} + return file_services_yor_clair_v1_clair_proto_rawDescGZIP(), []int{3} } func (x *SubmitManifestToScanResponse) GetSuccess() bool { @@ -217,7 +320,7 @@ type ClairDescriptor struct { func (x *ClairDescriptor) Reset() { *x = ClairDescriptor{} if protoimpl.UnsafeEnabled { - mi := &file_services_yor_clair_v1_clair_proto_msgTypes[2] + mi := &file_services_yor_clair_v1_clair_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -230,7 +333,7 @@ func (x *ClairDescriptor) String() string { func (*ClairDescriptor) ProtoMessage() {} func (x *ClairDescriptor) ProtoReflect() protoreflect.Message { - mi := &file_services_yor_clair_v1_clair_proto_msgTypes[2] + mi := &file_services_yor_clair_v1_clair_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -243,7 +346,7 @@ func (x *ClairDescriptor) ProtoReflect() protoreflect.Message { // Deprecated: Use ClairDescriptor.ProtoReflect.Descriptor instead. func (*ClairDescriptor) Descriptor() ([]byte, []int) { - return file_services_yor_clair_v1_clair_proto_rawDescGZIP(), []int{2} + return file_services_yor_clair_v1_clair_proto_rawDescGZIP(), []int{4} } func (x *ClairDescriptor) GetHash() string { @@ -272,14 +375,13 @@ type SubmitManifestToScanRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Hash string `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` - Layers []*ClairDescriptor `protobuf:"bytes,2,rep,name=layers,proto3" json:"layers,omitempty"` + Hash string `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` } func (x *SubmitManifestToScanRequest) Reset() { *x = SubmitManifestToScanRequest{} if protoimpl.UnsafeEnabled { - mi := &file_services_yor_clair_v1_clair_proto_msgTypes[3] + mi := &file_services_yor_clair_v1_clair_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -292,7 +394,7 @@ func (x *SubmitManifestToScanRequest) String() string { func (*SubmitManifestToScanRequest) ProtoMessage() {} func (x *SubmitManifestToScanRequest) ProtoReflect() protoreflect.Message { - mi := &file_services_yor_clair_v1_clair_proto_msgTypes[3] + mi := &file_services_yor_clair_v1_clair_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -305,7 +407,7 @@ func (x *SubmitManifestToScanRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubmitManifestToScanRequest.ProtoReflect.Descriptor instead. func (*SubmitManifestToScanRequest) Descriptor() ([]byte, []int) { - return file_services_yor_clair_v1_clair_proto_rawDescGZIP(), []int{3} + return file_services_yor_clair_v1_clair_proto_rawDescGZIP(), []int{5} } func (x *SubmitManifestToScanRequest) GetHash() string { @@ -315,13 +417,6 @@ func (x *SubmitManifestToScanRequest) GetHash() string { return "" } -func (x *SubmitManifestToScanRequest) GetLayers() []*ClairDescriptor { - if x != nil { - return x.Layers - } - return nil -} - type GetVulnerabilityReportRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -333,7 +428,7 @@ type GetVulnerabilityReportRequest struct { func (x *GetVulnerabilityReportRequest) Reset() { *x = GetVulnerabilityReportRequest{} if protoimpl.UnsafeEnabled { - mi := &file_services_yor_clair_v1_clair_proto_msgTypes[4] + mi := &file_services_yor_clair_v1_clair_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -346,7 +441,7 @@ func (x *GetVulnerabilityReportRequest) String() string { func (*GetVulnerabilityReportRequest) ProtoMessage() {} func (x *GetVulnerabilityReportRequest) ProtoReflect() protoreflect.Message { - mi := &file_services_yor_clair_v1_clair_proto_msgTypes[4] + mi := &file_services_yor_clair_v1_clair_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -359,7 +454,7 @@ func (x *GetVulnerabilityReportRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVulnerabilityReportRequest.ProtoReflect.Descriptor instead. func (*GetVulnerabilityReportRequest) Descriptor() ([]byte, []int) { - return file_services_yor_clair_v1_clair_proto_rawDescGZIP(), []int{4} + return file_services_yor_clair_v1_clair_proto_rawDescGZIP(), []int{6} } func (x *GetVulnerabilityReportRequest) GetManifestId() string { @@ -369,6 +464,61 @@ func (x *GetVulnerabilityReportRequest) GetManifestId() string { return "" } +type ClairIndexManifestRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Hash string `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` + Layers []*ClairDescriptor `protobuf:"bytes,2,rep,name=layers,proto3" json:"layers,omitempty"` +} + +func (x *ClairIndexManifestRequest) Reset() { + *x = ClairIndexManifestRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_services_yor_clair_v1_clair_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClairIndexManifestRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClairIndexManifestRequest) ProtoMessage() {} + +func (x *ClairIndexManifestRequest) ProtoReflect() protoreflect.Message { + mi := &file_services_yor_clair_v1_clair_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClairIndexManifestRequest.ProtoReflect.Descriptor instead. +func (*ClairIndexManifestRequest) Descriptor() ([]byte, []int) { + return file_services_yor_clair_v1_clair_proto_rawDescGZIP(), []int{7} +} + +func (x *ClairIndexManifestRequest) GetHash() string { + if x != nil { + return x.Hash + } + return "" +} + +func (x *ClairIndexManifestRequest) GetLayers() []*ClairDescriptor { + if x != nil { + return x.Layers + } + return nil +} + type ClairPackageSource struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -383,7 +533,7 @@ type ClairPackageSource struct { func (x *ClairPackageSource) Reset() { *x = ClairPackageSource{} if protoimpl.UnsafeEnabled { - mi := &file_services_yor_clair_v1_clair_proto_msgTypes[5] + mi := &file_services_yor_clair_v1_clair_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -396,7 +546,7 @@ func (x *ClairPackageSource) String() string { func (*ClairPackageSource) ProtoMessage() {} func (x *ClairPackageSource) ProtoReflect() protoreflect.Message { - mi := &file_services_yor_clair_v1_clair_proto_msgTypes[5] + mi := &file_services_yor_clair_v1_clair_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -409,7 +559,7 @@ func (x *ClairPackageSource) ProtoReflect() protoreflect.Message { // Deprecated: Use ClairPackageSource.ProtoReflect.Descriptor instead. func (*ClairPackageSource) Descriptor() ([]byte, []int) { - return file_services_yor_clair_v1_clair_proto_rawDescGZIP(), []int{5} + return file_services_yor_clair_v1_clair_proto_rawDescGZIP(), []int{8} } func (x *ClairPackageSource) GetId() string { @@ -456,7 +606,7 @@ type ClairPackage struct { func (x *ClairPackage) Reset() { *x = ClairPackage{} if protoimpl.UnsafeEnabled { - mi := &file_services_yor_clair_v1_clair_proto_msgTypes[6] + mi := &file_services_yor_clair_v1_clair_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -469,7 +619,7 @@ func (x *ClairPackage) String() string { func (*ClairPackage) ProtoMessage() {} func (x *ClairPackage) ProtoReflect() protoreflect.Message { - mi := &file_services_yor_clair_v1_clair_proto_msgTypes[6] + mi := &file_services_yor_clair_v1_clair_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -482,7 +632,7 @@ func (x *ClairPackage) ProtoReflect() protoreflect.Message { // Deprecated: Use ClairPackage.ProtoReflect.Descriptor instead. func (*ClairPackage) Descriptor() ([]byte, []int) { - return file_services_yor_clair_v1_clair_proto_rawDescGZIP(), []int{6} + return file_services_yor_clair_v1_clair_proto_rawDescGZIP(), []int{9} } func (x *ClairPackage) GetId() string { @@ -546,7 +696,7 @@ type ClairDistribution struct { func (x *ClairDistribution) Reset() { *x = ClairDistribution{} if protoimpl.UnsafeEnabled { - mi := &file_services_yor_clair_v1_clair_proto_msgTypes[7] + mi := &file_services_yor_clair_v1_clair_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -559,7 +709,7 @@ func (x *ClairDistribution) String() string { func (*ClairDistribution) ProtoMessage() {} func (x *ClairDistribution) ProtoReflect() protoreflect.Message { - mi := &file_services_yor_clair_v1_clair_proto_msgTypes[7] + mi := &file_services_yor_clair_v1_clair_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -572,7 +722,7 @@ func (x *ClairDistribution) ProtoReflect() protoreflect.Message { // Deprecated: Use ClairDistribution.ProtoReflect.Descriptor instead. func (*ClairDistribution) Descriptor() ([]byte, []int) { - return file_services_yor_clair_v1_clair_proto_rawDescGZIP(), []int{7} + return file_services_yor_clair_v1_clair_proto_rawDescGZIP(), []int{10} } func (x *ClairDistribution) GetId() string { @@ -652,7 +802,7 @@ type ClairEnvironmentItem struct { func (x *ClairEnvironmentItem) Reset() { *x = ClairEnvironmentItem{} if protoimpl.UnsafeEnabled { - mi := &file_services_yor_clair_v1_clair_proto_msgTypes[8] + mi := &file_services_yor_clair_v1_clair_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -665,7 +815,7 @@ func (x *ClairEnvironmentItem) String() string { func (*ClairEnvironmentItem) ProtoMessage() {} func (x *ClairEnvironmentItem) ProtoReflect() protoreflect.Message { - mi := &file_services_yor_clair_v1_clair_proto_msgTypes[8] + mi := &file_services_yor_clair_v1_clair_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -678,7 +828,7 @@ func (x *ClairEnvironmentItem) ProtoReflect() protoreflect.Message { // Deprecated: Use ClairEnvironmentItem.ProtoReflect.Descriptor instead. func (*ClairEnvironmentItem) Descriptor() ([]byte, []int) { - return file_services_yor_clair_v1_clair_proto_rawDescGZIP(), []int{8} + return file_services_yor_clair_v1_clair_proto_rawDescGZIP(), []int{11} } func (x *ClairEnvironmentItem) GetPackageDb() string { @@ -720,7 +870,7 @@ type ClairRepository struct { func (x *ClairRepository) Reset() { *x = ClairRepository{} if protoimpl.UnsafeEnabled { - mi := &file_services_yor_clair_v1_clair_proto_msgTypes[9] + mi := &file_services_yor_clair_v1_clair_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -733,7 +883,7 @@ func (x *ClairRepository) String() string { func (*ClairRepository) ProtoMessage() {} func (x *ClairRepository) ProtoReflect() protoreflect.Message { - mi := &file_services_yor_clair_v1_clair_proto_msgTypes[9] + mi := &file_services_yor_clair_v1_clair_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -746,7 +896,7 @@ func (x *ClairRepository) ProtoReflect() protoreflect.Message { // Deprecated: Use ClairRepository.ProtoReflect.Descriptor instead. func (*ClairRepository) Descriptor() ([]byte, []int) { - return file_services_yor_clair_v1_clair_proto_rawDescGZIP(), []int{9} + return file_services_yor_clair_v1_clair_proto_rawDescGZIP(), []int{12} } func (x *ClairRepository) GetId() string { @@ -778,7 +928,7 @@ type ClairVulnerability struct { func (x *ClairVulnerability) Reset() { *x = ClairVulnerability{} if protoimpl.UnsafeEnabled { - mi := &file_services_yor_clair_v1_clair_proto_msgTypes[10] + mi := &file_services_yor_clair_v1_clair_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -791,7 +941,7 @@ func (x *ClairVulnerability) String() string { func (*ClairVulnerability) ProtoMessage() {} func (x *ClairVulnerability) ProtoReflect() protoreflect.Message { - mi := &file_services_yor_clair_v1_clair_proto_msgTypes[10] + mi := &file_services_yor_clair_v1_clair_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -804,7 +954,7 @@ func (x *ClairVulnerability) ProtoReflect() protoreflect.Message { // Deprecated: Use ClairVulnerability.ProtoReflect.Descriptor instead. func (*ClairVulnerability) Descriptor() ([]byte, []int) { - return file_services_yor_clair_v1_clair_proto_rawDescGZIP(), []int{10} + return file_services_yor_clair_v1_clair_proto_rawDescGZIP(), []int{13} } func (x *ClairVulnerability) GetId() string { @@ -902,7 +1052,7 @@ type ClairEnrichment struct { func (x *ClairEnrichment) Reset() { *x = ClairEnrichment{} if protoimpl.UnsafeEnabled { - mi := &file_services_yor_clair_v1_clair_proto_msgTypes[11] + mi := &file_services_yor_clair_v1_clair_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -915,7 +1065,7 @@ func (x *ClairEnrichment) String() string { func (*ClairEnrichment) ProtoMessage() {} func (x *ClairEnrichment) ProtoReflect() protoreflect.Message { - mi := &file_services_yor_clair_v1_clair_proto_msgTypes[11] + mi := &file_services_yor_clair_v1_clair_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -928,7 +1078,7 @@ func (x *ClairEnrichment) ProtoReflect() protoreflect.Message { // Deprecated: Use ClairEnrichment.ProtoReflect.Descriptor instead. func (*ClairEnrichment) Descriptor() ([]byte, []int) { - return file_services_yor_clair_v1_clair_proto_rawDescGZIP(), []int{11} + return file_services_yor_clair_v1_clair_proto_rawDescGZIP(), []int{14} } func (x *ClairEnrichment) GetId() string { @@ -949,7 +1099,7 @@ type ClairVulnerabilityIdList struct { func (x *ClairVulnerabilityIdList) Reset() { *x = ClairVulnerabilityIdList{} if protoimpl.UnsafeEnabled { - mi := &file_services_yor_clair_v1_clair_proto_msgTypes[12] + mi := &file_services_yor_clair_v1_clair_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -962,7 +1112,7 @@ func (x *ClairVulnerabilityIdList) String() string { func (*ClairVulnerabilityIdList) ProtoMessage() {} func (x *ClairVulnerabilityIdList) ProtoReflect() protoreflect.Message { - mi := &file_services_yor_clair_v1_clair_proto_msgTypes[12] + mi := &file_services_yor_clair_v1_clair_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -975,7 +1125,7 @@ func (x *ClairVulnerabilityIdList) ProtoReflect() protoreflect.Message { // Deprecated: Use ClairVulnerabilityIdList.ProtoReflect.Descriptor instead. func (*ClairVulnerabilityIdList) Descriptor() ([]byte, []int) { - return file_services_yor_clair_v1_clair_proto_rawDescGZIP(), []int{12} + return file_services_yor_clair_v1_clair_proto_rawDescGZIP(), []int{15} } func (x *ClairVulnerabilityIdList) GetIds() []string { @@ -1006,7 +1156,7 @@ type GetVulnerabilityReportResponse struct { func (x *GetVulnerabilityReportResponse) Reset() { *x = GetVulnerabilityReportResponse{} if protoimpl.UnsafeEnabled { - mi := &file_services_yor_clair_v1_clair_proto_msgTypes[13] + mi := &file_services_yor_clair_v1_clair_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1019,7 +1169,7 @@ func (x *GetVulnerabilityReportResponse) String() string { func (*GetVulnerabilityReportResponse) ProtoMessage() {} func (x *GetVulnerabilityReportResponse) ProtoReflect() protoreflect.Message { - mi := &file_services_yor_clair_v1_clair_proto_msgTypes[13] + mi := &file_services_yor_clair_v1_clair_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1032,7 +1182,7 @@ func (x *GetVulnerabilityReportResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVulnerabilityReportResponse.ProtoReflect.Descriptor instead. func (*GetVulnerabilityReportResponse) Descriptor() ([]byte, []int) { - return file_services_yor_clair_v1_clair_proto_rawDescGZIP(), []int{13} + return file_services_yor_clair_v1_clair_proto_rawDescGZIP(), []int{16} } func (x *GetVulnerabilityReportResponse) GetManifestHash() string { @@ -1122,311 +1272,339 @@ var file_services_yor_clair_v1_clair_proto_rawDesc = []byte{ 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 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, 0x7a, 0x0a, 0x12, 0x43, 0x6c, 0x61, - 0x69, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 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, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, - 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x61, 0x72, 0x63, 0x68, 0x22, 0xba, 0x07, 0x0a, 0x1c, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, - 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x54, 0x6f, 0x53, 0x63, 0x61, 0x6e, 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, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x5f, 0x68, 0x61, 0x73, - 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, - 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x65, - 0x72, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x65, 0x72, 0x72, 0x12, 0x5d, 0x0a, - 0x08, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x41, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, - 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x4d, 0x61, - 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x54, 0x6f, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x08, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x0d, - 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, - 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x6d, - 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x54, 0x6f, 0x53, 0x63, 0x61, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, - 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x64, 0x69, 0x73, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x63, 0x0a, 0x0a, 0x72, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, - 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, - 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x4d, 0x61, 0x6e, - 0x69, 0x66, 0x65, 0x73, 0x74, 0x54, 0x6f, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, - 0x69, 0x0a, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, - 0x62, 0x6d, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x54, 0x6f, 0x53, 0x63, - 0x61, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x65, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x66, 0x0a, 0x0d, 0x50, 0x61, - 0x63, 0x6b, 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, 0x3f, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x6a, 0x0a, 0x12, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 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, 0x3e, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x65, - 0x0a, 0x0f, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 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, 0x3c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, - 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x72, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5b, 0x0a, 0x11, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 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, 0x30, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 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, 0x4c, 0x69, - 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0xde, 0x01, 0x0a, 0x0f, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x44, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, - 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x69, 0x12, 0x4d, 0x0a, 0x07, - 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, - 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x56, 0x0a, 0x0c, 0x48, - 0x65, 0x61, 0x64, 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, 0x30, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 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, 0x4c, - 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x71, 0x0a, 0x1b, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x4d, 0x61, 0x6e, - 0x69, 0x66, 0x65, 0x73, 0x74, 0x54, 0x6f, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x3e, 0x0a, 0x06, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x6c, 0x61, 0x69, 0x72, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x06, - 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x22, 0x40, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x56, 0x75, 0x6c, - 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x6e, 0x69, 0x66, - 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x61, - 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x49, 0x64, 0x22, 0x66, 0x0a, 0x12, 0x43, 0x6c, 0x61, 0x69, - 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 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, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, - 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, - 0x22, 0xb7, 0x01, 0x0a, 0x0c, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x12, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x5a, 0x0a, + 0x22, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x53, 0x63, 0x61, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x0d, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, + 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x55, 0x49, 0x44, 0x52, 0x0c, 0x72, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x49, 0x64, 0x22, 0x3f, 0x0a, 0x23, 0x45, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x56, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, + 0x53, 0x63, 0x61, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 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, 0xbd, 0x01, 0x0a, 0x12, 0x43, + 0x6c, 0x61, 0x69, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 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, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, - 0x69, 0x6e, 0x64, 0x12, 0x41, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, - 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x61, 0x69, - 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x06, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x63, 0x68, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x72, 0x63, 0x68, 0x22, 0xf5, 0x01, 0x0a, 0x11, 0x43, - 0x6c, 0x61, 0x69, 0x72, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, - 0x69, 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, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x2a, 0x0a, 0x11, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x64, 0x65, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x61, - 0x72, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x72, 0x63, 0x68, 0x12, - 0x10, 0x0a, 0x03, 0x63, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x63, 0x70, - 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x74, 0x74, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x74, 0x74, 0x79, 0x4e, 0x61, - 0x6d, 0x65, 0x22, 0xaa, 0x01, 0x0a, 0x14, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x1d, 0x0a, 0x0a, 0x70, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x62, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, - 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x64, 0x49, 0x6e, 0x12, - 0x27, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, - 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0d, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x49, 0x64, 0x73, 0x22, - 0x21, 0x0a, 0x0f, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, - 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x22, 0x8a, 0x04, 0x0a, 0x12, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x56, 0x75, 0x6c, 0x6e, - 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x72, 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, 0x32, 0x0a, 0x06, 0x69, 0x73, 0x73, - 0x75, 0x65, 0x64, 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, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, 0x12, 0x14, 0x0a, - 0x05, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x69, - 0x6e, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, - 0x2f, 0x0a, 0x13, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x73, 0x65, - 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x6f, - 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, - 0x12, 0x3d, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, - 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x50, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, - 0x4c, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, - 0x61, 0x69, 0x72, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x0c, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, - 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, - 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x69, - 0x6e, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x66, 0x69, 0x78, 0x65, 0x64, 0x49, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x21, 0x0a, 0x0f, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x22, 0x2c, 0x0a, 0x18, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x56, 0x75, 0x6c, 0x6e, 0x65, - 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x49, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x10, - 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, - 0x22, 0xe1, 0x0b, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x56, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, - 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x5f, - 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x61, 0x6e, 0x69, - 0x66, 0x65, 0x73, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x10, - 0x0a, 0x03, 0x65, 0x72, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x65, 0x72, 0x72, - 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, 0x5f, 0x0a, 0x08, 0x70, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, - 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x12, 0x6e, 0x0a, 0x0d, 0x64, - 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x48, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, - 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x75, - 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, - 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x64, 0x69, - 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x6b, 0x0a, 0x0c, 0x65, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x47, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, - 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x75, 0x6c, - 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8a, 0x01, 0x0a, 0x17, 0x70, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x76, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, - 0x74, 0x69, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x51, 0x2e, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, - 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, 0x70, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x48, 0x0a, 0x0b, 0x65, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x65, 0x72, + 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x61, 0x72, 0x63, 0x68, 0x12, 0x41, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6c, 0x61, 0x69, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xba, 0x07, 0x0a, 0x1c, 0x53, + 0x75, 0x62, 0x6d, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x54, 0x6f, 0x53, + 0x63, 0x61, 0x6e, 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, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, + 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x61, + 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x10, 0x0a, 0x03, 0x65, 0x72, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x65, + 0x72, 0x72, 0x12, 0x5d, 0x0a, 0x08, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, + 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, + 0x6d, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x54, 0x6f, 0x53, 0x63, 0x61, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x73, 0x12, 0x6c, 0x0a, 0x0d, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x54, + 0x6f, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x44, 0x69, + 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0d, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x63, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, + 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x6d, + 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x54, 0x6f, 0x53, 0x63, 0x61, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x6f, 0x72, 0x79, 0x12, 0x69, 0x0a, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x0b, 0x65, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, - 0x65, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x0a, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, - 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x56, - 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x74, 0x0a, 0x0f, 0x76, 0x75, 0x6c, 0x6e, 0x65, 0x72, - 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x4a, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, - 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x75, 0x6c, 0x6e, 0x65, - 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x56, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x76, 0x75, 0x6c, - 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x60, 0x0a, 0x0d, - 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, + 0x74, 0x54, 0x6f, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x1a, + 0x66, 0x0a, 0x0d, 0x50, 0x61, 0x63, 0x6b, 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, 0x3f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x29, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, + 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x52, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x6a, 0x0a, 0x12, 0x44, 0x69, 0x73, 0x74, 0x72, + 0x69, 0x62, 0x75, 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, - 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, + 0x3e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, - 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x50, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x6a, - 0x0a, 0x12, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 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, 0x3e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, - 0x61, 0x69, 0x72, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x44, 0x69, 0x73, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x1a, 0x65, 0x0a, 0x0f, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, + 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, 0x3c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6c, 0x61, 0x69, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5b, 0x0a, 0x11, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 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, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 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, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x65, 0x0a, 0x1b, 0x50, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x56, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 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, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 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, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x65, - 0x0a, 0x0f, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 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, 0x3c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xde, 0x01, 0x0a, 0x0f, 0x43, 0x6c, 0x61, 0x69, + 0x72, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x68, + 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, + 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, + 0x69, 0x12, 0x4d, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x72, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x6d, 0x0a, 0x14, 0x56, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, - 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 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, - 0x3f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, - 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, - 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x56, 0x75, 0x6c, 0x6e, - 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x32, 0x9c, 0x02, 0x0a, 0x0c, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x81, 0x01, 0x0a, 0x14, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, - 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x54, 0x6f, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x32, + 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, + 0x1a, 0x56, 0x0a, 0x0c, 0x48, 0x65, 0x61, 0x64, 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, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 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, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x75, 0x62, 0x6d, + 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x54, 0x6f, 0x53, 0x63, 0x61, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x22, 0x40, 0x0a, 0x1d, 0x47, + 0x65, 0x74, 0x56, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, + 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x49, 0x64, 0x22, 0x6f, 0x0a, + 0x19, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4d, 0x61, 0x6e, 0x69, 0x66, + 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, + 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x3e, + 0x0a, 0x06, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, - 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x4d, 0x61, 0x6e, - 0x69, 0x66, 0x65, 0x73, 0x74, 0x54, 0x6f, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, - 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, - 0x74, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x54, 0x6f, 0x53, 0x63, 0x61, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x87, 0x01, 0x0a, 0x16, 0x47, 0x65, + 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x06, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x22, 0x66, + 0x0a, 0x12, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x6f, + 0x75, 0x72, 0x63, 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, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0xb7, 0x01, 0x0a, 0x0c, 0x43, 0x6c, 0x61, 0x69, 0x72, + 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 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, 0x18, 0x0a, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x41, 0x0a, 0x06, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x61, 0x72, 0x63, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x72, 0x63, 0x68, + 0x22, 0xf5, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x69, 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, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x11, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x61, 0x72, 0x63, 0x68, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x63, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x74, 0x74, + 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, + 0x65, 0x74, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xaa, 0x01, 0x0a, 0x14, 0x43, 0x6c, 0x61, + 0x69, 0x72, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x74, 0x65, + 0x6d, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x62, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x62, + 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x64, 0x5f, 0x69, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x65, 0x64, 0x49, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x25, + 0x0a, 0x0e, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x69, 0x64, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, + 0x72, 0x79, 0x49, 0x64, 0x73, 0x22, 0x21, 0x0a, 0x0f, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x8a, 0x04, 0x0a, 0x12, 0x43, 0x6c, 0x61, + 0x69, 0x72, 0x56, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x18, 0x0a, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x72, 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, + 0x32, 0x0a, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, 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, 0x06, 0x69, 0x73, 0x73, + 0x75, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x76, + 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x76, + 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x13, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, + 0x7a, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x12, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53, 0x65, + 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x3d, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6c, 0x61, 0x69, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x07, 0x70, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x4c, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, + 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6c, 0x61, 0x69, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, + 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x66, + 0x69, 0x78, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x66, 0x69, 0x78, 0x65, 0x64, 0x49, 0x6e, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x21, 0x0a, 0x0f, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x45, 0x6e, + 0x72, 0x69, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x2c, 0x0a, 0x18, 0x43, 0x6c, 0x61, 0x69, + 0x72, 0x56, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x49, 0x64, + 0x4c, 0x69, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0xe1, 0x0b, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x56, 0x75, + 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x6e, + 0x69, 0x66, 0x65, 0x73, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x72, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x65, 0x72, 0x72, 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, 0x5f, 0x0a, 0x08, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, + 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x75, + 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x73, 0x12, 0x6e, 0x0a, 0x0d, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x48, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x56, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, + 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0d, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x6b, 0x0a, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x56, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, + 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8a, + 0x01, 0x0a, 0x17, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x76, 0x75, 0x6c, 0x6e, 0x65, + 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x51, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, 0x2e, + 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x75, 0x6c, 0x6e, + 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, + 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x16, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x75, 0x6c, 0x6e, + 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x48, 0x0a, 0x0b, 0x65, + 0x6e, 0x72, 0x69, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x26, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, 0x2e, + 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x45, 0x6e, + 0x72, 0x69, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x65, 0x6e, 0x72, 0x69, 0x63, 0x68, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x65, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x6f, 0x72, 0x79, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x74, 0x0a, 0x0f, + 0x76, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, + 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4a, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x12, 0x34, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, - 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x56, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x73, 0x65, 0x72, + 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x56, 0x75, 0x6c, + 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0f, 0x76, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, + 0x65, 0x73, 0x1a, 0x60, 0x0a, 0x0d, 0x50, 0x61, 0x63, 0x6b, 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, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, + 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x61, + 0x69, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x6a, 0x0a, 0x12, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, + 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, 0x3e, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x1a, 0x5b, 0x0a, 0x11, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 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, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 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, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x65, 0x0a, + 0x1b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x69, 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, 0x30, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 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, + 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x65, 0x0a, 0x0f, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, + 0x72, 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, 0x3c, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x6d, 0x0a, 0x14, 0x56, + 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 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, 0x3f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, + 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x61, + 0x69, 0x72, 0x56, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x32, 0xb5, 0x03, 0x0a, 0x0c, 0x43, + 0x6c, 0x61, 0x69, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x81, 0x01, 0x0a, 0x14, + 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x54, 0x6f, + 0x53, 0x63, 0x61, 0x6e, 0x12, 0x32, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, + 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, + 0x6d, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x54, 0x6f, 0x53, 0x63, 0x61, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x54, + 0x6f, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x87, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x56, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x34, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x42, 0xe0, 0x01, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x74, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x35, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, 0x2e, + 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x75, 0x6c, 0x6e, + 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x96, 0x01, 0x0a, 0x1b, 0x45, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x56, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x79, 0x53, 0x63, 0x61, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x39, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, - 0x31, 0x42, 0x0a, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, - 0x40, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x69, 0x73, 0x68, 0x2f, 0x4f, 0x70, 0x65, 0x6e, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x72, 0x79, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x79, - 0x6f, 0x72, 0x2f, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2f, 0x76, 0x31, 0x3b, 0x63, 0x6c, 0x61, 0x69, - 0x72, 0xa2, 0x02, 0x03, 0x53, 0x59, 0x43, 0xaa, 0x02, 0x15, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x2e, 0x59, 0x6f, 0x72, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x56, 0x31, 0xca, - 0x02, 0x15, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x5c, 0x59, 0x6f, 0x72, 0x5c, 0x43, - 0x6c, 0x61, 0x69, 0x72, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x21, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x5c, 0x59, 0x6f, 0x72, 0x5c, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x5c, 0x56, 0x31, 0x5c, - 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x18, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x3a, 0x3a, 0x59, 0x6f, 0x72, 0x3a, 0x3a, 0x43, 0x6c, 0x61, - 0x69, 0x72, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x31, 0x2e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x79, 0x53, 0x63, 0x61, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, + 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x56, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, + 0x53, 0x63, 0x61, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x42, 0xe0, 0x01, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x2e, 0x79, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x31, + 0x42, 0x0a, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x40, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x69, 0x73, 0x68, 0x2f, 0x4f, 0x70, 0x65, 0x6e, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x72, 0x79, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x79, 0x6f, + 0x72, 0x2f, 0x63, 0x6c, 0x61, 0x69, 0x72, 0x2f, 0x76, 0x31, 0x3b, 0x63, 0x6c, 0x61, 0x69, 0x72, + 0xa2, 0x02, 0x03, 0x53, 0x59, 0x43, 0xaa, 0x02, 0x15, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x2e, 0x59, 0x6f, 0x72, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x56, 0x31, 0xca, 0x02, + 0x15, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x5c, 0x59, 0x6f, 0x72, 0x5c, 0x43, 0x6c, + 0x61, 0x69, 0x72, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x21, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x5c, 0x59, 0x6f, 0x72, 0x5c, 0x43, 0x6c, 0x61, 0x69, 0x72, 0x5c, 0x56, 0x31, 0x5c, 0x47, + 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x18, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x3a, 0x3a, 0x59, 0x6f, 0x72, 0x3a, 0x3a, 0x43, 0x6c, 0x61, 0x69, + 0x72, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1441,75 +1619,83 @@ func file_services_yor_clair_v1_clair_proto_rawDescGZIP() []byte { return file_services_yor_clair_v1_clair_proto_rawDescData } -var file_services_yor_clair_v1_clair_proto_msgTypes = make([]protoimpl.MessageInfo, 25) +var file_services_yor_clair_v1_clair_proto_msgTypes = make([]protoimpl.MessageInfo, 28) var file_services_yor_clair_v1_clair_proto_goTypes = []interface{}{ - (*ClairReportPackage)(nil), // 0: services.yor.clair.v1.ClairReportPackage - (*SubmitManifestToScanResponse)(nil), // 1: services.yor.clair.v1.SubmitManifestToScanResponse - (*ClairDescriptor)(nil), // 2: services.yor.clair.v1.ClairDescriptor - (*SubmitManifestToScanRequest)(nil), // 3: services.yor.clair.v1.SubmitManifestToScanRequest - (*GetVulnerabilityReportRequest)(nil), // 4: services.yor.clair.v1.GetVulnerabilityReportRequest - (*ClairPackageSource)(nil), // 5: services.yor.clair.v1.ClairPackageSource - (*ClairPackage)(nil), // 6: services.yor.clair.v1.ClairPackage - (*ClairDistribution)(nil), // 7: services.yor.clair.v1.ClairDistribution - (*ClairEnvironmentItem)(nil), // 8: services.yor.clair.v1.ClairEnvironmentItem - (*ClairRepository)(nil), // 9: services.yor.clair.v1.ClairRepository - (*ClairVulnerability)(nil), // 10: services.yor.clair.v1.ClairVulnerability - (*ClairEnrichment)(nil), // 11: services.yor.clair.v1.ClairEnrichment - (*ClairVulnerabilityIdList)(nil), // 12: services.yor.clair.v1.ClairVulnerabilityIdList - (*GetVulnerabilityReportResponse)(nil), // 13: services.yor.clair.v1.GetVulnerabilityReportResponse - nil, // 14: services.yor.clair.v1.SubmitManifestToScanResponse.PackagesEntry - nil, // 15: services.yor.clair.v1.SubmitManifestToScanResponse.DistributionsEntry - nil, // 16: services.yor.clair.v1.SubmitManifestToScanResponse.RepositoryEntry - nil, // 17: services.yor.clair.v1.SubmitManifestToScanResponse.EnvironmentsEntry - nil, // 18: services.yor.clair.v1.ClairDescriptor.HeadersEntry - nil, // 19: services.yor.clair.v1.GetVulnerabilityReportResponse.PackagesEntry - nil, // 20: services.yor.clair.v1.GetVulnerabilityReportResponse.DistributionsEntry - nil, // 21: services.yor.clair.v1.GetVulnerabilityReportResponse.EnvironmentsEntry - nil, // 22: services.yor.clair.v1.GetVulnerabilityReportResponse.PackageVulnerabilitiesEntry - nil, // 23: services.yor.clair.v1.GetVulnerabilityReportResponse.RepositoryEntry - nil, // 24: services.yor.clair.v1.GetVulnerabilityReportResponse.VulnerabilitiesEntry - (*timestamppb.Timestamp)(nil), // 25: google.protobuf.Timestamp - (*structpb.ListValue)(nil), // 26: google.protobuf.ListValue + (*EnableVulnerabilityScanningRequest)(nil), // 0: services.yor.clair.v1.EnableVulnerabilityScanningRequest + (*EnableVulnerabilityScanningResponse)(nil), // 1: services.yor.clair.v1.EnableVulnerabilityScanningResponse + (*ClairReportPackage)(nil), // 2: services.yor.clair.v1.ClairReportPackage + (*SubmitManifestToScanResponse)(nil), // 3: services.yor.clair.v1.SubmitManifestToScanResponse + (*ClairDescriptor)(nil), // 4: services.yor.clair.v1.ClairDescriptor + (*SubmitManifestToScanRequest)(nil), // 5: services.yor.clair.v1.SubmitManifestToScanRequest + (*GetVulnerabilityReportRequest)(nil), // 6: services.yor.clair.v1.GetVulnerabilityReportRequest + (*ClairIndexManifestRequest)(nil), // 7: services.yor.clair.v1.ClairIndexManifestRequest + (*ClairPackageSource)(nil), // 8: services.yor.clair.v1.ClairPackageSource + (*ClairPackage)(nil), // 9: services.yor.clair.v1.ClairPackage + (*ClairDistribution)(nil), // 10: services.yor.clair.v1.ClairDistribution + (*ClairEnvironmentItem)(nil), // 11: services.yor.clair.v1.ClairEnvironmentItem + (*ClairRepository)(nil), // 12: services.yor.clair.v1.ClairRepository + (*ClairVulnerability)(nil), // 13: services.yor.clair.v1.ClairVulnerability + (*ClairEnrichment)(nil), // 14: services.yor.clair.v1.ClairEnrichment + (*ClairVulnerabilityIdList)(nil), // 15: services.yor.clair.v1.ClairVulnerabilityIdList + (*GetVulnerabilityReportResponse)(nil), // 16: services.yor.clair.v1.GetVulnerabilityReportResponse + nil, // 17: services.yor.clair.v1.SubmitManifestToScanResponse.PackagesEntry + nil, // 18: services.yor.clair.v1.SubmitManifestToScanResponse.DistributionsEntry + nil, // 19: services.yor.clair.v1.SubmitManifestToScanResponse.RepositoryEntry + nil, // 20: services.yor.clair.v1.SubmitManifestToScanResponse.EnvironmentsEntry + nil, // 21: services.yor.clair.v1.ClairDescriptor.HeadersEntry + nil, // 22: services.yor.clair.v1.GetVulnerabilityReportResponse.PackagesEntry + nil, // 23: services.yor.clair.v1.GetVulnerabilityReportResponse.DistributionsEntry + nil, // 24: services.yor.clair.v1.GetVulnerabilityReportResponse.EnvironmentsEntry + nil, // 25: services.yor.clair.v1.GetVulnerabilityReportResponse.PackageVulnerabilitiesEntry + nil, // 26: services.yor.clair.v1.GetVulnerabilityReportResponse.RepositoryEntry + nil, // 27: services.yor.clair.v1.GetVulnerabilityReportResponse.VulnerabilitiesEntry + (*v1.UUID)(nil), // 28: common.v1.UUID + (*timestamppb.Timestamp)(nil), // 29: google.protobuf.Timestamp + (*structpb.ListValue)(nil), // 30: google.protobuf.ListValue } var file_services_yor_clair_v1_clair_proto_depIdxs = []int32{ - 14, // 0: services.yor.clair.v1.SubmitManifestToScanResponse.packages:type_name -> services.yor.clair.v1.SubmitManifestToScanResponse.PackagesEntry - 15, // 1: services.yor.clair.v1.SubmitManifestToScanResponse.distributions:type_name -> services.yor.clair.v1.SubmitManifestToScanResponse.DistributionsEntry - 16, // 2: services.yor.clair.v1.SubmitManifestToScanResponse.repository:type_name -> services.yor.clair.v1.SubmitManifestToScanResponse.RepositoryEntry - 17, // 3: services.yor.clair.v1.SubmitManifestToScanResponse.environments:type_name -> services.yor.clair.v1.SubmitManifestToScanResponse.EnvironmentsEntry - 18, // 4: services.yor.clair.v1.ClairDescriptor.headers:type_name -> services.yor.clair.v1.ClairDescriptor.HeadersEntry - 2, // 5: services.yor.clair.v1.SubmitManifestToScanRequest.layers:type_name -> services.yor.clair.v1.ClairDescriptor - 5, // 6: services.yor.clair.v1.ClairPackage.source:type_name -> services.yor.clair.v1.ClairPackageSource - 25, // 7: services.yor.clair.v1.ClairVulnerability.issued:type_name -> google.protobuf.Timestamp - 6, // 8: services.yor.clair.v1.ClairVulnerability.package:type_name -> services.yor.clair.v1.ClairPackage - 7, // 9: services.yor.clair.v1.ClairVulnerability.distribution:type_name -> services.yor.clair.v1.ClairDistribution - 9, // 10: services.yor.clair.v1.ClairVulnerability.repository:type_name -> services.yor.clair.v1.ClairRepository - 19, // 11: services.yor.clair.v1.GetVulnerabilityReportResponse.packages:type_name -> services.yor.clair.v1.GetVulnerabilityReportResponse.PackagesEntry - 20, // 12: services.yor.clair.v1.GetVulnerabilityReportResponse.distributions:type_name -> services.yor.clair.v1.GetVulnerabilityReportResponse.DistributionsEntry - 21, // 13: services.yor.clair.v1.GetVulnerabilityReportResponse.environments:type_name -> services.yor.clair.v1.GetVulnerabilityReportResponse.EnvironmentsEntry - 22, // 14: services.yor.clair.v1.GetVulnerabilityReportResponse.package_vulnerabilities:type_name -> services.yor.clair.v1.GetVulnerabilityReportResponse.PackageVulnerabilitiesEntry - 11, // 15: services.yor.clair.v1.GetVulnerabilityReportResponse.enrichments:type_name -> services.yor.clair.v1.ClairEnrichment - 23, // 16: services.yor.clair.v1.GetVulnerabilityReportResponse.repository:type_name -> services.yor.clair.v1.GetVulnerabilityReportResponse.RepositoryEntry - 24, // 17: services.yor.clair.v1.GetVulnerabilityReportResponse.vulnerabilities:type_name -> services.yor.clair.v1.GetVulnerabilityReportResponse.VulnerabilitiesEntry - 0, // 18: services.yor.clair.v1.SubmitManifestToScanResponse.PackagesEntry.value:type_name -> services.yor.clair.v1.ClairReportPackage - 7, // 19: services.yor.clair.v1.SubmitManifestToScanResponse.DistributionsEntry.value:type_name -> services.yor.clair.v1.ClairDistribution - 9, // 20: services.yor.clair.v1.SubmitManifestToScanResponse.RepositoryEntry.value:type_name -> services.yor.clair.v1.ClairRepository - 26, // 21: services.yor.clair.v1.SubmitManifestToScanResponse.EnvironmentsEntry.value:type_name -> google.protobuf.ListValue - 26, // 22: services.yor.clair.v1.ClairDescriptor.HeadersEntry.value:type_name -> google.protobuf.ListValue - 6, // 23: services.yor.clair.v1.GetVulnerabilityReportResponse.PackagesEntry.value:type_name -> services.yor.clair.v1.ClairPackage - 7, // 24: services.yor.clair.v1.GetVulnerabilityReportResponse.DistributionsEntry.value:type_name -> services.yor.clair.v1.ClairDistribution - 26, // 25: services.yor.clair.v1.GetVulnerabilityReportResponse.EnvironmentsEntry.value:type_name -> google.protobuf.ListValue - 26, // 26: services.yor.clair.v1.GetVulnerabilityReportResponse.PackageVulnerabilitiesEntry.value:type_name -> google.protobuf.ListValue - 9, // 27: services.yor.clair.v1.GetVulnerabilityReportResponse.RepositoryEntry.value:type_name -> services.yor.clair.v1.ClairRepository - 10, // 28: services.yor.clair.v1.GetVulnerabilityReportResponse.VulnerabilitiesEntry.value:type_name -> services.yor.clair.v1.ClairVulnerability - 3, // 29: services.yor.clair.v1.ClairService.SubmitManifestToScan:input_type -> services.yor.clair.v1.SubmitManifestToScanRequest - 4, // 30: services.yor.clair.v1.ClairService.GetVulnerabilityReport:input_type -> services.yor.clair.v1.GetVulnerabilityReportRequest - 1, // 31: services.yor.clair.v1.ClairService.SubmitManifestToScan:output_type -> services.yor.clair.v1.SubmitManifestToScanResponse - 13, // 32: services.yor.clair.v1.ClairService.GetVulnerabilityReport:output_type -> services.yor.clair.v1.GetVulnerabilityReportResponse - 31, // [31:33] is the sub-list for method output_type - 29, // [29:31] is the sub-list for method input_type - 29, // [29:29] is the sub-list for extension type_name - 29, // [29:29] is the sub-list for extension extendee - 0, // [0:29] is the sub-list for field type_name + 28, // 0: services.yor.clair.v1.EnableVulnerabilityScanningRequest.repository_id:type_name -> common.v1.UUID + 8, // 1: services.yor.clair.v1.ClairReportPackage.source:type_name -> services.yor.clair.v1.ClairPackageSource + 17, // 2: services.yor.clair.v1.SubmitManifestToScanResponse.packages:type_name -> services.yor.clair.v1.SubmitManifestToScanResponse.PackagesEntry + 18, // 3: services.yor.clair.v1.SubmitManifestToScanResponse.distributions:type_name -> services.yor.clair.v1.SubmitManifestToScanResponse.DistributionsEntry + 19, // 4: services.yor.clair.v1.SubmitManifestToScanResponse.repository:type_name -> services.yor.clair.v1.SubmitManifestToScanResponse.RepositoryEntry + 20, // 5: services.yor.clair.v1.SubmitManifestToScanResponse.environments:type_name -> services.yor.clair.v1.SubmitManifestToScanResponse.EnvironmentsEntry + 21, // 6: services.yor.clair.v1.ClairDescriptor.headers:type_name -> services.yor.clair.v1.ClairDescriptor.HeadersEntry + 4, // 7: services.yor.clair.v1.ClairIndexManifestRequest.layers:type_name -> services.yor.clair.v1.ClairDescriptor + 8, // 8: services.yor.clair.v1.ClairPackage.source:type_name -> services.yor.clair.v1.ClairPackageSource + 29, // 9: services.yor.clair.v1.ClairVulnerability.issued:type_name -> google.protobuf.Timestamp + 9, // 10: services.yor.clair.v1.ClairVulnerability.package:type_name -> services.yor.clair.v1.ClairPackage + 10, // 11: services.yor.clair.v1.ClairVulnerability.distribution:type_name -> services.yor.clair.v1.ClairDistribution + 12, // 12: services.yor.clair.v1.ClairVulnerability.repository:type_name -> services.yor.clair.v1.ClairRepository + 22, // 13: services.yor.clair.v1.GetVulnerabilityReportResponse.packages:type_name -> services.yor.clair.v1.GetVulnerabilityReportResponse.PackagesEntry + 23, // 14: services.yor.clair.v1.GetVulnerabilityReportResponse.distributions:type_name -> services.yor.clair.v1.GetVulnerabilityReportResponse.DistributionsEntry + 24, // 15: services.yor.clair.v1.GetVulnerabilityReportResponse.environments:type_name -> services.yor.clair.v1.GetVulnerabilityReportResponse.EnvironmentsEntry + 25, // 16: services.yor.clair.v1.GetVulnerabilityReportResponse.package_vulnerabilities:type_name -> services.yor.clair.v1.GetVulnerabilityReportResponse.PackageVulnerabilitiesEntry + 14, // 17: services.yor.clair.v1.GetVulnerabilityReportResponse.enrichments:type_name -> services.yor.clair.v1.ClairEnrichment + 26, // 18: services.yor.clair.v1.GetVulnerabilityReportResponse.repository:type_name -> services.yor.clair.v1.GetVulnerabilityReportResponse.RepositoryEntry + 27, // 19: services.yor.clair.v1.GetVulnerabilityReportResponse.vulnerabilities:type_name -> services.yor.clair.v1.GetVulnerabilityReportResponse.VulnerabilitiesEntry + 2, // 20: services.yor.clair.v1.SubmitManifestToScanResponse.PackagesEntry.value:type_name -> services.yor.clair.v1.ClairReportPackage + 10, // 21: services.yor.clair.v1.SubmitManifestToScanResponse.DistributionsEntry.value:type_name -> services.yor.clair.v1.ClairDistribution + 12, // 22: services.yor.clair.v1.SubmitManifestToScanResponse.RepositoryEntry.value:type_name -> services.yor.clair.v1.ClairRepository + 30, // 23: services.yor.clair.v1.SubmitManifestToScanResponse.EnvironmentsEntry.value:type_name -> google.protobuf.ListValue + 30, // 24: services.yor.clair.v1.ClairDescriptor.HeadersEntry.value:type_name -> google.protobuf.ListValue + 9, // 25: services.yor.clair.v1.GetVulnerabilityReportResponse.PackagesEntry.value:type_name -> services.yor.clair.v1.ClairPackage + 10, // 26: services.yor.clair.v1.GetVulnerabilityReportResponse.DistributionsEntry.value:type_name -> services.yor.clair.v1.ClairDistribution + 30, // 27: services.yor.clair.v1.GetVulnerabilityReportResponse.EnvironmentsEntry.value:type_name -> google.protobuf.ListValue + 30, // 28: services.yor.clair.v1.GetVulnerabilityReportResponse.PackageVulnerabilitiesEntry.value:type_name -> google.protobuf.ListValue + 12, // 29: services.yor.clair.v1.GetVulnerabilityReportResponse.RepositoryEntry.value:type_name -> services.yor.clair.v1.ClairRepository + 13, // 30: services.yor.clair.v1.GetVulnerabilityReportResponse.VulnerabilitiesEntry.value:type_name -> services.yor.clair.v1.ClairVulnerability + 5, // 31: services.yor.clair.v1.ClairService.SubmitManifestToScan:input_type -> services.yor.clair.v1.SubmitManifestToScanRequest + 6, // 32: services.yor.clair.v1.ClairService.GetVulnerabilityReport:input_type -> services.yor.clair.v1.GetVulnerabilityReportRequest + 0, // 33: services.yor.clair.v1.ClairService.EnableVulnerabilityScanning:input_type -> services.yor.clair.v1.EnableVulnerabilityScanningRequest + 3, // 34: services.yor.clair.v1.ClairService.SubmitManifestToScan:output_type -> services.yor.clair.v1.SubmitManifestToScanResponse + 16, // 35: services.yor.clair.v1.ClairService.GetVulnerabilityReport:output_type -> services.yor.clair.v1.GetVulnerabilityReportResponse + 1, // 36: services.yor.clair.v1.ClairService.EnableVulnerabilityScanning:output_type -> services.yor.clair.v1.EnableVulnerabilityScanningResponse + 34, // [34:37] is the sub-list for method output_type + 31, // [31:34] is the sub-list for method input_type + 31, // [31:31] is the sub-list for extension type_name + 31, // [31:31] is the sub-list for extension extendee + 0, // [0:31] is the sub-list for field type_name } func init() { file_services_yor_clair_v1_clair_proto_init() } @@ -1519,7 +1705,7 @@ func file_services_yor_clair_v1_clair_proto_init() { } if !protoimpl.UnsafeEnabled { file_services_yor_clair_v1_clair_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClairReportPackage); i { + switch v := v.(*EnableVulnerabilityScanningRequest); i { case 0: return &v.state case 1: @@ -1531,7 +1717,7 @@ func file_services_yor_clair_v1_clair_proto_init() { } } file_services_yor_clair_v1_clair_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubmitManifestToScanResponse); i { + switch v := v.(*EnableVulnerabilityScanningResponse); i { case 0: return &v.state case 1: @@ -1543,7 +1729,7 @@ func file_services_yor_clair_v1_clair_proto_init() { } } file_services_yor_clair_v1_clair_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClairDescriptor); i { + switch v := v.(*ClairReportPackage); i { case 0: return &v.state case 1: @@ -1555,7 +1741,7 @@ func file_services_yor_clair_v1_clair_proto_init() { } } file_services_yor_clair_v1_clair_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubmitManifestToScanRequest); i { + switch v := v.(*SubmitManifestToScanResponse); i { case 0: return &v.state case 1: @@ -1567,7 +1753,7 @@ func file_services_yor_clair_v1_clair_proto_init() { } } file_services_yor_clair_v1_clair_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetVulnerabilityReportRequest); i { + switch v := v.(*ClairDescriptor); i { case 0: return &v.state case 1: @@ -1579,7 +1765,7 @@ func file_services_yor_clair_v1_clair_proto_init() { } } file_services_yor_clair_v1_clair_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClairPackageSource); i { + switch v := v.(*SubmitManifestToScanRequest); i { case 0: return &v.state case 1: @@ -1591,7 +1777,7 @@ func file_services_yor_clair_v1_clair_proto_init() { } } file_services_yor_clair_v1_clair_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClairPackage); i { + switch v := v.(*GetVulnerabilityReportRequest); i { case 0: return &v.state case 1: @@ -1603,7 +1789,7 @@ func file_services_yor_clair_v1_clair_proto_init() { } } file_services_yor_clair_v1_clair_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClairDistribution); i { + switch v := v.(*ClairIndexManifestRequest); i { case 0: return &v.state case 1: @@ -1615,7 +1801,7 @@ func file_services_yor_clair_v1_clair_proto_init() { } } file_services_yor_clair_v1_clair_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClairEnvironmentItem); i { + switch v := v.(*ClairPackageSource); i { case 0: return &v.state case 1: @@ -1627,7 +1813,7 @@ func file_services_yor_clair_v1_clair_proto_init() { } } file_services_yor_clair_v1_clair_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClairRepository); i { + switch v := v.(*ClairPackage); i { case 0: return &v.state case 1: @@ -1639,7 +1825,7 @@ func file_services_yor_clair_v1_clair_proto_init() { } } file_services_yor_clair_v1_clair_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClairVulnerability); i { + switch v := v.(*ClairDistribution); i { case 0: return &v.state case 1: @@ -1651,7 +1837,7 @@ func file_services_yor_clair_v1_clair_proto_init() { } } file_services_yor_clair_v1_clair_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClairEnrichment); i { + switch v := v.(*ClairEnvironmentItem); i { case 0: return &v.state case 1: @@ -1663,7 +1849,7 @@ func file_services_yor_clair_v1_clair_proto_init() { } } file_services_yor_clair_v1_clair_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClairVulnerabilityIdList); i { + switch v := v.(*ClairRepository); i { case 0: return &v.state case 1: @@ -1675,6 +1861,42 @@ func file_services_yor_clair_v1_clair_proto_init() { } } file_services_yor_clair_v1_clair_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClairVulnerability); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_services_yor_clair_v1_clair_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClairEnrichment); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_services_yor_clair_v1_clair_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClairVulnerabilityIdList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_services_yor_clair_v1_clair_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetVulnerabilityReportResponse); i { case 0: return &v.state @@ -1693,7 +1915,7 @@ func file_services_yor_clair_v1_clair_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_services_yor_clair_v1_clair_proto_rawDesc, NumEnums: 0, - NumMessages: 25, + NumMessages: 28, NumExtensions: 0, NumServices: 1, }, diff --git a/services/yor/clair/v1/clair.pb.validate.go b/services/yor/clair/v1/clair.pb.validate.go index 199e7e39..c98cb754 100644 --- a/services/yor/clair/v1/clair.pb.validate.go +++ b/services/yor/clair/v1/clair.pb.validate.go @@ -35,6 +35,247 @@ var ( _ = sort.Sort ) +// Validate checks the field values on EnableVulnerabilityScanningRequest with +// the rules defined in the proto definition for this message. If any rules +// are violated, the first error encountered is returned, or nil if there are +// no violations. +func (m *EnableVulnerabilityScanningRequest) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on EnableVulnerabilityScanningRequest +// with the rules defined in the proto definition for this message. If any +// rules are violated, the result is a list of violation errors wrapped in +// EnableVulnerabilityScanningRequestMultiError, or nil if none found. +func (m *EnableVulnerabilityScanningRequest) ValidateAll() error { + return m.validate(true) +} + +func (m *EnableVulnerabilityScanningRequest) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if all { + switch v := interface{}(m.GetRepositoryId()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, EnableVulnerabilityScanningRequestValidationError{ + field: "RepositoryId", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, EnableVulnerabilityScanningRequestValidationError{ + field: "RepositoryId", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetRepositoryId()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return EnableVulnerabilityScanningRequestValidationError{ + field: "RepositoryId", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if len(errors) > 0 { + return EnableVulnerabilityScanningRequestMultiError(errors) + } + + return nil +} + +// EnableVulnerabilityScanningRequestMultiError is an error wrapping multiple +// validation errors returned by +// EnableVulnerabilityScanningRequest.ValidateAll() if the designated +// constraints aren't met. +type EnableVulnerabilityScanningRequestMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m EnableVulnerabilityScanningRequestMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m EnableVulnerabilityScanningRequestMultiError) AllErrors() []error { return m } + +// EnableVulnerabilityScanningRequestValidationError is the validation error +// returned by EnableVulnerabilityScanningRequest.Validate if the designated +// constraints aren't met. +type EnableVulnerabilityScanningRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e EnableVulnerabilityScanningRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e EnableVulnerabilityScanningRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e EnableVulnerabilityScanningRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e EnableVulnerabilityScanningRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e EnableVulnerabilityScanningRequestValidationError) ErrorName() string { + return "EnableVulnerabilityScanningRequestValidationError" +} + +// Error satisfies the builtin error interface +func (e EnableVulnerabilityScanningRequestValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sEnableVulnerabilityScanningRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = EnableVulnerabilityScanningRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = EnableVulnerabilityScanningRequestValidationError{} + +// Validate checks the field values on EnableVulnerabilityScanningResponse with +// the rules defined in the proto definition for this message. If any rules +// are violated, the first error encountered is returned, or nil if there are +// no violations. +func (m *EnableVulnerabilityScanningResponse) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on EnableVulnerabilityScanningResponse +// with the rules defined in the proto definition for this message. If any +// rules are violated, the result is a list of violation errors wrapped in +// EnableVulnerabilityScanningResponseMultiError, or nil if none found. +func (m *EnableVulnerabilityScanningResponse) ValidateAll() error { + return m.validate(true) +} + +func (m *EnableVulnerabilityScanningResponse) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Message + + if len(errors) > 0 { + return EnableVulnerabilityScanningResponseMultiError(errors) + } + + return nil +} + +// EnableVulnerabilityScanningResponseMultiError is an error wrapping multiple +// validation errors returned by +// EnableVulnerabilityScanningResponse.ValidateAll() if the designated +// constraints aren't met. +type EnableVulnerabilityScanningResponseMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m EnableVulnerabilityScanningResponseMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m EnableVulnerabilityScanningResponseMultiError) AllErrors() []error { return m } + +// EnableVulnerabilityScanningResponseValidationError is the validation error +// returned by EnableVulnerabilityScanningResponse.Validate if the designated +// constraints aren't met. +type EnableVulnerabilityScanningResponseValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e EnableVulnerabilityScanningResponseValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e EnableVulnerabilityScanningResponseValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e EnableVulnerabilityScanningResponseValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e EnableVulnerabilityScanningResponseValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e EnableVulnerabilityScanningResponseValidationError) ErrorName() string { + return "EnableVulnerabilityScanningResponseValidationError" +} + +// Error satisfies the builtin error interface +func (e EnableVulnerabilityScanningResponseValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sEnableVulnerabilityScanningResponse.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = EnableVulnerabilityScanningResponseValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = EnableVulnerabilityScanningResponseValidationError{} + // Validate checks the field values on ClairReportPackage with the rules // defined in the proto definition for this message. If any rules are // violated, the first error encountered is returned, or nil if there are no violations. @@ -67,6 +308,35 @@ func (m *ClairReportPackage) validate(all bool) error { // no validation rules for Arch + if all { + switch v := interface{}(m.GetSource()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ClairReportPackageValidationError{ + field: "Source", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ClairReportPackageValidationError{ + field: "Source", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetSource()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ClairReportPackageValidationError{ + field: "Source", + reason: "embedded message failed validation", + cause: err, + } + } + } + if len(errors) > 0 { return ClairReportPackageMultiError(errors) } @@ -616,40 +886,6 @@ func (m *SubmitManifestToScanRequest) validate(all bool) error { // no validation rules for Hash - for idx, item := range m.GetLayers() { - _, _ = idx, item - - if all { - switch v := interface{}(item).(type) { - case interface{ ValidateAll() error }: - if err := v.ValidateAll(); err != nil { - errors = append(errors, SubmitManifestToScanRequestValidationError{ - field: fmt.Sprintf("Layers[%v]", idx), - reason: "embedded message failed validation", - cause: err, - }) - } - case interface{ Validate() error }: - if err := v.Validate(); err != nil { - errors = append(errors, SubmitManifestToScanRequestValidationError{ - field: fmt.Sprintf("Layers[%v]", idx), - reason: "embedded message failed validation", - cause: err, - }) - } - } - } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { - if err := v.Validate(); err != nil { - return SubmitManifestToScanRequestValidationError{ - field: fmt.Sprintf("Layers[%v]", idx), - reason: "embedded message failed validation", - cause: err, - } - } - } - - } - if len(errors) > 0 { return SubmitManifestToScanRequestMultiError(errors) } @@ -836,6 +1072,144 @@ var _ interface { ErrorName() string } = GetVulnerabilityReportRequestValidationError{} +// Validate checks the field values on ClairIndexManifestRequest with the rules +// defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *ClairIndexManifestRequest) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on ClairIndexManifestRequest with the +// rules defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// ClairIndexManifestRequestMultiError, or nil if none found. +func (m *ClairIndexManifestRequest) ValidateAll() error { + return m.validate(true) +} + +func (m *ClairIndexManifestRequest) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Hash + + for idx, item := range m.GetLayers() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ClairIndexManifestRequestValidationError{ + field: fmt.Sprintf("Layers[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ClairIndexManifestRequestValidationError{ + field: fmt.Sprintf("Layers[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ClairIndexManifestRequestValidationError{ + field: fmt.Sprintf("Layers[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + if len(errors) > 0 { + return ClairIndexManifestRequestMultiError(errors) + } + + return nil +} + +// ClairIndexManifestRequestMultiError is an error wrapping multiple validation +// errors returned by ClairIndexManifestRequest.ValidateAll() if the +// designated constraints aren't met. +type ClairIndexManifestRequestMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m ClairIndexManifestRequestMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m ClairIndexManifestRequestMultiError) AllErrors() []error { return m } + +// ClairIndexManifestRequestValidationError is the validation error returned by +// ClairIndexManifestRequest.Validate if the designated constraints aren't met. +type ClairIndexManifestRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e ClairIndexManifestRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e ClairIndexManifestRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e ClairIndexManifestRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e ClairIndexManifestRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e ClairIndexManifestRequestValidationError) ErrorName() string { + return "ClairIndexManifestRequestValidationError" +} + +// Error satisfies the builtin error interface +func (e ClairIndexManifestRequestValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sClairIndexManifestRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = ClairIndexManifestRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = ClairIndexManifestRequestValidationError{} + // Validate checks the field values on ClairPackageSource with the rules // defined in the proto definition for this message. If any rules are // violated, the first error encountered is returned, or nil if there are no violations. diff --git a/services/yor/clair/v1/clairconnect/clair.connect.go b/services/yor/clair/v1/clairconnect/clair.connect.go index b364fb77..db62506a 100644 --- a/services/yor/clair/v1/clairconnect/clair.connect.go +++ b/services/yor/clair/v1/clairconnect/clair.connect.go @@ -39,12 +39,16 @@ const ( // ClairServiceGetVulnerabilityReportProcedure is the fully-qualified name of the ClairService's // GetVulnerabilityReport RPC. ClairServiceGetVulnerabilityReportProcedure = "/services.yor.clair.v1.ClairService/GetVulnerabilityReport" + // ClairServiceEnableVulnerabilityScanningProcedure is the fully-qualified name of the + // ClairService's EnableVulnerabilityScanning RPC. + ClairServiceEnableVulnerabilityScanningProcedure = "/services.yor.clair.v1.ClairService/EnableVulnerabilityScanning" ) // ClairServiceClient is a client for the services.yor.clair.v1.ClairService service. type ClairServiceClient interface { SubmitManifestToScan(context.Context, *connect_go.Request[v1.SubmitManifestToScanRequest]) (*connect_go.Response[v1.SubmitManifestToScanResponse], error) GetVulnerabilityReport(context.Context, *connect_go.Request[v1.GetVulnerabilityReportRequest]) (*connect_go.Response[v1.GetVulnerabilityReportResponse], error) + EnableVulnerabilityScanning(context.Context, *connect_go.Request[v1.EnableVulnerabilityScanningRequest]) (*connect_go.Response[v1.EnableVulnerabilityScanningResponse], error) } // NewClairServiceClient constructs a client for the services.yor.clair.v1.ClairService service. By @@ -67,13 +71,19 @@ func NewClairServiceClient(httpClient connect_go.HTTPClient, baseURL string, opt baseURL+ClairServiceGetVulnerabilityReportProcedure, opts..., ), + enableVulnerabilityScanning: connect_go.NewClient[v1.EnableVulnerabilityScanningRequest, v1.EnableVulnerabilityScanningResponse]( + httpClient, + baseURL+ClairServiceEnableVulnerabilityScanningProcedure, + opts..., + ), } } // clairServiceClient implements ClairServiceClient. type clairServiceClient struct { - submitManifestToScan *connect_go.Client[v1.SubmitManifestToScanRequest, v1.SubmitManifestToScanResponse] - getVulnerabilityReport *connect_go.Client[v1.GetVulnerabilityReportRequest, v1.GetVulnerabilityReportResponse] + submitManifestToScan *connect_go.Client[v1.SubmitManifestToScanRequest, v1.SubmitManifestToScanResponse] + getVulnerabilityReport *connect_go.Client[v1.GetVulnerabilityReportRequest, v1.GetVulnerabilityReportResponse] + enableVulnerabilityScanning *connect_go.Client[v1.EnableVulnerabilityScanningRequest, v1.EnableVulnerabilityScanningResponse] } // SubmitManifestToScan calls services.yor.clair.v1.ClairService.SubmitManifestToScan. @@ -86,10 +96,16 @@ func (c *clairServiceClient) GetVulnerabilityReport(ctx context.Context, req *co return c.getVulnerabilityReport.CallUnary(ctx, req) } +// EnableVulnerabilityScanning calls services.yor.clair.v1.ClairService.EnableVulnerabilityScanning. +func (c *clairServiceClient) EnableVulnerabilityScanning(ctx context.Context, req *connect_go.Request[v1.EnableVulnerabilityScanningRequest]) (*connect_go.Response[v1.EnableVulnerabilityScanningResponse], error) { + return c.enableVulnerabilityScanning.CallUnary(ctx, req) +} + // ClairServiceHandler is an implementation of the services.yor.clair.v1.ClairService service. type ClairServiceHandler interface { SubmitManifestToScan(context.Context, *connect_go.Request[v1.SubmitManifestToScanRequest]) (*connect_go.Response[v1.SubmitManifestToScanResponse], error) GetVulnerabilityReport(context.Context, *connect_go.Request[v1.GetVulnerabilityReportRequest]) (*connect_go.Response[v1.GetVulnerabilityReportResponse], error) + EnableVulnerabilityScanning(context.Context, *connect_go.Request[v1.EnableVulnerabilityScanningRequest]) (*connect_go.Response[v1.EnableVulnerabilityScanningResponse], error) } // NewClairServiceHandler builds an HTTP handler from the service implementation. It returns the @@ -108,12 +124,19 @@ func NewClairServiceHandler(svc ClairServiceHandler, opts ...connect_go.HandlerO svc.GetVulnerabilityReport, opts..., ) + clairServiceEnableVulnerabilityScanningHandler := connect_go.NewUnaryHandler( + ClairServiceEnableVulnerabilityScanningProcedure, + svc.EnableVulnerabilityScanning, + opts..., + ) return "/services.yor.clair.v1.ClairService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch r.URL.Path { case ClairServiceSubmitManifestToScanProcedure: clairServiceSubmitManifestToScanHandler.ServeHTTP(w, r) case ClairServiceGetVulnerabilityReportProcedure: clairServiceGetVulnerabilityReportHandler.ServeHTTP(w, r) + case ClairServiceEnableVulnerabilityScanningProcedure: + clairServiceEnableVulnerabilityScanningHandler.ServeHTTP(w, r) default: http.NotFound(w, r) } @@ -130,3 +153,7 @@ func (UnimplementedClairServiceHandler) SubmitManifestToScan(context.Context, *c func (UnimplementedClairServiceHandler) GetVulnerabilityReport(context.Context, *connect_go.Request[v1.GetVulnerabilityReportRequest]) (*connect_go.Response[v1.GetVulnerabilityReportResponse], error) { return nil, connect_go.NewError(connect_go.CodeUnimplemented, errors.New("services.yor.clair.v1.ClairService.GetVulnerabilityReport is not implemented")) } + +func (UnimplementedClairServiceHandler) EnableVulnerabilityScanning(context.Context, *connect_go.Request[v1.EnableVulnerabilityScanningRequest]) (*connect_go.Response[v1.EnableVulnerabilityScanningResponse], error) { + return nil, connect_go.NewError(connect_go.CodeUnimplemented, errors.New("services.yor.clair.v1.ClairService.EnableVulnerabilityScanning is not implemented")) +} diff --git a/services/yor/clair/v1/server/clair.go b/services/yor/clair/v1/server/clair.go index 97b58004..21309aaf 100644 --- a/services/yor/clair/v1/server/clair.go +++ b/services/yor/clair/v1/server/clair.go @@ -13,6 +13,16 @@ import ( "google.golang.org/protobuf/encoding/protojson" ) +func (c *clair) EnableVulnerabilityScanning( + ctx context.Context, + req *connect.Request[clair_v1.EnableVulnerabilityScanningRequest], +) ( + *connect.Response[clair_v1.EnableVulnerabilityScanningResponse], + error, +) { + return nil, connect.NewError(connect.CodeUnimplemented, fmt.Errorf("UNIMPLEMENTED")) +} + func (c *clair) GetVulnerabilityReport( ctx context.Context, req *connect.Request[clair_v1.GetVulnerabilityReportRequest], @@ -71,7 +81,31 @@ func (c *clair) SubmitManifestToScan( logEvent.Str("manifest", req.Msg.GetHash()) - result, err := c.submitManifest(ctx, req.Msg) + dfsLinks, err := c.layerLinkReader(ctx, req.Msg.GetHash()) + if err != nil { + logEvent.Err(err).Send() + return nil, connect.NewError(connect.CodeInvalidArgument, err) + } + + layers := make([]*clair_v1.ClairDescriptor, len(dfsLinks)) + for i, link := range dfsLinks { + presignedURL, signErr := c.prePresignedURLGenerator(ctx, link.DFSLink) + if signErr != nil { + logEvent.Err(err).Send() + return nil, connect.NewError(connect.CodeInvalidArgument, err) + } + layers[i] = &clair_v1.ClairDescriptor{ + Hash: link.Digest, + Uri: presignedURL, + } + } + + body := &clair_v1.ClairIndexManifestRequest{ + Hash: req.Msg.GetHash(), + Layers: layers, + } + + result, err := c.submitManifest(ctx, body) if err != nil { logEvent.Err(err).Send() return nil, connect.NewError(connect.CodeInvalidArgument, err) @@ -113,7 +147,7 @@ func (c *clair) getVulnReport(ctx context.Context, manifestID string) (io.ReadCl func (c *clair) submitManifest( ctx context.Context, - manifest *clair_v1.SubmitManifestToScanRequest, + manifest *clair_v1.ClairIndexManifestRequest, ) (io.ReadCloser, error) { uri := fmt.Sprintf("%s/indexer/api/v1/index_report", c.config.ClairEndpoint) diff --git a/services/yor/clair/v1/server/interceptors.go b/services/yor/clair/v1/server/interceptors.go new file mode 100644 index 00000000..3e08bbdb --- /dev/null +++ b/services/yor/clair/v1/server/interceptors.go @@ -0,0 +1,124 @@ +package server + +import ( + "context" + "crypto/rsa" + "fmt" + "net/http" + "net/url" + "strings" + + "github.com/bufbuild/connect-go" + "github.com/containerish/OpenRegistry/auth" + "github.com/containerish/OpenRegistry/store/v1/types" + "github.com/golang-jwt/jwt/v5" + "github.com/google/uuid" +) + +// NewJWTInterceptor is a UnaryInterceptorFunc that inspects and tries to parse a JWT from the request. +// If the JWT is invalid, an Unauthorized error is returned +func (c *clair) NewJWTInterceptor() connect.UnaryInterceptorFunc { + return connect.UnaryInterceptorFunc(func(next connect.UnaryFunc) connect.UnaryFunc { + return connect.UnaryFunc(func(ctx context.Context, req connect.AnyRequest) (connect.AnyResponse, error) { + logEvent := c.logger.Debug().Str("procedure", req.Spec().Procedure) + + userID, err := c.getTokenFromReq(req, c.authConfig.JWTSigningPubKey) + if err != nil { + return nil, err + } + + user, err := c.userGetter.GetUserByID(ctx, userID) + if err != nil { + logEvent.Str("error", err.Error()).Send() + return nil, connect.NewError(connect.CodeFailedPrecondition, err) + } + + logEvent.Bool("success", true).Send() + ctx = context.WithValue(ctx, types.UserContextKey, user) + return next(ctx, req) + }) + }) +} + +func (c *clair) getTokenFromReq(req connect.AnyRequest, jwtSigningPubKey *rsa.PublicKey) (uuid.UUID, error) { + token, err := c.tryTokenFromReqHeaders(req, jwtSigningPubKey) + if err != nil { + token, err = c.tryTokenFromReqCookies(req, jwtSigningPubKey) + if err != nil { + return uuid.Nil, fmt.Errorf("getTokenFromReq: tryTokenFromReqCookies: %w", err) + } + } + + return token, nil +} + +func (c *clair) tryTokenFromReqCookies(req connect.AnyRequest, jwtSigningPubKey *rsa.PublicKey) (uuid.UUID, error) { + tmpReq := http.Request{Header: req.Header()} + sessionCookie, err := tmpReq.Cookie("access") + if err != nil { + return uuid.Nil, fmt.Errorf("tryTokenFromReqCookies: ERR_NO_COOKIE: %w", err) + } + + authToken, err := url.QueryUnescape(sessionCookie.Value) + if err != nil { + return uuid.Nil, fmt.Errorf("tryTokenFromReqCookies: ERR_WRONG_ENCODING: %w", err) + } + + if authToken != "" { + claims := &auth.Claims{} + token, err := jwt.ParseWithClaims(authToken, claims, func(t *jwt.Token) (interface{}, error) { + return jwtSigningPubKey, nil + }) + if err != nil { + return uuid.Nil, fmt.Errorf("tryTokenFromReqHeaders: ERR_JWT_CLAIM_PARSE: %w", err) + } + + claims, ok := token.Claims.(*auth.Claims) + if !ok { + return uuid.Nil, fmt.Errorf("tryTokenFromReqHeaders: error parsing claims from token") + } + + parsedID, err := uuid.Parse(claims.Subject) + if err != nil { + return uuid.Nil, fmt.Errorf("tryTokenFromReqHeaders: ERR_UUID_PARSE: %w", err) + } + + return parsedID, nil + } + + errMsg := fmt.Errorf("auth token contains invalid parts") + return uuid.Nil, errMsg +} + +func (c *clair) tryTokenFromReqHeaders(req connect.AnyRequest, jwtSigningPubKey *rsa.PublicKey) (uuid.UUID, error) { + authToken := req.Header().Get("Authorization") + tokenParts := strings.Split(authToken, " ") + if len(tokenParts) == 2 { + if !strings.EqualFold(tokenParts[0], "Bearer") { + errMsg := fmt.Errorf("tryTokenFromReqHeaders: invalid authorization scheme") + return uuid.Nil, errMsg + } + + claims := &auth.Claims{} + token, err := jwt.ParseWithClaims(tokenParts[1], claims, func(t *jwt.Token) (interface{}, error) { + return jwtSigningPubKey, nil + }) + if err != nil { + return uuid.Nil, fmt.Errorf("tryTokenFromReqHeaders: ERR_JWT_CLAIM_PARSE: %w", err) + } + + claims, ok := token.Claims.(*auth.Claims) + if !ok { + return uuid.Nil, fmt.Errorf("tryTokenFromReqHeaders: error parsing claims from token") + } + + parsedID, err := uuid.Parse(claims.Subject) + if err != nil { + return uuid.Nil, fmt.Errorf("tryTokenFromReqHeaders: ERR_UUID_PARSE: %w", err) + } + return parsedID, nil + } + + errMsg := fmt.Errorf("auth token contains invalid parts") + return uuid.Nil, errMsg +} diff --git a/services/yor/clair/v1/server/server.go b/services/yor/clair/v1/server/server.go index 10af3844..28ab1bf8 100644 --- a/services/yor/clair/v1/server/server.go +++ b/services/yor/clair/v1/server/server.go @@ -1,27 +1,42 @@ package server import ( + "context" "net/http" "sync" "time" + "github.com/bufbuild/connect-go" "github.com/containerish/OpenRegistry/config" connect_v1 "github.com/containerish/OpenRegistry/services/yor/clair/v1/clairconnect" + "github.com/containerish/OpenRegistry/store/v1/types" + "github.com/containerish/OpenRegistry/store/v1/users" "github.com/containerish/OpenRegistry/telemetry" ) type ( clair struct { - http *http.Client - logger telemetry.Logger - config *config.ClairIntegration - mu *sync.RWMutex + http *http.Client + logger telemetry.Logger + config *config.ClairIntegration + userGetter users.UserStore + authConfig *config.Auth + mu *sync.RWMutex + layerLinkReader LayerLinkReader + prePresignedURLGenerator PresignedURLGenerator } + + LayerLinkReader func(ctx context.Context, manifestDigest string) ([]*types.ContainerImageLayer, error) + PresignedURLGenerator func(ctx context.Context, path string) (string, error) ) func NewClairClient( + userStore users.UserStore, config *config.ClairIntegration, + authConfig *config.Auth, logger telemetry.Logger, + layerLinkReader LayerLinkReader, + prePresignedURLGenerator PresignedURLGenerator, ) *http.ServeMux { if !config.Enabled { return nil @@ -33,14 +48,18 @@ func NewClairClient( } server := &clair{ - logger: logger, - config: config, - mu: &sync.RWMutex{}, - http: httpClient, + logger: logger, + config: config, + mu: &sync.RWMutex{}, + http: httpClient, + userGetter: userStore, + authConfig: authConfig, + layerLinkReader: layerLinkReader, + prePresignedURLGenerator: prePresignedURLGenerator, } - // interceptors := connect.WithInterceptors(NewGithubAppInterceptor(logger, ghStore, nil, authConfig)) + interceptors := connect.WithInterceptors(server.NewJWTInterceptor()) mux := http.NewServeMux() - mux.Handle(connect_v1.NewClairServiceHandler(server)) + mux.Handle(connect_v1.NewClairServiceHandler(server, interceptors)) return mux } diff --git a/store/v1/registry/registry_impl.go b/store/v1/registry/registry_impl.go index 75d745d9..5b9d896a 100644 --- a/store/v1/registry/registry_impl.go +++ b/store/v1/registry/registry_impl.go @@ -790,7 +790,10 @@ func (s *registryStore) RemoveRepositoryFromFavorites(ctx context.Context, repoI ) } -func (s *registryStore) GetLayersLinksForManifest(ctx context.Context, manifestDigest string) ([]*types.ContainerImageLayer, error) { +func (s *registryStore) GetLayersLinksForManifest( + ctx context.Context, + manifestDigest string, +) ([]*types.ContainerImageLayer, error) { logEvent := s.logger.Debug().Str("method", "GetLayersLinksForManifest").Str("digest", manifestDigest) manifest := &types.ImageManifest{}