diff --git a/admin/database/database.go b/admin/database/database.go index 2f99b74c5a8..f2719eda1eb 100644 --- a/admin/database/database.go +++ b/admin/database/database.go @@ -179,6 +179,8 @@ type DB interface { FindBookmark(ctx context.Context, bookmarkID string) (*Bookmark, error) InsertBookmark(ctx context.Context, opts *InsertBookmarkOptions) (*Bookmark, error) DeleteBookmark(ctx context.Context, bookmarkID string) error + + SearchProjectUsers(ctx context.Context, projectID, emailQuery string, afterEmail string, limit int) ([]*User, error) } // Tx represents a database transaction. It can only be used to commit and rollback transactions. diff --git a/admin/database/postgres/postgres.go b/admin/database/postgres/postgres.go index 3cd39da746d..64e262407c2 100644 --- a/admin/database/postgres/postgres.go +++ b/admin/database/postgres/postgres.go @@ -521,6 +521,25 @@ func (c *connection) FindUsersByEmailPattern(ctx context.Context, emailPattern, return res, nil } +// SearchProjectUsers searches for users that have access to the project. +func (c *connection) SearchProjectUsers(ctx context.Context, projectID, emailQuery, afterEmail string, limit int) ([]*database.User, error) { + var res []*database.User + err := c.getDB(ctx).SelectContext(ctx, &res, ` + SELECT u.* FROM users u + WHERE u.id IN ( + SELECT upr.user_id FROM users_projects_roles upr WHERE upr.project_id=$1 + UNION + SELECT ugu.user_id FROM usergroups_projects_roles ugpr JOIN usergroups_users ugu ON ugpr.usergroup_id = ugu.usergroup_id WHERE ugpr.project_id=$1 + ) + AND lower(u.email) LIKE lower($2) + AND lower(u.email) > lower($3) + ORDER BY lower(u.email) ASC LIMIT $4`, projectID, emailQuery, afterEmail, limit) + if err != nil { + return nil, parseErr("users", err) + } + return res, nil +} + func (c *connection) InsertUser(ctx context.Context, opts *database.InsertUserOptions) (*database.User, error) { if err := database.Validate(opts); err != nil { return nil, err diff --git a/admin/deployments.go b/admin/deployments.go index 74d5a2b9323..7c6391c5be8 100644 --- a/admin/deployments.go +++ b/admin/deployments.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" "path" + "strconv" "strings" "time" @@ -57,21 +58,40 @@ func (s *Service) createDeployment(ctx context.Context, opts *createDeploymentOp // Build instance config instanceID := strings.ReplaceAll(uuid.New().String(), "-", "") olapDriver := opts.ProdOLAPDriver - olapDSN := opts.ProdOLAPDSN + olapConfig := map[string]string{} var embedCatalog bool var ingestionLimit int64 - if olapDriver == "duckdb" { - if olapDSN != "" { + switch olapDriver { + case "duckdb": + if opts.ProdOLAPDSN != "" { return nil, fmt.Errorf("passing a DSN is not allowed for driver 'duckdb'") } if opts.ProdSlots == 0 { return nil, fmt.Errorf("slot count can't be 0 for driver 'duckdb'") } + olapConfig["dsn"] = fmt.Sprintf("%s.db?max_memory=%dGB", path.Join(alloc.DataDir, instanceID), alloc.MemoryGB) + olapConfig["pool_size"] = strconv.Itoa(alloc.CPU) embedCatalog = true ingestionLimit = alloc.StorageBytes + case "duckdb-vip": + if opts.ProdOLAPDSN != "" { + return nil, fmt.Errorf("passing a DSN is not allowed for driver 'duckdb-vip'") + } + if opts.ProdSlots == 0 { + return nil, fmt.Errorf("slot count can't be 0 for driver 'duckdb-vip'") + } - olapDSN = fmt.Sprintf("%s.db?rill_pool_size=%d&max_memory=%dGB", path.Join(alloc.DataDir, instanceID), alloc.CPU, alloc.MemoryGB) + // NOTE: Rewriting to a "duckdb" driver without CPU, memory, or storage limits + olapDriver = "duckdb" + olapConfig["dsn"] = fmt.Sprintf("%s.db", path.Join(alloc.DataDir, instanceID)) + olapConfig["pool_size"] = "8" + embedCatalog = true + ingestionLimit = 0 + default: + olapConfig["dsn"] = opts.ProdOLAPDSN + embedCatalog = false + ingestionLimit = 0 } // Open a runtime client @@ -94,7 +114,7 @@ func (s *Service) createDeployment(ctx context.Context, opts *createDeploymentOp { Name: "olap", Type: olapDriver, - Config: map[string]string{"dsn": olapDSN}, + Config: olapConfig, }, { Name: "repo", diff --git a/admin/permissions.go b/admin/permissions.go new file mode 100644 index 00000000000..69cba593241 --- /dev/null +++ b/admin/permissions.go @@ -0,0 +1,126 @@ +package admin + +import ( + "context" + + "github.com/rilldata/rill/admin/database" + adminv1 "github.com/rilldata/rill/proto/gen/rill/admin/v1" +) + +// OrganizationPermissionsForUser resolves organization permissions for a user. +func (s *Service) OrganizationPermissionsForUser(ctx context.Context, orgID, userID string) (*adminv1.OrganizationPermissions, error) { + roles, err := s.DB.ResolveOrganizationRolesForUser(ctx, userID, orgID) + if err != nil { + return nil, err + } + + composite := &adminv1.OrganizationPermissions{} + for _, role := range roles { + composite = unionOrgRoles(composite, role) + } + + return composite, nil +} + +// OrganizationPermissionsForService resolves organization permissions for a service. +// A service currently gets full permissions on the org they belong to. +func (s *Service) OrganizationPermissionsForService(ctx context.Context, orgID, serviceID string) (*adminv1.OrganizationPermissions, error) { + service, err := s.DB.FindService(ctx, serviceID) + if err != nil { + return nil, err + } + + // Services get full permissions on the org they belong to + if orgID == service.OrgID { + return &adminv1.OrganizationPermissions{ + ReadOrg: true, + ManageOrg: true, + ReadProjects: true, + CreateProjects: true, + ManageProjects: true, + ReadOrgMembers: true, + ManageOrgMembers: true, + }, nil + } + + return &adminv1.OrganizationPermissions{}, nil +} + +// ProjectPermissionsForUser resolves project permissions for a user. +func (s *Service) ProjectPermissionsForUser(ctx context.Context, projectID, userID string, orgPerms *adminv1.OrganizationPermissions) (*adminv1.ProjectPermissions, error) { + // ManageProjects permission on the org gives full access to all projects in the org (only org admins have this) + if orgPerms.ManageProjects { + return &adminv1.ProjectPermissions{ + ReadProject: true, + ManageProject: true, + ReadProd: true, + ReadProdStatus: true, + ManageProd: true, + ReadDev: true, + ReadDevStatus: true, + ManageDev: true, + ReadProjectMembers: true, + ManageProjectMembers: true, + }, nil + } + + roles, err := s.DB.ResolveProjectRolesForUser(ctx, userID, projectID) + if err != nil { + return nil, err + } + + composite := &adminv1.ProjectPermissions{} + for _, role := range roles { + composite = unionProjectRoles(composite, role) + } + + return composite, nil +} + +// ProjectPermissionsService resolves project permissions for a service. +// A service currently gets full permissions on all projects in the org they belong to. +func (s *Service) ProjectPermissionsForService(ctx context.Context, projectID, serviceID string, orgPerms *adminv1.OrganizationPermissions) (*adminv1.ProjectPermissions, error) { + if orgPerms.ManageProjects { + return &adminv1.ProjectPermissions{ + ReadProject: true, + ManageProject: true, + ReadProd: true, + ReadProdStatus: true, + ManageProd: true, + ReadDev: true, + ReadDevStatus: true, + ManageDev: true, + ReadProjectMembers: true, + ManageProjectMembers: true, + }, nil + } + + return &adminv1.ProjectPermissions{}, nil +} + +func unionOrgRoles(a *adminv1.OrganizationPermissions, b *database.OrganizationRole) *adminv1.OrganizationPermissions { + return &adminv1.OrganizationPermissions{ + ReadOrg: a.ReadOrg || b.ReadOrg, + ManageOrg: a.ManageOrg || b.ManageOrg, + ReadProjects: a.ReadProjects || b.ReadProjects, + CreateProjects: a.CreateProjects || b.CreateProjects, + ManageProjects: a.ManageProjects || b.ManageProjects, + ReadOrgMembers: a.ReadOrgMembers || b.ReadOrgMembers, + ManageOrgMembers: a.ManageOrgMembers || b.ManageOrgMembers, + } +} + +func unionProjectRoles(a *adminv1.ProjectPermissions, b *database.ProjectRole) *adminv1.ProjectPermissions { + return &adminv1.ProjectPermissions{ + ReadProject: a.ReadProject || b.ReadProject, + ManageProject: a.ManageProject || b.ManageProject, + ReadProd: a.ReadProd || b.ReadProd, + ReadProdStatus: a.ReadProdStatus || b.ReadProdStatus, + ManageProd: a.ManageProd || b.ManageProd, + ReadDev: a.ReadDev || b.ReadDev, + ReadDevStatus: a.ReadDevStatus || b.ReadDevStatus, + ManageDev: a.ManageDev || b.ManageDev, + ReadProjectMembers: a.ReadProjectMembers || b.ReadProjectMembers, + ManageProjectMembers: a.ManageProjectMembers || b.ManageProjectMembers, + } +} diff --git a/admin/provisioner/provisioner.go b/admin/provisioner/provisioner.go index 4c19fd21e0c..135362f28f5 100644 --- a/admin/provisioner/provisioner.go +++ b/admin/provisioner/provisioner.go @@ -91,6 +91,6 @@ func (p *StaticProvisioner) Provision(ctx context.Context, opts *ProvisionOption DataDir: target.DataDir, CPU: 1 * opts.Slots, MemoryGB: 2 * opts.Slots, - StorageBytes: int64(opts.Slots) * 10 * int64(datasize.GB), + StorageBytes: int64(opts.Slots) * 40 * int64(datasize.GB), }, nil } diff --git a/admin/provisioner/provisioner_test.go b/admin/provisioner/provisioner_test.go index a1b42653973..9b0ec87b2d0 100644 --- a/admin/provisioner/provisioner_test.go +++ b/admin/provisioner/provisioner_test.go @@ -87,14 +87,14 @@ func Test_staticProvisioner_Provision(t *testing.T) { name: "all applicable ", spec: spec, opts: &ProvisionOptions{OLAPDriver: "duckdb", Slots: 1, Region: "us-east-1"}, - want: &Allocation{CPU: 1, MemoryGB: 2, StorageBytes: int64(10) * int64(datasize.GB)}, + want: &Allocation{CPU: 1, MemoryGB: 2, StorageBytes: int64(40) * int64(datasize.GB)}, wantErr: false, }, { name: "one applicable ", spec: spec, opts: &ProvisionOptions{OLAPDriver: "duckdb", Slots: 4, Region: "us-east-1"}, - want: &Allocation{CPU: 4, MemoryGB: 8, StorageBytes: int64(40) * int64(datasize.GB), Host: "host_1"}, + want: &Allocation{CPU: 4, MemoryGB: 8, StorageBytes: int64(160) * int64(datasize.GB), Host: "host_1"}, wantErr: false, }, { @@ -120,7 +120,7 @@ func Test_staticProvisioner_Provision(t *testing.T) { }, }, opts: &ProvisionOptions{OLAPDriver: "duckdb", Slots: 1, Region: "us-east-2"}, - want: &Allocation{CPU: 1, MemoryGB: 2, StorageBytes: int64(10) * int64(datasize.GB), Host: "host_2"}, + want: &Allocation{CPU: 1, MemoryGB: 2, StorageBytes: int64(40) * int64(datasize.GB), Host: "host_2"}, wantErr: false, }, } diff --git a/admin/server/auth/claims.go b/admin/server/auth/claims.go index 96d19e313b6..983dc71c7b3 100644 --- a/admin/server/auth/claims.go +++ b/admin/server/auth/claims.go @@ -6,7 +6,6 @@ import ( "sync" "github.com/rilldata/rill/admin" - "github.com/rilldata/rill/admin/database" "github.com/rilldata/rill/admin/pkg/authtoken" adminv1 "github.com/rilldata/rill/proto/gen/rill/admin/v1" ) @@ -161,13 +160,19 @@ func (c *authTokenClaims) ProjectPermissions(ctx context.Context, orgID, project return perm } + orgPerms := c.organizationPermissionsUnsafe(ctx, orgID) + + var err error switch c.token.Token().Type { case authtoken.TypeUser: - perm = c.projectPermissionsUser(ctx, orgID, projectID) + perm, err = c.admin.ProjectPermissionsForUser(ctx, projectID, c.token.OwnerID(), orgPerms) case authtoken.TypeService: - perm = c.projectPermissionsService(ctx, orgID, projectID) + perm, err = c.admin.ProjectPermissionsForService(ctx, projectID, c.token.OwnerID(), orgPerms) default: - panic(fmt.Errorf("unexpected token type %q", c.token.Token().Type)) + err = fmt.Errorf("unexpected token type %q", c.token.Token().Type) + } + if err != nil { + panic(fmt.Errorf("failed to get project permissions: %w", err)) } c.projectPermissionsCache[projectID] = perm @@ -182,135 +187,19 @@ func (c *authTokenClaims) organizationPermissionsUnsafe(ctx context.Context, org return perm } + var err error switch c.token.Token().Type { case authtoken.TypeUser: - perm = c.organizationPermissionsUser(ctx, orgID) + perm, err = c.admin.OrganizationPermissionsForUser(ctx, orgID, c.token.OwnerID()) case authtoken.TypeService: - perm = c.organizationPermissionsService(ctx, orgID) + perm, err = c.admin.OrganizationPermissionsForService(ctx, orgID, c.token.OwnerID()) default: - panic(fmt.Errorf("unexpected token type %q", c.token.Token().Type)) + err = fmt.Errorf("unexpected token type %q", c.token.Token().Type) } - - c.orgPermissionsCache[orgID] = perm - return perm -} - -// organizationPermissionsUser resolves organization permissions for a user. -func (c *authTokenClaims) organizationPermissionsUser(ctx context.Context, orgID string) *adminv1.OrganizationPermissions { - roles, err := c.admin.DB.ResolveOrganizationRolesForUser(context.Background(), c.token.OwnerID(), orgID) if err != nil { panic(fmt.Errorf("failed to get org permissions: %w", err)) } - composite := &adminv1.OrganizationPermissions{} - for _, role := range roles { - composite = unionOrgRoles(composite, role) - } - - return composite -} - -// organizationPermissionsService resolves organization permissions for a service. -// A service currently gets full permissions on the org they belong to. -func (c *authTokenClaims) organizationPermissionsService(ctx context.Context, orgID string) *adminv1.OrganizationPermissions { - service, err := c.admin.DB.FindService(ctx, c.token.OwnerID()) - if err != nil { - panic(fmt.Errorf("failed to get service info: %w", err)) - } - - // Services get full permissions on the org they belong to - if orgID == service.OrgID { - return &adminv1.OrganizationPermissions{ - ReadOrg: true, - ManageOrg: true, - ReadProjects: true, - CreateProjects: true, - ManageProjects: true, - ReadOrgMembers: true, - ManageOrgMembers: true, - } - } - - return &adminv1.OrganizationPermissions{} -} - -// projectPermissionsUser resolves project permissions for a user. -func (c *authTokenClaims) projectPermissionsUser(ctx context.Context, orgID, projectID string) *adminv1.ProjectPermissions { - // ManageProjects permission on the org gives full access to all projects in the org (only org admins have this) - orgPerms := c.organizationPermissionsUnsafe(ctx, orgID) - if orgPerms.ManageProjects { - return &adminv1.ProjectPermissions{ - ReadProject: true, - ManageProject: true, - ReadProd: true, - ReadProdStatus: true, - ManageProd: true, - ReadDev: true, - ReadDevStatus: true, - ManageDev: true, - ReadProjectMembers: true, - ManageProjectMembers: true, - } - } - - roles, err := c.admin.DB.ResolveProjectRolesForUser(ctx, c.token.OwnerID(), projectID) - if err != nil { - panic(fmt.Errorf("failed to get project permissions: %w", err)) - } - - composite := &adminv1.ProjectPermissions{} - for _, role := range roles { - composite = unionProjectRoles(composite, role) - } - - return composite -} - -// projectPermissionsService resolves project permissions for a service. -// A service currently gets full permissions on all projects in the org they belong to. -func (c *authTokenClaims) projectPermissionsService(ctx context.Context, orgID, projectID string) *adminv1.ProjectPermissions { - orgPerms := c.organizationPermissionsUnsafe(ctx, orgID) - if orgPerms.ManageProjects { - return &adminv1.ProjectPermissions{ - ReadProject: true, - ManageProject: true, - ReadProd: true, - ReadProdStatus: true, - ManageProd: true, - ReadDev: true, - ReadDevStatus: true, - ManageDev: true, - ReadProjectMembers: true, - ManageProjectMembers: true, - } - } - - return &adminv1.ProjectPermissions{} -} - -func unionOrgRoles(a *adminv1.OrganizationPermissions, b *database.OrganizationRole) *adminv1.OrganizationPermissions { - return &adminv1.OrganizationPermissions{ - ReadOrg: a.ReadOrg || b.ReadOrg, - ManageOrg: a.ManageOrg || b.ManageOrg, - ReadProjects: a.ReadProjects || b.ReadProjects, - CreateProjects: a.CreateProjects || b.CreateProjects, - ManageProjects: a.ManageProjects || b.ManageProjects, - ReadOrgMembers: a.ReadOrgMembers || b.ReadOrgMembers, - ManageOrgMembers: a.ManageOrgMembers || b.ManageOrgMembers, - } -} - -func unionProjectRoles(a *adminv1.ProjectPermissions, b *database.ProjectRole) *adminv1.ProjectPermissions { - return &adminv1.ProjectPermissions{ - ReadProject: a.ReadProject || b.ReadProject, - ManageProject: a.ManageProject || b.ManageProject, - ReadProd: a.ReadProd || b.ReadProd, - ReadProdStatus: a.ReadProdStatus || b.ReadProdStatus, - ManageProd: a.ManageProd || b.ManageProd, - ReadDev: a.ReadDev || b.ReadDev, - ReadDevStatus: a.ReadDevStatus || b.ReadDevStatus, - ManageDev: a.ManageDev || b.ManageDev, - ReadProjectMembers: a.ReadProjectMembers || b.ReadProjectMembers, - ManageProjectMembers: a.ManageProjectMembers || b.ManageProjectMembers, - } + c.orgPermissionsCache[orgID] = perm + return perm } diff --git a/admin/server/deployment.go b/admin/server/deployment.go index bd2b586227d..792b344036f 100644 --- a/admin/server/deployment.go +++ b/admin/server/deployment.go @@ -3,11 +3,13 @@ package server import ( "context" "net/http" + "time" "github.com/rilldata/rill/admin/database" "github.com/rilldata/rill/admin/server/auth" adminv1 "github.com/rilldata/rill/proto/gen/rill/admin/v1" "github.com/rilldata/rill/runtime/pkg/observability" + runtimeauth "github.com/rilldata/rill/runtime/server/auth" "go.opentelemetry.io/otel/attribute" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -150,3 +152,89 @@ func (s *Server) TriggerRedeploy(ctx context.Context, req *adminv1.TriggerRedepl return &adminv1.TriggerRedeployResponse{}, nil } + +// GetDeploymentCredentials returns runtime info and JWT on behalf of a specific user, or alternatively for a raw set of JWT attributes +func (s *Server) GetDeploymentCredentials(ctx context.Context, req *adminv1.GetDeploymentCredentialsRequest) (*adminv1.GetDeploymentCredentialsResponse, error) { + observability.AddRequestAttributes(ctx, + attribute.String("args.organization", req.Organization), + attribute.String("args.project", req.Project), + attribute.String("args.branch", req.Branch), + ) + + proj, err := s.admin.DB.FindProjectByName(ctx, req.Organization, req.Project) + if err != nil { + return nil, status.Error(codes.InvalidArgument, err.Error()) + } + + if proj.ProdDeploymentID == nil { + return nil, status.Error(codes.InvalidArgument, "project does not have a deployment") + } + + prodDepl, err := s.admin.DB.FindDeployment(ctx, *proj.ProdDeploymentID) + if err != nil { + return nil, status.Error(codes.InvalidArgument, err.Error()) + } + + if req.Branch != "" && req.Branch != prodDepl.Branch { + return nil, status.Error(codes.InvalidArgument, "project does not have a deployment for given branch") + } + + claims := auth.GetClaims(ctx) + permissions := claims.ProjectPermissions(ctx, proj.OrganizationID, proj.ID) + + // If the user is not a superuser, they must have ManageProd permissions + if !permissions.ManageProd && !claims.Superuser(ctx) { + return nil, status.Error(codes.PermissionDenied, "does not have permission to manage deployment") + } + + var attr map[string]any + switch forVal := req.For.(type) { + case *adminv1.GetDeploymentCredentialsRequest_UserId: + forOrgPerms, err := s.admin.OrganizationPermissionsForUser(ctx, proj.OrganizationID, forVal.UserId) + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + + forProjPerms, err := s.admin.ProjectPermissionsForUser(ctx, proj.ID, forVal.UserId, forOrgPerms) + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + + attr, err = s.jwtAttributesForUser(ctx, forVal.UserId, proj.OrganizationID, forProjPerms) + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + case *adminv1.GetDeploymentCredentialsRequest_Attrs: + attr = forVal.Attrs.AsMap() + default: + return nil, status.Error(codes.InvalidArgument, "invalid 'for' type") + } + + // Generate JWT + jwt, err := s.issuer.NewToken(runtimeauth.TokenOptions{ + AudienceURL: prodDepl.RuntimeAudience, + Subject: claims.OwnerID(), + TTL: time.Hour, + InstancePermissions: map[string][]runtimeauth.Permission{ + prodDepl.RuntimeInstanceID: { + // TODO: Remove ReadProfiling and ReadRepo (may require frontend changes) + runtimeauth.ReadObjects, + runtimeauth.ReadMetrics, + runtimeauth.ReadProfiling, + runtimeauth.ReadRepo, + }, + }, + Attributes: attr, + }) + if err != nil { + return nil, status.Errorf(codes.Internal, "could not issue jwt: %s", err.Error()) + } + + s.admin.Used.Deployment(prodDepl.ID) + + return &adminv1.GetDeploymentCredentialsResponse{ + RuntimeHost: prodDepl.RuntimeHost, + RuntimeInstanceId: prodDepl.RuntimeInstanceID, + Jwt: jwt, + }, nil +} diff --git a/admin/server/projects.go b/admin/server/projects.go index 239e1f51d30..6d2cc65a0e5 100644 --- a/admin/server/projects.go +++ b/admin/server/projects.go @@ -5,7 +5,6 @@ import ( "errors" "fmt" "net/url" - "strings" "time" "github.com/rilldata/rill/admin" @@ -125,27 +124,10 @@ func (s *Server) GetProject(ctx context.Context, req *adminv1.GetProjectRequest) var attr map[string]any if claims.OwnerType() == auth.OwnerTypeUser { - // Find User - user, err := s.admin.DB.FindUser(ctx, claims.OwnerID()) - if err != nil { - return nil, status.Error(codes.Internal, err.Error()) - } - // Find User groups - groups, err := s.admin.DB.FindUsergroupsForUser(ctx, user.ID, proj.OrganizationID) + attr, err = s.jwtAttributesForUser(ctx, claims.OwnerID(), proj.OrganizationID, permissions) if err != nil { return nil, status.Error(codes.Internal, err.Error()) } - groupNames := make([]string, len(groups)) - for i, group := range groups { - groupNames[i] = group.Name - } - attr = map[string]any{ - "name": user.DisplayName, - "email": user.Email, - "domain": user.Email[strings.LastIndex(user.Email, "@")+1:], - "groups": groupNames, - "admin": permissions.ManageProject, - } } jwt, err := s.issuer.NewToken(runtimeauth.TokenOptions{ diff --git a/admin/server/server.go b/admin/server/server.go index 6d228e54dfd..ce3ab0d08ec 100644 --- a/admin/server/server.go +++ b/admin/server/server.go @@ -363,3 +363,29 @@ func (s *Server) checkRateLimit(ctx context.Context) (context.Context, error) { return ctx, nil } + +func (s *Server) jwtAttributesForUser(ctx context.Context, userID, orgID string, projectPermissions *adminv1.ProjectPermissions) (map[string]any, error) { + user, err := s.admin.DB.FindUser(ctx, userID) + if err != nil { + return nil, status.Error(codes.InvalidArgument, err.Error()) + } + + groups, err := s.admin.DB.FindUsergroupsForUser(ctx, user.ID, orgID) + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + groupNames := make([]string, len(groups)) + for i, group := range groups { + groupNames[i] = group.Name + } + + attr := map[string]any{ + "name": user.DisplayName, + "email": user.Email, + "domain": user.Email[strings.LastIndex(user.Email, "@")+1:], + "groups": groupNames, + "admin": projectPermissions.ManageProject, + } + + return attr, nil +} diff --git a/admin/server/users.go b/admin/server/users.go index 003db213790..e755ef91d8d 100644 --- a/admin/server/users.go +++ b/admin/server/users.go @@ -317,6 +317,52 @@ func (s *Server) SudoUpdateUserQuotas(ctx context.Context, req *adminv1.SudoUpda return &adminv1.SudoUpdateUserQuotasResponse{User: userToPB(updatedUser)}, nil } +// SearchProjectUsers returns a list of users that match the given search/email query. +func (s *Server) SearchProjectUsers(ctx context.Context, req *adminv1.SearchProjectUsersRequest) (*adminv1.SearchProjectUsersResponse, error) { + observability.AddRequestAttributes(ctx, + attribute.String("args.org", req.Organization), + attribute.String("args.project", req.Project), + attribute.String("args.email_query", req.EmailQuery), + ) + + proj, err := s.admin.DB.FindProjectByName(ctx, req.Organization, req.Project) + if err != nil { + return nil, status.Error(codes.InvalidArgument, err.Error()) + } + + claims := auth.GetClaims(ctx) + if !claims.ProjectPermissions(ctx, proj.OrganizationID, proj.ID).ManageProject { + return nil, status.Error(codes.PermissionDenied, "not authorized to search project users") + } + + token, err := unmarshalPageToken(req.PageToken) + if err != nil { + return nil, status.Error(codes.InvalidArgument, err.Error()) + } + + pageSize := validPageSize(req.PageSize) + + users, err := s.admin.DB.SearchProjectUsers(ctx, proj.ID, req.EmailQuery, token.Val, pageSize) + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + + nextToken := "" + if len(users) >= pageSize { + nextToken = marshalPageToken(users[len(users)-1].Email) + } + + dtos := make([]*adminv1.User, len(users)) + for i, user := range users { + dtos[i] = userToPB(user) + } + + return &adminv1.SearchProjectUsersResponse{ + Users: dtos, + NextPageToken: nextToken, + }, nil +} + func userToPB(u *database.User) *adminv1.User { return &adminv1.User{ Id: u.ID, diff --git a/cli/cmd/upgrade/upgrade.go b/cli/cmd/upgrade/upgrade.go index 40761c00cd0..a36476ecd75 100644 --- a/cli/cmd/upgrade/upgrade.go +++ b/cli/cmd/upgrade/upgrade.go @@ -45,6 +45,8 @@ func UpgradeCmd(cfg *config.Config) *cobra.Command { args = append(args, "--nightly") } cmd := exec.Command("/bin/bash", args...) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr return cmd.Run() }, } diff --git a/cli/pkg/local/app.go b/cli/pkg/local/app.go index 343d1ce3ed1..593e35ff1ba 100644 --- a/cli/pkg/local/app.go +++ b/cli/pkg/local/app.go @@ -126,6 +126,13 @@ func NewApp(ctx context.Context, ver config.Version, verbose, reset bool, olapDr return nil, fmt.Errorf("failed to clean OLAP: %w", err) } } + + // Set default DuckDB pool size to 4 + olapCfg := map[string]string{"dsn": olapDSN} + if olapDriver == "duckdb" { + olapCfg["pool_size"] = "4" + } + // Create instance with its repo set to the project directory inst := &drivers.Instance{ ID: DefaultInstanceID, @@ -143,7 +150,7 @@ func NewApp(ctx context.Context, ver config.Version, verbose, reset bool, olapDr { Type: olapDriver, Name: "olap", - Config: map[string]string{"dsn": olapDSN}, + Config: olapCfg, }, }, } diff --git a/proto/gen/rill/admin/v1/admin.swagger.yaml b/proto/gen/rill/admin/v1/admin.swagger.yaml index 1ff661b11cc..03e935139f4 100644 --- a/proto/gen/rill/admin/v1/admin.swagger.yaml +++ b/proto/gen/rill/admin/v1/admin.swagger.yaml @@ -365,6 +365,42 @@ paths: type: string tags: - AdminService + /v1/organizations/{organization}/projects/{project}/credentials: + post: + summary: GetDeploymentCredentials returns runtime info and JWT on behalf of a specific user, or alternatively for a raw set of JWT attributes + operationId: AdminService_GetDeploymentCredentials + responses: + "200": + description: A successful response. + schema: + $ref: '#/definitions/v1GetDeploymentCredentialsResponse' + default: + description: An unexpected error response. + schema: + $ref: '#/definitions/rpcStatus' + parameters: + - name: organization + in: path + required: true + type: string + - name: project + in: path + required: true + type: string + - name: body + in: body + required: true + schema: + type: object + properties: + branch: + type: string + userId: + type: string + attrs: + type: object + tags: + - AdminService /v1/organizations/{organization}/projects/{project}/git-credentials: get: summary: GetGitCredentials returns credentials and other details for a project's Git repository. @@ -551,6 +587,43 @@ paths: type: string tags: - AdminService + /v1/organizations/{organization}/projects/{project}/users/search: + get: + summary: SearchProjectUsers returns users who has access to to a project (including org members that have access through a usergroup) + operationId: AdminService_SearchProjectUsers + responses: + "200": + description: A successful response. + schema: + $ref: '#/definitions/v1SearchProjectUsersResponse' + default: + description: An unexpected error response. + schema: + $ref: '#/definitions/rpcStatus' + parameters: + - name: organization + in: path + required: true + type: string + - name: project + in: path + required: true + type: string + - name: emailQuery + in: query + required: false + type: string + - name: pageSize + in: query + required: false + type: integer + format: int64 + - name: pageToken + in: query + required: false + type: string + tags: + - AdminService /v1/organizations/{organization}/whitelisted: get: summary: ListWhitelistedDomains lists all the whitelisted domains for the organization @@ -1409,6 +1482,18 @@ definitions: '@type': type: string additionalProperties: {} + protobufNullValue: + type: string + enum: + - NULL_VALUE + default: NULL_VALUE + description: |- + `NullValue` is a singleton enumeration to represent the null value for the + `Value` type union. + + The JSON representation for `NullValue` is JSON `null`. + + - NULL_VALUE: Null value. rpcStatus: type: object properties: @@ -1551,6 +1636,15 @@ definitions: $ref: '#/definitions/v1User' preferences: $ref: '#/definitions/v1UserPreferences' + v1GetDeploymentCredentialsResponse: + type: object + properties: + runtimeHost: + type: string + runtimeInstanceId: + type: string + jwt: + type: string v1GetGitCredentialsResponse: type: object properties: @@ -1892,6 +1986,16 @@ definitions: type: string nextPageToken: type: string + v1SearchProjectUsersResponse: + type: object + properties: + users: + type: array + items: + type: object + $ref: '#/definitions/v1User' + nextPageToken: + type: string v1SearchUsersResponse: type: object properties: diff --git a/proto/gen/rill/admin/v1/api.pb.go b/proto/gen/rill/admin/v1/api.pb.go index f733e7b832b..c130df27708 100644 --- a/proto/gen/rill/admin/v1/api.pb.go +++ b/proto/gen/rill/admin/v1/api.pb.go @@ -11,6 +11,7 @@ import ( _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + structpb "google.golang.org/protobuf/types/known/structpb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" reflect "reflect" sync "sync" @@ -1144,16 +1145,20 @@ func (x *GetProjectVariablesResponse) GetVariables() map[string]string { return nil } -type ListServicesRequest struct { +type SearchProjectUsersRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - OrganizationName string `protobuf:"bytes,1,opt,name=organization_name,json=organizationName,proto3" json:"organization_name,omitempty"` + Organization string `protobuf:"bytes,1,opt,name=organization,proto3" json:"organization,omitempty"` + Project string `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"` + EmailQuery string `protobuf:"bytes,3,opt,name=email_query,json=emailQuery,proto3" json:"email_query,omitempty"` + PageSize uint32 `protobuf:"varint,4,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + PageToken string `protobuf:"bytes,5,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` } -func (x *ListServicesRequest) Reset() { - *x = ListServicesRequest{} +func (x *SearchProjectUsersRequest) Reset() { + *x = SearchProjectUsersRequest{} if protoimpl.UnsafeEnabled { mi := &file_rill_admin_v1_api_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1161,13 +1166,13 @@ func (x *ListServicesRequest) Reset() { } } -func (x *ListServicesRequest) String() string { +func (x *SearchProjectUsersRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListServicesRequest) ProtoMessage() {} +func (*SearchProjectUsersRequest) ProtoMessage() {} -func (x *ListServicesRequest) ProtoReflect() protoreflect.Message { +func (x *SearchProjectUsersRequest) ProtoReflect() protoreflect.Message { mi := &file_rill_admin_v1_api_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1179,28 +1184,57 @@ func (x *ListServicesRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListServicesRequest.ProtoReflect.Descriptor instead. -func (*ListServicesRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use SearchProjectUsersRequest.ProtoReflect.Descriptor instead. +func (*SearchProjectUsersRequest) Descriptor() ([]byte, []int) { return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{20} } -func (x *ListServicesRequest) GetOrganizationName() string { +func (x *SearchProjectUsersRequest) GetOrganization() string { if x != nil { - return x.OrganizationName + return x.Organization } return "" } -type ListServicesResponse struct { +func (x *SearchProjectUsersRequest) GetProject() string { + if x != nil { + return x.Project + } + return "" +} + +func (x *SearchProjectUsersRequest) GetEmailQuery() string { + if x != nil { + return x.EmailQuery + } + return "" +} + +func (x *SearchProjectUsersRequest) GetPageSize() uint32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *SearchProjectUsersRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +type SearchProjectUsersResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Services []*Service `protobuf:"bytes,1,rep,name=services,proto3" json:"services,omitempty"` + Users []*User `protobuf:"bytes,1,rep,name=users,proto3" json:"users,omitempty"` + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` } -func (x *ListServicesResponse) Reset() { - *x = ListServicesResponse{} +func (x *SearchProjectUsersResponse) Reset() { + *x = SearchProjectUsersResponse{} if protoimpl.UnsafeEnabled { mi := &file_rill_admin_v1_api_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1208,13 +1242,13 @@ func (x *ListServicesResponse) Reset() { } } -func (x *ListServicesResponse) String() string { +func (x *SearchProjectUsersResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListServicesResponse) ProtoMessage() {} +func (*SearchProjectUsersResponse) ProtoMessage() {} -func (x *ListServicesResponse) ProtoReflect() protoreflect.Message { +func (x *SearchProjectUsersResponse) ProtoReflect() protoreflect.Message { mi := &file_rill_admin_v1_api_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1226,29 +1260,42 @@ func (x *ListServicesResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListServicesResponse.ProtoReflect.Descriptor instead. -func (*ListServicesResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use SearchProjectUsersResponse.ProtoReflect.Descriptor instead. +func (*SearchProjectUsersResponse) Descriptor() ([]byte, []int) { return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{21} } -func (x *ListServicesResponse) GetServices() []*Service { +func (x *SearchProjectUsersResponse) GetUsers() []*User { if x != nil { - return x.Services + return x.Users } return nil } -type CreateServiceRequest struct { +func (x *SearchProjectUsersResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +type GetDeploymentCredentialsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - OrganizationName string `protobuf:"bytes,2,opt,name=organization_name,json=organizationName,proto3" json:"organization_name,omitempty"` + Organization string `protobuf:"bytes,1,opt,name=organization,proto3" json:"organization,omitempty"` + Project string `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"` + Branch string `protobuf:"bytes,3,opt,name=branch,proto3" json:"branch,omitempty"` + // Types that are assignable to For: + // + // *GetDeploymentCredentialsRequest_UserId + // *GetDeploymentCredentialsRequest_Attrs + For isGetDeploymentCredentialsRequest_For `protobuf_oneof:"for"` } -func (x *CreateServiceRequest) Reset() { - *x = CreateServiceRequest{} +func (x *GetDeploymentCredentialsRequest) Reset() { + *x = GetDeploymentCredentialsRequest{} if protoimpl.UnsafeEnabled { mi := &file_rill_admin_v1_api_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1256,13 +1303,13 @@ func (x *CreateServiceRequest) Reset() { } } -func (x *CreateServiceRequest) String() string { +func (x *GetDeploymentCredentialsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateServiceRequest) ProtoMessage() {} +func (*GetDeploymentCredentialsRequest) ProtoMessage() {} -func (x *CreateServiceRequest) ProtoReflect() protoreflect.Message { +func (x *GetDeploymentCredentialsRequest) ProtoReflect() protoreflect.Message { mi := &file_rill_admin_v1_api_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1274,35 +1321,81 @@ func (x *CreateServiceRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CreateServiceRequest.ProtoReflect.Descriptor instead. -func (*CreateServiceRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use GetDeploymentCredentialsRequest.ProtoReflect.Descriptor instead. +func (*GetDeploymentCredentialsRequest) Descriptor() ([]byte, []int) { return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{22} } -func (x *CreateServiceRequest) GetName() string { +func (x *GetDeploymentCredentialsRequest) GetOrganization() string { if x != nil { - return x.Name + return x.Organization } return "" } -func (x *CreateServiceRequest) GetOrganizationName() string { +func (x *GetDeploymentCredentialsRequest) GetProject() string { if x != nil { - return x.OrganizationName + return x.Project } return "" } -type CreateServiceResponse struct { +func (x *GetDeploymentCredentialsRequest) GetBranch() string { + if x != nil { + return x.Branch + } + return "" +} + +func (m *GetDeploymentCredentialsRequest) GetFor() isGetDeploymentCredentialsRequest_For { + if m != nil { + return m.For + } + return nil +} + +func (x *GetDeploymentCredentialsRequest) GetUserId() string { + if x, ok := x.GetFor().(*GetDeploymentCredentialsRequest_UserId); ok { + return x.UserId + } + return "" +} + +func (x *GetDeploymentCredentialsRequest) GetAttrs() *structpb.Struct { + if x, ok := x.GetFor().(*GetDeploymentCredentialsRequest_Attrs); ok { + return x.Attrs + } + return nil +} + +type isGetDeploymentCredentialsRequest_For interface { + isGetDeploymentCredentialsRequest_For() +} + +type GetDeploymentCredentialsRequest_UserId struct { + UserId string `protobuf:"bytes,4,opt,name=user_id,json=userId,proto3,oneof"` +} + +type GetDeploymentCredentialsRequest_Attrs struct { + Attrs *structpb.Struct `protobuf:"bytes,5,opt,name=attrs,proto3,oneof"` +} + +func (*GetDeploymentCredentialsRequest_UserId) isGetDeploymentCredentialsRequest_For() {} + +func (*GetDeploymentCredentialsRequest_Attrs) isGetDeploymentCredentialsRequest_For() {} + +type GetDeploymentCredentialsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Service *Service `protobuf:"bytes,1,opt,name=service,proto3" json:"service,omitempty"` + RuntimeHost string `protobuf:"bytes,1,opt,name=runtime_host,json=runtimeHost,proto3" json:"runtime_host,omitempty"` + RuntimeInstanceId string `protobuf:"bytes,2,opt,name=runtime_instance_id,json=runtimeInstanceId,proto3" json:"runtime_instance_id,omitempty"` + Jwt string `protobuf:"bytes,3,opt,name=jwt,proto3" json:"jwt,omitempty"` } -func (x *CreateServiceResponse) Reset() { - *x = CreateServiceResponse{} +func (x *GetDeploymentCredentialsResponse) Reset() { + *x = GetDeploymentCredentialsResponse{} if protoimpl.UnsafeEnabled { mi := &file_rill_admin_v1_api_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1310,13 +1403,13 @@ func (x *CreateServiceResponse) Reset() { } } -func (x *CreateServiceResponse) String() string { +func (x *GetDeploymentCredentialsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateServiceResponse) ProtoMessage() {} +func (*GetDeploymentCredentialsResponse) ProtoMessage() {} -func (x *CreateServiceResponse) ProtoReflect() protoreflect.Message { +func (x *GetDeploymentCredentialsResponse) ProtoReflect() protoreflect.Message { mi := &file_rill_admin_v1_api_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1328,30 +1421,42 @@ func (x *CreateServiceResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CreateServiceResponse.ProtoReflect.Descriptor instead. -func (*CreateServiceResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use GetDeploymentCredentialsResponse.ProtoReflect.Descriptor instead. +func (*GetDeploymentCredentialsResponse) Descriptor() ([]byte, []int) { return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{23} } -func (x *CreateServiceResponse) GetService() *Service { +func (x *GetDeploymentCredentialsResponse) GetRuntimeHost() string { if x != nil { - return x.Service + return x.RuntimeHost } - return nil + return "" } -type UpdateServiceRequest struct { +func (x *GetDeploymentCredentialsResponse) GetRuntimeInstanceId() string { + if x != nil { + return x.RuntimeInstanceId + } + return "" +} + +func (x *GetDeploymentCredentialsResponse) GetJwt() string { + if x != nil { + return x.Jwt + } + return "" +} + +type ListServicesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - OrganizationName string `protobuf:"bytes,2,opt,name=organization_name,json=organizationName,proto3" json:"organization_name,omitempty"` - NewName *string `protobuf:"bytes,3,opt,name=new_name,json=newName,proto3,oneof" json:"new_name,omitempty"` + OrganizationName string `protobuf:"bytes,1,opt,name=organization_name,json=organizationName,proto3" json:"organization_name,omitempty"` } -func (x *UpdateServiceRequest) Reset() { - *x = UpdateServiceRequest{} +func (x *ListServicesRequest) Reset() { + *x = ListServicesRequest{} if protoimpl.UnsafeEnabled { mi := &file_rill_admin_v1_api_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1359,13 +1464,13 @@ func (x *UpdateServiceRequest) Reset() { } } -func (x *UpdateServiceRequest) String() string { +func (x *ListServicesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateServiceRequest) ProtoMessage() {} +func (*ListServicesRequest) ProtoMessage() {} -func (x *UpdateServiceRequest) ProtoReflect() protoreflect.Message { +func (x *ListServicesRequest) ProtoReflect() protoreflect.Message { mi := &file_rill_admin_v1_api_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1377,42 +1482,28 @@ func (x *UpdateServiceRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateServiceRequest.ProtoReflect.Descriptor instead. -func (*UpdateServiceRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use ListServicesRequest.ProtoReflect.Descriptor instead. +func (*ListServicesRequest) Descriptor() ([]byte, []int) { return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{24} } -func (x *UpdateServiceRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *UpdateServiceRequest) GetOrganizationName() string { +func (x *ListServicesRequest) GetOrganizationName() string { if x != nil { return x.OrganizationName } return "" } -func (x *UpdateServiceRequest) GetNewName() string { - if x != nil && x.NewName != nil { - return *x.NewName - } - return "" -} - -type UpdateServiceResponse struct { +type ListServicesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Service *Service `protobuf:"bytes,1,opt,name=service,proto3" json:"service,omitempty"` + Services []*Service `protobuf:"bytes,1,rep,name=services,proto3" json:"services,omitempty"` } -func (x *UpdateServiceResponse) Reset() { - *x = UpdateServiceResponse{} +func (x *ListServicesResponse) Reset() { + *x = ListServicesResponse{} if protoimpl.UnsafeEnabled { mi := &file_rill_admin_v1_api_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1420,13 +1511,13 @@ func (x *UpdateServiceResponse) Reset() { } } -func (x *UpdateServiceResponse) String() string { +func (x *ListServicesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateServiceResponse) ProtoMessage() {} +func (*ListServicesResponse) ProtoMessage() {} -func (x *UpdateServiceResponse) ProtoReflect() protoreflect.Message { +func (x *ListServicesResponse) ProtoReflect() protoreflect.Message { mi := &file_rill_admin_v1_api_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1438,19 +1529,19 @@ func (x *UpdateServiceResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateServiceResponse.ProtoReflect.Descriptor instead. -func (*UpdateServiceResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use ListServicesResponse.ProtoReflect.Descriptor instead. +func (*ListServicesResponse) Descriptor() ([]byte, []int) { return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{25} } -func (x *UpdateServiceResponse) GetService() *Service { +func (x *ListServicesResponse) GetServices() []*Service { if x != nil { - return x.Service + return x.Services } return nil } -type DeleteServiceRequest struct { +type CreateServiceRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -1459,8 +1550,8 @@ type DeleteServiceRequest struct { OrganizationName string `protobuf:"bytes,2,opt,name=organization_name,json=organizationName,proto3" json:"organization_name,omitempty"` } -func (x *DeleteServiceRequest) Reset() { - *x = DeleteServiceRequest{} +func (x *CreateServiceRequest) Reset() { + *x = CreateServiceRequest{} if protoimpl.UnsafeEnabled { mi := &file_rill_admin_v1_api_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1468,13 +1559,13 @@ func (x *DeleteServiceRequest) Reset() { } } -func (x *DeleteServiceRequest) String() string { +func (x *CreateServiceRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteServiceRequest) ProtoMessage() {} +func (*CreateServiceRequest) ProtoMessage() {} -func (x *DeleteServiceRequest) ProtoReflect() protoreflect.Message { +func (x *CreateServiceRequest) ProtoReflect() protoreflect.Message { mi := &file_rill_admin_v1_api_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1486,26 +1577,26 @@ func (x *DeleteServiceRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeleteServiceRequest.ProtoReflect.Descriptor instead. -func (*DeleteServiceRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use CreateServiceRequest.ProtoReflect.Descriptor instead. +func (*CreateServiceRequest) Descriptor() ([]byte, []int) { return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{26} } -func (x *DeleteServiceRequest) GetName() string { +func (x *CreateServiceRequest) GetName() string { if x != nil { return x.Name } return "" } -func (x *DeleteServiceRequest) GetOrganizationName() string { +func (x *CreateServiceRequest) GetOrganizationName() string { if x != nil { return x.OrganizationName } return "" } -type DeleteServiceResponse struct { +type CreateServiceResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -1513,8 +1604,8 @@ type DeleteServiceResponse struct { Service *Service `protobuf:"bytes,1,opt,name=service,proto3" json:"service,omitempty"` } -func (x *DeleteServiceResponse) Reset() { - *x = DeleteServiceResponse{} +func (x *CreateServiceResponse) Reset() { + *x = CreateServiceResponse{} if protoimpl.UnsafeEnabled { mi := &file_rill_admin_v1_api_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1522,13 +1613,13 @@ func (x *DeleteServiceResponse) Reset() { } } -func (x *DeleteServiceResponse) String() string { +func (x *CreateServiceResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteServiceResponse) ProtoMessage() {} +func (*CreateServiceResponse) ProtoMessage() {} -func (x *DeleteServiceResponse) ProtoReflect() protoreflect.Message { +func (x *CreateServiceResponse) ProtoReflect() protoreflect.Message { mi := &file_rill_admin_v1_api_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1540,39 +1631,30 @@ func (x *DeleteServiceResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeleteServiceResponse.ProtoReflect.Descriptor instead. -func (*DeleteServiceResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use CreateServiceResponse.ProtoReflect.Descriptor instead. +func (*CreateServiceResponse) Descriptor() ([]byte, []int) { return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{27} } -func (x *DeleteServiceResponse) GetService() *Service { +func (x *CreateServiceResponse) GetService() *Service { if x != nil { return x.Service } return nil } -type CreateProjectRequest struct { +type UpdateServiceRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - OrganizationName string `protobuf:"bytes,1,opt,name=organization_name,json=organizationName,proto3" json:"organization_name,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` - Public bool `protobuf:"varint,4,opt,name=public,proto3" json:"public,omitempty"` - Region string `protobuf:"bytes,5,opt,name=region,proto3" json:"region,omitempty"` - ProdOlapDriver string `protobuf:"bytes,6,opt,name=prod_olap_driver,json=prodOlapDriver,proto3" json:"prod_olap_driver,omitempty"` - ProdOlapDsn string `protobuf:"bytes,7,opt,name=prod_olap_dsn,json=prodOlapDsn,proto3" json:"prod_olap_dsn,omitempty"` - ProdSlots int64 `protobuf:"varint,8,opt,name=prod_slots,json=prodSlots,proto3" json:"prod_slots,omitempty"` - Subpath string `protobuf:"bytes,12,opt,name=subpath,proto3" json:"subpath,omitempty"` - ProdBranch string `protobuf:"bytes,9,opt,name=prod_branch,json=prodBranch,proto3" json:"prod_branch,omitempty"` - GithubUrl string `protobuf:"bytes,10,opt,name=github_url,json=githubUrl,proto3" json:"github_url,omitempty"` - Variables map[string]string `protobuf:"bytes,11,rep,name=variables,proto3" json:"variables,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + OrganizationName string `protobuf:"bytes,2,opt,name=organization_name,json=organizationName,proto3" json:"organization_name,omitempty"` + NewName *string `protobuf:"bytes,3,opt,name=new_name,json=newName,proto3,oneof" json:"new_name,omitempty"` } -func (x *CreateProjectRequest) Reset() { - *x = CreateProjectRequest{} +func (x *UpdateServiceRequest) Reset() { + *x = UpdateServiceRequest{} if protoimpl.UnsafeEnabled { mi := &file_rill_admin_v1_api_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1580,13 +1662,13 @@ func (x *CreateProjectRequest) Reset() { } } -func (x *CreateProjectRequest) String() string { +func (x *UpdateServiceRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateProjectRequest) ProtoMessage() {} +func (*UpdateServiceRequest) ProtoMessage() {} -func (x *CreateProjectRequest) ProtoReflect() protoreflect.Message { +func (x *UpdateServiceRequest) ProtoReflect() protoreflect.Message { mi := &file_rill_admin_v1_api_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1598,9 +1680,230 @@ func (x *CreateProjectRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CreateProjectRequest.ProtoReflect.Descriptor instead. -func (*CreateProjectRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{28} +// Deprecated: Use UpdateServiceRequest.ProtoReflect.Descriptor instead. +func (*UpdateServiceRequest) Descriptor() ([]byte, []int) { + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{28} +} + +func (x *UpdateServiceRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *UpdateServiceRequest) GetOrganizationName() string { + if x != nil { + return x.OrganizationName + } + return "" +} + +func (x *UpdateServiceRequest) GetNewName() string { + if x != nil && x.NewName != nil { + return *x.NewName + } + return "" +} + +type UpdateServiceResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Service *Service `protobuf:"bytes,1,opt,name=service,proto3" json:"service,omitempty"` +} + +func (x *UpdateServiceResponse) Reset() { + *x = UpdateServiceResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_rill_admin_v1_api_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateServiceResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateServiceResponse) ProtoMessage() {} + +func (x *UpdateServiceResponse) ProtoReflect() protoreflect.Message { + mi := &file_rill_admin_v1_api_proto_msgTypes[29] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateServiceResponse.ProtoReflect.Descriptor instead. +func (*UpdateServiceResponse) Descriptor() ([]byte, []int) { + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{29} +} + +func (x *UpdateServiceResponse) GetService() *Service { + if x != nil { + return x.Service + } + return nil +} + +type DeleteServiceRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + OrganizationName string `protobuf:"bytes,2,opt,name=organization_name,json=organizationName,proto3" json:"organization_name,omitempty"` +} + +func (x *DeleteServiceRequest) Reset() { + *x = DeleteServiceRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_rill_admin_v1_api_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteServiceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteServiceRequest) ProtoMessage() {} + +func (x *DeleteServiceRequest) ProtoReflect() protoreflect.Message { + mi := &file_rill_admin_v1_api_proto_msgTypes[30] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteServiceRequest.ProtoReflect.Descriptor instead. +func (*DeleteServiceRequest) Descriptor() ([]byte, []int) { + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{30} +} + +func (x *DeleteServiceRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *DeleteServiceRequest) GetOrganizationName() string { + if x != nil { + return x.OrganizationName + } + return "" +} + +type DeleteServiceResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Service *Service `protobuf:"bytes,1,opt,name=service,proto3" json:"service,omitempty"` +} + +func (x *DeleteServiceResponse) Reset() { + *x = DeleteServiceResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_rill_admin_v1_api_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteServiceResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteServiceResponse) ProtoMessage() {} + +func (x *DeleteServiceResponse) ProtoReflect() protoreflect.Message { + mi := &file_rill_admin_v1_api_proto_msgTypes[31] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteServiceResponse.ProtoReflect.Descriptor instead. +func (*DeleteServiceResponse) Descriptor() ([]byte, []int) { + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{31} +} + +func (x *DeleteServiceResponse) GetService() *Service { + if x != nil { + return x.Service + } + return nil +} + +type CreateProjectRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + OrganizationName string `protobuf:"bytes,1,opt,name=organization_name,json=organizationName,proto3" json:"organization_name,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + Public bool `protobuf:"varint,4,opt,name=public,proto3" json:"public,omitempty"` + Region string `protobuf:"bytes,5,opt,name=region,proto3" json:"region,omitempty"` + ProdOlapDriver string `protobuf:"bytes,6,opt,name=prod_olap_driver,json=prodOlapDriver,proto3" json:"prod_olap_driver,omitempty"` + ProdOlapDsn string `protobuf:"bytes,7,opt,name=prod_olap_dsn,json=prodOlapDsn,proto3" json:"prod_olap_dsn,omitempty"` + ProdSlots int64 `protobuf:"varint,8,opt,name=prod_slots,json=prodSlots,proto3" json:"prod_slots,omitempty"` + Subpath string `protobuf:"bytes,12,opt,name=subpath,proto3" json:"subpath,omitempty"` + ProdBranch string `protobuf:"bytes,9,opt,name=prod_branch,json=prodBranch,proto3" json:"prod_branch,omitempty"` + GithubUrl string `protobuf:"bytes,10,opt,name=github_url,json=githubUrl,proto3" json:"github_url,omitempty"` + Variables map[string]string `protobuf:"bytes,11,rep,name=variables,proto3" json:"variables,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *CreateProjectRequest) Reset() { + *x = CreateProjectRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_rill_admin_v1_api_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateProjectRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateProjectRequest) ProtoMessage() {} + +func (x *CreateProjectRequest) ProtoReflect() protoreflect.Message { + mi := &file_rill_admin_v1_api_proto_msgTypes[32] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateProjectRequest.ProtoReflect.Descriptor instead. +func (*CreateProjectRequest) Descriptor() ([]byte, []int) { + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{32} } func (x *CreateProjectRequest) GetOrganizationName() string { @@ -1698,7 +2001,7 @@ type CreateProjectResponse struct { func (x *CreateProjectResponse) Reset() { *x = CreateProjectResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[29] + mi := &file_rill_admin_v1_api_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1711,7 +2014,7 @@ func (x *CreateProjectResponse) String() string { func (*CreateProjectResponse) ProtoMessage() {} func (x *CreateProjectResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[29] + mi := &file_rill_admin_v1_api_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1724,7 +2027,7 @@ func (x *CreateProjectResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateProjectResponse.ProtoReflect.Descriptor instead. func (*CreateProjectResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{29} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{33} } func (x *CreateProjectResponse) GetProject() *Project { @@ -1746,7 +2049,7 @@ type DeleteProjectRequest struct { func (x *DeleteProjectRequest) Reset() { *x = DeleteProjectRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[30] + mi := &file_rill_admin_v1_api_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1759,7 +2062,7 @@ func (x *DeleteProjectRequest) String() string { func (*DeleteProjectRequest) ProtoMessage() {} func (x *DeleteProjectRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[30] + mi := &file_rill_admin_v1_api_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1772,7 +2075,7 @@ func (x *DeleteProjectRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteProjectRequest.ProtoReflect.Descriptor instead. func (*DeleteProjectRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{30} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{34} } func (x *DeleteProjectRequest) GetOrganizationName() string { @@ -1798,7 +2101,7 @@ type DeleteProjectResponse struct { func (x *DeleteProjectResponse) Reset() { *x = DeleteProjectResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[31] + mi := &file_rill_admin_v1_api_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1811,7 +2114,7 @@ func (x *DeleteProjectResponse) String() string { func (*DeleteProjectResponse) ProtoMessage() {} func (x *DeleteProjectResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[31] + mi := &file_rill_admin_v1_api_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1824,7 +2127,7 @@ func (x *DeleteProjectResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteProjectResponse.ProtoReflect.Descriptor instead. func (*DeleteProjectResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{31} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{35} } type UpdateProjectRequest struct { @@ -1847,7 +2150,7 @@ type UpdateProjectRequest struct { func (x *UpdateProjectRequest) Reset() { *x = UpdateProjectRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[32] + mi := &file_rill_admin_v1_api_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1860,7 +2163,7 @@ func (x *UpdateProjectRequest) String() string { func (*UpdateProjectRequest) ProtoMessage() {} func (x *UpdateProjectRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[32] + mi := &file_rill_admin_v1_api_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1873,7 +2176,7 @@ func (x *UpdateProjectRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateProjectRequest.ProtoReflect.Descriptor instead. func (*UpdateProjectRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{32} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{36} } func (x *UpdateProjectRequest) GetOrganizationName() string { @@ -1957,7 +2260,7 @@ type UpdateProjectResponse struct { func (x *UpdateProjectResponse) Reset() { *x = UpdateProjectResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[33] + mi := &file_rill_admin_v1_api_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1970,7 +2273,7 @@ func (x *UpdateProjectResponse) String() string { func (*UpdateProjectResponse) ProtoMessage() {} func (x *UpdateProjectResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[33] + mi := &file_rill_admin_v1_api_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1983,7 +2286,7 @@ func (x *UpdateProjectResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateProjectResponse.ProtoReflect.Descriptor instead. func (*UpdateProjectResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{33} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{37} } func (x *UpdateProjectResponse) GetProject() *Project { @@ -2006,7 +2309,7 @@ type UpdateProjectVariablesRequest struct { func (x *UpdateProjectVariablesRequest) Reset() { *x = UpdateProjectVariablesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[34] + mi := &file_rill_admin_v1_api_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2019,7 +2322,7 @@ func (x *UpdateProjectVariablesRequest) String() string { func (*UpdateProjectVariablesRequest) ProtoMessage() {} func (x *UpdateProjectVariablesRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[34] + mi := &file_rill_admin_v1_api_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2032,7 +2335,7 @@ func (x *UpdateProjectVariablesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateProjectVariablesRequest.ProtoReflect.Descriptor instead. func (*UpdateProjectVariablesRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{34} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{38} } func (x *UpdateProjectVariablesRequest) GetOrganizationName() string { @@ -2067,7 +2370,7 @@ type UpdateProjectVariablesResponse struct { func (x *UpdateProjectVariablesResponse) Reset() { *x = UpdateProjectVariablesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[35] + mi := &file_rill_admin_v1_api_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2080,7 +2383,7 @@ func (x *UpdateProjectVariablesResponse) String() string { func (*UpdateProjectVariablesResponse) ProtoMessage() {} func (x *UpdateProjectVariablesResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[35] + mi := &file_rill_admin_v1_api_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2093,7 +2396,7 @@ func (x *UpdateProjectVariablesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateProjectVariablesResponse.ProtoReflect.Descriptor instead. func (*UpdateProjectVariablesResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{35} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{39} } func (x *UpdateProjectVariablesResponse) GetVariables() map[string]string { @@ -2114,7 +2417,7 @@ type TriggerReconcileRequest struct { func (x *TriggerReconcileRequest) Reset() { *x = TriggerReconcileRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[36] + mi := &file_rill_admin_v1_api_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2127,7 +2430,7 @@ func (x *TriggerReconcileRequest) String() string { func (*TriggerReconcileRequest) ProtoMessage() {} func (x *TriggerReconcileRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[36] + mi := &file_rill_admin_v1_api_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2140,7 +2443,7 @@ func (x *TriggerReconcileRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TriggerReconcileRequest.ProtoReflect.Descriptor instead. func (*TriggerReconcileRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{36} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{40} } func (x *TriggerReconcileRequest) GetDeploymentId() string { @@ -2159,7 +2462,7 @@ type TriggerReconcileResponse struct { func (x *TriggerReconcileResponse) Reset() { *x = TriggerReconcileResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[37] + mi := &file_rill_admin_v1_api_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2172,7 +2475,7 @@ func (x *TriggerReconcileResponse) String() string { func (*TriggerReconcileResponse) ProtoMessage() {} func (x *TriggerReconcileResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[37] + mi := &file_rill_admin_v1_api_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2185,7 +2488,7 @@ func (x *TriggerReconcileResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use TriggerReconcileResponse.ProtoReflect.Descriptor instead. func (*TriggerReconcileResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{37} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{41} } type TriggerRefreshSourcesRequest struct { @@ -2200,7 +2503,7 @@ type TriggerRefreshSourcesRequest struct { func (x *TriggerRefreshSourcesRequest) Reset() { *x = TriggerRefreshSourcesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[38] + mi := &file_rill_admin_v1_api_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2213,7 +2516,7 @@ func (x *TriggerRefreshSourcesRequest) String() string { func (*TriggerRefreshSourcesRequest) ProtoMessage() {} func (x *TriggerRefreshSourcesRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[38] + mi := &file_rill_admin_v1_api_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2226,7 +2529,7 @@ func (x *TriggerRefreshSourcesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TriggerRefreshSourcesRequest.ProtoReflect.Descriptor instead. func (*TriggerRefreshSourcesRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{38} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{42} } func (x *TriggerRefreshSourcesRequest) GetDeploymentId() string { @@ -2252,7 +2555,7 @@ type TriggerRefreshSourcesResponse struct { func (x *TriggerRefreshSourcesResponse) Reset() { *x = TriggerRefreshSourcesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[39] + mi := &file_rill_admin_v1_api_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2265,7 +2568,7 @@ func (x *TriggerRefreshSourcesResponse) String() string { func (*TriggerRefreshSourcesResponse) ProtoMessage() {} func (x *TriggerRefreshSourcesResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[39] + mi := &file_rill_admin_v1_api_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2278,7 +2581,7 @@ func (x *TriggerRefreshSourcesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use TriggerRefreshSourcesResponse.ProtoReflect.Descriptor instead. func (*TriggerRefreshSourcesResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{39} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{43} } type TriggerRedeployRequest struct { @@ -2296,7 +2599,7 @@ type TriggerRedeployRequest struct { func (x *TriggerRedeployRequest) Reset() { *x = TriggerRedeployRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[40] + mi := &file_rill_admin_v1_api_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2309,7 +2612,7 @@ func (x *TriggerRedeployRequest) String() string { func (*TriggerRedeployRequest) ProtoMessage() {} func (x *TriggerRedeployRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[40] + mi := &file_rill_admin_v1_api_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2322,7 +2625,7 @@ func (x *TriggerRedeployRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TriggerRedeployRequest.ProtoReflect.Descriptor instead. func (*TriggerRedeployRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{40} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{44} } func (x *TriggerRedeployRequest) GetOrganization() string { @@ -2355,7 +2658,7 @@ type TriggerRedeployResponse struct { func (x *TriggerRedeployResponse) Reset() { *x = TriggerRedeployResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[41] + mi := &file_rill_admin_v1_api_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2368,7 +2671,7 @@ func (x *TriggerRedeployResponse) String() string { func (*TriggerRedeployResponse) ProtoMessage() {} func (x *TriggerRedeployResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[41] + mi := &file_rill_admin_v1_api_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2381,7 +2684,7 @@ func (x *TriggerRedeployResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use TriggerRedeployResponse.ProtoReflect.Descriptor instead. func (*TriggerRedeployResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{41} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{45} } type ListOrganizationMembersRequest struct { @@ -2397,7 +2700,7 @@ type ListOrganizationMembersRequest struct { func (x *ListOrganizationMembersRequest) Reset() { *x = ListOrganizationMembersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[42] + mi := &file_rill_admin_v1_api_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2410,7 +2713,7 @@ func (x *ListOrganizationMembersRequest) String() string { func (*ListOrganizationMembersRequest) ProtoMessage() {} func (x *ListOrganizationMembersRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[42] + mi := &file_rill_admin_v1_api_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2423,7 +2726,7 @@ func (x *ListOrganizationMembersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListOrganizationMembersRequest.ProtoReflect.Descriptor instead. func (*ListOrganizationMembersRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{42} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{46} } func (x *ListOrganizationMembersRequest) GetOrganization() string { @@ -2459,7 +2762,7 @@ type ListOrganizationMembersResponse struct { func (x *ListOrganizationMembersResponse) Reset() { *x = ListOrganizationMembersResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[43] + mi := &file_rill_admin_v1_api_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2472,7 +2775,7 @@ func (x *ListOrganizationMembersResponse) String() string { func (*ListOrganizationMembersResponse) ProtoMessage() {} func (x *ListOrganizationMembersResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[43] + mi := &file_rill_admin_v1_api_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2485,7 +2788,7 @@ func (x *ListOrganizationMembersResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListOrganizationMembersResponse.ProtoReflect.Descriptor instead. func (*ListOrganizationMembersResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{43} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{47} } func (x *ListOrganizationMembersResponse) GetMembers() []*Member { @@ -2515,7 +2818,7 @@ type ListOrganizationInvitesRequest struct { func (x *ListOrganizationInvitesRequest) Reset() { *x = ListOrganizationInvitesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[44] + mi := &file_rill_admin_v1_api_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2528,7 +2831,7 @@ func (x *ListOrganizationInvitesRequest) String() string { func (*ListOrganizationInvitesRequest) ProtoMessage() {} func (x *ListOrganizationInvitesRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[44] + mi := &file_rill_admin_v1_api_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2541,7 +2844,7 @@ func (x *ListOrganizationInvitesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListOrganizationInvitesRequest.ProtoReflect.Descriptor instead. func (*ListOrganizationInvitesRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{44} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{48} } func (x *ListOrganizationInvitesRequest) GetOrganization() string { @@ -2577,7 +2880,7 @@ type ListOrganizationInvitesResponse struct { func (x *ListOrganizationInvitesResponse) Reset() { *x = ListOrganizationInvitesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[45] + mi := &file_rill_admin_v1_api_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2590,7 +2893,7 @@ func (x *ListOrganizationInvitesResponse) String() string { func (*ListOrganizationInvitesResponse) ProtoMessage() {} func (x *ListOrganizationInvitesResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[45] + mi := &file_rill_admin_v1_api_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2603,7 +2906,7 @@ func (x *ListOrganizationInvitesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListOrganizationInvitesResponse.ProtoReflect.Descriptor instead. func (*ListOrganizationInvitesResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{45} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{49} } func (x *ListOrganizationInvitesResponse) GetInvites() []*UserInvite { @@ -2633,7 +2936,7 @@ type AddOrganizationMemberRequest struct { func (x *AddOrganizationMemberRequest) Reset() { *x = AddOrganizationMemberRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[46] + mi := &file_rill_admin_v1_api_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2646,7 +2949,7 @@ func (x *AddOrganizationMemberRequest) String() string { func (*AddOrganizationMemberRequest) ProtoMessage() {} func (x *AddOrganizationMemberRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[46] + mi := &file_rill_admin_v1_api_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2659,7 +2962,7 @@ func (x *AddOrganizationMemberRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddOrganizationMemberRequest.ProtoReflect.Descriptor instead. func (*AddOrganizationMemberRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{46} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{50} } func (x *AddOrganizationMemberRequest) GetOrganization() string { @@ -2694,7 +2997,7 @@ type AddOrganizationMemberResponse struct { func (x *AddOrganizationMemberResponse) Reset() { *x = AddOrganizationMemberResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[47] + mi := &file_rill_admin_v1_api_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2707,7 +3010,7 @@ func (x *AddOrganizationMemberResponse) String() string { func (*AddOrganizationMemberResponse) ProtoMessage() {} func (x *AddOrganizationMemberResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[47] + mi := &file_rill_admin_v1_api_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2720,7 +3023,7 @@ func (x *AddOrganizationMemberResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AddOrganizationMemberResponse.ProtoReflect.Descriptor instead. func (*AddOrganizationMemberResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{47} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{51} } func (x *AddOrganizationMemberResponse) GetPendingSignup() bool { @@ -2743,7 +3046,7 @@ type RemoveOrganizationMemberRequest struct { func (x *RemoveOrganizationMemberRequest) Reset() { *x = RemoveOrganizationMemberRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[48] + mi := &file_rill_admin_v1_api_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2756,7 +3059,7 @@ func (x *RemoveOrganizationMemberRequest) String() string { func (*RemoveOrganizationMemberRequest) ProtoMessage() {} func (x *RemoveOrganizationMemberRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[48] + mi := &file_rill_admin_v1_api_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2769,7 +3072,7 @@ func (x *RemoveOrganizationMemberRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveOrganizationMemberRequest.ProtoReflect.Descriptor instead. func (*RemoveOrganizationMemberRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{48} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{52} } func (x *RemoveOrganizationMemberRequest) GetOrganization() string { @@ -2802,7 +3105,7 @@ type RemoveOrganizationMemberResponse struct { func (x *RemoveOrganizationMemberResponse) Reset() { *x = RemoveOrganizationMemberResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[49] + mi := &file_rill_admin_v1_api_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2815,7 +3118,7 @@ func (x *RemoveOrganizationMemberResponse) String() string { func (*RemoveOrganizationMemberResponse) ProtoMessage() {} func (x *RemoveOrganizationMemberResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[49] + mi := &file_rill_admin_v1_api_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2828,7 +3131,7 @@ func (x *RemoveOrganizationMemberResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveOrganizationMemberResponse.ProtoReflect.Descriptor instead. func (*RemoveOrganizationMemberResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{49} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{53} } type LeaveOrganizationRequest struct { @@ -2842,7 +3145,7 @@ type LeaveOrganizationRequest struct { func (x *LeaveOrganizationRequest) Reset() { *x = LeaveOrganizationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[50] + mi := &file_rill_admin_v1_api_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2855,7 +3158,7 @@ func (x *LeaveOrganizationRequest) String() string { func (*LeaveOrganizationRequest) ProtoMessage() {} func (x *LeaveOrganizationRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[50] + mi := &file_rill_admin_v1_api_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2868,7 +3171,7 @@ func (x *LeaveOrganizationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LeaveOrganizationRequest.ProtoReflect.Descriptor instead. func (*LeaveOrganizationRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{50} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{54} } func (x *LeaveOrganizationRequest) GetOrganization() string { @@ -2887,7 +3190,7 @@ type LeaveOrganizationResponse struct { func (x *LeaveOrganizationResponse) Reset() { *x = LeaveOrganizationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[51] + mi := &file_rill_admin_v1_api_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2900,7 +3203,7 @@ func (x *LeaveOrganizationResponse) String() string { func (*LeaveOrganizationResponse) ProtoMessage() {} func (x *LeaveOrganizationResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[51] + mi := &file_rill_admin_v1_api_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2913,7 +3216,7 @@ func (x *LeaveOrganizationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LeaveOrganizationResponse.ProtoReflect.Descriptor instead. func (*LeaveOrganizationResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{51} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{55} } type SetOrganizationMemberRoleRequest struct { @@ -2929,7 +3232,7 @@ type SetOrganizationMemberRoleRequest struct { func (x *SetOrganizationMemberRoleRequest) Reset() { *x = SetOrganizationMemberRoleRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[52] + mi := &file_rill_admin_v1_api_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2942,7 +3245,7 @@ func (x *SetOrganizationMemberRoleRequest) String() string { func (*SetOrganizationMemberRoleRequest) ProtoMessage() {} func (x *SetOrganizationMemberRoleRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[52] + mi := &file_rill_admin_v1_api_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2955,7 +3258,7 @@ func (x *SetOrganizationMemberRoleRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetOrganizationMemberRoleRequest.ProtoReflect.Descriptor instead. func (*SetOrganizationMemberRoleRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{52} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{56} } func (x *SetOrganizationMemberRoleRequest) GetOrganization() string { @@ -2988,7 +3291,7 @@ type SetOrganizationMemberRoleResponse struct { func (x *SetOrganizationMemberRoleResponse) Reset() { *x = SetOrganizationMemberRoleResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[53] + mi := &file_rill_admin_v1_api_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3001,7 +3304,7 @@ func (x *SetOrganizationMemberRoleResponse) String() string { func (*SetOrganizationMemberRoleResponse) ProtoMessage() {} func (x *SetOrganizationMemberRoleResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[53] + mi := &file_rill_admin_v1_api_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3014,7 +3317,7 @@ func (x *SetOrganizationMemberRoleResponse) ProtoReflect() protoreflect.Message // Deprecated: Use SetOrganizationMemberRoleResponse.ProtoReflect.Descriptor instead. func (*SetOrganizationMemberRoleResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{53} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{57} } type ListSuperusersRequest struct { @@ -3026,7 +3329,7 @@ type ListSuperusersRequest struct { func (x *ListSuperusersRequest) Reset() { *x = ListSuperusersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[54] + mi := &file_rill_admin_v1_api_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3039,7 +3342,7 @@ func (x *ListSuperusersRequest) String() string { func (*ListSuperusersRequest) ProtoMessage() {} func (x *ListSuperusersRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[54] + mi := &file_rill_admin_v1_api_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3052,7 +3355,7 @@ func (x *ListSuperusersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListSuperusersRequest.ProtoReflect.Descriptor instead. func (*ListSuperusersRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{54} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{58} } type ListSuperusersResponse struct { @@ -3066,7 +3369,7 @@ type ListSuperusersResponse struct { func (x *ListSuperusersResponse) Reset() { *x = ListSuperusersResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[55] + mi := &file_rill_admin_v1_api_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3079,7 +3382,7 @@ func (x *ListSuperusersResponse) String() string { func (*ListSuperusersResponse) ProtoMessage() {} func (x *ListSuperusersResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[55] + mi := &file_rill_admin_v1_api_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3092,7 +3395,7 @@ func (x *ListSuperusersResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListSuperusersResponse.ProtoReflect.Descriptor instead. func (*ListSuperusersResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{55} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{59} } func (x *ListSuperusersResponse) GetUsers() []*User { @@ -3114,7 +3417,7 @@ type SetSuperuserRequest struct { func (x *SetSuperuserRequest) Reset() { *x = SetSuperuserRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[56] + mi := &file_rill_admin_v1_api_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3127,7 +3430,7 @@ func (x *SetSuperuserRequest) String() string { func (*SetSuperuserRequest) ProtoMessage() {} func (x *SetSuperuserRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[56] + mi := &file_rill_admin_v1_api_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3140,7 +3443,7 @@ func (x *SetSuperuserRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetSuperuserRequest.ProtoReflect.Descriptor instead. func (*SetSuperuserRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{56} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{60} } func (x *SetSuperuserRequest) GetEmail() string { @@ -3166,7 +3469,7 @@ type SetSuperuserResponse struct { func (x *SetSuperuserResponse) Reset() { *x = SetSuperuserResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[57] + mi := &file_rill_admin_v1_api_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3179,7 +3482,7 @@ func (x *SetSuperuserResponse) String() string { func (*SetSuperuserResponse) ProtoMessage() {} func (x *SetSuperuserResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[57] + mi := &file_rill_admin_v1_api_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3192,7 +3495,7 @@ func (x *SetSuperuserResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetSuperuserResponse.ProtoReflect.Descriptor instead. func (*SetSuperuserResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{57} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{61} } // SudoGetResourceRequest @@ -3214,7 +3517,7 @@ type SudoGetResourceRequest struct { func (x *SudoGetResourceRequest) Reset() { *x = SudoGetResourceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[58] + mi := &file_rill_admin_v1_api_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3227,7 +3530,7 @@ func (x *SudoGetResourceRequest) String() string { func (*SudoGetResourceRequest) ProtoMessage() {} func (x *SudoGetResourceRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[58] + mi := &file_rill_admin_v1_api_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3240,7 +3543,7 @@ func (x *SudoGetResourceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SudoGetResourceRequest.ProtoReflect.Descriptor instead. func (*SudoGetResourceRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{58} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{62} } func (m *SudoGetResourceRequest) GetId() isSudoGetResourceRequest_Id { @@ -3338,7 +3641,7 @@ type SudoGetResourceResponse struct { func (x *SudoGetResourceResponse) Reset() { *x = SudoGetResourceResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[59] + mi := &file_rill_admin_v1_api_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3351,7 +3654,7 @@ func (x *SudoGetResourceResponse) String() string { func (*SudoGetResourceResponse) ProtoMessage() {} func (x *SudoGetResourceResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[59] + mi := &file_rill_admin_v1_api_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3364,7 +3667,7 @@ func (x *SudoGetResourceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SudoGetResourceResponse.ProtoReflect.Descriptor instead. func (*SudoGetResourceResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{59} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{63} } func (m *SudoGetResourceResponse) GetResource() isSudoGetResourceResponse_Resource { @@ -3460,7 +3763,7 @@ type SudoUpdateOrganizationQuotasRequest struct { func (x *SudoUpdateOrganizationQuotasRequest) Reset() { *x = SudoUpdateOrganizationQuotasRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[60] + mi := &file_rill_admin_v1_api_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3473,7 +3776,7 @@ func (x *SudoUpdateOrganizationQuotasRequest) String() string { func (*SudoUpdateOrganizationQuotasRequest) ProtoMessage() {} func (x *SudoUpdateOrganizationQuotasRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[60] + mi := &file_rill_admin_v1_api_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3486,7 +3789,7 @@ func (x *SudoUpdateOrganizationQuotasRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use SudoUpdateOrganizationQuotasRequest.ProtoReflect.Descriptor instead. func (*SudoUpdateOrganizationQuotasRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{60} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{64} } func (x *SudoUpdateOrganizationQuotasRequest) GetOrgName() string { @@ -3543,7 +3846,7 @@ type SudoUpdateOrganizationQuotasResponse struct { func (x *SudoUpdateOrganizationQuotasResponse) Reset() { *x = SudoUpdateOrganizationQuotasResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[61] + mi := &file_rill_admin_v1_api_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3556,7 +3859,7 @@ func (x *SudoUpdateOrganizationQuotasResponse) String() string { func (*SudoUpdateOrganizationQuotasResponse) ProtoMessage() {} func (x *SudoUpdateOrganizationQuotasResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[61] + mi := &file_rill_admin_v1_api_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3569,7 +3872,7 @@ func (x *SudoUpdateOrganizationQuotasResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use SudoUpdateOrganizationQuotasResponse.ProtoReflect.Descriptor instead. func (*SudoUpdateOrganizationQuotasResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{61} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{65} } func (x *SudoUpdateOrganizationQuotasResponse) GetOrganization() *Organization { @@ -3592,7 +3895,7 @@ type SudoUpdateUserQuotasRequest struct { func (x *SudoUpdateUserQuotasRequest) Reset() { *x = SudoUpdateUserQuotasRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[62] + mi := &file_rill_admin_v1_api_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3605,7 +3908,7 @@ func (x *SudoUpdateUserQuotasRequest) String() string { func (*SudoUpdateUserQuotasRequest) ProtoMessage() {} func (x *SudoUpdateUserQuotasRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[62] + mi := &file_rill_admin_v1_api_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3618,7 +3921,7 @@ func (x *SudoUpdateUserQuotasRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SudoUpdateUserQuotasRequest.ProtoReflect.Descriptor instead. func (*SudoUpdateUserQuotasRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{62} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{66} } func (x *SudoUpdateUserQuotasRequest) GetEmail() string { @@ -3647,7 +3950,7 @@ type SudoUpdateUserQuotasResponse struct { func (x *SudoUpdateUserQuotasResponse) Reset() { *x = SudoUpdateUserQuotasResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[63] + mi := &file_rill_admin_v1_api_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3660,7 +3963,7 @@ func (x *SudoUpdateUserQuotasResponse) String() string { func (*SudoUpdateUserQuotasResponse) ProtoMessage() {} func (x *SudoUpdateUserQuotasResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[63] + mi := &file_rill_admin_v1_api_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3673,7 +3976,7 @@ func (x *SudoUpdateUserQuotasResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SudoUpdateUserQuotasResponse.ProtoReflect.Descriptor instead. func (*SudoUpdateUserQuotasResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{63} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{67} } func (x *SudoUpdateUserQuotasResponse) GetUser() *User { @@ -3697,7 +4000,7 @@ type ListProjectMembersRequest struct { func (x *ListProjectMembersRequest) Reset() { *x = ListProjectMembersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[64] + mi := &file_rill_admin_v1_api_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3710,7 +4013,7 @@ func (x *ListProjectMembersRequest) String() string { func (*ListProjectMembersRequest) ProtoMessage() {} func (x *ListProjectMembersRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[64] + mi := &file_rill_admin_v1_api_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3723,7 +4026,7 @@ func (x *ListProjectMembersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListProjectMembersRequest.ProtoReflect.Descriptor instead. func (*ListProjectMembersRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{64} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{68} } func (x *ListProjectMembersRequest) GetOrganization() string { @@ -3766,7 +4069,7 @@ type ListProjectMembersResponse struct { func (x *ListProjectMembersResponse) Reset() { *x = ListProjectMembersResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[65] + mi := &file_rill_admin_v1_api_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3779,7 +4082,7 @@ func (x *ListProjectMembersResponse) String() string { func (*ListProjectMembersResponse) ProtoMessage() {} func (x *ListProjectMembersResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[65] + mi := &file_rill_admin_v1_api_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3792,7 +4095,7 @@ func (x *ListProjectMembersResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListProjectMembersResponse.ProtoReflect.Descriptor instead. func (*ListProjectMembersResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{65} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{69} } func (x *ListProjectMembersResponse) GetMembers() []*Member { @@ -3823,7 +4126,7 @@ type ListProjectInvitesRequest struct { func (x *ListProjectInvitesRequest) Reset() { *x = ListProjectInvitesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[66] + mi := &file_rill_admin_v1_api_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3836,7 +4139,7 @@ func (x *ListProjectInvitesRequest) String() string { func (*ListProjectInvitesRequest) ProtoMessage() {} func (x *ListProjectInvitesRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[66] + mi := &file_rill_admin_v1_api_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3849,7 +4152,7 @@ func (x *ListProjectInvitesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListProjectInvitesRequest.ProtoReflect.Descriptor instead. func (*ListProjectInvitesRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{66} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{70} } func (x *ListProjectInvitesRequest) GetOrganization() string { @@ -3892,7 +4195,7 @@ type ListProjectInvitesResponse struct { func (x *ListProjectInvitesResponse) Reset() { *x = ListProjectInvitesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[67] + mi := &file_rill_admin_v1_api_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3905,7 +4208,7 @@ func (x *ListProjectInvitesResponse) String() string { func (*ListProjectInvitesResponse) ProtoMessage() {} func (x *ListProjectInvitesResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[67] + mi := &file_rill_admin_v1_api_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3918,7 +4221,7 @@ func (x *ListProjectInvitesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListProjectInvitesResponse.ProtoReflect.Descriptor instead. func (*ListProjectInvitesResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{67} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{71} } func (x *ListProjectInvitesResponse) GetInvites() []*UserInvite { @@ -3949,7 +4252,7 @@ type AddProjectMemberRequest struct { func (x *AddProjectMemberRequest) Reset() { *x = AddProjectMemberRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[68] + mi := &file_rill_admin_v1_api_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3962,7 +4265,7 @@ func (x *AddProjectMemberRequest) String() string { func (*AddProjectMemberRequest) ProtoMessage() {} func (x *AddProjectMemberRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[68] + mi := &file_rill_admin_v1_api_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3975,7 +4278,7 @@ func (x *AddProjectMemberRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddProjectMemberRequest.ProtoReflect.Descriptor instead. func (*AddProjectMemberRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{68} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{72} } func (x *AddProjectMemberRequest) GetOrganization() string { @@ -4017,7 +4320,7 @@ type AddProjectMemberResponse struct { func (x *AddProjectMemberResponse) Reset() { *x = AddProjectMemberResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[69] + mi := &file_rill_admin_v1_api_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4030,7 +4333,7 @@ func (x *AddProjectMemberResponse) String() string { func (*AddProjectMemberResponse) ProtoMessage() {} func (x *AddProjectMemberResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[69] + mi := &file_rill_admin_v1_api_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4043,7 +4346,7 @@ func (x *AddProjectMemberResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AddProjectMemberResponse.ProtoReflect.Descriptor instead. func (*AddProjectMemberResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{69} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{73} } func (x *AddProjectMemberResponse) GetPendingSignup() bool { @@ -4066,7 +4369,7 @@ type RemoveProjectMemberRequest struct { func (x *RemoveProjectMemberRequest) Reset() { *x = RemoveProjectMemberRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[70] + mi := &file_rill_admin_v1_api_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4079,7 +4382,7 @@ func (x *RemoveProjectMemberRequest) String() string { func (*RemoveProjectMemberRequest) ProtoMessage() {} func (x *RemoveProjectMemberRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[70] + mi := &file_rill_admin_v1_api_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4092,7 +4395,7 @@ func (x *RemoveProjectMemberRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveProjectMemberRequest.ProtoReflect.Descriptor instead. func (*RemoveProjectMemberRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{70} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{74} } func (x *RemoveProjectMemberRequest) GetOrganization() string { @@ -4125,7 +4428,7 @@ type RemoveProjectMemberResponse struct { func (x *RemoveProjectMemberResponse) Reset() { *x = RemoveProjectMemberResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[71] + mi := &file_rill_admin_v1_api_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4138,7 +4441,7 @@ func (x *RemoveProjectMemberResponse) String() string { func (*RemoveProjectMemberResponse) ProtoMessage() {} func (x *RemoveProjectMemberResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[71] + mi := &file_rill_admin_v1_api_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4151,7 +4454,7 @@ func (x *RemoveProjectMemberResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveProjectMemberResponse.ProtoReflect.Descriptor instead. func (*RemoveProjectMemberResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{71} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{75} } type SetProjectMemberRoleRequest struct { @@ -4168,7 +4471,7 @@ type SetProjectMemberRoleRequest struct { func (x *SetProjectMemberRoleRequest) Reset() { *x = SetProjectMemberRoleRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[72] + mi := &file_rill_admin_v1_api_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4181,7 +4484,7 @@ func (x *SetProjectMemberRoleRequest) String() string { func (*SetProjectMemberRoleRequest) ProtoMessage() {} func (x *SetProjectMemberRoleRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[72] + mi := &file_rill_admin_v1_api_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4194,7 +4497,7 @@ func (x *SetProjectMemberRoleRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetProjectMemberRoleRequest.ProtoReflect.Descriptor instead. func (*SetProjectMemberRoleRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{72} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{76} } func (x *SetProjectMemberRoleRequest) GetOrganization() string { @@ -4234,7 +4537,7 @@ type SetProjectMemberRoleResponse struct { func (x *SetProjectMemberRoleResponse) Reset() { *x = SetProjectMemberRoleResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[73] + mi := &file_rill_admin_v1_api_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4247,7 +4550,7 @@ func (x *SetProjectMemberRoleResponse) String() string { func (*SetProjectMemberRoleResponse) ProtoMessage() {} func (x *SetProjectMemberRoleResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[73] + mi := &file_rill_admin_v1_api_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4260,7 +4563,7 @@ func (x *SetProjectMemberRoleResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetProjectMemberRoleResponse.ProtoReflect.Descriptor instead. func (*SetProjectMemberRoleResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{73} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{77} } type GetCurrentUserRequest struct { @@ -4272,7 +4575,7 @@ type GetCurrentUserRequest struct { func (x *GetCurrentUserRequest) Reset() { *x = GetCurrentUserRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[74] + mi := &file_rill_admin_v1_api_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4285,7 +4588,7 @@ func (x *GetCurrentUserRequest) String() string { func (*GetCurrentUserRequest) ProtoMessage() {} func (x *GetCurrentUserRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[74] + mi := &file_rill_admin_v1_api_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4298,7 +4601,7 @@ func (x *GetCurrentUserRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCurrentUserRequest.ProtoReflect.Descriptor instead. func (*GetCurrentUserRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{74} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{78} } type GetCurrentUserResponse struct { @@ -4313,7 +4616,7 @@ type GetCurrentUserResponse struct { func (x *GetCurrentUserResponse) Reset() { *x = GetCurrentUserResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[75] + mi := &file_rill_admin_v1_api_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4326,7 +4629,7 @@ func (x *GetCurrentUserResponse) String() string { func (*GetCurrentUserResponse) ProtoMessage() {} func (x *GetCurrentUserResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[75] + mi := &file_rill_admin_v1_api_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4339,7 +4642,7 @@ func (x *GetCurrentUserResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCurrentUserResponse.ProtoReflect.Descriptor instead. func (*GetCurrentUserResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{75} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{79} } func (x *GetCurrentUserResponse) GetUser() *User { @@ -4367,7 +4670,7 @@ type GetUserRequest struct { func (x *GetUserRequest) Reset() { *x = GetUserRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[76] + mi := &file_rill_admin_v1_api_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4380,7 +4683,7 @@ func (x *GetUserRequest) String() string { func (*GetUserRequest) ProtoMessage() {} func (x *GetUserRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[76] + mi := &file_rill_admin_v1_api_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4393,7 +4696,7 @@ func (x *GetUserRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetUserRequest.ProtoReflect.Descriptor instead. func (*GetUserRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{76} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{80} } func (x *GetUserRequest) GetEmail() string { @@ -4414,7 +4717,7 @@ type GetUserResponse struct { func (x *GetUserResponse) Reset() { *x = GetUserResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[77] + mi := &file_rill_admin_v1_api_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4427,7 +4730,7 @@ func (x *GetUserResponse) String() string { func (*GetUserResponse) ProtoMessage() {} func (x *GetUserResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[77] + mi := &file_rill_admin_v1_api_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4440,7 +4743,7 @@ func (x *GetUserResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetUserResponse.ProtoReflect.Descriptor instead. func (*GetUserResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{77} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{81} } func (x *GetUserResponse) GetUser() *User { @@ -4462,7 +4765,7 @@ type UserPreferences struct { func (x *UserPreferences) Reset() { *x = UserPreferences{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[78] + mi := &file_rill_admin_v1_api_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4475,7 +4778,7 @@ func (x *UserPreferences) String() string { func (*UserPreferences) ProtoMessage() {} func (x *UserPreferences) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[78] + mi := &file_rill_admin_v1_api_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4488,7 +4791,7 @@ func (x *UserPreferences) ProtoReflect() protoreflect.Message { // Deprecated: Use UserPreferences.ProtoReflect.Descriptor instead. func (*UserPreferences) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{78} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{82} } func (x *UserPreferences) GetTimeZone() string { @@ -4510,7 +4813,7 @@ type UpdateUserPreferencesRequest struct { func (x *UpdateUserPreferencesRequest) Reset() { *x = UpdateUserPreferencesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[79] + mi := &file_rill_admin_v1_api_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4523,7 +4826,7 @@ func (x *UpdateUserPreferencesRequest) String() string { func (*UpdateUserPreferencesRequest) ProtoMessage() {} func (x *UpdateUserPreferencesRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[79] + mi := &file_rill_admin_v1_api_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4536,7 +4839,7 @@ func (x *UpdateUserPreferencesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateUserPreferencesRequest.ProtoReflect.Descriptor instead. func (*UpdateUserPreferencesRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{79} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{83} } func (x *UpdateUserPreferencesRequest) GetPreferences() *UserPreferences { @@ -4557,7 +4860,7 @@ type UpdateUserPreferencesResponse struct { func (x *UpdateUserPreferencesResponse) Reset() { *x = UpdateUserPreferencesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[80] + mi := &file_rill_admin_v1_api_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4570,7 +4873,7 @@ func (x *UpdateUserPreferencesResponse) String() string { func (*UpdateUserPreferencesResponse) ProtoMessage() {} func (x *UpdateUserPreferencesResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[80] + mi := &file_rill_admin_v1_api_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4583,7 +4886,7 @@ func (x *UpdateUserPreferencesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateUserPreferencesResponse.ProtoReflect.Descriptor instead. func (*UpdateUserPreferencesResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{80} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{84} } func (x *UpdateUserPreferencesResponse) GetPreferences() *UserPreferences { @@ -4604,7 +4907,7 @@ type ListBookmarksRequest struct { func (x *ListBookmarksRequest) Reset() { *x = ListBookmarksRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[81] + mi := &file_rill_admin_v1_api_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4617,7 +4920,7 @@ func (x *ListBookmarksRequest) String() string { func (*ListBookmarksRequest) ProtoMessage() {} func (x *ListBookmarksRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[81] + mi := &file_rill_admin_v1_api_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4630,7 +4933,7 @@ func (x *ListBookmarksRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListBookmarksRequest.ProtoReflect.Descriptor instead. func (*ListBookmarksRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{81} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{85} } func (x *ListBookmarksRequest) GetProjectId() string { @@ -4651,7 +4954,7 @@ type ListBookmarksResponse struct { func (x *ListBookmarksResponse) Reset() { *x = ListBookmarksResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[82] + mi := &file_rill_admin_v1_api_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4664,7 +4967,7 @@ func (x *ListBookmarksResponse) String() string { func (*ListBookmarksResponse) ProtoMessage() {} func (x *ListBookmarksResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[82] + mi := &file_rill_admin_v1_api_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4677,7 +4980,7 @@ func (x *ListBookmarksResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListBookmarksResponse.ProtoReflect.Descriptor instead. func (*ListBookmarksResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{82} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{86} } func (x *ListBookmarksResponse) GetBookmarks() []*Bookmark { @@ -4698,7 +5001,7 @@ type GetBookmarkRequest struct { func (x *GetBookmarkRequest) Reset() { *x = GetBookmarkRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[83] + mi := &file_rill_admin_v1_api_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4711,7 +5014,7 @@ func (x *GetBookmarkRequest) String() string { func (*GetBookmarkRequest) ProtoMessage() {} func (x *GetBookmarkRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[83] + mi := &file_rill_admin_v1_api_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4724,7 +5027,7 @@ func (x *GetBookmarkRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBookmarkRequest.ProtoReflect.Descriptor instead. func (*GetBookmarkRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{83} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{87} } func (x *GetBookmarkRequest) GetBookmarkId() string { @@ -4745,7 +5048,7 @@ type GetBookmarkResponse struct { func (x *GetBookmarkResponse) Reset() { *x = GetBookmarkResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[84] + mi := &file_rill_admin_v1_api_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4758,7 +5061,7 @@ func (x *GetBookmarkResponse) String() string { func (*GetBookmarkResponse) ProtoMessage() {} func (x *GetBookmarkResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[84] + mi := &file_rill_admin_v1_api_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4771,7 +5074,7 @@ func (x *GetBookmarkResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBookmarkResponse.ProtoReflect.Descriptor instead. func (*GetBookmarkResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{84} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{88} } func (x *GetBookmarkResponse) GetBookmark() *Bookmark { @@ -4795,7 +5098,7 @@ type CreateBookmarkRequest struct { func (x *CreateBookmarkRequest) Reset() { *x = CreateBookmarkRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[85] + mi := &file_rill_admin_v1_api_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4808,7 +5111,7 @@ func (x *CreateBookmarkRequest) String() string { func (*CreateBookmarkRequest) ProtoMessage() {} func (x *CreateBookmarkRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[85] + mi := &file_rill_admin_v1_api_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4821,7 +5124,7 @@ func (x *CreateBookmarkRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateBookmarkRequest.ProtoReflect.Descriptor instead. func (*CreateBookmarkRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{85} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{89} } func (x *CreateBookmarkRequest) GetDisplayName() string { @@ -4863,7 +5166,7 @@ type CreateBookmarkResponse struct { func (x *CreateBookmarkResponse) Reset() { *x = CreateBookmarkResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[86] + mi := &file_rill_admin_v1_api_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4876,7 +5179,7 @@ func (x *CreateBookmarkResponse) String() string { func (*CreateBookmarkResponse) ProtoMessage() {} func (x *CreateBookmarkResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[86] + mi := &file_rill_admin_v1_api_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4889,7 +5192,7 @@ func (x *CreateBookmarkResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateBookmarkResponse.ProtoReflect.Descriptor instead. func (*CreateBookmarkResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{86} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{90} } func (x *CreateBookmarkResponse) GetBookmark() *Bookmark { @@ -4910,7 +5213,7 @@ type RemoveBookmarkRequest struct { func (x *RemoveBookmarkRequest) Reset() { *x = RemoveBookmarkRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[87] + mi := &file_rill_admin_v1_api_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4923,7 +5226,7 @@ func (x *RemoveBookmarkRequest) String() string { func (*RemoveBookmarkRequest) ProtoMessage() {} func (x *RemoveBookmarkRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[87] + mi := &file_rill_admin_v1_api_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4936,7 +5239,7 @@ func (x *RemoveBookmarkRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveBookmarkRequest.ProtoReflect.Descriptor instead. func (*RemoveBookmarkRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{87} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{91} } func (x *RemoveBookmarkRequest) GetBookmarkId() string { @@ -4955,7 +5258,7 @@ type RemoveBookmarkResponse struct { func (x *RemoveBookmarkResponse) Reset() { *x = RemoveBookmarkResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[88] + mi := &file_rill_admin_v1_api_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4968,7 +5271,7 @@ func (x *RemoveBookmarkResponse) String() string { func (*RemoveBookmarkResponse) ProtoMessage() {} func (x *RemoveBookmarkResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[88] + mi := &file_rill_admin_v1_api_proto_msgTypes[92] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4981,7 +5284,7 @@ func (x *RemoveBookmarkResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveBookmarkResponse.ProtoReflect.Descriptor instead. func (*RemoveBookmarkResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{88} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{92} } // It can be some string as well so not validating for email here @@ -4998,7 +5301,7 @@ type SearchUsersRequest struct { func (x *SearchUsersRequest) Reset() { *x = SearchUsersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[89] + mi := &file_rill_admin_v1_api_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5011,7 +5314,7 @@ func (x *SearchUsersRequest) String() string { func (*SearchUsersRequest) ProtoMessage() {} func (x *SearchUsersRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[89] + mi := &file_rill_admin_v1_api_proto_msgTypes[93] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5024,7 +5327,7 @@ func (x *SearchUsersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchUsersRequest.ProtoReflect.Descriptor instead. func (*SearchUsersRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{89} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{93} } func (x *SearchUsersRequest) GetEmailPattern() string { @@ -5060,7 +5363,7 @@ type SearchUsersResponse struct { func (x *SearchUsersResponse) Reset() { *x = SearchUsersResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[90] + mi := &file_rill_admin_v1_api_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5073,7 +5376,7 @@ func (x *SearchUsersResponse) String() string { func (*SearchUsersResponse) ProtoMessage() {} func (x *SearchUsersResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[90] + mi := &file_rill_admin_v1_api_proto_msgTypes[94] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5086,7 +5389,7 @@ func (x *SearchUsersResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchUsersResponse.ProtoReflect.Descriptor instead. func (*SearchUsersResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{90} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{94} } func (x *SearchUsersResponse) GetUsers() []*User { @@ -5112,7 +5415,7 @@ type RevokeCurrentAuthTokenRequest struct { func (x *RevokeCurrentAuthTokenRequest) Reset() { *x = RevokeCurrentAuthTokenRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[91] + mi := &file_rill_admin_v1_api_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5125,7 +5428,7 @@ func (x *RevokeCurrentAuthTokenRequest) String() string { func (*RevokeCurrentAuthTokenRequest) ProtoMessage() {} func (x *RevokeCurrentAuthTokenRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[91] + mi := &file_rill_admin_v1_api_proto_msgTypes[95] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5138,7 +5441,7 @@ func (x *RevokeCurrentAuthTokenRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RevokeCurrentAuthTokenRequest.ProtoReflect.Descriptor instead. func (*RevokeCurrentAuthTokenRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{91} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{95} } type RevokeCurrentAuthTokenResponse struct { @@ -5152,7 +5455,7 @@ type RevokeCurrentAuthTokenResponse struct { func (x *RevokeCurrentAuthTokenResponse) Reset() { *x = RevokeCurrentAuthTokenResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[92] + mi := &file_rill_admin_v1_api_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5165,7 +5468,7 @@ func (x *RevokeCurrentAuthTokenResponse) String() string { func (*RevokeCurrentAuthTokenResponse) ProtoMessage() {} func (x *RevokeCurrentAuthTokenResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[92] + mi := &file_rill_admin_v1_api_proto_msgTypes[96] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5178,7 +5481,7 @@ func (x *RevokeCurrentAuthTokenResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RevokeCurrentAuthTokenResponse.ProtoReflect.Descriptor instead. func (*RevokeCurrentAuthTokenResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{92} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{96} } func (x *RevokeCurrentAuthTokenResponse) GetTokenId() string { @@ -5200,7 +5503,7 @@ type IssueRepresentativeAuthTokenRequest struct { func (x *IssueRepresentativeAuthTokenRequest) Reset() { *x = IssueRepresentativeAuthTokenRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[93] + mi := &file_rill_admin_v1_api_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5213,7 +5516,7 @@ func (x *IssueRepresentativeAuthTokenRequest) String() string { func (*IssueRepresentativeAuthTokenRequest) ProtoMessage() {} func (x *IssueRepresentativeAuthTokenRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[93] + mi := &file_rill_admin_v1_api_proto_msgTypes[97] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5226,7 +5529,7 @@ func (x *IssueRepresentativeAuthTokenRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use IssueRepresentativeAuthTokenRequest.ProtoReflect.Descriptor instead. func (*IssueRepresentativeAuthTokenRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{93} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{97} } func (x *IssueRepresentativeAuthTokenRequest) GetEmail() string { @@ -5254,7 +5557,7 @@ type IssueRepresentativeAuthTokenResponse struct { func (x *IssueRepresentativeAuthTokenResponse) Reset() { *x = IssueRepresentativeAuthTokenResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[94] + mi := &file_rill_admin_v1_api_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5267,7 +5570,7 @@ func (x *IssueRepresentativeAuthTokenResponse) String() string { func (*IssueRepresentativeAuthTokenResponse) ProtoMessage() {} func (x *IssueRepresentativeAuthTokenResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[94] + mi := &file_rill_admin_v1_api_proto_msgTypes[98] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5280,7 +5583,7 @@ func (x *IssueRepresentativeAuthTokenResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use IssueRepresentativeAuthTokenResponse.ProtoReflect.Descriptor instead. func (*IssueRepresentativeAuthTokenResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{94} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{98} } func (x *IssueRepresentativeAuthTokenResponse) GetToken() string { @@ -5301,7 +5604,7 @@ type RevokeServiceAuthTokenRequest struct { func (x *RevokeServiceAuthTokenRequest) Reset() { *x = RevokeServiceAuthTokenRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[95] + mi := &file_rill_admin_v1_api_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5314,7 +5617,7 @@ func (x *RevokeServiceAuthTokenRequest) String() string { func (*RevokeServiceAuthTokenRequest) ProtoMessage() {} func (x *RevokeServiceAuthTokenRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[95] + mi := &file_rill_admin_v1_api_proto_msgTypes[99] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5327,7 +5630,7 @@ func (x *RevokeServiceAuthTokenRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RevokeServiceAuthTokenRequest.ProtoReflect.Descriptor instead. func (*RevokeServiceAuthTokenRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{95} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{99} } func (x *RevokeServiceAuthTokenRequest) GetTokenId() string { @@ -5346,7 +5649,7 @@ type RevokeServiceAuthTokenResponse struct { func (x *RevokeServiceAuthTokenResponse) Reset() { *x = RevokeServiceAuthTokenResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[96] + mi := &file_rill_admin_v1_api_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5359,7 +5662,7 @@ func (x *RevokeServiceAuthTokenResponse) String() string { func (*RevokeServiceAuthTokenResponse) ProtoMessage() {} func (x *RevokeServiceAuthTokenResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[96] + mi := &file_rill_admin_v1_api_proto_msgTypes[100] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5372,7 +5675,7 @@ func (x *RevokeServiceAuthTokenResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RevokeServiceAuthTokenResponse.ProtoReflect.Descriptor instead. func (*RevokeServiceAuthTokenResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{96} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{100} } type IssueServiceAuthTokenRequest struct { @@ -5387,7 +5690,7 @@ type IssueServiceAuthTokenRequest struct { func (x *IssueServiceAuthTokenRequest) Reset() { *x = IssueServiceAuthTokenRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[97] + mi := &file_rill_admin_v1_api_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5400,7 +5703,7 @@ func (x *IssueServiceAuthTokenRequest) String() string { func (*IssueServiceAuthTokenRequest) ProtoMessage() {} func (x *IssueServiceAuthTokenRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[97] + mi := &file_rill_admin_v1_api_proto_msgTypes[101] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5413,7 +5716,7 @@ func (x *IssueServiceAuthTokenRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use IssueServiceAuthTokenRequest.ProtoReflect.Descriptor instead. func (*IssueServiceAuthTokenRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{97} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{101} } func (x *IssueServiceAuthTokenRequest) GetOrganizationName() string { @@ -5441,7 +5744,7 @@ type IssueServiceAuthTokenResponse struct { func (x *IssueServiceAuthTokenResponse) Reset() { *x = IssueServiceAuthTokenResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[98] + mi := &file_rill_admin_v1_api_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5454,7 +5757,7 @@ func (x *IssueServiceAuthTokenResponse) String() string { func (*IssueServiceAuthTokenResponse) ProtoMessage() {} func (x *IssueServiceAuthTokenResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[98] + mi := &file_rill_admin_v1_api_proto_msgTypes[102] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5467,7 +5770,7 @@ func (x *IssueServiceAuthTokenResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use IssueServiceAuthTokenResponse.ProtoReflect.Descriptor instead. func (*IssueServiceAuthTokenResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{98} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{102} } func (x *IssueServiceAuthTokenResponse) GetToken() string { @@ -5489,7 +5792,7 @@ type ListServiceAuthTokensRequest struct { func (x *ListServiceAuthTokensRequest) Reset() { *x = ListServiceAuthTokensRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[99] + mi := &file_rill_admin_v1_api_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5502,7 +5805,7 @@ func (x *ListServiceAuthTokensRequest) String() string { func (*ListServiceAuthTokensRequest) ProtoMessage() {} func (x *ListServiceAuthTokensRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[99] + mi := &file_rill_admin_v1_api_proto_msgTypes[103] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5515,7 +5818,7 @@ func (x *ListServiceAuthTokensRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListServiceAuthTokensRequest.ProtoReflect.Descriptor instead. func (*ListServiceAuthTokensRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{99} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{103} } func (x *ListServiceAuthTokensRequest) GetOrganizationName() string { @@ -5543,7 +5846,7 @@ type ListServiceAuthTokensResponse struct { func (x *ListServiceAuthTokensResponse) Reset() { *x = ListServiceAuthTokensResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[100] + mi := &file_rill_admin_v1_api_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5556,7 +5859,7 @@ func (x *ListServiceAuthTokensResponse) String() string { func (*ListServiceAuthTokensResponse) ProtoMessage() {} func (x *ListServiceAuthTokensResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[100] + mi := &file_rill_admin_v1_api_proto_msgTypes[104] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5569,7 +5872,7 @@ func (x *ListServiceAuthTokensResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListServiceAuthTokensResponse.ProtoReflect.Descriptor instead. func (*ListServiceAuthTokensResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{100} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{104} } func (x *ListServiceAuthTokensResponse) GetTokens() []*ServiceToken { @@ -5590,7 +5893,7 @@ type GetGithubRepoStatusRequest struct { func (x *GetGithubRepoStatusRequest) Reset() { *x = GetGithubRepoStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[101] + mi := &file_rill_admin_v1_api_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5603,7 +5906,7 @@ func (x *GetGithubRepoStatusRequest) String() string { func (*GetGithubRepoStatusRequest) ProtoMessage() {} func (x *GetGithubRepoStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[101] + mi := &file_rill_admin_v1_api_proto_msgTypes[105] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5616,7 +5919,7 @@ func (x *GetGithubRepoStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetGithubRepoStatusRequest.ProtoReflect.Descriptor instead. func (*GetGithubRepoStatusRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{101} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{105} } func (x *GetGithubRepoStatusRequest) GetGithubUrl() string { @@ -5639,7 +5942,7 @@ type GetGithubRepoStatusResponse struct { func (x *GetGithubRepoStatusResponse) Reset() { *x = GetGithubRepoStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[102] + mi := &file_rill_admin_v1_api_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5652,7 +5955,7 @@ func (x *GetGithubRepoStatusResponse) String() string { func (*GetGithubRepoStatusResponse) ProtoMessage() {} func (x *GetGithubRepoStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[102] + mi := &file_rill_admin_v1_api_proto_msgTypes[106] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5665,7 +5968,7 @@ func (x *GetGithubRepoStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetGithubRepoStatusResponse.ProtoReflect.Descriptor instead. func (*GetGithubRepoStatusResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{102} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{106} } func (x *GetGithubRepoStatusResponse) GetHasAccess() bool { @@ -5701,7 +6004,7 @@ type GetGitCredentialsRequest struct { func (x *GetGitCredentialsRequest) Reset() { *x = GetGitCredentialsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[103] + mi := &file_rill_admin_v1_api_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5714,7 +6017,7 @@ func (x *GetGitCredentialsRequest) String() string { func (*GetGitCredentialsRequest) ProtoMessage() {} func (x *GetGitCredentialsRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[103] + mi := &file_rill_admin_v1_api_proto_msgTypes[107] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5727,7 +6030,7 @@ func (x *GetGitCredentialsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetGitCredentialsRequest.ProtoReflect.Descriptor instead. func (*GetGitCredentialsRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{103} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{107} } func (x *GetGitCredentialsRequest) GetOrganization() string { @@ -5759,7 +6062,7 @@ type GetGitCredentialsResponse struct { func (x *GetGitCredentialsResponse) Reset() { *x = GetGitCredentialsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[104] + mi := &file_rill_admin_v1_api_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5772,7 +6075,7 @@ func (x *GetGitCredentialsResponse) String() string { func (*GetGitCredentialsResponse) ProtoMessage() {} func (x *GetGitCredentialsResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[104] + mi := &file_rill_admin_v1_api_proto_msgTypes[108] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5785,7 +6088,7 @@ func (x *GetGitCredentialsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetGitCredentialsResponse.ProtoReflect.Descriptor instead. func (*GetGitCredentialsResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{104} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{108} } func (x *GetGitCredentialsResponse) GetRepoUrl() string { @@ -5836,7 +6139,7 @@ type CreateWhitelistedDomainRequest struct { func (x *CreateWhitelistedDomainRequest) Reset() { *x = CreateWhitelistedDomainRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[105] + mi := &file_rill_admin_v1_api_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5849,7 +6152,7 @@ func (x *CreateWhitelistedDomainRequest) String() string { func (*CreateWhitelistedDomainRequest) ProtoMessage() {} func (x *CreateWhitelistedDomainRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[105] + mi := &file_rill_admin_v1_api_proto_msgTypes[109] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5862,7 +6165,7 @@ func (x *CreateWhitelistedDomainRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateWhitelistedDomainRequest.ProtoReflect.Descriptor instead. func (*CreateWhitelistedDomainRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{105} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{109} } func (x *CreateWhitelistedDomainRequest) GetOrganization() string { @@ -5895,7 +6198,7 @@ type CreateWhitelistedDomainResponse struct { func (x *CreateWhitelistedDomainResponse) Reset() { *x = CreateWhitelistedDomainResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[106] + mi := &file_rill_admin_v1_api_proto_msgTypes[110] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5908,7 +6211,7 @@ func (x *CreateWhitelistedDomainResponse) String() string { func (*CreateWhitelistedDomainResponse) ProtoMessage() {} func (x *CreateWhitelistedDomainResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[106] + mi := &file_rill_admin_v1_api_proto_msgTypes[110] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5921,7 +6224,7 @@ func (x *CreateWhitelistedDomainResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateWhitelistedDomainResponse.ProtoReflect.Descriptor instead. func (*CreateWhitelistedDomainResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{106} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{110} } type RemoveWhitelistedDomainRequest struct { @@ -5936,7 +6239,7 @@ type RemoveWhitelistedDomainRequest struct { func (x *RemoveWhitelistedDomainRequest) Reset() { *x = RemoveWhitelistedDomainRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[107] + mi := &file_rill_admin_v1_api_proto_msgTypes[111] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5949,7 +6252,7 @@ func (x *RemoveWhitelistedDomainRequest) String() string { func (*RemoveWhitelistedDomainRequest) ProtoMessage() {} func (x *RemoveWhitelistedDomainRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[107] + mi := &file_rill_admin_v1_api_proto_msgTypes[111] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5962,7 +6265,7 @@ func (x *RemoveWhitelistedDomainRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveWhitelistedDomainRequest.ProtoReflect.Descriptor instead. func (*RemoveWhitelistedDomainRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{107} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{111} } func (x *RemoveWhitelistedDomainRequest) GetOrganization() string { @@ -5988,7 +6291,7 @@ type RemoveWhitelistedDomainResponse struct { func (x *RemoveWhitelistedDomainResponse) Reset() { *x = RemoveWhitelistedDomainResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[108] + mi := &file_rill_admin_v1_api_proto_msgTypes[112] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6001,7 +6304,7 @@ func (x *RemoveWhitelistedDomainResponse) String() string { func (*RemoveWhitelistedDomainResponse) ProtoMessage() {} func (x *RemoveWhitelistedDomainResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[108] + mi := &file_rill_admin_v1_api_proto_msgTypes[112] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6014,7 +6317,7 @@ func (x *RemoveWhitelistedDomainResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveWhitelistedDomainResponse.ProtoReflect.Descriptor instead. func (*RemoveWhitelistedDomainResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{108} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{112} } type ListWhitelistedDomainsRequest struct { @@ -6028,7 +6331,7 @@ type ListWhitelistedDomainsRequest struct { func (x *ListWhitelistedDomainsRequest) Reset() { *x = ListWhitelistedDomainsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[109] + mi := &file_rill_admin_v1_api_proto_msgTypes[113] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6041,7 +6344,7 @@ func (x *ListWhitelistedDomainsRequest) String() string { func (*ListWhitelistedDomainsRequest) ProtoMessage() {} func (x *ListWhitelistedDomainsRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[109] + mi := &file_rill_admin_v1_api_proto_msgTypes[113] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6054,7 +6357,7 @@ func (x *ListWhitelistedDomainsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWhitelistedDomainsRequest.ProtoReflect.Descriptor instead. func (*ListWhitelistedDomainsRequest) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{109} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{113} } func (x *ListWhitelistedDomainsRequest) GetOrganization() string { @@ -6075,7 +6378,7 @@ type ListWhitelistedDomainsResponse struct { func (x *ListWhitelistedDomainsResponse) Reset() { *x = ListWhitelistedDomainsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[110] + mi := &file_rill_admin_v1_api_proto_msgTypes[114] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6088,7 +6391,7 @@ func (x *ListWhitelistedDomainsResponse) String() string { func (*ListWhitelistedDomainsResponse) ProtoMessage() {} func (x *ListWhitelistedDomainsResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[110] + mi := &file_rill_admin_v1_api_proto_msgTypes[114] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6101,7 +6404,7 @@ func (x *ListWhitelistedDomainsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWhitelistedDomainsResponse.ProtoReflect.Descriptor instead. func (*ListWhitelistedDomainsResponse) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{110} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{114} } func (x *ListWhitelistedDomainsResponse) GetDomains() []*WhitelistedDomain { @@ -6128,7 +6431,7 @@ type User struct { func (x *User) Reset() { *x = User{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[111] + mi := &file_rill_admin_v1_api_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6141,7 +6444,7 @@ func (x *User) String() string { func (*User) ProtoMessage() {} func (x *User) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[111] + mi := &file_rill_admin_v1_api_proto_msgTypes[115] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6154,7 +6457,7 @@ func (x *User) ProtoReflect() protoreflect.Message { // Deprecated: Use User.ProtoReflect.Descriptor instead. func (*User) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{111} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{115} } func (x *User) GetId() string { @@ -6222,7 +6525,7 @@ type Service struct { func (x *Service) Reset() { *x = Service{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[112] + mi := &file_rill_admin_v1_api_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6235,7 +6538,7 @@ func (x *Service) String() string { func (*Service) ProtoMessage() {} func (x *Service) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[112] + mi := &file_rill_admin_v1_api_proto_msgTypes[116] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6248,7 +6551,7 @@ func (x *Service) ProtoReflect() protoreflect.Message { // Deprecated: Use Service.ProtoReflect.Descriptor instead. func (*Service) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{112} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{116} } func (x *Service) GetId() string { @@ -6309,7 +6612,7 @@ type Organization struct { func (x *Organization) Reset() { *x = Organization{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[113] + mi := &file_rill_admin_v1_api_proto_msgTypes[117] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6322,7 +6625,7 @@ func (x *Organization) String() string { func (*Organization) ProtoMessage() {} func (x *Organization) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[113] + mi := &file_rill_admin_v1_api_proto_msgTypes[117] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6335,7 +6638,7 @@ func (x *Organization) ProtoReflect() protoreflect.Message { // Deprecated: Use Organization.ProtoReflect.Descriptor instead. func (*Organization) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{113} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{117} } func (x *Organization) GetId() string { @@ -6391,7 +6694,7 @@ type UserQuotas struct { func (x *UserQuotas) Reset() { *x = UserQuotas{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[114] + mi := &file_rill_admin_v1_api_proto_msgTypes[118] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6404,7 +6707,7 @@ func (x *UserQuotas) String() string { func (*UserQuotas) ProtoMessage() {} func (x *UserQuotas) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[114] + mi := &file_rill_admin_v1_api_proto_msgTypes[118] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6417,7 +6720,7 @@ func (x *UserQuotas) ProtoReflect() protoreflect.Message { // Deprecated: Use UserQuotas.ProtoReflect.Descriptor instead. func (*UserQuotas) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{114} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{118} } func (x *UserQuotas) GetSingleuserOrgs() uint32 { @@ -6442,7 +6745,7 @@ type OrganizationQuotas struct { func (x *OrganizationQuotas) Reset() { *x = OrganizationQuotas{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[115] + mi := &file_rill_admin_v1_api_proto_msgTypes[119] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6455,7 +6758,7 @@ func (x *OrganizationQuotas) String() string { func (*OrganizationQuotas) ProtoMessage() {} func (x *OrganizationQuotas) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[115] + mi := &file_rill_admin_v1_api_proto_msgTypes[119] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6468,7 +6771,7 @@ func (x *OrganizationQuotas) ProtoReflect() protoreflect.Message { // Deprecated: Use OrganizationQuotas.ProtoReflect.Descriptor instead. func (*OrganizationQuotas) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{115} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{119} } func (x *OrganizationQuotas) GetProjects() uint32 { @@ -6534,7 +6837,7 @@ type Project struct { func (x *Project) Reset() { *x = Project{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[116] + mi := &file_rill_admin_v1_api_proto_msgTypes[120] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6547,7 +6850,7 @@ func (x *Project) String() string { func (*Project) ProtoMessage() {} func (x *Project) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[116] + mi := &file_rill_admin_v1_api_proto_msgTypes[120] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6560,7 +6863,7 @@ func (x *Project) ProtoReflect() protoreflect.Message { // Deprecated: Use Project.ProtoReflect.Descriptor instead. func (*Project) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{116} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{120} } func (x *Project) GetId() string { @@ -6709,7 +7012,7 @@ type Deployment struct { func (x *Deployment) Reset() { *x = Deployment{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[117] + mi := &file_rill_admin_v1_api_proto_msgTypes[121] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6722,7 +7025,7 @@ func (x *Deployment) String() string { func (*Deployment) ProtoMessage() {} func (x *Deployment) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[117] + mi := &file_rill_admin_v1_api_proto_msgTypes[121] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6735,7 +7038,7 @@ func (x *Deployment) ProtoReflect() protoreflect.Message { // Deprecated: Use Deployment.ProtoReflect.Descriptor instead. func (*Deployment) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{117} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{121} } func (x *Deployment) GetId() string { @@ -6825,7 +7128,7 @@ type OrganizationPermissions struct { func (x *OrganizationPermissions) Reset() { *x = OrganizationPermissions{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[118] + mi := &file_rill_admin_v1_api_proto_msgTypes[122] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6838,7 +7141,7 @@ func (x *OrganizationPermissions) String() string { func (*OrganizationPermissions) ProtoMessage() {} func (x *OrganizationPermissions) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[118] + mi := &file_rill_admin_v1_api_proto_msgTypes[122] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6851,7 +7154,7 @@ func (x *OrganizationPermissions) ProtoReflect() protoreflect.Message { // Deprecated: Use OrganizationPermissions.ProtoReflect.Descriptor instead. func (*OrganizationPermissions) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{118} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{122} } func (x *OrganizationPermissions) GetReadOrg() bool { @@ -6923,7 +7226,7 @@ type ProjectPermissions struct { func (x *ProjectPermissions) Reset() { *x = ProjectPermissions{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[119] + mi := &file_rill_admin_v1_api_proto_msgTypes[123] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6936,7 +7239,7 @@ func (x *ProjectPermissions) String() string { func (*ProjectPermissions) ProtoMessage() {} func (x *ProjectPermissions) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[119] + mi := &file_rill_admin_v1_api_proto_msgTypes[123] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6949,7 +7252,7 @@ func (x *ProjectPermissions) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectPermissions.ProtoReflect.Descriptor instead. func (*ProjectPermissions) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{119} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{123} } func (x *ProjectPermissions) GetReadProject() bool { @@ -7038,7 +7341,7 @@ type Member struct { func (x *Member) Reset() { *x = Member{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[120] + mi := &file_rill_admin_v1_api_proto_msgTypes[124] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7051,7 +7354,7 @@ func (x *Member) String() string { func (*Member) ProtoMessage() {} func (x *Member) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[120] + mi := &file_rill_admin_v1_api_proto_msgTypes[124] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7064,7 +7367,7 @@ func (x *Member) ProtoReflect() protoreflect.Message { // Deprecated: Use Member.ProtoReflect.Descriptor instead. func (*Member) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{120} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{124} } func (x *Member) GetUserId() string { @@ -7122,7 +7425,7 @@ type UserInvite struct { func (x *UserInvite) Reset() { *x = UserInvite{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[121] + mi := &file_rill_admin_v1_api_proto_msgTypes[125] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7135,7 +7438,7 @@ func (x *UserInvite) String() string { func (*UserInvite) ProtoMessage() {} func (x *UserInvite) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[121] + mi := &file_rill_admin_v1_api_proto_msgTypes[125] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7148,7 +7451,7 @@ func (x *UserInvite) ProtoReflect() protoreflect.Message { // Deprecated: Use UserInvite.ProtoReflect.Descriptor instead. func (*UserInvite) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{121} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{125} } func (x *UserInvite) GetEmail() string { @@ -7184,7 +7487,7 @@ type WhitelistedDomain struct { func (x *WhitelistedDomain) Reset() { *x = WhitelistedDomain{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[122] + mi := &file_rill_admin_v1_api_proto_msgTypes[126] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7197,7 +7500,7 @@ func (x *WhitelistedDomain) String() string { func (*WhitelistedDomain) ProtoMessage() {} func (x *WhitelistedDomain) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[122] + mi := &file_rill_admin_v1_api_proto_msgTypes[126] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7210,7 +7513,7 @@ func (x *WhitelistedDomain) ProtoReflect() protoreflect.Message { // Deprecated: Use WhitelistedDomain.ProtoReflect.Descriptor instead. func (*WhitelistedDomain) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{122} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{126} } func (x *WhitelistedDomain) GetDomain() string { @@ -7245,7 +7548,7 @@ type Bookmark struct { func (x *Bookmark) Reset() { *x = Bookmark{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[123] + mi := &file_rill_admin_v1_api_proto_msgTypes[127] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7258,7 +7561,7 @@ func (x *Bookmark) String() string { func (*Bookmark) ProtoMessage() {} func (x *Bookmark) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[123] + mi := &file_rill_admin_v1_api_proto_msgTypes[127] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7271,7 +7574,7 @@ func (x *Bookmark) ProtoReflect() protoreflect.Message { // Deprecated: Use Bookmark.ProtoReflect.Descriptor instead. func (*Bookmark) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{123} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{127} } func (x *Bookmark) GetId() string { @@ -7343,7 +7646,7 @@ type ServiceToken struct { func (x *ServiceToken) Reset() { *x = ServiceToken{} if protoimpl.UnsafeEnabled { - mi := &file_rill_admin_v1_api_proto_msgTypes[124] + mi := &file_rill_admin_v1_api_proto_msgTypes[128] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7356,7 +7659,7 @@ func (x *ServiceToken) String() string { func (*ServiceToken) ProtoMessage() {} func (x *ServiceToken) ProtoReflect() protoreflect.Message { - mi := &file_rill_admin_v1_api_proto_msgTypes[124] + mi := &file_rill_admin_v1_api_proto_msgTypes[128] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7369,7 +7672,7 @@ func (x *ServiceToken) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceToken.ProtoReflect.Descriptor instead. func (*ServiceToken) Descriptor() ([]byte, []int) { - return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{124} + return file_rill_admin_v1_api_proto_rawDescGZIP(), []int{128} } func (x *ServiceToken) GetId() string { @@ -7402,345 +7705,371 @@ var file_rill_admin_v1_api_proto_rawDesc = []byte{ 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 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, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x22, 0x0d, 0x0a, 0x0b, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x58, 0x0a, 0x0c, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x62, 0x0a, 0x18, 0x4c, 0x69, 0x73, - 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x2a, 0x05, 0x18, - 0xe8, 0x07, 0x40, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, - 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x86, 0x01, - 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x0d, 0x6f, - 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x0d, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, - 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, - 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x2c, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, - 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xa4, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, + 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 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, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x0d, + 0x0a, 0x0b, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x58, 0x0a, + 0x0c, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x62, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x4f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x2a, 0x05, 0x18, 0xe8, 0x07, + 0x40, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, + 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x86, 0x01, 0x0a, 0x19, + 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x0d, 0x6f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, + 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x6f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0f, + 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x2c, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0xa4, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, + 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, + 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x48, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, + 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0b, 0x70, 0x65, + 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x5a, 0x0a, 0x19, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5d, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1c, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, + 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x4e, 0x61, + 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x5d, 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x48, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, - 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0b, - 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x5a, 0x0a, 0x19, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5d, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x61, - 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1c, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x6e, 0x65, 0x77, - 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6e, 0x65, 0x77, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5d, 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, - 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0xa2, 0x01, 0x0a, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x11, 0x6f, 0x72, - 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x10, - 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x27, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x2a, 0x05, 0x18, 0xe8, 0x07, 0x40, 0x01, 0x52, - 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, - 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, - 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x81, 0x01, 0x0a, 0x23, 0x4c, 0x69, 0x73, - 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x4f, 0x72, 0x67, 0x61, - 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x32, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, - 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, - 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x54, 0x0a, 0x11, - 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6f, 0x72, - 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x22, 0xf0, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x69, 0x6c, - 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x42, 0x0a, 0x0f, 0x70, - 0x72, 0x6f, 0x64, 0x5f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x0e, 0x70, 0x72, 0x6f, 0x64, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x10, 0x0a, 0x03, 0x6a, 0x77, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6a, 0x77, - 0x74, 0x12, 0x52, 0x0a, 0x13, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x70, 0x65, 0x72, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, - 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x12, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x86, 0x01, 0x0a, 0x19, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, - 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x50, - 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x27, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, - 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x2a, 0x05, - 0x18, 0xe8, 0x07, 0x40, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, - 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x5a, - 0x0a, 0x1a, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, - 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, - 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x5d, 0x0a, 0x1a, 0x47, 0x65, - 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x6f, 0x72, 0x67, 0x61, + 0x6e, 0x22, 0xa2, 0x01, 0x0a, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x73, 0x46, 0x6f, 0x72, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x11, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x10, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xb4, 0x01, 0x0a, 0x1b, 0x47, 0x65, - 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x57, 0x0a, 0x09, 0x76, 0x61, 0x72, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x73, 0x1a, 0x3c, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x4b, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x11, 0x6f, 0x72, 0x67, 0x61, 0x6e, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x10, 0x6f, 0x72, 0x67, - 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x4a, 0x0a, - 0x14, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, - 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, - 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, 0x69, 0x0a, 0x14, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x34, - 0x0a, 0x11, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, - 0x10, 0x01, 0x52, 0x10, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x49, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, - 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, - 0x96, 0x01, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x11, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x10, 0x6f, 0x72, 0x67, 0x61, 0x6e, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x08, 0x6e, - 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, - 0x07, 0x6e, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, - 0x6e, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x49, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x30, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x22, 0x69, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, - 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x11, 0x6f, 0x72, 0x67, 0x61, - 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x10, 0x6f, 0x72, - 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x49, - 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x92, 0x04, 0x0a, 0x14, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x34, 0x0a, 0x11, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, - 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x10, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, - 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x64, 0x5f, - 0x6f, 0x6c, 0x61, 0x70, 0x5f, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x64, 0x4f, 0x6c, 0x61, 0x70, 0x44, 0x72, 0x69, 0x76, 0x65, - 0x72, 0x12, 0x22, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x64, 0x5f, 0x6f, 0x6c, 0x61, 0x70, 0x5f, 0x64, - 0x73, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x4f, 0x6c, - 0x61, 0x70, 0x44, 0x73, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x5f, 0x73, 0x6c, - 0x6f, 0x74, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x53, - 0x6c, 0x6f, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x70, 0x61, 0x74, 0x68, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1f, - 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, - 0x1d, 0x0a, 0x0a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x55, 0x72, 0x6c, 0x12, 0x50, - 0x0a, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x32, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, - 0x1a, 0x3c, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x49, - 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x27, + 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0d, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x2a, 0x05, 0x18, 0xe8, 0x07, 0x40, 0x01, 0x52, 0x08, 0x70, + 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, + 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x81, 0x01, 0x0a, 0x23, 0x4c, 0x69, 0x73, 0x74, 0x50, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, + 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, + 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x54, 0x0a, 0x11, 0x47, 0x65, + 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x2b, 0x0a, 0x11, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0xf0, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x57, 0x0a, 0x14, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6f, 0x72, - 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xfd, 0x03, 0x0a, 0x14, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x11, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x10, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, - 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x1b, - 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, - 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x70, - 0x72, 0x6f, 0x64, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x02, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x88, 0x01, - 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x5f, 0x75, 0x72, 0x6c, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x09, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x55, - 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x5f, 0x73, 0x6c, - 0x6f, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x48, 0x04, 0x52, 0x09, 0x70, 0x72, 0x6f, - 0x64, 0x53, 0x6c, 0x6f, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x72, 0x65, 0x67, - 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x06, 0x72, 0x65, 0x67, - 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x4e, - 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x64, 0x5f, 0x74, - 0x74, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, - 0x48, 0x07, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x64, 0x54, 0x74, 0x6c, 0x53, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x73, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, - 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, - 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x5f, 0x75, 0x72, 0x6c, 0x42, - 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x42, 0x09, - 0x0a, 0x07, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6e, 0x65, - 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x5f, - 0x74, 0x74, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0x49, 0x0a, 0x15, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, - 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x8b, 0x02, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x11, 0x6f, 0x72, 0x67, 0x61, - 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x10, 0x6f, 0x72, - 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, - 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x59, 0x0a, 0x09, 0x76, - 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, - 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x61, 0x72, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x76, 0x61, 0x72, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x1a, 0x3c, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0xba, 0x01, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, + 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x42, 0x0a, 0x0f, 0x70, 0x72, 0x6f, + 0x64, 0x5f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, + 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0e, 0x70, + 0x72, 0x6f, 0x64, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, + 0x03, 0x6a, 0x77, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6a, 0x77, 0x74, 0x12, + 0x52, 0x0a, 0x13, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x72, + 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x12, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0x86, 0x01, 0x0a, 0x19, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x12, 0x27, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x2a, 0x05, 0x18, 0xe8, + 0x07, 0x40, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, + 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x5a, 0x0a, 0x1a, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, + 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x5d, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x72, 0x69, 0x6c, - 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x73, 0x1a, 0x3c, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x3e, 0x0a, 0x17, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, - 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, - 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x22, 0x1a, 0x0a, 0x18, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, - 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5d, 0x0a, - 0x1c, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, - 0x0d, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x1f, 0x0a, 0x1d, - 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7b, 0x0a, - 0x16, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, - 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x19, 0x0a, 0x17, 0x54, 0x72, - 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8c, 0x01, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, - 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x10, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xb4, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x50, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x57, 0x0a, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x72, 0x69, 0x6c, + 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x1a, 0x3c, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc2, + 0x01, 0x0a, 0x19, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, + 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x6d, + 0x61, 0x69, 0x6c, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x27, 0x0a, 0x09, 0x70, + 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x0a, + 0xfa, 0x42, 0x07, 0x2a, 0x05, 0x18, 0xe8, 0x07, 0x40, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x22, 0x6f, 0x0a, 0x1a, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x29, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x12, 0x26, 0x0a, 0x0f, + 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xca, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x09, - 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x42, - 0x0a, 0xfa, 0x42, 0x07, 0x2a, 0x05, 0x18, 0xe8, 0x07, 0x40, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x7a, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, - 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, - 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, - 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, - 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x19, + 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x05, 0x61, 0x74, 0x74, + 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x48, 0x00, 0x52, 0x05, 0x61, 0x74, 0x74, 0x72, 0x73, 0x42, 0x05, 0x0a, 0x03, 0x66, 0x6f, + 0x72, 0x22, 0x87, 0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6a, 0x77, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6a, 0x77, 0x74, 0x22, 0x4b, 0x0a, 0x13, 0x4c, + 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x34, 0x0a, 0x11, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, + 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x10, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x4a, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x32, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x22, 0x69, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, + 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x11, 0x6f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x10, 0x6f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x22, + 0x49, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x96, 0x01, 0x0a, 0x14, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x34, 0x0a, 0x11, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x10, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x4e, + 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x49, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x07, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x69, + 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x11, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x10, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x49, 0x0a, 0x15, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x22, 0x92, 0x04, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, + 0x11, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, + 0x01, 0x52, 0x10, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x64, 0x5f, 0x6f, 0x6c, 0x61, 0x70, 0x5f, + 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x72, + 0x6f, 0x64, 0x4f, 0x6c, 0x61, 0x70, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0d, + 0x70, 0x72, 0x6f, 0x64, 0x5f, 0x6f, 0x6c, 0x61, 0x70, 0x5f, 0x64, 0x73, 0x6e, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x4f, 0x6c, 0x61, 0x70, 0x44, 0x73, 0x6e, + 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x53, 0x6c, 0x6f, 0x74, 0x73, 0x12, + 0x18, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x70, 0x61, 0x74, 0x68, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x73, 0x75, 0x62, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, + 0x64, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x70, 0x72, 0x6f, 0x64, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x55, 0x72, 0x6c, 0x12, 0x50, 0x0a, 0x09, 0x76, 0x61, 0x72, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x72, + 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x1a, 0x3c, 0x0a, 0x0e, 0x56, + 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x49, 0x0a, 0x15, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x57, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x11, + 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, + 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xfd, 0x03, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x34, 0x0a, 0x11, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, + 0x02, 0x10, 0x01, 0x52, 0x10, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x06, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x5f, 0x62, + 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0a, 0x70, + 0x72, 0x6f, 0x64, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x03, 0x52, 0x09, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, + 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x03, 0x48, 0x04, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x53, 0x6c, 0x6f, 0x74, + 0x73, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x88, 0x01, + 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, + 0x01, 0x12, 0x2d, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x64, 0x5f, 0x74, 0x74, 0x6c, 0x5f, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x48, 0x07, 0x52, 0x0e, 0x70, + 0x72, 0x6f, 0x64, 0x54, 0x74, 0x6c, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, + 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, + 0x70, 0x72, 0x6f, 0x64, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, + 0x72, 0x6f, 0x64, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x72, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x5f, 0x74, 0x74, 0x6c, 0x5f, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0x49, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x30, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x22, 0x8b, 0x02, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x11, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x10, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x59, 0x0a, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x73, 0x1a, 0x3c, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0xba, 0x01, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, + 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x1a, 0x3c, + 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3e, 0x0a, 0x17, + 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x1a, 0x0a, 0x18, + 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5d, 0x0a, 0x1c, 0x54, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x1f, 0x0a, 0x1d, 0x54, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7b, 0x0a, 0x16, 0x54, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x52, 0x65, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x19, 0x0a, 0x17, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x52, 0x65, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8c, 0x01, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, @@ -7748,1194 +8077,1235 @@ var file_rill_admin_v1_api_proto_rawDesc = []byte{ 0x05, 0x18, 0xe8, 0x07, 0x40, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, - 0x7e, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x07, - 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, - 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, - 0x7e, 0x0a, 0x1c, 0x41, 0x64, 0x64, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x7a, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x07, 0x6d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, + 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, + 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x8c, 0x01, 0x0a, 0x1e, + 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, + 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x2a, 0x05, 0x18, 0xe8, 0x07, 0x40, + 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, + 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x7e, 0x0a, 0x1f, 0x4c, 0x69, + 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, + 0x76, 0x69, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, + 0x07, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x07, 0x69, 0x6e, 0x76, 0x69, 0x74, + 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, + 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x7e, 0x0a, 0x1c, 0x41, 0x64, + 0x64, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x0c, 0x6f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x60, 0x01, 0x52, + 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x46, 0x0a, 0x1d, 0x41, 0x64, + 0x64, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x70, + 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x75, 0x70, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0d, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x67, 0x6e, + 0x75, 0x70, 0x22, 0x9b, 0x01, 0x0a, 0x1f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, + 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x60, 0x01, 0x52, 0x05, 0x65, 0x6d, 0x61, + 0x69, 0x6c, 0x12, 0x2c, 0x0a, 0x12, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, + 0x6b, 0x65, 0x65, 0x70, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, + 0x22, 0x22, 0x0a, 0x20, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x47, 0x0a, 0x18, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x4f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x2b, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, + 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x1b, 0x0a, + 0x19, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8b, 0x01, 0x0a, 0x20, 0x53, + 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x72, 0x02, 0x60, 0x01, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x72, - 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, - 0x46, 0x0a, 0x1d, 0x41, 0x64, 0x64, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x69, 0x67, 0x6e, - 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x53, 0x69, 0x67, 0x6e, 0x75, 0x70, 0x22, 0x9b, 0x01, 0x0a, 0x1f, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, - 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x0c, 0x6f, - 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, - 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, - 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x60, 0x01, - 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x2c, 0x0a, 0x12, 0x6b, 0x65, 0x65, 0x70, 0x5f, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x10, 0x6b, 0x65, 0x65, 0x70, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x22, 0x0a, 0x20, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4f, + 0x72, 0x02, 0x60, 0x01, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1b, 0x0a, 0x04, 0x72, + 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, + 0x10, 0x01, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x23, 0x0a, 0x21, 0x53, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x47, 0x0a, 0x18, 0x4c, 0x65, 0x61, - 0x76, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x72, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x22, 0x1b, 0x0a, 0x19, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x8b, 0x01, 0x0a, 0x20, 0x53, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x1d, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x60, 0x01, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, - 0x12, 0x1b, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, - 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x23, 0x0a, - 0x21, 0x53, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x70, 0x65, 0x72, 0x75, - 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x43, 0x0a, 0x16, 0x4c, - 0x69, 0x73, 0x74, 0x53, 0x75, 0x70, 0x65, 0x72, 0x75, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, - 0x22, 0x52, 0x0a, 0x13, 0x53, 0x65, 0x74, 0x53, 0x75, 0x70, 0x65, 0x72, 0x75, 0x73, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x60, 0x01, 0x52, - 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x75, 0x70, 0x65, 0x72, 0x75, - 0x73, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x75, 0x70, 0x65, 0x72, - 0x75, 0x73, 0x65, 0x72, 0x22, 0x16, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x53, 0x75, 0x70, 0x65, 0x72, - 0x75, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xbd, 0x01, 0x0a, - 0x16, 0x53, 0x75, 0x64, 0x6f, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, - 0x49, 0x64, 0x12, 0x17, 0x0a, 0x06, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0a, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0d, - 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x42, 0x04, 0x0a, 0x02, 0x69, 0x64, 0x22, 0xab, 0x02, 0x0a, - 0x17, 0x53, 0x75, 0x64, 0x6f, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, - 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x48, 0x00, 0x52, 0x04, 0x75, - 0x73, 0x65, 0x72, 0x12, 0x2f, 0x0a, 0x03, 0x6f, 0x72, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, - 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, - 0x03, 0x6f, 0x72, 0x67, 0x12, 0x32, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, - 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x48, 0x00, 0x52, - 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x3b, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x37, 0x0a, 0x08, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, + 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x0a, + 0x15, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x70, 0x65, 0x72, 0x75, 0x73, 0x65, 0x72, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x43, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, + 0x70, 0x65, 0x72, 0x75, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x29, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, 0x52, 0x0a, 0x13, 0x53, + 0x65, 0x74, 0x53, 0x75, 0x70, 0x65, 0x72, 0x75, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x60, 0x01, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, + 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x75, 0x70, 0x65, 0x72, 0x75, 0x73, 0x65, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x75, 0x70, 0x65, 0x72, 0x75, 0x73, 0x65, 0x72, 0x22, + 0x16, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x53, 0x75, 0x70, 0x65, 0x72, 0x75, 0x73, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xbd, 0x01, 0x0a, 0x16, 0x53, 0x75, 0x64, 0x6f, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x19, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, + 0x06, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0d, 0x64, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, + 0x52, 0x0c, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x21, + 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, + 0x64, 0x42, 0x04, 0x0a, 0x02, 0x69, 0x64, 0x22, 0xab, 0x02, 0x0a, 0x17, 0x53, 0x75, 0x64, 0x6f, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, + 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x48, 0x00, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x2f, + 0x0a, 0x03, 0x6f, 0x72, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x69, + 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x03, 0x6f, 0x72, 0x67, 0x12, + 0x32, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x48, 0x00, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x12, 0x3b, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x42, 0x0a, - 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xf9, 0x02, 0x0a, 0x23, 0x53, - 0x75, 0x64, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, - 0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x48, - 0x00, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x25, - 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0d, 0x48, 0x01, 0x52, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x5f, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x02, 0x52, 0x0a, 0x73, 0x6c, - 0x6f, 0x74, 0x73, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, 0x14, 0x73, - 0x6c, 0x6f, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x03, 0x52, 0x12, 0x73, 0x6c, 0x6f, - 0x74, 0x73, 0x50, 0x65, 0x72, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x88, - 0x01, 0x01, 0x12, 0x34, 0x0a, 0x13, 0x6f, 0x75, 0x74, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x5f, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x48, - 0x04, 0x52, 0x12, 0x6f, 0x75, 0x74, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e, - 0x76, 0x69, 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x5f, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x5f, - 0x70, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x16, - 0x0a, 0x14, 0x5f, 0x6f, 0x75, 0x74, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x69, - 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x22, 0x67, 0x0a, 0x24, 0x53, 0x75, 0x64, 0x6f, 0x55, 0x70, + 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x37, 0x0a, 0x08, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, + 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x08, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xf9, 0x02, 0x0a, 0x23, 0x53, 0x75, 0x64, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x51, 0x75, 0x6f, 0x74, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, - 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0x75, 0x0a, 0x1b, 0x53, 0x75, 0x64, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, - 0x72, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, - 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x2c, 0x0a, 0x0f, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x75, 0x73, - 0x65, 0x72, 0x5f, 0x6f, 0x72, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, - 0x0e, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x75, 0x73, 0x65, 0x72, 0x4f, 0x72, 0x67, 0x73, 0x88, - 0x01, 0x01, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x75, 0x73, 0x65, - 0x72, 0x5f, 0x6f, 0x72, 0x67, 0x73, 0x22, 0x47, 0x0a, 0x1c, 0x53, 0x75, 0x64, 0x6f, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, - 0xb3, 0x01, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, - 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x6f, 0x72, - 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x07, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 0x0a, - 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, - 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x2a, 0x05, 0x18, 0xe8, 0x07, 0x40, 0x01, 0x52, 0x08, 0x70, 0x61, - 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x75, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x07, 0x6d, 0x65, 0x6d, - 0x62, 0x65, 0x72, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, - 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, - 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xb3, 0x01, 0x0a, - 0x19, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x76, 0x69, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x0c, 0x6f, 0x72, - 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, - 0x01, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 0x0a, 0x09, 0x70, 0x61, - 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x0a, 0xfa, - 0x42, 0x07, 0x2a, 0x05, 0x18, 0xe8, 0x07, 0x40, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, - 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x22, 0x79, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x33, 0x0a, 0x07, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, - 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x07, 0x69, 0x6e, - 0x76, 0x69, 0x74, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, - 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xa5, 0x01, - 0x0a, 0x17, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x0c, 0x6f, 0x72, 0x67, - 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, - 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1d, 0x0a, 0x05, 0x65, 0x6d, 0x61, - 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x60, - 0x01, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1b, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, - 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x41, 0x0a, 0x18, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x69, 0x67, - 0x6e, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x70, 0x65, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x75, 0x70, 0x22, 0x8b, 0x01, 0x0a, 0x1a, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, - 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1d, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x60, 0x01, 0x52, - 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x22, 0x1d, 0x0a, 0x1b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa9, 0x01, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, + 0x51, 0x75, 0x6f, 0x74, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, + 0x08, 0x6f, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x6f, 0x72, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x08, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x01, + 0x52, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, + 0x12, 0x24, 0x0a, 0x0b, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x02, 0x52, 0x0a, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x54, 0x6f, + 0x74, 0x61, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, 0x14, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x5f, + 0x70, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0d, 0x48, 0x03, 0x52, 0x12, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x50, 0x65, 0x72, + 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, + 0x13, 0x6f, 0x75, 0x74, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6e, 0x76, + 0x69, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x04, 0x52, 0x12, 0x6f, 0x75, + 0x74, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, + 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, + 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x64, + 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x6f, 0x75, + 0x74, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, + 0x73, 0x22, 0x67, 0x0a, 0x24, 0x53, 0x75, 0x64, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x6f, 0x74, 0x61, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0c, 0x6f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, + 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x6f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x75, 0x0a, 0x1b, 0x53, 0x75, + 0x64, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x51, 0x75, 0x6f, 0x74, + 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, + 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, + 0x2c, 0x0a, 0x0f, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6f, 0x72, + 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x0e, 0x73, 0x69, 0x6e, 0x67, + 0x6c, 0x65, 0x75, 0x73, 0x65, 0x72, 0x4f, 0x72, 0x67, 0x73, 0x88, 0x01, 0x01, 0x42, 0x12, 0x0a, + 0x10, 0x5f, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6f, 0x72, 0x67, + 0x73, 0x22, 0x47, 0x0a, 0x1c, 0x53, 0x75, 0x64, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, + 0x73, 0x65, 0x72, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x27, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0xb3, 0x01, 0x0a, 0x19, 0x4c, + 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, + 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x0a, 0xfa, 0x42, 0x07, + 0x2a, 0x05, 0x18, 0xe8, 0x07, 0x40, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, + 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x22, 0x75, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, + 0x0a, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, + 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, + 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, + 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xb3, 0x01, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, + 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1d, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x60, 0x01, 0x52, 0x05, 0x65, - 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1b, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x72, 0x6f, 0x6c, - 0x65, 0x22, 0x1e, 0x0a, 0x1c, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x17, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x55, - 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x83, 0x01, 0x0a, 0x16, 0x47, - 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x40, - 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x2a, 0x05, 0x18, + 0xe8, 0x07, 0x40, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, + 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x79, 0x0a, + 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x76, 0x69, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x69, + 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x72, + 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x07, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, + 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, + 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xa5, 0x01, 0x0a, 0x17, 0x41, 0x64, 0x64, + 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, + 0x02, 0x10, 0x01, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x21, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1d, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x60, 0x01, 0x52, 0x05, 0x65, 0x6d, + 0x61, 0x69, 0x6c, 0x12, 0x1b, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, + 0x22, 0x41, 0x0a, 0x18, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, + 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x75, 0x70, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x67, + 0x6e, 0x75, 0x70, 0x22, 0x8b, 0x01, 0x0a, 0x1a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, + 0x01, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x21, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x12, 0x1d, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x60, 0x01, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, + 0x6c, 0x22, 0x1d, 0x0a, 0x1b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0xa9, 0x01, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x2b, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, + 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, + 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x12, 0x1d, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x60, 0x01, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, + 0x1b, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, + 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x1e, 0x0a, 0x1c, + 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x0a, 0x15, + 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x83, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x27, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x0b, 0x70, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, + 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x0b, + 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x2f, 0x0a, 0x0e, 0x47, + 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, + 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, + 0x04, 0x72, 0x02, 0x60, 0x01, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x22, 0x3a, 0x0a, 0x0f, + 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x27, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x41, 0x0a, 0x0f, 0x55, 0x73, 0x65, 0x72, + 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, + 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, + 0x0a, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x22, 0x60, 0x0a, 0x1c, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x0b, 0x70, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, + 0x52, 0x0b, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x61, 0x0a, + 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, + 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, - 0x22, 0x2f, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x60, 0x01, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, - 0x6c, 0x22, 0x3a, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x41, 0x0a, - 0x0f, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, - 0x12, 0x20, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x88, - 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, - 0x22, 0x60, 0x0a, 0x1c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x40, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, - 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x73, 0x22, 0x61, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, - 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x35, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x6f, - 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, - 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x22, 0x4e, 0x0a, 0x15, - 0x4c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, - 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, - 0x6b, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x22, 0x35, 0x0a, 0x12, - 0x47, 0x65, 0x74, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, - 0x6b, 0x49, 0x64, 0x22, 0x4a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, - 0x72, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x62, 0x6f, - 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x6f, - 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x52, 0x08, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x22, - 0x94, 0x01, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, - 0x72, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, - 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, - 0x61, 0x72, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x22, 0x4d, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x33, 0x0a, 0x08, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x52, 0x08, 0x62, 0x6f, 0x6f, - 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x22, 0x38, 0x0a, 0x15, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, - 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, - 0x0a, 0x0b, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x49, 0x64, 0x22, - 0x18, 0x0a, 0x16, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, - 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8a, 0x01, 0x0a, 0x12, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x2c, 0x0a, 0x0d, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, - 0x52, 0x0c, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x27, - 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0d, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x2a, 0x05, 0x18, 0xe8, 0x07, 0x40, 0x01, 0x52, 0x08, 0x70, - 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, - 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x68, 0x0a, 0x13, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, - 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, - 0x72, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, - 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x22, 0x1f, 0x0a, 0x1d, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0x3b, 0x0a, 0x1e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x43, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, 0x22, 0x65, - 0x0a, 0x23, 0x49, 0x73, 0x73, 0x75, 0x65, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, - 0x61, 0x74, 0x69, 0x76, 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x60, 0x01, 0x52, 0x05, 0x65, - 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x74, 0x6c, 0x5f, 0x6d, 0x69, 0x6e, 0x75, - 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x74, 0x74, 0x6c, 0x4d, 0x69, - 0x6e, 0x75, 0x74, 0x65, 0x73, 0x22, 0x3c, 0x0a, 0x24, 0x49, 0x73, 0x73, 0x75, 0x65, 0x52, 0x65, - 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x41, 0x75, 0x74, 0x68, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x22, 0x3a, 0x0a, 0x1d, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, 0x22, - 0x20, 0x0a, 0x1e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x77, 0x0a, 0x1c, 0x49, 0x73, 0x73, 0x75, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x34, 0x0a, 0x11, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, - 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x10, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x35, 0x0a, 0x1d, 0x49, 0x73, - 0x73, 0x75, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x22, 0x77, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x34, 0x0a, 0x11, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, - 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x10, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x54, 0x0a, 0x1d, 0x4c, 0x69, - 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, - 0x22, 0x3b, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x47, 0x69, 0x74, 0x68, 0x75, 0x62, 0x52, 0x65, 0x70, - 0x6f, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, - 0x0a, 0x0a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x55, 0x72, 0x6c, 0x22, 0x8d, 0x01, - 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x47, 0x69, 0x74, 0x68, 0x75, 0x62, 0x52, 0x65, 0x70, 0x6f, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, - 0x0a, 0x68, 0x61, 0x73, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x09, 0x68, 0x61, 0x73, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x28, 0x0a, 0x10, - 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x75, 0x72, 0x6c, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x41, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x55, 0x72, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x6a, 0x0a, - 0x18, 0x47, 0x65, 0x74, 0x47, 0x69, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, - 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x0c, 0x6f, 0x72, 0x67, - 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, - 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0xa9, 0x01, 0x0a, 0x19, 0x47, 0x65, - 0x74, 0x47, 0x69, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6f, 0x5f, - 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6f, 0x55, - 0x72, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, - 0x62, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, - 0x70, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x5f, 0x62, 0x72, 0x61, - 0x6e, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x42, - 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x8b, 0x01, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, - 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, - 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, - 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1b, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x72, - 0x6f, 0x6c, 0x65, 0x22, 0x21, 0x0a, 0x1f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x68, 0x69, - 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6e, 0x0a, 0x1e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, - 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, - 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, - 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x21, 0x0a, 0x1f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4c, 0x0a, 0x1d, 0x4c, 0x69, 0x73, - 0x74, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x44, 0x6f, 0x6d, 0x61, - 0x69, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x0c, 0x6f, 0x72, - 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5c, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x57, - 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x07, 0x64, 0x6f, 0x6d, - 0x61, 0x69, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x69, 0x6c, - 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x68, 0x69, 0x74, 0x65, - 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x07, 0x64, 0x6f, - 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x22, 0x95, 0x02, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, - 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, - 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x68, 0x6f, 0x74, 0x6f, - 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x68, 0x6f, 0x74, - 0x6f, 0x55, 0x72, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x71, 0x75, 0x6f, 0x74, 0x61, 0x73, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x73, 0x52, - 0x06, 0x71, 0x75, 0x6f, 0x74, 0x61, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x4f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x6e, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x22, 0x35, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x22, 0x4e, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x42, + 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x35, 0x0a, 0x09, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x52, 0x09, 0x62, 0x6f, + 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x22, 0x35, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x42, 0x6f, + 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, + 0x0b, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x49, 0x64, 0x22, 0x4a, + 0x0a, 0x13, 0x47, 0x65, 0x74, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, + 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, + 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, + 0x52, 0x08, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x22, 0x94, 0x01, 0x0a, 0x15, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x25, 0x0a, 0x0e, 0x64, + 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, + 0x64, 0x22, 0x4d, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, + 0x61, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x62, + 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, + 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x52, 0x08, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, + 0x22, 0x38, 0x0a, 0x15, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, + 0x72, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x6f, 0x6f, + 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x49, 0x64, 0x22, 0x18, 0x0a, 0x16, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8a, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, + 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x0d, 0x65, + 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x65, 0x6d, 0x61, + 0x69, 0x6c, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x27, 0x0a, 0x09, 0x70, 0x61, 0x67, + 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x0a, 0xfa, 0x42, + 0x07, 0x2a, 0x05, 0x18, 0xe8, 0x07, 0x40, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, + 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x22, 0x68, 0x0a, 0x13, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, + 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, + 0x65, 0x72, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, + 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, + 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x1f, 0x0a, 0x1d, 0x52, + 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x68, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x1e, + 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, + 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, + 0x0a, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, 0x22, 0x65, 0x0a, 0x23, 0x49, 0x73, 0x73, + 0x75, 0x65, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, + 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1d, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x60, 0x01, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, + 0x1f, 0x0a, 0x0b, 0x74, 0x74, 0x6c, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x74, 0x74, 0x6c, 0x4d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, + 0x22, 0x3c, 0x0a, 0x24, 0x49, 0x73, 0x73, 0x75, 0x65, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, + 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x3a, + 0x0a, 0x1d, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, + 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, 0x22, 0x20, 0x0a, 0x1e, 0x52, 0x65, + 0x76, 0x6f, 0x6b, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x77, 0x0a, 0x1c, + 0x49, 0x73, 0x73, 0x75, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x75, 0x74, 0x68, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x11, + 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, + 0x52, 0x10, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x35, 0x0a, 0x1d, 0x49, 0x73, 0x73, 0x75, 0x65, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x77, 0x0a, 0x1c, + 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x11, + 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, + 0x52, 0x10, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x54, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, + 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x52, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x22, 0x3b, 0x0a, 0x1a, 0x47, + 0x65, 0x74, 0x47, 0x69, 0x74, 0x68, 0x75, 0x62, 0x52, 0x65, 0x70, 0x6f, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x55, 0x72, 0x6c, 0x22, 0x8d, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, + 0x47, 0x69, 0x74, 0x68, 0x75, 0x62, 0x52, 0x65, 0x70, 0x6f, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x68, 0x61, 0x73, 0x5f, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x68, 0x61, + 0x73, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x72, 0x61, 0x6e, 0x74, + 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x55, 0x72, + 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x62, 0x72, 0x61, + 0x6e, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x6a, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x47, + 0x69, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, + 0x02, 0x10, 0x01, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x21, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0xa9, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x47, 0x69, 0x74, 0x43, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6f, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6f, 0x55, 0x72, 0x6c, 0x12, 0x1a, 0x0a, + 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x70, 0x61, 0x74, 0x68, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x70, 0x61, 0x74, 0x68, 0x12, + 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x22, 0x8b, 0x01, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x68, 0x69, 0x74, 0x65, + 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, + 0x10, 0x01, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x1f, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x12, 0x1b, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x21, + 0x0a, 0x1f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, + 0x74, 0x65, 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x6e, 0x0a, 0x1e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x68, 0x69, 0x74, 0x65, + 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, + 0x10, 0x01, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x1f, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x22, 0x21, 0x0a, 0x1f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x68, 0x69, 0x74, 0x65, + 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4c, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x68, 0x69, 0x74, + 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x5c, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, + 0x69, 0x73, 0x74, 0x65, 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x07, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, + 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, + 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x07, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, + 0x22, 0x95, 0x02, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, + 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, + 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x68, 0x6f, 0x74, 0x6f, 0x5f, 0x75, 0x72, 0x6c, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x68, 0x6f, 0x74, 0x6f, 0x55, 0x72, 0x6c, 0x12, + 0x31, 0x0a, 0x06, 0x71, 0x75, 0x6f, 0x74, 0x61, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x73, 0x52, 0x06, 0x71, 0x75, 0x6f, 0x74, + 0x61, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x6e, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x4f, 0x6e, 0x22, 0xd5, 0x01, - 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 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, 0x15, 0x0a, - 0x06, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, - 0x72, 0x67, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x4f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x4f, 0x6e, 0x12, 0x39, 0x0a, + 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x4f, 0x6e, 0x22, 0xd5, 0x01, 0x0a, 0x07, 0x53, 0x65, 0x72, + 0x76, 0x69, 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, 0x15, 0x0a, 0x06, 0x6f, 0x72, 0x67, 0x5f, + 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, 0x12, + 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x6f, 0x72, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x4f, 0x6e, 0x22, 0x85, 0x02, 0x0a, 0x0c, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x06, - 0x71, 0x75, 0x6f, 0x74, 0x61, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, - 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x73, 0x52, - 0x06, 0x71, 0x75, 0x6f, 0x74, 0x61, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x4f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x6e, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x4f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x5f, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x4f, 0x6e, + 0x22, 0x85, 0x02, 0x0a, 0x0c, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x06, 0x71, 0x75, 0x6f, 0x74, 0x61, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, + 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x73, 0x52, 0x06, 0x71, 0x75, 0x6f, 0x74, + 0x61, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x6e, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x4f, 0x6e, 0x22, 0x35, 0x0a, - 0x0a, 0x55, 0x73, 0x65, 0x72, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x73, - 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6f, 0x72, 0x67, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x75, 0x73, 0x65, 0x72, - 0x4f, 0x72, 0x67, 0x73, 0x22, 0xd6, 0x01, 0x0a, 0x12, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x64, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6c, 0x6f, - 0x74, 0x73, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, - 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x6c, - 0x6f, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x50, - 0x65, 0x72, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x13, - 0x6f, 0x75, 0x74, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6e, 0x76, 0x69, - 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x6f, 0x75, 0x74, 0x73, 0x74, - 0x61, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x22, 0xe9, 0x04, - 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x15, 0x0a, - 0x06, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, - 0x72, 0x67, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, - 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, - 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x5f, 0x75, 0x72, 0x6c, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x55, 0x72, 0x6c, - 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x70, 0x61, 0x74, 0x68, 0x18, 0x11, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, - 0x6f, 0x64, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x28, 0x0a, 0x10, 0x70, - 0x72, 0x6f, 0x64, 0x5f, 0x6f, 0x6c, 0x61, 0x70, 0x5f, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x64, 0x4f, 0x6c, 0x61, 0x70, 0x44, - 0x72, 0x69, 0x76, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x64, 0x5f, 0x6f, 0x6c, - 0x61, 0x70, 0x5f, 0x64, 0x73, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, - 0x6f, 0x64, 0x4f, 0x6c, 0x61, 0x70, 0x44, 0x73, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, - 0x64, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x70, - 0x72, 0x6f, 0x64, 0x53, 0x6c, 0x6f, 0x74, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x64, - 0x5f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x64, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x64, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x55, 0x72, 0x6c, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x72, 0x6f, - 0x64, 0x5f, 0x74, 0x74, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x12, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x64, 0x54, 0x74, 0x6c, 0x53, 0x65, 0x63, 0x6f, - 0x6e, 0x64, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6f, - 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x4f, 0x6e, 0x12, 0x39, - 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, + 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x4f, 0x6e, 0x12, 0x39, 0x0a, + 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x4f, 0x6e, 0x22, 0x35, 0x0a, 0x0a, 0x55, 0x73, 0x65, 0x72, + 0x51, 0x75, 0x6f, 0x74, 0x61, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, + 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6f, 0x72, 0x67, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0e, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x75, 0x73, 0x65, 0x72, 0x4f, 0x72, 0x67, 0x73, 0x22, + 0xd6, 0x01, 0x0a, 0x12, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x51, 0x75, 0x6f, 0x74, 0x61, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x5f, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x73, 0x6c, 0x6f, 0x74, 0x73, + 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x5f, 0x70, + 0x65, 0x72, 0x5f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x12, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x50, 0x65, 0x72, 0x44, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x13, 0x6f, 0x75, 0x74, 0x73, 0x74, + 0x61, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x6f, 0x75, 0x74, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x22, 0xe9, 0x04, 0x0a, 0x07, 0x50, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x72, 0x67, 0x5f, + 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, 0x12, + 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x6f, 0x72, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, + 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x55, 0x72, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x73, + 0x75, 0x62, 0x70, 0x61, 0x74, 0x68, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, + 0x62, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x5f, 0x62, 0x72, + 0x61, 0x6e, 0x63, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x64, + 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x64, 0x5f, 0x6f, + 0x6c, 0x61, 0x70, 0x5f, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x64, 0x4f, 0x6c, 0x61, 0x70, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, + 0x12, 0x22, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x64, 0x5f, 0x6f, 0x6c, 0x61, 0x70, 0x5f, 0x64, 0x73, + 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x4f, 0x6c, 0x61, + 0x70, 0x44, 0x73, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x5f, 0x73, 0x6c, 0x6f, + 0x74, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x53, 0x6c, + 0x6f, 0x74, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x64, 0x5f, 0x64, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x10, 0x70, 0x72, 0x6f, 0x64, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x5f, 0x75, 0x72, + 0x6c, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x64, 0x55, 0x72, 0x6c, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x64, 0x5f, 0x74, 0x74, 0x6c, + 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, + 0x70, 0x72, 0x6f, 0x64, 0x54, 0x74, 0x6c, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x39, + 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x4f, 0x6e, 0x22, 0xff, 0x02, 0x0a, 0x0a, 0x44, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x6c, 0x6f, 0x74, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x12, 0x16, 0x0a, - 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, - 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x37, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x5f, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x4f, 0x6e, - 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x4f, 0x6e, 0x22, 0xa2, 0x02, 0x0a, 0x17, - 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x65, 0x61, 0x64, 0x5f, - 0x6f, 0x72, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x61, 0x64, 0x4f, - 0x72, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x5f, 0x6f, 0x72, 0x67, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x4f, 0x72, - 0x67, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x72, 0x65, 0x61, 0x64, 0x50, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, - 0x27, 0x0a, 0x0f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x72, 0x65, 0x61, 0x64, - 0x5f, 0x6f, 0x72, 0x67, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, - 0x72, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x5f, 0x6f, 0x72, 0x67, - 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, - 0x22, 0x90, 0x03, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x65, 0x72, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x61, 0x64, 0x5f, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x72, - 0x65, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0d, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x64, 0x12, 0x28, - 0x0a, 0x10, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x50, 0x72, - 0x6f, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x6d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x65, 0x61, - 0x64, 0x5f, 0x64, 0x65, 0x76, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x61, - 0x64, 0x44, 0x65, 0x76, 0x12, 0x26, 0x0a, 0x0f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x64, 0x65, 0x76, - 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, - 0x65, 0x61, 0x64, 0x44, 0x65, 0x76, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x0a, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x65, 0x76, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x09, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x44, 0x65, 0x76, 0x12, 0x30, 0x0a, 0x14, 0x72, - 0x65, 0x61, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x72, 0x65, 0x61, 0x64, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x34, 0x0a, - 0x16, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, - 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x73, 0x22, 0xf0, 0x01, 0x0a, 0x06, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x17, - 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, - 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, - 0x72, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x18, 0x05, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x4f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x4f, 0x6e, 0x22, 0xff, 0x02, 0x0a, 0x0a, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x05, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x72, 0x61, 0x6e, + 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x68, 0x6f, 0x73, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x48, + 0x6f, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x11, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x49, 0x64, 0x12, 0x37, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, + 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, + 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x4f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x4f, 0x6e, 0x22, 0x55, 0x0a, 0x0a, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, - 0x76, 0x69, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, - 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x1d, - 0x0a, 0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x64, 0x42, 0x79, 0x22, 0x3f, 0x0a, - 0x11, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x44, 0x6f, 0x6d, 0x61, - 0x69, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, - 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0xa6, - 0x02, 0x0a, 0x08, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, - 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, - 0x74, 0x61, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x61, 0x73, 0x68, - 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, - 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x4f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x61, 0x74, 0x65, 0x64, 0x4f, 0x6e, 0x22, 0xa2, 0x02, 0x0a, 0x17, 0x4f, 0x72, 0x67, 0x61, 0x6e, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x72, 0x67, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x72, 0x67, 0x12, 0x1d, 0x0a, + 0x0a, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x5f, 0x6f, 0x72, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x4f, 0x72, 0x67, 0x12, 0x23, 0x0a, 0x0d, + 0x72, 0x65, 0x61, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0c, 0x72, 0x65, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x72, 0x67, 0x5f, + 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, + 0x65, 0x61, 0x64, 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x2c, 0x0a, + 0x12, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x5f, 0x6f, 0x72, 0x67, 0x5f, 0x6d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x22, 0x90, 0x03, 0x0a, 0x12, + 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x72, 0x65, 0x61, 0x64, 0x50, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x5f, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1b, 0x0a, 0x09, + 0x72, 0x65, 0x61, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x08, 0x72, 0x65, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x72, 0x65, 0x61, + 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x64, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x72, + 0x6f, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x50, 0x72, 0x6f, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x64, 0x65, 0x76, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x61, 0x64, 0x44, 0x65, 0x76, 0x12, + 0x26, 0x0a, 0x0f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x64, 0x65, 0x76, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, 0x65, 0x61, 0x64, 0x44, 0x65, + 0x76, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x5f, 0x64, 0x65, 0x76, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x44, 0x65, 0x76, 0x12, 0x30, 0x0a, 0x14, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x72, 0x65, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x22, 0xf0, + 0x01, 0x0a, 0x06, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x45, 0x6d, 0x61, 0x69, + 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, + 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x4f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x5f, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x4f, + 0x6e, 0x22, 0x55, 0x0a, 0x0a, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x6e, 0x76, + 0x69, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, + 0x6e, 0x76, 0x69, 0x74, 0x65, 0x64, 0x42, 0x79, 0x22, 0x3f, 0x0a, 0x11, 0x57, 0x68, 0x69, 0x74, + 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x16, 0x0a, + 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0xa6, 0x02, 0x0a, 0x08, 0x42, 0x6f, + 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x25, 0x0a, + 0x0e, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0a, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x4f, 0x6e, 0x22, 0x94, 0x01, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x4f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x6f, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x4f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x4f, 0x6e, 0x22, 0x94, 0x01, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x4f, 0x6e, 0x2a, 0xae, - 0x01, 0x0a, 0x10, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x1d, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, - 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, - 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x19, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, - 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x45, 0x4e, 0x44, - 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, - 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4f, 0x4b, 0x10, 0x02, 0x12, - 0x21, 0x0a, 0x1d, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4e, 0x43, 0x49, 0x4c, 0x49, 0x4e, 0x47, - 0x10, 0x03, 0x12, 0x1b, 0x0a, 0x17, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, - 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x32, - 0x98, 0x43, 0x0a, 0x0c, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x51, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x12, 0x08, 0x2f, 0x76, 0x31, 0x2f, 0x70, - 0x69, 0x6e, 0x67, 0x12, 0x81, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, - 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, - 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, - 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x82, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4f, - 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, + 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x4f, 0x6e, 0x12, 0x39, + 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, + 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x4f, 0x6e, 0x2a, 0xae, 0x01, 0x0a, 0x10, 0x44, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, + 0x0a, 0x1d, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x1d, 0x0a, 0x19, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, + 0x12, 0x18, 0x0a, 0x14, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4f, 0x4b, 0x10, 0x02, 0x12, 0x21, 0x0a, 0x1d, 0x44, 0x45, + 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, + 0x52, 0x45, 0x43, 0x4f, 0x4e, 0x43, 0x49, 0x4c, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x1b, 0x0a, + 0x17, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x55, 0x53, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x32, 0x98, 0x46, 0x0a, 0x0c, 0x41, + 0x64, 0x6d, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x51, 0x0a, 0x04, 0x50, + 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, + 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x10, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0a, 0x12, 0x08, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x81, + 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, + 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x12, + 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x82, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, + 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, + 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x87, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, + 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x22, 0x11, + 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x8b, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x87, 0x01, 0x0a, - 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, - 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, - 0x3a, 0x01, 0x2a, 0x22, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x8b, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, - 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, - 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, - 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x2a, 0x18, 0x2f, 0x76, 0x31, 0x2f, - 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6e, - 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x8e, 0x01, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, - 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, - 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, - 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x3a, 0x01, 0x2a, 0x32, 0x18, 0x2f, 0x76, 0x31, + 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, + 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x2a, 0x18, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, + 0x8e, 0x01, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, + 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x1d, 0x3a, 0x01, 0x2a, 0x32, 0x18, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, + 0x12, 0xbc, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x73, 0x46, 0x6f, 0x72, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x31, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x46, 0x6f, 0x72, + 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, + 0x46, 0x6f, 0x72, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x36, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x12, + 0x2e, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, + 0x90, 0x01, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x20, + 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x21, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x12, 0x35, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, - 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0xbc, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, - 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x46, 0x6f, 0x72, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x36, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x30, 0x12, 0x2e, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x73, 0x12, 0x90, 0x01, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x12, 0x20, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, - 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, - 0x12, 0x35, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x90, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, - 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x76, 0x31, - 0x2f, 0x73, 0x75, 0x70, 0x65, 0x72, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0xb5, 0x01, 0x0a, 0x13, 0x47, - 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x73, 0x12, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x61, 0x72, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, + 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, + 0x65, 0x7d, 0x12, 0x90, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x75, 0x70, 0x65, + 0x72, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0xb5, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x47, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x41, 0x12, 0x3f, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x73, 0x12, 0x95, 0x01, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x12, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x47, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x41, 0x12, 0x3f, 0x2f, 0x76, + 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x6e, 0x61, + 0x6d, 0x65, 0x7d, 0x2f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x95, 0x01, + 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, + 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, - 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x3a, 0x01, 0x2a, 0x22, 0x2e, 0x2f, 0x76, 0x31, 0x2f, + 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x33, 0x3a, 0x01, 0x2a, 0x22, 0x2e, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, + 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x72, + 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x2a, 0x35, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0d, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x23, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, - 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x2a, - 0x35, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, - 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, + 0x7d, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x12, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, - 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x40, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3a, 0x3a, 0x01, 0x2a, 0x32, 0x35, - 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, - 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0xc1, 0x01, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x40, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3a, 0x3a, 0x01, 0x2a, 0x32, 0x35, 0x2f, 0x76, 0x31, 0x2f, 0x6f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, + 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, + 0x12, 0xc1, 0x01, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x2c, 0x2e, 0x72, 0x69, + 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, - 0x12, 0x2c, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, - 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x61, - 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, - 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x61, 0x72, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4a, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x44, 0x3a, 0x01, 0x2a, 0x1a, 0x3f, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, - 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, - 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, - 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x10, 0x54, 0x72, - 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x12, 0x26, - 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x54, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, - 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, - 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x3a, 0x01, 0x2a, 0x22, 0x29, 0x2f, 0x76, 0x31, 0x2f, - 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x65, 0x63, 0x6f, - 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x12, 0xa6, 0x01, 0x0a, 0x15, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, - 0x2b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, - 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x69, - 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x2c, 0x3a, 0x01, 0x2a, 0x22, 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x12, 0x84, - 0x01, 0x0a, 0x0f, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x64, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x12, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x76, 0x31, 0x2e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x64, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x44, + 0x3a, 0x01, 0x2a, 0x1a, 0x3f, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x76, 0x61, 0x72, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x10, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x12, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x52, 0x65, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x3a, 0x01, 0x2a, 0x22, 0x17, 0x2f, 0x76, - 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2d, 0x2f, 0x72, 0x65, 0x64, - 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x12, 0xaa, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, - 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x73, 0x12, 0x2d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, - 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x12, 0x28, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, - 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, - 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, - 0x72, 0x73, 0x12, 0xaa, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2d, + 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, + 0x31, 0x2e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, + 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x2e, 0x3a, 0x01, 0x2a, 0x22, 0x29, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, + 0x12, 0xa6, 0x01, 0x0a, 0x15, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x66, 0x72, + 0x65, 0x73, 0x68, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x2b, 0x2e, 0x72, 0x69, 0x6c, + 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, + 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, + 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x3a, 0x01, 0x2a, + 0x22, 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, + 0x7d, 0x2f, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x12, 0x84, 0x01, 0x0a, 0x0f, 0x54, 0x72, + 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x12, 0x25, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, + 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, + 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x64, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x1c, 0x3a, 0x01, 0x2a, 0x22, 0x17, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2d, 0x2f, 0x72, 0x65, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x12, 0xaa, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x2e, 0x72, + 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x72, 0x69, + 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x2a, 0x12, 0x28, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0xaa, 0x01, + 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, + 0x12, 0x28, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x7d, 0x2f, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x12, 0xa7, 0x01, 0x0a, 0x15, 0x41, + 0x64, 0x64, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, + 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2c, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x3a, 0x01, 0x2a, 0x22, 0x28, 0x2f, 0x76, 0x31, 0x2f, + 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x6d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x73, 0x12, 0xb5, 0x01, 0x0a, 0x18, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x12, 0x2e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, + 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, + 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x32, 0x2a, 0x30, 0x2f, 0x76, 0x31, 0x2f, + 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x6d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x7d, 0x12, 0xa0, 0x01, 0x0a, + 0x11, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x72, 0x69, + 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x65, 0x61, 0x76, + 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x32, 0x2a, 0x30, 0x2f, + 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, + 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x12, + 0xbb, 0x01, 0x0a, 0x19, 0x53, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2f, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, + 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, + 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x35, 0x3a, 0x01, 0x2a, 0x1a, 0x30, 0x2f, 0x76, 0x31, + 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, + 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x6d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x7d, 0x12, 0xae, 0x01, + 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x73, 0x12, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, + 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, - 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, - 0x76, 0x69, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x12, 0x28, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x12, - 0xa7, 0x01, 0x0a, 0x15, 0x41, 0x64, 0x64, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, - 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4f, 0x72, 0x67, - 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, - 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x3a, 0x01, 0x2a, 0x22, - 0x28, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0xb5, 0x01, 0x0a, 0x18, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, - 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4f, 0x72, 0x67, - 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, - 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4f, 0x72, 0x67, - 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x32, 0x2a, - 0x30, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x65, 0x6d, 0x61, 0x69, 0x6c, - 0x7d, 0x12, 0xa0, 0x01, 0x0a, 0x11, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, - 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x4f, 0x72, 0x67, - 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, - 0x2e, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x32, 0x2a, 0x30, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x43, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x3d, 0x12, 0x3b, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0xae, + 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, + 0x76, 0x69, 0x74, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, + 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x43, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x3d, 0x12, 0x3b, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x12, 0xbb, 0x01, 0x0a, 0x19, 0x53, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, - 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, - 0x6c, 0x65, 0x12, 0x2f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x35, 0x3a, 0x01, 0x2a, - 0x1a, 0x30, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x12, + 0xab, 0x01, 0x0a, 0x10, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x12, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, + 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x72, + 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, + 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x46, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x40, 0x3a, 0x01, 0x2a, + 0x22, 0x3b, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x65, 0x6d, 0x61, 0x69, - 0x6c, 0x7d, 0x12, 0xae, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, - 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x43, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x12, 0x3b, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, + 0x6e, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0xb9, 0x01, + 0x0a, 0x13, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, + 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4b, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x45, 0x2a, 0x43, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, + 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x73, 0x2f, 0x7b, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x7d, 0x12, 0xbf, 0x01, 0x0a, 0x14, 0x53, 0x65, + 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, + 0x6c, 0x65, 0x12, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, + 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, + 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4e, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x48, 0x3a, 0x01, 0x2a, 0x1a, 0x43, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x73, 0x12, 0xae, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x72, 0x69, 0x6c, - 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x43, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x12, 0x3b, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, - 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, - 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x69, 0x6e, 0x76, - 0x69, 0x74, 0x65, 0x73, 0x12, 0xab, 0x01, 0x0a, 0x10, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, - 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, - 0x31, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x46, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x40, 0x3a, 0x01, 0x2a, 0x22, 0x3b, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, - 0x72, 0x73, 0x12, 0xb9, 0x01, 0x0a, 0x13, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x29, 0x2e, 0x72, 0x69, 0x6c, - 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, - 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x4b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x45, 0x2a, 0x43, 0x2f, 0x76, 0x31, 0x2f, 0x6f, - 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, - 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x6d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x7d, 0x12, 0xbf, - 0x01, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, - 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, - 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, - 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x4e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x48, 0x3a, 0x01, 0x2a, 0x1a, 0x43, 0x2f, 0x76, 0x31, - 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, - 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, - 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x7d, - 0x12, 0x78, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x55, 0x73, - 0x65, 0x72, 0x12, 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, - 0x72, 0x73, 0x2f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x12, 0xa8, 0x01, 0x0a, 0x1c, 0x49, - 0x73, 0x73, 0x75, 0x65, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, - 0x76, 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x32, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x73, 0x73, 0x75, - 0x65, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x41, - 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x33, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, - 0x49, 0x73, 0x73, 0x75, 0x65, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, - 0x69, 0x76, 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x3a, 0x01, 0x2a, 0x22, - 0x14, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x2f, 0x72, 0x65, 0x70, 0x72, - 0x65, 0x73, 0x65, 0x6e, 0x74, 0x12, 0x91, 0x01, 0x0a, 0x16, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, + 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x7d, 0x12, 0x78, 0x0a, 0x0e, 0x47, + 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x24, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x55, 0x73, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x13, 0x12, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x12, 0xa8, 0x01, 0x0a, 0x1c, 0x49, 0x73, 0x73, 0x75, 0x65, 0x52, + 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x41, 0x75, 0x74, + 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x32, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, + 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x73, 0x73, 0x75, 0x65, 0x52, 0x65, 0x70, 0x72, + 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x72, 0x69, 0x6c, + 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x73, 0x73, 0x75, 0x65, + 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x41, 0x75, + 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x3a, 0x01, 0x2a, 0x22, 0x14, 0x2f, 0x76, 0x31, 0x2f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x2f, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, + 0x12, 0x91, 0x01, 0x0a, 0x16, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x43, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2c, 0x2e, 0x72, 0x69, + 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x76, 0x6f, + 0x6b, 0x65, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x12, 0x2c, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, - 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x41, 0x75, - 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, - 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x52, - 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x68, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x2a, 0x12, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x73, 0x2f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x8d, 0x01, 0x0a, 0x13, 0x47, 0x65, - 0x74, 0x47, 0x69, 0x74, 0x68, 0x75, 0x62, 0x52, 0x65, 0x70, 0x6f, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x69, 0x74, 0x68, 0x75, 0x62, 0x52, 0x65, 0x70, 0x6f, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, + 0x2a, 0x12, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x2f, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x12, 0x8d, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x47, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x52, 0x65, 0x70, 0x6f, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x69, 0x74, 0x68, 0x75, 0x62, 0x52, 0x65, 0x70, 0x6f, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, - 0x12, 0x17, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2f, 0x72, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, 0xb3, 0x01, 0x0a, 0x11, 0x47, 0x65, - 0x74, 0x47, 0x69, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, - 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x47, 0x69, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x69, 0x74, 0x43, - 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x4b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x45, 0x12, 0x43, 0x2f, 0x76, 0x31, 0x2f, - 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, - 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, - 0x67, 0x69, 0x74, 0x2d, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, - 0xb1, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, - 0x69, 0x73, 0x74, 0x65, 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x2d, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x44, 0x6f, 0x6d, - 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x72, 0x69, 0x6c, - 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x44, 0x6f, 0x6d, 0x61, - 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x37, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x31, 0x3a, 0x01, 0x2a, 0x22, 0x2c, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, + 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x52, 0x65, 0x70, 0x6f, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x12, 0x17, 0x2f, 0x76, 0x31, + 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, + 0x72, 0x69, 0x65, 0x73, 0x12, 0xb3, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x47, 0x69, 0x74, 0x43, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x27, 0x2e, 0x72, 0x69, 0x6c, + 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x69, + 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x69, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4b, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x45, 0x12, 0x43, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, - 0x74, 0x65, 0x64, 0x12, 0xb7, 0x01, 0x0a, 0x17, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x68, - 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, - 0x2d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, - 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, - 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, - 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x2a, 0x35, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, - 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, - 0x73, 0x74, 0x65, 0x64, 0x2f, 0x7b, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x7d, 0x12, 0xab, 0x01, - 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, - 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x2c, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x68, 0x69, - 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, - 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x68, 0x69, 0x74, 0x65, - 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x12, 0x2c, 0x2f, - 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, - 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x12, 0x5b, 0x0a, 0x07, 0x47, - 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, - 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, - 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, - 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x12, 0x6e, 0x0a, 0x0b, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x21, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, - 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, - 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x72, 0x69, 0x6c, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, + 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x67, 0x69, 0x74, 0x2d, 0x63, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0xb1, 0x01, 0x0a, 0x17, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, + 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x2d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, + 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x68, 0x69, + 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, + 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x68, 0x69, 0x74, + 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x37, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x31, 0x3a, 0x01, 0x2a, + 0x22, 0x2c, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x7d, 0x2f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x12, 0xb7, + 0x01, 0x0a, 0x17, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, + 0x73, 0x74, 0x65, 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x2d, 0x2e, 0x72, 0x69, 0x6c, + 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x44, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x37, 0x2a, 0x35, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x7d, 0x2f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x2f, + 0x7b, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x7d, 0x12, 0xab, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, + 0x74, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x44, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x73, 0x12, 0x2c, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, + 0x74, 0x65, 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x65, + 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x12, 0x2c, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x77, 0x68, 0x69, 0x74, 0x65, + 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x12, 0x5b, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, + 0x72, 0x12, 0x1d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, + 0x65, 0x72, 0x73, 0x12, 0x6e, 0x0a, 0x0b, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, + 0x72, 0x73, 0x12, 0x21, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, + 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x12, 0x12, 0x10, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x12, 0xb3, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, - 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x7c, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, - 0x53, 0x75, 0x70, 0x65, 0x72, 0x75, 0x73, 0x65, 0x72, 0x73, 0x12, 0x24, 0x2e, 0x72, 0x69, 0x6c, - 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, - 0x75, 0x70, 0x65, 0x72, 0x75, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x70, 0x65, 0x72, 0x75, 0x73, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, - 0x15, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x75, 0x70, 0x65, 0x72, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x79, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x53, 0x75, 0x70, - 0x65, 0x72, 0x75, 0x73, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, - 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x75, 0x70, 0x65, 0x72, 0x75, - 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x72, 0x69, 0x6c, - 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x75, - 0x70, 0x65, 0x72, 0x75, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x76, 0x31, 0x2f, - 0x73, 0x75, 0x70, 0x65, 0x72, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x73, 0x12, 0x80, 0x01, 0x0a, 0x0f, 0x53, 0x75, 0x64, 0x6f, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, - 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x64, 0x6f, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x72, + 0x68, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, + 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x48, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x42, 0x12, 0x40, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x75, 0x73, 0x65, + 0x72, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x7c, 0x0a, 0x0e, 0x4c, 0x69, 0x73, + 0x74, 0x53, 0x75, 0x70, 0x65, 0x72, 0x75, 0x73, 0x65, 0x72, 0x73, 0x12, 0x24, 0x2e, 0x72, 0x69, + 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x53, 0x75, 0x70, 0x65, 0x72, 0x75, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x70, 0x65, 0x72, 0x75, 0x73, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, + 0x12, 0x15, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x75, 0x70, 0x65, 0x72, 0x75, 0x73, 0x65, 0x72, 0x2f, + 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0xc7, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x44, + 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x61, 0x6c, 0x73, 0x12, 0x2e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, + 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, + 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x44, 0x3a, 0x01, 0x2a, + 0x22, 0x3f, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x73, 0x12, 0x79, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x53, 0x75, 0x70, 0x65, 0x72, 0x75, 0x73, 0x65, + 0x72, 0x12, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x75, 0x70, 0x65, 0x72, 0x75, 0x73, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, + 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x75, 0x70, 0x65, 0x72, 0x75, 0x73, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x75, 0x70, 0x65, 0x72, + 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x80, 0x01, 0x0a, + 0x0f, 0x53, 0x75, 0x64, 0x6f, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x12, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x75, 0x64, 0x6f, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, + 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x64, 0x6f, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x75, 0x70, + 0x65, 0x72, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, + 0x95, 0x01, 0x0a, 0x14, 0x53, 0x75, 0x64, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, + 0x65, 0x72, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x73, 0x12, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x64, 0x6f, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, + 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x64, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, + 0x73, 0x65, 0x72, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x3a, 0x01, 0x2a, 0x32, 0x19, 0x2f, 0x76, + 0x31, 0x2f, 0x73, 0x75, 0x70, 0x65, 0x72, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x71, 0x75, 0x6f, 0x74, + 0x61, 0x73, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x12, 0xb5, 0x01, 0x0a, 0x1c, 0x53, 0x75, 0x64, 0x6f, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x73, 0x12, 0x32, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x64, 0x6f, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x51, + 0x75, 0x6f, 0x74, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x64, - 0x6f, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x76, - 0x31, 0x2f, 0x73, 0x75, 0x70, 0x65, 0x72, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x12, 0x95, 0x01, 0x0a, 0x14, 0x53, 0x75, 0x64, 0x6f, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x73, 0x12, 0x2a, 0x2e, - 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, - 0x64, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x51, 0x75, 0x6f, 0x74, - 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, - 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x64, 0x6f, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x3a, 0x01, - 0x2a, 0x32, 0x19, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x75, 0x70, 0x65, 0x72, 0x75, 0x73, 0x65, 0x72, - 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x61, 0x73, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x12, 0xb5, 0x01, 0x0a, - 0x1c, 0x53, 0x75, 0x64, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x73, 0x12, 0x32, 0x2e, - 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, - 0x64, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x33, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, - 0x31, 0x2e, 0x53, 0x75, 0x64, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, - 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x3a, 0x01, - 0x2a, 0x32, 0x21, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x75, 0x70, 0x65, 0x72, 0x75, 0x73, 0x65, 0x72, - 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x61, 0x73, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x8f, 0x01, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, - 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, - 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x36, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x12, 0x2e, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, + 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x3a, 0x01, 0x2a, 0x32, 0x21, 0x2f, 0x76, + 0x31, 0x2f, 0x73, 0x75, 0x70, 0x65, 0x72, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x71, 0x75, 0x6f, 0x74, + 0x61, 0x73, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x8f, 0x01, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x12, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, + 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x36, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x30, 0x12, 0x2e, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x12, 0x92, 0x01, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x36, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x22, 0x2e, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x92, 0x01, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, + 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, - 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x36, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x22, 0x2e, 0x2f, 0x76, 0x31, - 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, - 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x7d, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x40, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3a, - 0x3a, 0x01, 0x2a, 0x32, 0x35, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x99, 0x01, 0x0a, 0x0d, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x23, 0x2e, 0x72, + 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x40, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3a, 0x3a, 0x01, 0x2a, 0x32, 0x35, + 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, + 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x99, 0x01, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, + 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, - 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x2a, - 0x35, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, - 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0xc0, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, - 0x12, 0x2b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x75, 0x74, 0x68, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, - 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4c, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x46, 0x12, 0x44, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x7d, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0xc3, 0x01, 0x0a, 0x15, 0x49, 0x73, - 0x73, 0x75, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x12, 0x2b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x73, 0x73, 0x75, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2c, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, - 0x2e, 0x49, 0x73, 0x73, 0x75, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x75, 0x74, - 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4f, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x49, 0x3a, 0x01, 0x2a, 0x22, 0x44, 0x2f, 0x76, 0x31, 0x2f, 0x6f, - 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, - 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, - 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, - 0x9d, 0x01, 0x0a, 0x16, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2c, 0x2e, 0x72, 0x69, 0x6c, - 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x6b, + 0x65, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x2a, 0x35, 0x2f, 0x76, 0x31, 0x2f, + 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x7d, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, + 0x7d, 0x12, 0xc0, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x2b, 0x2e, 0x72, 0x69, + 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x46, 0x12, 0x44, + 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x73, 0x12, 0xc3, 0x01, 0x0a, 0x15, 0x49, 0x73, 0x73, 0x75, 0x65, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2b, + 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x49, + 0x73, 0x73, 0x75, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x72, 0x69, + 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x73, 0x73, 0x75, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x2a, - 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x73, 0x2f, 0x7b, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x12, - 0x94, 0x01, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x2b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, - 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, - 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, - 0x72, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x1a, - 0x15, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x70, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x77, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x6f, - 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4f, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x49, 0x3a, 0x01, 0x2a, 0x22, 0x44, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x7d, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x9d, 0x01, 0x0a, 0x16, 0x52, + 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x75, 0x74, 0x68, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2c, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, + 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x2a, 0x1e, 0x2f, 0x76, 0x31, 0x2f, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x2f, + 0x7b, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x94, 0x01, 0x0a, 0x15, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x73, 0x12, 0x2b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, + 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2c, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, + 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x1a, 0x15, 0x2f, 0x76, 0x31, 0x2f, + 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x73, 0x12, 0x77, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, + 0x6b, 0x73, 0x12, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x6f, 0x6b, - 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, 0x2f, 0x76, 0x31, 0x2f, - 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, - 0x7f, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x21, - 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x12, 0x21, 0x2f, - 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, - 0x6b, 0x73, 0x2f, 0x7b, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x7d, - 0x12, 0x7d, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, - 0x72, 0x6b, 0x12, 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, - 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, - 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x76, 0x31, 0x2f, - 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, - 0x88, 0x01, 0x0a, 0x0e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, - 0x72, 0x6b, 0x12, 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, - 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, - 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x2a, 0x21, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, - 0x72, 0x73, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x2f, 0x7b, 0x62, 0x6f, - 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x7d, 0x42, 0xa3, 0x01, 0x0a, 0x11, 0x63, - 0x6f, 0x6d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, - 0x42, 0x08, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2e, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x69, 0x6c, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2f, 0x72, 0x69, 0x6c, 0x6c, 0x2f, 0x72, 0x69, 0x6c, 0x6c, 0x2f, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x52, - 0x41, 0x58, 0xaa, 0x02, 0x0d, 0x52, 0x69, 0x6c, 0x6c, 0x2e, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x56, 0x31, 0xca, 0x02, 0x0d, 0x52, 0x69, 0x6c, 0x6c, 0x5c, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x5c, - 0x56, 0x31, 0xe2, 0x02, 0x19, 0x52, 0x69, 0x6c, 0x6c, 0x5c, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x5c, - 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, - 0x0f, 0x52, 0x69, 0x6c, 0x6c, 0x3a, 0x3a, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x3a, 0x3a, 0x56, 0x31, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, + 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, 0x7f, 0x0a, 0x0b, 0x47, 0x65, + 0x74, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x21, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6f, 0x6f, + 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x72, + 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x12, 0x21, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, + 0x65, 0x72, 0x73, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x2f, 0x7b, 0x62, + 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x7d, 0x0a, 0x0e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x24, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, + 0x72, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, + 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, 0x88, 0x01, 0x0a, 0x0e, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x24, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, + 0x72, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x23, 0x2a, 0x21, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x62, 0x6f, + 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x2f, 0x7b, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, + 0x6b, 0x5f, 0x69, 0x64, 0x7d, 0x42, 0xa3, 0x01, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x69, + 0x6c, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x42, 0x08, 0x41, 0x70, 0x69, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x69, 0x6c, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x72, 0x69, 0x6c, + 0x6c, 0x2f, 0x72, 0x69, 0x6c, 0x6c, 0x2f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2f, 0x76, 0x31, 0x3b, + 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x52, 0x41, 0x58, 0xaa, 0x02, 0x0d, + 0x52, 0x69, 0x6c, 0x6c, 0x2e, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0d, + 0x52, 0x69, 0x6c, 0x6c, 0x5c, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x19, + 0x52, 0x69, 0x6c, 0x6c, 0x5c, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, + 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0f, 0x52, 0x69, 0x6c, 0x6c, + 0x3a, 0x3a, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -8951,7 +9321,7 @@ func file_rill_admin_v1_api_proto_rawDescGZIP() []byte { } var file_rill_admin_v1_api_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_rill_admin_v1_api_proto_msgTypes = make([]protoimpl.MessageInfo, 129) +var file_rill_admin_v1_api_proto_msgTypes = make([]protoimpl.MessageInfo, 133) var file_rill_admin_v1_api_proto_goTypes = []interface{}{ (DeploymentStatus)(0), // 0: rill.admin.v1.DeploymentStatus (*PingRequest)(nil), // 1: rill.admin.v1.PingRequest @@ -8974,295 +9344,306 @@ var file_rill_admin_v1_api_proto_goTypes = []interface{}{ (*SearchProjectNamesResponse)(nil), // 18: rill.admin.v1.SearchProjectNamesResponse (*GetProjectVariablesRequest)(nil), // 19: rill.admin.v1.GetProjectVariablesRequest (*GetProjectVariablesResponse)(nil), // 20: rill.admin.v1.GetProjectVariablesResponse - (*ListServicesRequest)(nil), // 21: rill.admin.v1.ListServicesRequest - (*ListServicesResponse)(nil), // 22: rill.admin.v1.ListServicesResponse - (*CreateServiceRequest)(nil), // 23: rill.admin.v1.CreateServiceRequest - (*CreateServiceResponse)(nil), // 24: rill.admin.v1.CreateServiceResponse - (*UpdateServiceRequest)(nil), // 25: rill.admin.v1.UpdateServiceRequest - (*UpdateServiceResponse)(nil), // 26: rill.admin.v1.UpdateServiceResponse - (*DeleteServiceRequest)(nil), // 27: rill.admin.v1.DeleteServiceRequest - (*DeleteServiceResponse)(nil), // 28: rill.admin.v1.DeleteServiceResponse - (*CreateProjectRequest)(nil), // 29: rill.admin.v1.CreateProjectRequest - (*CreateProjectResponse)(nil), // 30: rill.admin.v1.CreateProjectResponse - (*DeleteProjectRequest)(nil), // 31: rill.admin.v1.DeleteProjectRequest - (*DeleteProjectResponse)(nil), // 32: rill.admin.v1.DeleteProjectResponse - (*UpdateProjectRequest)(nil), // 33: rill.admin.v1.UpdateProjectRequest - (*UpdateProjectResponse)(nil), // 34: rill.admin.v1.UpdateProjectResponse - (*UpdateProjectVariablesRequest)(nil), // 35: rill.admin.v1.UpdateProjectVariablesRequest - (*UpdateProjectVariablesResponse)(nil), // 36: rill.admin.v1.UpdateProjectVariablesResponse - (*TriggerReconcileRequest)(nil), // 37: rill.admin.v1.TriggerReconcileRequest - (*TriggerReconcileResponse)(nil), // 38: rill.admin.v1.TriggerReconcileResponse - (*TriggerRefreshSourcesRequest)(nil), // 39: rill.admin.v1.TriggerRefreshSourcesRequest - (*TriggerRefreshSourcesResponse)(nil), // 40: rill.admin.v1.TriggerRefreshSourcesResponse - (*TriggerRedeployRequest)(nil), // 41: rill.admin.v1.TriggerRedeployRequest - (*TriggerRedeployResponse)(nil), // 42: rill.admin.v1.TriggerRedeployResponse - (*ListOrganizationMembersRequest)(nil), // 43: rill.admin.v1.ListOrganizationMembersRequest - (*ListOrganizationMembersResponse)(nil), // 44: rill.admin.v1.ListOrganizationMembersResponse - (*ListOrganizationInvitesRequest)(nil), // 45: rill.admin.v1.ListOrganizationInvitesRequest - (*ListOrganizationInvitesResponse)(nil), // 46: rill.admin.v1.ListOrganizationInvitesResponse - (*AddOrganizationMemberRequest)(nil), // 47: rill.admin.v1.AddOrganizationMemberRequest - (*AddOrganizationMemberResponse)(nil), // 48: rill.admin.v1.AddOrganizationMemberResponse - (*RemoveOrganizationMemberRequest)(nil), // 49: rill.admin.v1.RemoveOrganizationMemberRequest - (*RemoveOrganizationMemberResponse)(nil), // 50: rill.admin.v1.RemoveOrganizationMemberResponse - (*LeaveOrganizationRequest)(nil), // 51: rill.admin.v1.LeaveOrganizationRequest - (*LeaveOrganizationResponse)(nil), // 52: rill.admin.v1.LeaveOrganizationResponse - (*SetOrganizationMemberRoleRequest)(nil), // 53: rill.admin.v1.SetOrganizationMemberRoleRequest - (*SetOrganizationMemberRoleResponse)(nil), // 54: rill.admin.v1.SetOrganizationMemberRoleResponse - (*ListSuperusersRequest)(nil), // 55: rill.admin.v1.ListSuperusersRequest - (*ListSuperusersResponse)(nil), // 56: rill.admin.v1.ListSuperusersResponse - (*SetSuperuserRequest)(nil), // 57: rill.admin.v1.SetSuperuserRequest - (*SetSuperuserResponse)(nil), // 58: rill.admin.v1.SetSuperuserResponse - (*SudoGetResourceRequest)(nil), // 59: rill.admin.v1.SudoGetResourceRequest - (*SudoGetResourceResponse)(nil), // 60: rill.admin.v1.SudoGetResourceResponse - (*SudoUpdateOrganizationQuotasRequest)(nil), // 61: rill.admin.v1.SudoUpdateOrganizationQuotasRequest - (*SudoUpdateOrganizationQuotasResponse)(nil), // 62: rill.admin.v1.SudoUpdateOrganizationQuotasResponse - (*SudoUpdateUserQuotasRequest)(nil), // 63: rill.admin.v1.SudoUpdateUserQuotasRequest - (*SudoUpdateUserQuotasResponse)(nil), // 64: rill.admin.v1.SudoUpdateUserQuotasResponse - (*ListProjectMembersRequest)(nil), // 65: rill.admin.v1.ListProjectMembersRequest - (*ListProjectMembersResponse)(nil), // 66: rill.admin.v1.ListProjectMembersResponse - (*ListProjectInvitesRequest)(nil), // 67: rill.admin.v1.ListProjectInvitesRequest - (*ListProjectInvitesResponse)(nil), // 68: rill.admin.v1.ListProjectInvitesResponse - (*AddProjectMemberRequest)(nil), // 69: rill.admin.v1.AddProjectMemberRequest - (*AddProjectMemberResponse)(nil), // 70: rill.admin.v1.AddProjectMemberResponse - (*RemoveProjectMemberRequest)(nil), // 71: rill.admin.v1.RemoveProjectMemberRequest - (*RemoveProjectMemberResponse)(nil), // 72: rill.admin.v1.RemoveProjectMemberResponse - (*SetProjectMemberRoleRequest)(nil), // 73: rill.admin.v1.SetProjectMemberRoleRequest - (*SetProjectMemberRoleResponse)(nil), // 74: rill.admin.v1.SetProjectMemberRoleResponse - (*GetCurrentUserRequest)(nil), // 75: rill.admin.v1.GetCurrentUserRequest - (*GetCurrentUserResponse)(nil), // 76: rill.admin.v1.GetCurrentUserResponse - (*GetUserRequest)(nil), // 77: rill.admin.v1.GetUserRequest - (*GetUserResponse)(nil), // 78: rill.admin.v1.GetUserResponse - (*UserPreferences)(nil), // 79: rill.admin.v1.UserPreferences - (*UpdateUserPreferencesRequest)(nil), // 80: rill.admin.v1.UpdateUserPreferencesRequest - (*UpdateUserPreferencesResponse)(nil), // 81: rill.admin.v1.UpdateUserPreferencesResponse - (*ListBookmarksRequest)(nil), // 82: rill.admin.v1.ListBookmarksRequest - (*ListBookmarksResponse)(nil), // 83: rill.admin.v1.ListBookmarksResponse - (*GetBookmarkRequest)(nil), // 84: rill.admin.v1.GetBookmarkRequest - (*GetBookmarkResponse)(nil), // 85: rill.admin.v1.GetBookmarkResponse - (*CreateBookmarkRequest)(nil), // 86: rill.admin.v1.CreateBookmarkRequest - (*CreateBookmarkResponse)(nil), // 87: rill.admin.v1.CreateBookmarkResponse - (*RemoveBookmarkRequest)(nil), // 88: rill.admin.v1.RemoveBookmarkRequest - (*RemoveBookmarkResponse)(nil), // 89: rill.admin.v1.RemoveBookmarkResponse - (*SearchUsersRequest)(nil), // 90: rill.admin.v1.SearchUsersRequest - (*SearchUsersResponse)(nil), // 91: rill.admin.v1.SearchUsersResponse - (*RevokeCurrentAuthTokenRequest)(nil), // 92: rill.admin.v1.RevokeCurrentAuthTokenRequest - (*RevokeCurrentAuthTokenResponse)(nil), // 93: rill.admin.v1.RevokeCurrentAuthTokenResponse - (*IssueRepresentativeAuthTokenRequest)(nil), // 94: rill.admin.v1.IssueRepresentativeAuthTokenRequest - (*IssueRepresentativeAuthTokenResponse)(nil), // 95: rill.admin.v1.IssueRepresentativeAuthTokenResponse - (*RevokeServiceAuthTokenRequest)(nil), // 96: rill.admin.v1.RevokeServiceAuthTokenRequest - (*RevokeServiceAuthTokenResponse)(nil), // 97: rill.admin.v1.RevokeServiceAuthTokenResponse - (*IssueServiceAuthTokenRequest)(nil), // 98: rill.admin.v1.IssueServiceAuthTokenRequest - (*IssueServiceAuthTokenResponse)(nil), // 99: rill.admin.v1.IssueServiceAuthTokenResponse - (*ListServiceAuthTokensRequest)(nil), // 100: rill.admin.v1.ListServiceAuthTokensRequest - (*ListServiceAuthTokensResponse)(nil), // 101: rill.admin.v1.ListServiceAuthTokensResponse - (*GetGithubRepoStatusRequest)(nil), // 102: rill.admin.v1.GetGithubRepoStatusRequest - (*GetGithubRepoStatusResponse)(nil), // 103: rill.admin.v1.GetGithubRepoStatusResponse - (*GetGitCredentialsRequest)(nil), // 104: rill.admin.v1.GetGitCredentialsRequest - (*GetGitCredentialsResponse)(nil), // 105: rill.admin.v1.GetGitCredentialsResponse - (*CreateWhitelistedDomainRequest)(nil), // 106: rill.admin.v1.CreateWhitelistedDomainRequest - (*CreateWhitelistedDomainResponse)(nil), // 107: rill.admin.v1.CreateWhitelistedDomainResponse - (*RemoveWhitelistedDomainRequest)(nil), // 108: rill.admin.v1.RemoveWhitelistedDomainRequest - (*RemoveWhitelistedDomainResponse)(nil), // 109: rill.admin.v1.RemoveWhitelistedDomainResponse - (*ListWhitelistedDomainsRequest)(nil), // 110: rill.admin.v1.ListWhitelistedDomainsRequest - (*ListWhitelistedDomainsResponse)(nil), // 111: rill.admin.v1.ListWhitelistedDomainsResponse - (*User)(nil), // 112: rill.admin.v1.User - (*Service)(nil), // 113: rill.admin.v1.Service - (*Organization)(nil), // 114: rill.admin.v1.Organization - (*UserQuotas)(nil), // 115: rill.admin.v1.UserQuotas - (*OrganizationQuotas)(nil), // 116: rill.admin.v1.OrganizationQuotas - (*Project)(nil), // 117: rill.admin.v1.Project - (*Deployment)(nil), // 118: rill.admin.v1.Deployment - (*OrganizationPermissions)(nil), // 119: rill.admin.v1.OrganizationPermissions - (*ProjectPermissions)(nil), // 120: rill.admin.v1.ProjectPermissions - (*Member)(nil), // 121: rill.admin.v1.Member - (*UserInvite)(nil), // 122: rill.admin.v1.UserInvite - (*WhitelistedDomain)(nil), // 123: rill.admin.v1.WhitelistedDomain - (*Bookmark)(nil), // 124: rill.admin.v1.Bookmark - (*ServiceToken)(nil), // 125: rill.admin.v1.ServiceToken - nil, // 126: rill.admin.v1.GetProjectVariablesResponse.VariablesEntry - nil, // 127: rill.admin.v1.CreateProjectRequest.VariablesEntry - nil, // 128: rill.admin.v1.UpdateProjectVariablesRequest.VariablesEntry - nil, // 129: rill.admin.v1.UpdateProjectVariablesResponse.VariablesEntry - (*timestamppb.Timestamp)(nil), // 130: google.protobuf.Timestamp + (*SearchProjectUsersRequest)(nil), // 21: rill.admin.v1.SearchProjectUsersRequest + (*SearchProjectUsersResponse)(nil), // 22: rill.admin.v1.SearchProjectUsersResponse + (*GetDeploymentCredentialsRequest)(nil), // 23: rill.admin.v1.GetDeploymentCredentialsRequest + (*GetDeploymentCredentialsResponse)(nil), // 24: rill.admin.v1.GetDeploymentCredentialsResponse + (*ListServicesRequest)(nil), // 25: rill.admin.v1.ListServicesRequest + (*ListServicesResponse)(nil), // 26: rill.admin.v1.ListServicesResponse + (*CreateServiceRequest)(nil), // 27: rill.admin.v1.CreateServiceRequest + (*CreateServiceResponse)(nil), // 28: rill.admin.v1.CreateServiceResponse + (*UpdateServiceRequest)(nil), // 29: rill.admin.v1.UpdateServiceRequest + (*UpdateServiceResponse)(nil), // 30: rill.admin.v1.UpdateServiceResponse + (*DeleteServiceRequest)(nil), // 31: rill.admin.v1.DeleteServiceRequest + (*DeleteServiceResponse)(nil), // 32: rill.admin.v1.DeleteServiceResponse + (*CreateProjectRequest)(nil), // 33: rill.admin.v1.CreateProjectRequest + (*CreateProjectResponse)(nil), // 34: rill.admin.v1.CreateProjectResponse + (*DeleteProjectRequest)(nil), // 35: rill.admin.v1.DeleteProjectRequest + (*DeleteProjectResponse)(nil), // 36: rill.admin.v1.DeleteProjectResponse + (*UpdateProjectRequest)(nil), // 37: rill.admin.v1.UpdateProjectRequest + (*UpdateProjectResponse)(nil), // 38: rill.admin.v1.UpdateProjectResponse + (*UpdateProjectVariablesRequest)(nil), // 39: rill.admin.v1.UpdateProjectVariablesRequest + (*UpdateProjectVariablesResponse)(nil), // 40: rill.admin.v1.UpdateProjectVariablesResponse + (*TriggerReconcileRequest)(nil), // 41: rill.admin.v1.TriggerReconcileRequest + (*TriggerReconcileResponse)(nil), // 42: rill.admin.v1.TriggerReconcileResponse + (*TriggerRefreshSourcesRequest)(nil), // 43: rill.admin.v1.TriggerRefreshSourcesRequest + (*TriggerRefreshSourcesResponse)(nil), // 44: rill.admin.v1.TriggerRefreshSourcesResponse + (*TriggerRedeployRequest)(nil), // 45: rill.admin.v1.TriggerRedeployRequest + (*TriggerRedeployResponse)(nil), // 46: rill.admin.v1.TriggerRedeployResponse + (*ListOrganizationMembersRequest)(nil), // 47: rill.admin.v1.ListOrganizationMembersRequest + (*ListOrganizationMembersResponse)(nil), // 48: rill.admin.v1.ListOrganizationMembersResponse + (*ListOrganizationInvitesRequest)(nil), // 49: rill.admin.v1.ListOrganizationInvitesRequest + (*ListOrganizationInvitesResponse)(nil), // 50: rill.admin.v1.ListOrganizationInvitesResponse + (*AddOrganizationMemberRequest)(nil), // 51: rill.admin.v1.AddOrganizationMemberRequest + (*AddOrganizationMemberResponse)(nil), // 52: rill.admin.v1.AddOrganizationMemberResponse + (*RemoveOrganizationMemberRequest)(nil), // 53: rill.admin.v1.RemoveOrganizationMemberRequest + (*RemoveOrganizationMemberResponse)(nil), // 54: rill.admin.v1.RemoveOrganizationMemberResponse + (*LeaveOrganizationRequest)(nil), // 55: rill.admin.v1.LeaveOrganizationRequest + (*LeaveOrganizationResponse)(nil), // 56: rill.admin.v1.LeaveOrganizationResponse + (*SetOrganizationMemberRoleRequest)(nil), // 57: rill.admin.v1.SetOrganizationMemberRoleRequest + (*SetOrganizationMemberRoleResponse)(nil), // 58: rill.admin.v1.SetOrganizationMemberRoleResponse + (*ListSuperusersRequest)(nil), // 59: rill.admin.v1.ListSuperusersRequest + (*ListSuperusersResponse)(nil), // 60: rill.admin.v1.ListSuperusersResponse + (*SetSuperuserRequest)(nil), // 61: rill.admin.v1.SetSuperuserRequest + (*SetSuperuserResponse)(nil), // 62: rill.admin.v1.SetSuperuserResponse + (*SudoGetResourceRequest)(nil), // 63: rill.admin.v1.SudoGetResourceRequest + (*SudoGetResourceResponse)(nil), // 64: rill.admin.v1.SudoGetResourceResponse + (*SudoUpdateOrganizationQuotasRequest)(nil), // 65: rill.admin.v1.SudoUpdateOrganizationQuotasRequest + (*SudoUpdateOrganizationQuotasResponse)(nil), // 66: rill.admin.v1.SudoUpdateOrganizationQuotasResponse + (*SudoUpdateUserQuotasRequest)(nil), // 67: rill.admin.v1.SudoUpdateUserQuotasRequest + (*SudoUpdateUserQuotasResponse)(nil), // 68: rill.admin.v1.SudoUpdateUserQuotasResponse + (*ListProjectMembersRequest)(nil), // 69: rill.admin.v1.ListProjectMembersRequest + (*ListProjectMembersResponse)(nil), // 70: rill.admin.v1.ListProjectMembersResponse + (*ListProjectInvitesRequest)(nil), // 71: rill.admin.v1.ListProjectInvitesRequest + (*ListProjectInvitesResponse)(nil), // 72: rill.admin.v1.ListProjectInvitesResponse + (*AddProjectMemberRequest)(nil), // 73: rill.admin.v1.AddProjectMemberRequest + (*AddProjectMemberResponse)(nil), // 74: rill.admin.v1.AddProjectMemberResponse + (*RemoveProjectMemberRequest)(nil), // 75: rill.admin.v1.RemoveProjectMemberRequest + (*RemoveProjectMemberResponse)(nil), // 76: rill.admin.v1.RemoveProjectMemberResponse + (*SetProjectMemberRoleRequest)(nil), // 77: rill.admin.v1.SetProjectMemberRoleRequest + (*SetProjectMemberRoleResponse)(nil), // 78: rill.admin.v1.SetProjectMemberRoleResponse + (*GetCurrentUserRequest)(nil), // 79: rill.admin.v1.GetCurrentUserRequest + (*GetCurrentUserResponse)(nil), // 80: rill.admin.v1.GetCurrentUserResponse + (*GetUserRequest)(nil), // 81: rill.admin.v1.GetUserRequest + (*GetUserResponse)(nil), // 82: rill.admin.v1.GetUserResponse + (*UserPreferences)(nil), // 83: rill.admin.v1.UserPreferences + (*UpdateUserPreferencesRequest)(nil), // 84: rill.admin.v1.UpdateUserPreferencesRequest + (*UpdateUserPreferencesResponse)(nil), // 85: rill.admin.v1.UpdateUserPreferencesResponse + (*ListBookmarksRequest)(nil), // 86: rill.admin.v1.ListBookmarksRequest + (*ListBookmarksResponse)(nil), // 87: rill.admin.v1.ListBookmarksResponse + (*GetBookmarkRequest)(nil), // 88: rill.admin.v1.GetBookmarkRequest + (*GetBookmarkResponse)(nil), // 89: rill.admin.v1.GetBookmarkResponse + (*CreateBookmarkRequest)(nil), // 90: rill.admin.v1.CreateBookmarkRequest + (*CreateBookmarkResponse)(nil), // 91: rill.admin.v1.CreateBookmarkResponse + (*RemoveBookmarkRequest)(nil), // 92: rill.admin.v1.RemoveBookmarkRequest + (*RemoveBookmarkResponse)(nil), // 93: rill.admin.v1.RemoveBookmarkResponse + (*SearchUsersRequest)(nil), // 94: rill.admin.v1.SearchUsersRequest + (*SearchUsersResponse)(nil), // 95: rill.admin.v1.SearchUsersResponse + (*RevokeCurrentAuthTokenRequest)(nil), // 96: rill.admin.v1.RevokeCurrentAuthTokenRequest + (*RevokeCurrentAuthTokenResponse)(nil), // 97: rill.admin.v1.RevokeCurrentAuthTokenResponse + (*IssueRepresentativeAuthTokenRequest)(nil), // 98: rill.admin.v1.IssueRepresentativeAuthTokenRequest + (*IssueRepresentativeAuthTokenResponse)(nil), // 99: rill.admin.v1.IssueRepresentativeAuthTokenResponse + (*RevokeServiceAuthTokenRequest)(nil), // 100: rill.admin.v1.RevokeServiceAuthTokenRequest + (*RevokeServiceAuthTokenResponse)(nil), // 101: rill.admin.v1.RevokeServiceAuthTokenResponse + (*IssueServiceAuthTokenRequest)(nil), // 102: rill.admin.v1.IssueServiceAuthTokenRequest + (*IssueServiceAuthTokenResponse)(nil), // 103: rill.admin.v1.IssueServiceAuthTokenResponse + (*ListServiceAuthTokensRequest)(nil), // 104: rill.admin.v1.ListServiceAuthTokensRequest + (*ListServiceAuthTokensResponse)(nil), // 105: rill.admin.v1.ListServiceAuthTokensResponse + (*GetGithubRepoStatusRequest)(nil), // 106: rill.admin.v1.GetGithubRepoStatusRequest + (*GetGithubRepoStatusResponse)(nil), // 107: rill.admin.v1.GetGithubRepoStatusResponse + (*GetGitCredentialsRequest)(nil), // 108: rill.admin.v1.GetGitCredentialsRequest + (*GetGitCredentialsResponse)(nil), // 109: rill.admin.v1.GetGitCredentialsResponse + (*CreateWhitelistedDomainRequest)(nil), // 110: rill.admin.v1.CreateWhitelistedDomainRequest + (*CreateWhitelistedDomainResponse)(nil), // 111: rill.admin.v1.CreateWhitelistedDomainResponse + (*RemoveWhitelistedDomainRequest)(nil), // 112: rill.admin.v1.RemoveWhitelistedDomainRequest + (*RemoveWhitelistedDomainResponse)(nil), // 113: rill.admin.v1.RemoveWhitelistedDomainResponse + (*ListWhitelistedDomainsRequest)(nil), // 114: rill.admin.v1.ListWhitelistedDomainsRequest + (*ListWhitelistedDomainsResponse)(nil), // 115: rill.admin.v1.ListWhitelistedDomainsResponse + (*User)(nil), // 116: rill.admin.v1.User + (*Service)(nil), // 117: rill.admin.v1.Service + (*Organization)(nil), // 118: rill.admin.v1.Organization + (*UserQuotas)(nil), // 119: rill.admin.v1.UserQuotas + (*OrganizationQuotas)(nil), // 120: rill.admin.v1.OrganizationQuotas + (*Project)(nil), // 121: rill.admin.v1.Project + (*Deployment)(nil), // 122: rill.admin.v1.Deployment + (*OrganizationPermissions)(nil), // 123: rill.admin.v1.OrganizationPermissions + (*ProjectPermissions)(nil), // 124: rill.admin.v1.ProjectPermissions + (*Member)(nil), // 125: rill.admin.v1.Member + (*UserInvite)(nil), // 126: rill.admin.v1.UserInvite + (*WhitelistedDomain)(nil), // 127: rill.admin.v1.WhitelistedDomain + (*Bookmark)(nil), // 128: rill.admin.v1.Bookmark + (*ServiceToken)(nil), // 129: rill.admin.v1.ServiceToken + nil, // 130: rill.admin.v1.GetProjectVariablesResponse.VariablesEntry + nil, // 131: rill.admin.v1.CreateProjectRequest.VariablesEntry + nil, // 132: rill.admin.v1.UpdateProjectVariablesRequest.VariablesEntry + nil, // 133: rill.admin.v1.UpdateProjectVariablesResponse.VariablesEntry + (*timestamppb.Timestamp)(nil), // 134: google.protobuf.Timestamp + (*structpb.Struct)(nil), // 135: google.protobuf.Struct } var file_rill_admin_v1_api_proto_depIdxs = []int32{ - 130, // 0: rill.admin.v1.PingResponse.time:type_name -> google.protobuf.Timestamp - 114, // 1: rill.admin.v1.ListOrganizationsResponse.organizations:type_name -> rill.admin.v1.Organization - 114, // 2: rill.admin.v1.GetOrganizationResponse.organization:type_name -> rill.admin.v1.Organization - 119, // 3: rill.admin.v1.GetOrganizationResponse.permissions:type_name -> rill.admin.v1.OrganizationPermissions - 114, // 4: rill.admin.v1.CreateOrganizationResponse.organization:type_name -> rill.admin.v1.Organization - 114, // 5: rill.admin.v1.UpdateOrganizationResponse.organization:type_name -> rill.admin.v1.Organization - 117, // 6: rill.admin.v1.ListProjectsForOrganizationResponse.projects:type_name -> rill.admin.v1.Project - 117, // 7: rill.admin.v1.GetProjectResponse.project:type_name -> rill.admin.v1.Project - 118, // 8: rill.admin.v1.GetProjectResponse.prod_deployment:type_name -> rill.admin.v1.Deployment - 120, // 9: rill.admin.v1.GetProjectResponse.project_permissions:type_name -> rill.admin.v1.ProjectPermissions - 126, // 10: rill.admin.v1.GetProjectVariablesResponse.variables:type_name -> rill.admin.v1.GetProjectVariablesResponse.VariablesEntry - 113, // 11: rill.admin.v1.ListServicesResponse.services:type_name -> rill.admin.v1.Service - 113, // 12: rill.admin.v1.CreateServiceResponse.service:type_name -> rill.admin.v1.Service - 113, // 13: rill.admin.v1.UpdateServiceResponse.service:type_name -> rill.admin.v1.Service - 113, // 14: rill.admin.v1.DeleteServiceResponse.service:type_name -> rill.admin.v1.Service - 127, // 15: rill.admin.v1.CreateProjectRequest.variables:type_name -> rill.admin.v1.CreateProjectRequest.VariablesEntry - 117, // 16: rill.admin.v1.CreateProjectResponse.project:type_name -> rill.admin.v1.Project - 117, // 17: rill.admin.v1.UpdateProjectResponse.project:type_name -> rill.admin.v1.Project - 128, // 18: rill.admin.v1.UpdateProjectVariablesRequest.variables:type_name -> rill.admin.v1.UpdateProjectVariablesRequest.VariablesEntry - 129, // 19: rill.admin.v1.UpdateProjectVariablesResponse.variables:type_name -> rill.admin.v1.UpdateProjectVariablesResponse.VariablesEntry - 121, // 20: rill.admin.v1.ListOrganizationMembersResponse.members:type_name -> rill.admin.v1.Member - 122, // 21: rill.admin.v1.ListOrganizationInvitesResponse.invites:type_name -> rill.admin.v1.UserInvite - 112, // 22: rill.admin.v1.ListSuperusersResponse.users:type_name -> rill.admin.v1.User - 112, // 23: rill.admin.v1.SudoGetResourceResponse.user:type_name -> rill.admin.v1.User - 114, // 24: rill.admin.v1.SudoGetResourceResponse.org:type_name -> rill.admin.v1.Organization - 117, // 25: rill.admin.v1.SudoGetResourceResponse.project:type_name -> rill.admin.v1.Project - 118, // 26: rill.admin.v1.SudoGetResourceResponse.deployment:type_name -> rill.admin.v1.Deployment - 118, // 27: rill.admin.v1.SudoGetResourceResponse.instance:type_name -> rill.admin.v1.Deployment - 114, // 28: rill.admin.v1.SudoUpdateOrganizationQuotasResponse.organization:type_name -> rill.admin.v1.Organization - 112, // 29: rill.admin.v1.SudoUpdateUserQuotasResponse.user:type_name -> rill.admin.v1.User - 121, // 30: rill.admin.v1.ListProjectMembersResponse.members:type_name -> rill.admin.v1.Member - 122, // 31: rill.admin.v1.ListProjectInvitesResponse.invites:type_name -> rill.admin.v1.UserInvite - 112, // 32: rill.admin.v1.GetCurrentUserResponse.user:type_name -> rill.admin.v1.User - 79, // 33: rill.admin.v1.GetCurrentUserResponse.preferences:type_name -> rill.admin.v1.UserPreferences - 112, // 34: rill.admin.v1.GetUserResponse.user:type_name -> rill.admin.v1.User - 79, // 35: rill.admin.v1.UpdateUserPreferencesRequest.preferences:type_name -> rill.admin.v1.UserPreferences - 79, // 36: rill.admin.v1.UpdateUserPreferencesResponse.preferences:type_name -> rill.admin.v1.UserPreferences - 124, // 37: rill.admin.v1.ListBookmarksResponse.bookmarks:type_name -> rill.admin.v1.Bookmark - 124, // 38: rill.admin.v1.GetBookmarkResponse.bookmark:type_name -> rill.admin.v1.Bookmark - 124, // 39: rill.admin.v1.CreateBookmarkResponse.bookmark:type_name -> rill.admin.v1.Bookmark - 112, // 40: rill.admin.v1.SearchUsersResponse.users:type_name -> rill.admin.v1.User - 125, // 41: rill.admin.v1.ListServiceAuthTokensResponse.tokens:type_name -> rill.admin.v1.ServiceToken - 123, // 42: rill.admin.v1.ListWhitelistedDomainsResponse.domains:type_name -> rill.admin.v1.WhitelistedDomain - 115, // 43: rill.admin.v1.User.quotas:type_name -> rill.admin.v1.UserQuotas - 130, // 44: rill.admin.v1.User.created_on:type_name -> google.protobuf.Timestamp - 130, // 45: rill.admin.v1.User.updated_on:type_name -> google.protobuf.Timestamp - 130, // 46: rill.admin.v1.Service.created_on:type_name -> google.protobuf.Timestamp - 130, // 47: rill.admin.v1.Service.updated_on:type_name -> google.protobuf.Timestamp - 116, // 48: rill.admin.v1.Organization.quotas:type_name -> rill.admin.v1.OrganizationQuotas - 130, // 49: rill.admin.v1.Organization.created_on:type_name -> google.protobuf.Timestamp - 130, // 50: rill.admin.v1.Organization.updated_on:type_name -> google.protobuf.Timestamp - 130, // 51: rill.admin.v1.Project.created_on:type_name -> google.protobuf.Timestamp - 130, // 52: rill.admin.v1.Project.updated_on:type_name -> google.protobuf.Timestamp - 0, // 53: rill.admin.v1.Deployment.status:type_name -> rill.admin.v1.DeploymentStatus - 130, // 54: rill.admin.v1.Deployment.created_on:type_name -> google.protobuf.Timestamp - 130, // 55: rill.admin.v1.Deployment.updated_on:type_name -> google.protobuf.Timestamp - 130, // 56: rill.admin.v1.Member.created_on:type_name -> google.protobuf.Timestamp - 130, // 57: rill.admin.v1.Member.updated_on:type_name -> google.protobuf.Timestamp - 130, // 58: rill.admin.v1.Bookmark.created_on:type_name -> google.protobuf.Timestamp - 130, // 59: rill.admin.v1.Bookmark.updated_on:type_name -> google.protobuf.Timestamp - 130, // 60: rill.admin.v1.ServiceToken.created_on:type_name -> google.protobuf.Timestamp - 130, // 61: rill.admin.v1.ServiceToken.expires_on:type_name -> google.protobuf.Timestamp - 1, // 62: rill.admin.v1.AdminService.Ping:input_type -> rill.admin.v1.PingRequest - 3, // 63: rill.admin.v1.AdminService.ListOrganizations:input_type -> rill.admin.v1.ListOrganizationsRequest - 5, // 64: rill.admin.v1.AdminService.GetOrganization:input_type -> rill.admin.v1.GetOrganizationRequest - 7, // 65: rill.admin.v1.AdminService.CreateOrganization:input_type -> rill.admin.v1.CreateOrganizationRequest - 9, // 66: rill.admin.v1.AdminService.DeleteOrganization:input_type -> rill.admin.v1.DeleteOrganizationRequest - 11, // 67: rill.admin.v1.AdminService.UpdateOrganization:input_type -> rill.admin.v1.UpdateOrganizationRequest - 13, // 68: rill.admin.v1.AdminService.ListProjectsForOrganization:input_type -> rill.admin.v1.ListProjectsForOrganizationRequest - 15, // 69: rill.admin.v1.AdminService.GetProject:input_type -> rill.admin.v1.GetProjectRequest - 17, // 70: rill.admin.v1.AdminService.SearchProjectNames:input_type -> rill.admin.v1.SearchProjectNamesRequest - 19, // 71: rill.admin.v1.AdminService.GetProjectVariables:input_type -> rill.admin.v1.GetProjectVariablesRequest - 29, // 72: rill.admin.v1.AdminService.CreateProject:input_type -> rill.admin.v1.CreateProjectRequest - 31, // 73: rill.admin.v1.AdminService.DeleteProject:input_type -> rill.admin.v1.DeleteProjectRequest - 33, // 74: rill.admin.v1.AdminService.UpdateProject:input_type -> rill.admin.v1.UpdateProjectRequest - 35, // 75: rill.admin.v1.AdminService.UpdateProjectVariables:input_type -> rill.admin.v1.UpdateProjectVariablesRequest - 37, // 76: rill.admin.v1.AdminService.TriggerReconcile:input_type -> rill.admin.v1.TriggerReconcileRequest - 39, // 77: rill.admin.v1.AdminService.TriggerRefreshSources:input_type -> rill.admin.v1.TriggerRefreshSourcesRequest - 41, // 78: rill.admin.v1.AdminService.TriggerRedeploy:input_type -> rill.admin.v1.TriggerRedeployRequest - 43, // 79: rill.admin.v1.AdminService.ListOrganizationMembers:input_type -> rill.admin.v1.ListOrganizationMembersRequest - 45, // 80: rill.admin.v1.AdminService.ListOrganizationInvites:input_type -> rill.admin.v1.ListOrganizationInvitesRequest - 47, // 81: rill.admin.v1.AdminService.AddOrganizationMember:input_type -> rill.admin.v1.AddOrganizationMemberRequest - 49, // 82: rill.admin.v1.AdminService.RemoveOrganizationMember:input_type -> rill.admin.v1.RemoveOrganizationMemberRequest - 51, // 83: rill.admin.v1.AdminService.LeaveOrganization:input_type -> rill.admin.v1.LeaveOrganizationRequest - 53, // 84: rill.admin.v1.AdminService.SetOrganizationMemberRole:input_type -> rill.admin.v1.SetOrganizationMemberRoleRequest - 65, // 85: rill.admin.v1.AdminService.ListProjectMembers:input_type -> rill.admin.v1.ListProjectMembersRequest - 67, // 86: rill.admin.v1.AdminService.ListProjectInvites:input_type -> rill.admin.v1.ListProjectInvitesRequest - 69, // 87: rill.admin.v1.AdminService.AddProjectMember:input_type -> rill.admin.v1.AddProjectMemberRequest - 71, // 88: rill.admin.v1.AdminService.RemoveProjectMember:input_type -> rill.admin.v1.RemoveProjectMemberRequest - 73, // 89: rill.admin.v1.AdminService.SetProjectMemberRole:input_type -> rill.admin.v1.SetProjectMemberRoleRequest - 75, // 90: rill.admin.v1.AdminService.GetCurrentUser:input_type -> rill.admin.v1.GetCurrentUserRequest - 94, // 91: rill.admin.v1.AdminService.IssueRepresentativeAuthToken:input_type -> rill.admin.v1.IssueRepresentativeAuthTokenRequest - 92, // 92: rill.admin.v1.AdminService.RevokeCurrentAuthToken:input_type -> rill.admin.v1.RevokeCurrentAuthTokenRequest - 102, // 93: rill.admin.v1.AdminService.GetGithubRepoStatus:input_type -> rill.admin.v1.GetGithubRepoStatusRequest - 104, // 94: rill.admin.v1.AdminService.GetGitCredentials:input_type -> rill.admin.v1.GetGitCredentialsRequest - 106, // 95: rill.admin.v1.AdminService.CreateWhitelistedDomain:input_type -> rill.admin.v1.CreateWhitelistedDomainRequest - 108, // 96: rill.admin.v1.AdminService.RemoveWhitelistedDomain:input_type -> rill.admin.v1.RemoveWhitelistedDomainRequest - 110, // 97: rill.admin.v1.AdminService.ListWhitelistedDomains:input_type -> rill.admin.v1.ListWhitelistedDomainsRequest - 77, // 98: rill.admin.v1.AdminService.GetUser:input_type -> rill.admin.v1.GetUserRequest - 90, // 99: rill.admin.v1.AdminService.SearchUsers:input_type -> rill.admin.v1.SearchUsersRequest - 55, // 100: rill.admin.v1.AdminService.ListSuperusers:input_type -> rill.admin.v1.ListSuperusersRequest - 57, // 101: rill.admin.v1.AdminService.SetSuperuser:input_type -> rill.admin.v1.SetSuperuserRequest - 59, // 102: rill.admin.v1.AdminService.SudoGetResource:input_type -> rill.admin.v1.SudoGetResourceRequest - 63, // 103: rill.admin.v1.AdminService.SudoUpdateUserQuotas:input_type -> rill.admin.v1.SudoUpdateUserQuotasRequest - 61, // 104: rill.admin.v1.AdminService.SudoUpdateOrganizationQuotas:input_type -> rill.admin.v1.SudoUpdateOrganizationQuotasRequest - 21, // 105: rill.admin.v1.AdminService.ListServices:input_type -> rill.admin.v1.ListServicesRequest - 23, // 106: rill.admin.v1.AdminService.CreateService:input_type -> rill.admin.v1.CreateServiceRequest - 25, // 107: rill.admin.v1.AdminService.UpdateService:input_type -> rill.admin.v1.UpdateServiceRequest - 27, // 108: rill.admin.v1.AdminService.DeleteService:input_type -> rill.admin.v1.DeleteServiceRequest - 100, // 109: rill.admin.v1.AdminService.ListServiceAuthTokens:input_type -> rill.admin.v1.ListServiceAuthTokensRequest - 98, // 110: rill.admin.v1.AdminService.IssueServiceAuthToken:input_type -> rill.admin.v1.IssueServiceAuthTokenRequest - 96, // 111: rill.admin.v1.AdminService.RevokeServiceAuthToken:input_type -> rill.admin.v1.RevokeServiceAuthTokenRequest - 80, // 112: rill.admin.v1.AdminService.UpdateUserPreferences:input_type -> rill.admin.v1.UpdateUserPreferencesRequest - 82, // 113: rill.admin.v1.AdminService.ListBookmarks:input_type -> rill.admin.v1.ListBookmarksRequest - 84, // 114: rill.admin.v1.AdminService.GetBookmark:input_type -> rill.admin.v1.GetBookmarkRequest - 86, // 115: rill.admin.v1.AdminService.CreateBookmark:input_type -> rill.admin.v1.CreateBookmarkRequest - 88, // 116: rill.admin.v1.AdminService.RemoveBookmark:input_type -> rill.admin.v1.RemoveBookmarkRequest - 2, // 117: rill.admin.v1.AdminService.Ping:output_type -> rill.admin.v1.PingResponse - 4, // 118: rill.admin.v1.AdminService.ListOrganizations:output_type -> rill.admin.v1.ListOrganizationsResponse - 6, // 119: rill.admin.v1.AdminService.GetOrganization:output_type -> rill.admin.v1.GetOrganizationResponse - 8, // 120: rill.admin.v1.AdminService.CreateOrganization:output_type -> rill.admin.v1.CreateOrganizationResponse - 10, // 121: rill.admin.v1.AdminService.DeleteOrganization:output_type -> rill.admin.v1.DeleteOrganizationResponse - 12, // 122: rill.admin.v1.AdminService.UpdateOrganization:output_type -> rill.admin.v1.UpdateOrganizationResponse - 14, // 123: rill.admin.v1.AdminService.ListProjectsForOrganization:output_type -> rill.admin.v1.ListProjectsForOrganizationResponse - 16, // 124: rill.admin.v1.AdminService.GetProject:output_type -> rill.admin.v1.GetProjectResponse - 18, // 125: rill.admin.v1.AdminService.SearchProjectNames:output_type -> rill.admin.v1.SearchProjectNamesResponse - 20, // 126: rill.admin.v1.AdminService.GetProjectVariables:output_type -> rill.admin.v1.GetProjectVariablesResponse - 30, // 127: rill.admin.v1.AdminService.CreateProject:output_type -> rill.admin.v1.CreateProjectResponse - 32, // 128: rill.admin.v1.AdminService.DeleteProject:output_type -> rill.admin.v1.DeleteProjectResponse - 34, // 129: rill.admin.v1.AdminService.UpdateProject:output_type -> rill.admin.v1.UpdateProjectResponse - 36, // 130: rill.admin.v1.AdminService.UpdateProjectVariables:output_type -> rill.admin.v1.UpdateProjectVariablesResponse - 38, // 131: rill.admin.v1.AdminService.TriggerReconcile:output_type -> rill.admin.v1.TriggerReconcileResponse - 40, // 132: rill.admin.v1.AdminService.TriggerRefreshSources:output_type -> rill.admin.v1.TriggerRefreshSourcesResponse - 42, // 133: rill.admin.v1.AdminService.TriggerRedeploy:output_type -> rill.admin.v1.TriggerRedeployResponse - 44, // 134: rill.admin.v1.AdminService.ListOrganizationMembers:output_type -> rill.admin.v1.ListOrganizationMembersResponse - 46, // 135: rill.admin.v1.AdminService.ListOrganizationInvites:output_type -> rill.admin.v1.ListOrganizationInvitesResponse - 48, // 136: rill.admin.v1.AdminService.AddOrganizationMember:output_type -> rill.admin.v1.AddOrganizationMemberResponse - 50, // 137: rill.admin.v1.AdminService.RemoveOrganizationMember:output_type -> rill.admin.v1.RemoveOrganizationMemberResponse - 52, // 138: rill.admin.v1.AdminService.LeaveOrganization:output_type -> rill.admin.v1.LeaveOrganizationResponse - 54, // 139: rill.admin.v1.AdminService.SetOrganizationMemberRole:output_type -> rill.admin.v1.SetOrganizationMemberRoleResponse - 66, // 140: rill.admin.v1.AdminService.ListProjectMembers:output_type -> rill.admin.v1.ListProjectMembersResponse - 68, // 141: rill.admin.v1.AdminService.ListProjectInvites:output_type -> rill.admin.v1.ListProjectInvitesResponse - 70, // 142: rill.admin.v1.AdminService.AddProjectMember:output_type -> rill.admin.v1.AddProjectMemberResponse - 72, // 143: rill.admin.v1.AdminService.RemoveProjectMember:output_type -> rill.admin.v1.RemoveProjectMemberResponse - 74, // 144: rill.admin.v1.AdminService.SetProjectMemberRole:output_type -> rill.admin.v1.SetProjectMemberRoleResponse - 76, // 145: rill.admin.v1.AdminService.GetCurrentUser:output_type -> rill.admin.v1.GetCurrentUserResponse - 95, // 146: rill.admin.v1.AdminService.IssueRepresentativeAuthToken:output_type -> rill.admin.v1.IssueRepresentativeAuthTokenResponse - 93, // 147: rill.admin.v1.AdminService.RevokeCurrentAuthToken:output_type -> rill.admin.v1.RevokeCurrentAuthTokenResponse - 103, // 148: rill.admin.v1.AdminService.GetGithubRepoStatus:output_type -> rill.admin.v1.GetGithubRepoStatusResponse - 105, // 149: rill.admin.v1.AdminService.GetGitCredentials:output_type -> rill.admin.v1.GetGitCredentialsResponse - 107, // 150: rill.admin.v1.AdminService.CreateWhitelistedDomain:output_type -> rill.admin.v1.CreateWhitelistedDomainResponse - 109, // 151: rill.admin.v1.AdminService.RemoveWhitelistedDomain:output_type -> rill.admin.v1.RemoveWhitelistedDomainResponse - 111, // 152: rill.admin.v1.AdminService.ListWhitelistedDomains:output_type -> rill.admin.v1.ListWhitelistedDomainsResponse - 78, // 153: rill.admin.v1.AdminService.GetUser:output_type -> rill.admin.v1.GetUserResponse - 91, // 154: rill.admin.v1.AdminService.SearchUsers:output_type -> rill.admin.v1.SearchUsersResponse - 56, // 155: rill.admin.v1.AdminService.ListSuperusers:output_type -> rill.admin.v1.ListSuperusersResponse - 58, // 156: rill.admin.v1.AdminService.SetSuperuser:output_type -> rill.admin.v1.SetSuperuserResponse - 60, // 157: rill.admin.v1.AdminService.SudoGetResource:output_type -> rill.admin.v1.SudoGetResourceResponse - 64, // 158: rill.admin.v1.AdminService.SudoUpdateUserQuotas:output_type -> rill.admin.v1.SudoUpdateUserQuotasResponse - 62, // 159: rill.admin.v1.AdminService.SudoUpdateOrganizationQuotas:output_type -> rill.admin.v1.SudoUpdateOrganizationQuotasResponse - 22, // 160: rill.admin.v1.AdminService.ListServices:output_type -> rill.admin.v1.ListServicesResponse - 24, // 161: rill.admin.v1.AdminService.CreateService:output_type -> rill.admin.v1.CreateServiceResponse - 26, // 162: rill.admin.v1.AdminService.UpdateService:output_type -> rill.admin.v1.UpdateServiceResponse - 28, // 163: rill.admin.v1.AdminService.DeleteService:output_type -> rill.admin.v1.DeleteServiceResponse - 101, // 164: rill.admin.v1.AdminService.ListServiceAuthTokens:output_type -> rill.admin.v1.ListServiceAuthTokensResponse - 99, // 165: rill.admin.v1.AdminService.IssueServiceAuthToken:output_type -> rill.admin.v1.IssueServiceAuthTokenResponse - 97, // 166: rill.admin.v1.AdminService.RevokeServiceAuthToken:output_type -> rill.admin.v1.RevokeServiceAuthTokenResponse - 81, // 167: rill.admin.v1.AdminService.UpdateUserPreferences:output_type -> rill.admin.v1.UpdateUserPreferencesResponse - 83, // 168: rill.admin.v1.AdminService.ListBookmarks:output_type -> rill.admin.v1.ListBookmarksResponse - 85, // 169: rill.admin.v1.AdminService.GetBookmark:output_type -> rill.admin.v1.GetBookmarkResponse - 87, // 170: rill.admin.v1.AdminService.CreateBookmark:output_type -> rill.admin.v1.CreateBookmarkResponse - 89, // 171: rill.admin.v1.AdminService.RemoveBookmark:output_type -> rill.admin.v1.RemoveBookmarkResponse - 117, // [117:172] is the sub-list for method output_type - 62, // [62:117] is the sub-list for method input_type - 62, // [62:62] is the sub-list for extension type_name - 62, // [62:62] is the sub-list for extension extendee - 0, // [0:62] is the sub-list for field type_name + 134, // 0: rill.admin.v1.PingResponse.time:type_name -> google.protobuf.Timestamp + 118, // 1: rill.admin.v1.ListOrganizationsResponse.organizations:type_name -> rill.admin.v1.Organization + 118, // 2: rill.admin.v1.GetOrganizationResponse.organization:type_name -> rill.admin.v1.Organization + 123, // 3: rill.admin.v1.GetOrganizationResponse.permissions:type_name -> rill.admin.v1.OrganizationPermissions + 118, // 4: rill.admin.v1.CreateOrganizationResponse.organization:type_name -> rill.admin.v1.Organization + 118, // 5: rill.admin.v1.UpdateOrganizationResponse.organization:type_name -> rill.admin.v1.Organization + 121, // 6: rill.admin.v1.ListProjectsForOrganizationResponse.projects:type_name -> rill.admin.v1.Project + 121, // 7: rill.admin.v1.GetProjectResponse.project:type_name -> rill.admin.v1.Project + 122, // 8: rill.admin.v1.GetProjectResponse.prod_deployment:type_name -> rill.admin.v1.Deployment + 124, // 9: rill.admin.v1.GetProjectResponse.project_permissions:type_name -> rill.admin.v1.ProjectPermissions + 130, // 10: rill.admin.v1.GetProjectVariablesResponse.variables:type_name -> rill.admin.v1.GetProjectVariablesResponse.VariablesEntry + 116, // 11: rill.admin.v1.SearchProjectUsersResponse.users:type_name -> rill.admin.v1.User + 135, // 12: rill.admin.v1.GetDeploymentCredentialsRequest.attrs:type_name -> google.protobuf.Struct + 117, // 13: rill.admin.v1.ListServicesResponse.services:type_name -> rill.admin.v1.Service + 117, // 14: rill.admin.v1.CreateServiceResponse.service:type_name -> rill.admin.v1.Service + 117, // 15: rill.admin.v1.UpdateServiceResponse.service:type_name -> rill.admin.v1.Service + 117, // 16: rill.admin.v1.DeleteServiceResponse.service:type_name -> rill.admin.v1.Service + 131, // 17: rill.admin.v1.CreateProjectRequest.variables:type_name -> rill.admin.v1.CreateProjectRequest.VariablesEntry + 121, // 18: rill.admin.v1.CreateProjectResponse.project:type_name -> rill.admin.v1.Project + 121, // 19: rill.admin.v1.UpdateProjectResponse.project:type_name -> rill.admin.v1.Project + 132, // 20: rill.admin.v1.UpdateProjectVariablesRequest.variables:type_name -> rill.admin.v1.UpdateProjectVariablesRequest.VariablesEntry + 133, // 21: rill.admin.v1.UpdateProjectVariablesResponse.variables:type_name -> rill.admin.v1.UpdateProjectVariablesResponse.VariablesEntry + 125, // 22: rill.admin.v1.ListOrganizationMembersResponse.members:type_name -> rill.admin.v1.Member + 126, // 23: rill.admin.v1.ListOrganizationInvitesResponse.invites:type_name -> rill.admin.v1.UserInvite + 116, // 24: rill.admin.v1.ListSuperusersResponse.users:type_name -> rill.admin.v1.User + 116, // 25: rill.admin.v1.SudoGetResourceResponse.user:type_name -> rill.admin.v1.User + 118, // 26: rill.admin.v1.SudoGetResourceResponse.org:type_name -> rill.admin.v1.Organization + 121, // 27: rill.admin.v1.SudoGetResourceResponse.project:type_name -> rill.admin.v1.Project + 122, // 28: rill.admin.v1.SudoGetResourceResponse.deployment:type_name -> rill.admin.v1.Deployment + 122, // 29: rill.admin.v1.SudoGetResourceResponse.instance:type_name -> rill.admin.v1.Deployment + 118, // 30: rill.admin.v1.SudoUpdateOrganizationQuotasResponse.organization:type_name -> rill.admin.v1.Organization + 116, // 31: rill.admin.v1.SudoUpdateUserQuotasResponse.user:type_name -> rill.admin.v1.User + 125, // 32: rill.admin.v1.ListProjectMembersResponse.members:type_name -> rill.admin.v1.Member + 126, // 33: rill.admin.v1.ListProjectInvitesResponse.invites:type_name -> rill.admin.v1.UserInvite + 116, // 34: rill.admin.v1.GetCurrentUserResponse.user:type_name -> rill.admin.v1.User + 83, // 35: rill.admin.v1.GetCurrentUserResponse.preferences:type_name -> rill.admin.v1.UserPreferences + 116, // 36: rill.admin.v1.GetUserResponse.user:type_name -> rill.admin.v1.User + 83, // 37: rill.admin.v1.UpdateUserPreferencesRequest.preferences:type_name -> rill.admin.v1.UserPreferences + 83, // 38: rill.admin.v1.UpdateUserPreferencesResponse.preferences:type_name -> rill.admin.v1.UserPreferences + 128, // 39: rill.admin.v1.ListBookmarksResponse.bookmarks:type_name -> rill.admin.v1.Bookmark + 128, // 40: rill.admin.v1.GetBookmarkResponse.bookmark:type_name -> rill.admin.v1.Bookmark + 128, // 41: rill.admin.v1.CreateBookmarkResponse.bookmark:type_name -> rill.admin.v1.Bookmark + 116, // 42: rill.admin.v1.SearchUsersResponse.users:type_name -> rill.admin.v1.User + 129, // 43: rill.admin.v1.ListServiceAuthTokensResponse.tokens:type_name -> rill.admin.v1.ServiceToken + 127, // 44: rill.admin.v1.ListWhitelistedDomainsResponse.domains:type_name -> rill.admin.v1.WhitelistedDomain + 119, // 45: rill.admin.v1.User.quotas:type_name -> rill.admin.v1.UserQuotas + 134, // 46: rill.admin.v1.User.created_on:type_name -> google.protobuf.Timestamp + 134, // 47: rill.admin.v1.User.updated_on:type_name -> google.protobuf.Timestamp + 134, // 48: rill.admin.v1.Service.created_on:type_name -> google.protobuf.Timestamp + 134, // 49: rill.admin.v1.Service.updated_on:type_name -> google.protobuf.Timestamp + 120, // 50: rill.admin.v1.Organization.quotas:type_name -> rill.admin.v1.OrganizationQuotas + 134, // 51: rill.admin.v1.Organization.created_on:type_name -> google.protobuf.Timestamp + 134, // 52: rill.admin.v1.Organization.updated_on:type_name -> google.protobuf.Timestamp + 134, // 53: rill.admin.v1.Project.created_on:type_name -> google.protobuf.Timestamp + 134, // 54: rill.admin.v1.Project.updated_on:type_name -> google.protobuf.Timestamp + 0, // 55: rill.admin.v1.Deployment.status:type_name -> rill.admin.v1.DeploymentStatus + 134, // 56: rill.admin.v1.Deployment.created_on:type_name -> google.protobuf.Timestamp + 134, // 57: rill.admin.v1.Deployment.updated_on:type_name -> google.protobuf.Timestamp + 134, // 58: rill.admin.v1.Member.created_on:type_name -> google.protobuf.Timestamp + 134, // 59: rill.admin.v1.Member.updated_on:type_name -> google.protobuf.Timestamp + 134, // 60: rill.admin.v1.Bookmark.created_on:type_name -> google.protobuf.Timestamp + 134, // 61: rill.admin.v1.Bookmark.updated_on:type_name -> google.protobuf.Timestamp + 134, // 62: rill.admin.v1.ServiceToken.created_on:type_name -> google.protobuf.Timestamp + 134, // 63: rill.admin.v1.ServiceToken.expires_on:type_name -> google.protobuf.Timestamp + 1, // 64: rill.admin.v1.AdminService.Ping:input_type -> rill.admin.v1.PingRequest + 3, // 65: rill.admin.v1.AdminService.ListOrganizations:input_type -> rill.admin.v1.ListOrganizationsRequest + 5, // 66: rill.admin.v1.AdminService.GetOrganization:input_type -> rill.admin.v1.GetOrganizationRequest + 7, // 67: rill.admin.v1.AdminService.CreateOrganization:input_type -> rill.admin.v1.CreateOrganizationRequest + 9, // 68: rill.admin.v1.AdminService.DeleteOrganization:input_type -> rill.admin.v1.DeleteOrganizationRequest + 11, // 69: rill.admin.v1.AdminService.UpdateOrganization:input_type -> rill.admin.v1.UpdateOrganizationRequest + 13, // 70: rill.admin.v1.AdminService.ListProjectsForOrganization:input_type -> rill.admin.v1.ListProjectsForOrganizationRequest + 15, // 71: rill.admin.v1.AdminService.GetProject:input_type -> rill.admin.v1.GetProjectRequest + 17, // 72: rill.admin.v1.AdminService.SearchProjectNames:input_type -> rill.admin.v1.SearchProjectNamesRequest + 19, // 73: rill.admin.v1.AdminService.GetProjectVariables:input_type -> rill.admin.v1.GetProjectVariablesRequest + 33, // 74: rill.admin.v1.AdminService.CreateProject:input_type -> rill.admin.v1.CreateProjectRequest + 35, // 75: rill.admin.v1.AdminService.DeleteProject:input_type -> rill.admin.v1.DeleteProjectRequest + 37, // 76: rill.admin.v1.AdminService.UpdateProject:input_type -> rill.admin.v1.UpdateProjectRequest + 39, // 77: rill.admin.v1.AdminService.UpdateProjectVariables:input_type -> rill.admin.v1.UpdateProjectVariablesRequest + 41, // 78: rill.admin.v1.AdminService.TriggerReconcile:input_type -> rill.admin.v1.TriggerReconcileRequest + 43, // 79: rill.admin.v1.AdminService.TriggerRefreshSources:input_type -> rill.admin.v1.TriggerRefreshSourcesRequest + 45, // 80: rill.admin.v1.AdminService.TriggerRedeploy:input_type -> rill.admin.v1.TriggerRedeployRequest + 47, // 81: rill.admin.v1.AdminService.ListOrganizationMembers:input_type -> rill.admin.v1.ListOrganizationMembersRequest + 49, // 82: rill.admin.v1.AdminService.ListOrganizationInvites:input_type -> rill.admin.v1.ListOrganizationInvitesRequest + 51, // 83: rill.admin.v1.AdminService.AddOrganizationMember:input_type -> rill.admin.v1.AddOrganizationMemberRequest + 53, // 84: rill.admin.v1.AdminService.RemoveOrganizationMember:input_type -> rill.admin.v1.RemoveOrganizationMemberRequest + 55, // 85: rill.admin.v1.AdminService.LeaveOrganization:input_type -> rill.admin.v1.LeaveOrganizationRequest + 57, // 86: rill.admin.v1.AdminService.SetOrganizationMemberRole:input_type -> rill.admin.v1.SetOrganizationMemberRoleRequest + 69, // 87: rill.admin.v1.AdminService.ListProjectMembers:input_type -> rill.admin.v1.ListProjectMembersRequest + 71, // 88: rill.admin.v1.AdminService.ListProjectInvites:input_type -> rill.admin.v1.ListProjectInvitesRequest + 73, // 89: rill.admin.v1.AdminService.AddProjectMember:input_type -> rill.admin.v1.AddProjectMemberRequest + 75, // 90: rill.admin.v1.AdminService.RemoveProjectMember:input_type -> rill.admin.v1.RemoveProjectMemberRequest + 77, // 91: rill.admin.v1.AdminService.SetProjectMemberRole:input_type -> rill.admin.v1.SetProjectMemberRoleRequest + 79, // 92: rill.admin.v1.AdminService.GetCurrentUser:input_type -> rill.admin.v1.GetCurrentUserRequest + 98, // 93: rill.admin.v1.AdminService.IssueRepresentativeAuthToken:input_type -> rill.admin.v1.IssueRepresentativeAuthTokenRequest + 96, // 94: rill.admin.v1.AdminService.RevokeCurrentAuthToken:input_type -> rill.admin.v1.RevokeCurrentAuthTokenRequest + 106, // 95: rill.admin.v1.AdminService.GetGithubRepoStatus:input_type -> rill.admin.v1.GetGithubRepoStatusRequest + 108, // 96: rill.admin.v1.AdminService.GetGitCredentials:input_type -> rill.admin.v1.GetGitCredentialsRequest + 110, // 97: rill.admin.v1.AdminService.CreateWhitelistedDomain:input_type -> rill.admin.v1.CreateWhitelistedDomainRequest + 112, // 98: rill.admin.v1.AdminService.RemoveWhitelistedDomain:input_type -> rill.admin.v1.RemoveWhitelistedDomainRequest + 114, // 99: rill.admin.v1.AdminService.ListWhitelistedDomains:input_type -> rill.admin.v1.ListWhitelistedDomainsRequest + 81, // 100: rill.admin.v1.AdminService.GetUser:input_type -> rill.admin.v1.GetUserRequest + 94, // 101: rill.admin.v1.AdminService.SearchUsers:input_type -> rill.admin.v1.SearchUsersRequest + 21, // 102: rill.admin.v1.AdminService.SearchProjectUsers:input_type -> rill.admin.v1.SearchProjectUsersRequest + 59, // 103: rill.admin.v1.AdminService.ListSuperusers:input_type -> rill.admin.v1.ListSuperusersRequest + 23, // 104: rill.admin.v1.AdminService.GetDeploymentCredentials:input_type -> rill.admin.v1.GetDeploymentCredentialsRequest + 61, // 105: rill.admin.v1.AdminService.SetSuperuser:input_type -> rill.admin.v1.SetSuperuserRequest + 63, // 106: rill.admin.v1.AdminService.SudoGetResource:input_type -> rill.admin.v1.SudoGetResourceRequest + 67, // 107: rill.admin.v1.AdminService.SudoUpdateUserQuotas:input_type -> rill.admin.v1.SudoUpdateUserQuotasRequest + 65, // 108: rill.admin.v1.AdminService.SudoUpdateOrganizationQuotas:input_type -> rill.admin.v1.SudoUpdateOrganizationQuotasRequest + 25, // 109: rill.admin.v1.AdminService.ListServices:input_type -> rill.admin.v1.ListServicesRequest + 27, // 110: rill.admin.v1.AdminService.CreateService:input_type -> rill.admin.v1.CreateServiceRequest + 29, // 111: rill.admin.v1.AdminService.UpdateService:input_type -> rill.admin.v1.UpdateServiceRequest + 31, // 112: rill.admin.v1.AdminService.DeleteService:input_type -> rill.admin.v1.DeleteServiceRequest + 104, // 113: rill.admin.v1.AdminService.ListServiceAuthTokens:input_type -> rill.admin.v1.ListServiceAuthTokensRequest + 102, // 114: rill.admin.v1.AdminService.IssueServiceAuthToken:input_type -> rill.admin.v1.IssueServiceAuthTokenRequest + 100, // 115: rill.admin.v1.AdminService.RevokeServiceAuthToken:input_type -> rill.admin.v1.RevokeServiceAuthTokenRequest + 84, // 116: rill.admin.v1.AdminService.UpdateUserPreferences:input_type -> rill.admin.v1.UpdateUserPreferencesRequest + 86, // 117: rill.admin.v1.AdminService.ListBookmarks:input_type -> rill.admin.v1.ListBookmarksRequest + 88, // 118: rill.admin.v1.AdminService.GetBookmark:input_type -> rill.admin.v1.GetBookmarkRequest + 90, // 119: rill.admin.v1.AdminService.CreateBookmark:input_type -> rill.admin.v1.CreateBookmarkRequest + 92, // 120: rill.admin.v1.AdminService.RemoveBookmark:input_type -> rill.admin.v1.RemoveBookmarkRequest + 2, // 121: rill.admin.v1.AdminService.Ping:output_type -> rill.admin.v1.PingResponse + 4, // 122: rill.admin.v1.AdminService.ListOrganizations:output_type -> rill.admin.v1.ListOrganizationsResponse + 6, // 123: rill.admin.v1.AdminService.GetOrganization:output_type -> rill.admin.v1.GetOrganizationResponse + 8, // 124: rill.admin.v1.AdminService.CreateOrganization:output_type -> rill.admin.v1.CreateOrganizationResponse + 10, // 125: rill.admin.v1.AdminService.DeleteOrganization:output_type -> rill.admin.v1.DeleteOrganizationResponse + 12, // 126: rill.admin.v1.AdminService.UpdateOrganization:output_type -> rill.admin.v1.UpdateOrganizationResponse + 14, // 127: rill.admin.v1.AdminService.ListProjectsForOrganization:output_type -> rill.admin.v1.ListProjectsForOrganizationResponse + 16, // 128: rill.admin.v1.AdminService.GetProject:output_type -> rill.admin.v1.GetProjectResponse + 18, // 129: rill.admin.v1.AdminService.SearchProjectNames:output_type -> rill.admin.v1.SearchProjectNamesResponse + 20, // 130: rill.admin.v1.AdminService.GetProjectVariables:output_type -> rill.admin.v1.GetProjectVariablesResponse + 34, // 131: rill.admin.v1.AdminService.CreateProject:output_type -> rill.admin.v1.CreateProjectResponse + 36, // 132: rill.admin.v1.AdminService.DeleteProject:output_type -> rill.admin.v1.DeleteProjectResponse + 38, // 133: rill.admin.v1.AdminService.UpdateProject:output_type -> rill.admin.v1.UpdateProjectResponse + 40, // 134: rill.admin.v1.AdminService.UpdateProjectVariables:output_type -> rill.admin.v1.UpdateProjectVariablesResponse + 42, // 135: rill.admin.v1.AdminService.TriggerReconcile:output_type -> rill.admin.v1.TriggerReconcileResponse + 44, // 136: rill.admin.v1.AdminService.TriggerRefreshSources:output_type -> rill.admin.v1.TriggerRefreshSourcesResponse + 46, // 137: rill.admin.v1.AdminService.TriggerRedeploy:output_type -> rill.admin.v1.TriggerRedeployResponse + 48, // 138: rill.admin.v1.AdminService.ListOrganizationMembers:output_type -> rill.admin.v1.ListOrganizationMembersResponse + 50, // 139: rill.admin.v1.AdminService.ListOrganizationInvites:output_type -> rill.admin.v1.ListOrganizationInvitesResponse + 52, // 140: rill.admin.v1.AdminService.AddOrganizationMember:output_type -> rill.admin.v1.AddOrganizationMemberResponse + 54, // 141: rill.admin.v1.AdminService.RemoveOrganizationMember:output_type -> rill.admin.v1.RemoveOrganizationMemberResponse + 56, // 142: rill.admin.v1.AdminService.LeaveOrganization:output_type -> rill.admin.v1.LeaveOrganizationResponse + 58, // 143: rill.admin.v1.AdminService.SetOrganizationMemberRole:output_type -> rill.admin.v1.SetOrganizationMemberRoleResponse + 70, // 144: rill.admin.v1.AdminService.ListProjectMembers:output_type -> rill.admin.v1.ListProjectMembersResponse + 72, // 145: rill.admin.v1.AdminService.ListProjectInvites:output_type -> rill.admin.v1.ListProjectInvitesResponse + 74, // 146: rill.admin.v1.AdminService.AddProjectMember:output_type -> rill.admin.v1.AddProjectMemberResponse + 76, // 147: rill.admin.v1.AdminService.RemoveProjectMember:output_type -> rill.admin.v1.RemoveProjectMemberResponse + 78, // 148: rill.admin.v1.AdminService.SetProjectMemberRole:output_type -> rill.admin.v1.SetProjectMemberRoleResponse + 80, // 149: rill.admin.v1.AdminService.GetCurrentUser:output_type -> rill.admin.v1.GetCurrentUserResponse + 99, // 150: rill.admin.v1.AdminService.IssueRepresentativeAuthToken:output_type -> rill.admin.v1.IssueRepresentativeAuthTokenResponse + 97, // 151: rill.admin.v1.AdminService.RevokeCurrentAuthToken:output_type -> rill.admin.v1.RevokeCurrentAuthTokenResponse + 107, // 152: rill.admin.v1.AdminService.GetGithubRepoStatus:output_type -> rill.admin.v1.GetGithubRepoStatusResponse + 109, // 153: rill.admin.v1.AdminService.GetGitCredentials:output_type -> rill.admin.v1.GetGitCredentialsResponse + 111, // 154: rill.admin.v1.AdminService.CreateWhitelistedDomain:output_type -> rill.admin.v1.CreateWhitelistedDomainResponse + 113, // 155: rill.admin.v1.AdminService.RemoveWhitelistedDomain:output_type -> rill.admin.v1.RemoveWhitelistedDomainResponse + 115, // 156: rill.admin.v1.AdminService.ListWhitelistedDomains:output_type -> rill.admin.v1.ListWhitelistedDomainsResponse + 82, // 157: rill.admin.v1.AdminService.GetUser:output_type -> rill.admin.v1.GetUserResponse + 95, // 158: rill.admin.v1.AdminService.SearchUsers:output_type -> rill.admin.v1.SearchUsersResponse + 22, // 159: rill.admin.v1.AdminService.SearchProjectUsers:output_type -> rill.admin.v1.SearchProjectUsersResponse + 60, // 160: rill.admin.v1.AdminService.ListSuperusers:output_type -> rill.admin.v1.ListSuperusersResponse + 24, // 161: rill.admin.v1.AdminService.GetDeploymentCredentials:output_type -> rill.admin.v1.GetDeploymentCredentialsResponse + 62, // 162: rill.admin.v1.AdminService.SetSuperuser:output_type -> rill.admin.v1.SetSuperuserResponse + 64, // 163: rill.admin.v1.AdminService.SudoGetResource:output_type -> rill.admin.v1.SudoGetResourceResponse + 68, // 164: rill.admin.v1.AdminService.SudoUpdateUserQuotas:output_type -> rill.admin.v1.SudoUpdateUserQuotasResponse + 66, // 165: rill.admin.v1.AdminService.SudoUpdateOrganizationQuotas:output_type -> rill.admin.v1.SudoUpdateOrganizationQuotasResponse + 26, // 166: rill.admin.v1.AdminService.ListServices:output_type -> rill.admin.v1.ListServicesResponse + 28, // 167: rill.admin.v1.AdminService.CreateService:output_type -> rill.admin.v1.CreateServiceResponse + 30, // 168: rill.admin.v1.AdminService.UpdateService:output_type -> rill.admin.v1.UpdateServiceResponse + 32, // 169: rill.admin.v1.AdminService.DeleteService:output_type -> rill.admin.v1.DeleteServiceResponse + 105, // 170: rill.admin.v1.AdminService.ListServiceAuthTokens:output_type -> rill.admin.v1.ListServiceAuthTokensResponse + 103, // 171: rill.admin.v1.AdminService.IssueServiceAuthToken:output_type -> rill.admin.v1.IssueServiceAuthTokenResponse + 101, // 172: rill.admin.v1.AdminService.RevokeServiceAuthToken:output_type -> rill.admin.v1.RevokeServiceAuthTokenResponse + 85, // 173: rill.admin.v1.AdminService.UpdateUserPreferences:output_type -> rill.admin.v1.UpdateUserPreferencesResponse + 87, // 174: rill.admin.v1.AdminService.ListBookmarks:output_type -> rill.admin.v1.ListBookmarksResponse + 89, // 175: rill.admin.v1.AdminService.GetBookmark:output_type -> rill.admin.v1.GetBookmarkResponse + 91, // 176: rill.admin.v1.AdminService.CreateBookmark:output_type -> rill.admin.v1.CreateBookmarkResponse + 93, // 177: rill.admin.v1.AdminService.RemoveBookmark:output_type -> rill.admin.v1.RemoveBookmarkResponse + 121, // [121:178] is the sub-list for method output_type + 64, // [64:121] is the sub-list for method input_type + 64, // [64:64] is the sub-list for extension type_name + 64, // [64:64] is the sub-list for extension extendee + 0, // [0:64] is the sub-list for field type_name } func init() { file_rill_admin_v1_api_proto_init() } @@ -9512,7 +9893,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListServicesRequest); i { + switch v := v.(*SearchProjectUsersRequest); i { case 0: return &v.state case 1: @@ -9524,7 +9905,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListServicesResponse); i { + switch v := v.(*SearchProjectUsersResponse); i { case 0: return &v.state case 1: @@ -9536,7 +9917,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateServiceRequest); i { + switch v := v.(*GetDeploymentCredentialsRequest); i { case 0: return &v.state case 1: @@ -9548,7 +9929,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateServiceResponse); i { + switch v := v.(*GetDeploymentCredentialsResponse); i { case 0: return &v.state case 1: @@ -9560,7 +9941,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateServiceRequest); i { + switch v := v.(*ListServicesRequest); i { case 0: return &v.state case 1: @@ -9572,7 +9953,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateServiceResponse); i { + switch v := v.(*ListServicesResponse); i { case 0: return &v.state case 1: @@ -9584,7 +9965,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteServiceRequest); i { + switch v := v.(*CreateServiceRequest); i { case 0: return &v.state case 1: @@ -9596,7 +9977,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteServiceResponse); i { + switch v := v.(*CreateServiceResponse); i { case 0: return &v.state case 1: @@ -9608,7 +9989,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateProjectRequest); i { + switch v := v.(*UpdateServiceRequest); i { case 0: return &v.state case 1: @@ -9620,7 +10001,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateProjectResponse); i { + switch v := v.(*UpdateServiceResponse); i { case 0: return &v.state case 1: @@ -9632,7 +10013,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteProjectRequest); i { + switch v := v.(*DeleteServiceRequest); i { case 0: return &v.state case 1: @@ -9644,7 +10025,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteProjectResponse); i { + switch v := v.(*DeleteServiceResponse); i { case 0: return &v.state case 1: @@ -9656,7 +10037,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateProjectRequest); i { + switch v := v.(*CreateProjectRequest); i { case 0: return &v.state case 1: @@ -9668,7 +10049,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateProjectResponse); i { + switch v := v.(*CreateProjectResponse); i { case 0: return &v.state case 1: @@ -9680,7 +10061,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateProjectVariablesRequest); i { + switch v := v.(*DeleteProjectRequest); i { case 0: return &v.state case 1: @@ -9692,7 +10073,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateProjectVariablesResponse); i { + switch v := v.(*DeleteProjectResponse); i { case 0: return &v.state case 1: @@ -9704,7 +10085,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TriggerReconcileRequest); i { + switch v := v.(*UpdateProjectRequest); i { case 0: return &v.state case 1: @@ -9716,7 +10097,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TriggerReconcileResponse); i { + switch v := v.(*UpdateProjectResponse); i { case 0: return &v.state case 1: @@ -9728,7 +10109,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TriggerRefreshSourcesRequest); i { + switch v := v.(*UpdateProjectVariablesRequest); i { case 0: return &v.state case 1: @@ -9740,7 +10121,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TriggerRefreshSourcesResponse); i { + switch v := v.(*UpdateProjectVariablesResponse); i { case 0: return &v.state case 1: @@ -9752,7 +10133,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TriggerRedeployRequest); i { + switch v := v.(*TriggerReconcileRequest); i { case 0: return &v.state case 1: @@ -9764,7 +10145,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TriggerRedeployResponse); i { + switch v := v.(*TriggerReconcileResponse); i { case 0: return &v.state case 1: @@ -9776,7 +10157,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListOrganizationMembersRequest); i { + switch v := v.(*TriggerRefreshSourcesRequest); i { case 0: return &v.state case 1: @@ -9788,7 +10169,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListOrganizationMembersResponse); i { + switch v := v.(*TriggerRefreshSourcesResponse); i { case 0: return &v.state case 1: @@ -9800,7 +10181,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListOrganizationInvitesRequest); i { + switch v := v.(*TriggerRedeployRequest); i { case 0: return &v.state case 1: @@ -9812,7 +10193,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListOrganizationInvitesResponse); i { + switch v := v.(*TriggerRedeployResponse); i { case 0: return &v.state case 1: @@ -9824,7 +10205,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddOrganizationMemberRequest); i { + switch v := v.(*ListOrganizationMembersRequest); i { case 0: return &v.state case 1: @@ -9836,7 +10217,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddOrganizationMemberResponse); i { + switch v := v.(*ListOrganizationMembersResponse); i { case 0: return &v.state case 1: @@ -9848,7 +10229,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveOrganizationMemberRequest); i { + switch v := v.(*ListOrganizationInvitesRequest); i { case 0: return &v.state case 1: @@ -9860,7 +10241,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveOrganizationMemberResponse); i { + switch v := v.(*ListOrganizationInvitesResponse); i { case 0: return &v.state case 1: @@ -9872,7 +10253,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LeaveOrganizationRequest); i { + switch v := v.(*AddOrganizationMemberRequest); i { case 0: return &v.state case 1: @@ -9884,7 +10265,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LeaveOrganizationResponse); i { + switch v := v.(*AddOrganizationMemberResponse); i { case 0: return &v.state case 1: @@ -9896,7 +10277,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetOrganizationMemberRoleRequest); i { + switch v := v.(*RemoveOrganizationMemberRequest); i { case 0: return &v.state case 1: @@ -9908,7 +10289,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetOrganizationMemberRoleResponse); i { + switch v := v.(*RemoveOrganizationMemberResponse); i { case 0: return &v.state case 1: @@ -9920,7 +10301,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListSuperusersRequest); i { + switch v := v.(*LeaveOrganizationRequest); i { case 0: return &v.state case 1: @@ -9932,7 +10313,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListSuperusersResponse); i { + switch v := v.(*LeaveOrganizationResponse); i { case 0: return &v.state case 1: @@ -9944,7 +10325,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetSuperuserRequest); i { + switch v := v.(*SetOrganizationMemberRoleRequest); i { case 0: return &v.state case 1: @@ -9956,7 +10337,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetSuperuserResponse); i { + switch v := v.(*SetOrganizationMemberRoleResponse); i { case 0: return &v.state case 1: @@ -9968,7 +10349,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SudoGetResourceRequest); i { + switch v := v.(*ListSuperusersRequest); i { case 0: return &v.state case 1: @@ -9980,7 +10361,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SudoGetResourceResponse); i { + switch v := v.(*ListSuperusersResponse); i { case 0: return &v.state case 1: @@ -9992,7 +10373,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SudoUpdateOrganizationQuotasRequest); i { + switch v := v.(*SetSuperuserRequest); i { case 0: return &v.state case 1: @@ -10004,7 +10385,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SudoUpdateOrganizationQuotasResponse); i { + switch v := v.(*SetSuperuserResponse); i { case 0: return &v.state case 1: @@ -10016,7 +10397,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SudoUpdateUserQuotasRequest); i { + switch v := v.(*SudoGetResourceRequest); i { case 0: return &v.state case 1: @@ -10028,7 +10409,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SudoUpdateUserQuotasResponse); i { + switch v := v.(*SudoGetResourceResponse); i { case 0: return &v.state case 1: @@ -10040,7 +10421,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListProjectMembersRequest); i { + switch v := v.(*SudoUpdateOrganizationQuotasRequest); i { case 0: return &v.state case 1: @@ -10052,7 +10433,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListProjectMembersResponse); i { + switch v := v.(*SudoUpdateOrganizationQuotasResponse); i { case 0: return &v.state case 1: @@ -10064,7 +10445,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListProjectInvitesRequest); i { + switch v := v.(*SudoUpdateUserQuotasRequest); i { case 0: return &v.state case 1: @@ -10076,7 +10457,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListProjectInvitesResponse); i { + switch v := v.(*SudoUpdateUserQuotasResponse); i { case 0: return &v.state case 1: @@ -10088,7 +10469,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddProjectMemberRequest); i { + switch v := v.(*ListProjectMembersRequest); i { case 0: return &v.state case 1: @@ -10100,7 +10481,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddProjectMemberResponse); i { + switch v := v.(*ListProjectMembersResponse); i { case 0: return &v.state case 1: @@ -10112,7 +10493,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveProjectMemberRequest); i { + switch v := v.(*ListProjectInvitesRequest); i { case 0: return &v.state case 1: @@ -10124,7 +10505,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveProjectMemberResponse); i { + switch v := v.(*ListProjectInvitesResponse); i { case 0: return &v.state case 1: @@ -10136,7 +10517,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetProjectMemberRoleRequest); i { + switch v := v.(*AddProjectMemberRequest); i { case 0: return &v.state case 1: @@ -10148,7 +10529,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetProjectMemberRoleResponse); i { + switch v := v.(*AddProjectMemberResponse); i { case 0: return &v.state case 1: @@ -10160,7 +10541,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetCurrentUserRequest); i { + switch v := v.(*RemoveProjectMemberRequest); i { case 0: return &v.state case 1: @@ -10172,7 +10553,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetCurrentUserResponse); i { + switch v := v.(*RemoveProjectMemberResponse); i { case 0: return &v.state case 1: @@ -10184,7 +10565,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetUserRequest); i { + switch v := v.(*SetProjectMemberRoleRequest); i { case 0: return &v.state case 1: @@ -10196,7 +10577,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetUserResponse); i { + switch v := v.(*SetProjectMemberRoleResponse); i { case 0: return &v.state case 1: @@ -10208,7 +10589,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserPreferences); i { + switch v := v.(*GetCurrentUserRequest); i { case 0: return &v.state case 1: @@ -10220,7 +10601,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateUserPreferencesRequest); i { + switch v := v.(*GetCurrentUserResponse); i { case 0: return &v.state case 1: @@ -10232,7 +10613,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateUserPreferencesResponse); i { + switch v := v.(*GetUserRequest); i { case 0: return &v.state case 1: @@ -10244,7 +10625,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListBookmarksRequest); i { + switch v := v.(*GetUserResponse); i { case 0: return &v.state case 1: @@ -10256,7 +10637,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListBookmarksResponse); i { + switch v := v.(*UserPreferences); i { case 0: return &v.state case 1: @@ -10268,7 +10649,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBookmarkRequest); i { + switch v := v.(*UpdateUserPreferencesRequest); i { case 0: return &v.state case 1: @@ -10280,7 +10661,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBookmarkResponse); i { + switch v := v.(*UpdateUserPreferencesResponse); i { case 0: return &v.state case 1: @@ -10292,7 +10673,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateBookmarkRequest); i { + switch v := v.(*ListBookmarksRequest); i { case 0: return &v.state case 1: @@ -10304,7 +10685,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateBookmarkResponse); i { + switch v := v.(*ListBookmarksResponse); i { case 0: return &v.state case 1: @@ -10316,7 +10697,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveBookmarkRequest); i { + switch v := v.(*GetBookmarkRequest); i { case 0: return &v.state case 1: @@ -10328,7 +10709,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveBookmarkResponse); i { + switch v := v.(*GetBookmarkResponse); i { case 0: return &v.state case 1: @@ -10340,7 +10721,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SearchUsersRequest); i { + switch v := v.(*CreateBookmarkRequest); i { case 0: return &v.state case 1: @@ -10352,7 +10733,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SearchUsersResponse); i { + switch v := v.(*CreateBookmarkResponse); i { case 0: return &v.state case 1: @@ -10364,7 +10745,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RevokeCurrentAuthTokenRequest); i { + switch v := v.(*RemoveBookmarkRequest); i { case 0: return &v.state case 1: @@ -10376,7 +10757,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RevokeCurrentAuthTokenResponse); i { + switch v := v.(*RemoveBookmarkResponse); i { case 0: return &v.state case 1: @@ -10388,7 +10769,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IssueRepresentativeAuthTokenRequest); i { + switch v := v.(*SearchUsersRequest); i { case 0: return &v.state case 1: @@ -10400,7 +10781,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IssueRepresentativeAuthTokenResponse); i { + switch v := v.(*SearchUsersResponse); i { case 0: return &v.state case 1: @@ -10412,7 +10793,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RevokeServiceAuthTokenRequest); i { + switch v := v.(*RevokeCurrentAuthTokenRequest); i { case 0: return &v.state case 1: @@ -10424,7 +10805,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RevokeServiceAuthTokenResponse); i { + switch v := v.(*RevokeCurrentAuthTokenResponse); i { case 0: return &v.state case 1: @@ -10436,7 +10817,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IssueServiceAuthTokenRequest); i { + switch v := v.(*IssueRepresentativeAuthTokenRequest); i { case 0: return &v.state case 1: @@ -10448,7 +10829,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IssueServiceAuthTokenResponse); i { + switch v := v.(*IssueRepresentativeAuthTokenResponse); i { case 0: return &v.state case 1: @@ -10460,7 +10841,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListServiceAuthTokensRequest); i { + switch v := v.(*RevokeServiceAuthTokenRequest); i { case 0: return &v.state case 1: @@ -10472,7 +10853,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListServiceAuthTokensResponse); i { + switch v := v.(*RevokeServiceAuthTokenResponse); i { case 0: return &v.state case 1: @@ -10484,7 +10865,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetGithubRepoStatusRequest); i { + switch v := v.(*IssueServiceAuthTokenRequest); i { case 0: return &v.state case 1: @@ -10496,7 +10877,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetGithubRepoStatusResponse); i { + switch v := v.(*IssueServiceAuthTokenResponse); i { case 0: return &v.state case 1: @@ -10508,7 +10889,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetGitCredentialsRequest); i { + switch v := v.(*ListServiceAuthTokensRequest); i { case 0: return &v.state case 1: @@ -10520,7 +10901,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetGitCredentialsResponse); i { + switch v := v.(*ListServiceAuthTokensResponse); i { case 0: return &v.state case 1: @@ -10532,7 +10913,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateWhitelistedDomainRequest); i { + switch v := v.(*GetGithubRepoStatusRequest); i { case 0: return &v.state case 1: @@ -10544,7 +10925,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateWhitelistedDomainResponse); i { + switch v := v.(*GetGithubRepoStatusResponse); i { case 0: return &v.state case 1: @@ -10556,7 +10937,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveWhitelistedDomainRequest); i { + switch v := v.(*GetGitCredentialsRequest); i { case 0: return &v.state case 1: @@ -10568,7 +10949,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveWhitelistedDomainResponse); i { + switch v := v.(*GetGitCredentialsResponse); i { case 0: return &v.state case 1: @@ -10580,7 +10961,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWhitelistedDomainsRequest); i { + switch v := v.(*CreateWhitelistedDomainRequest); i { case 0: return &v.state case 1: @@ -10592,7 +10973,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWhitelistedDomainsResponse); i { + switch v := v.(*CreateWhitelistedDomainResponse); i { case 0: return &v.state case 1: @@ -10604,7 +10985,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*User); i { + switch v := v.(*RemoveWhitelistedDomainRequest); i { case 0: return &v.state case 1: @@ -10616,7 +10997,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Service); i { + switch v := v.(*RemoveWhitelistedDomainResponse); i { case 0: return &v.state case 1: @@ -10628,7 +11009,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Organization); i { + switch v := v.(*ListWhitelistedDomainsRequest); i { case 0: return &v.state case 1: @@ -10640,7 +11021,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserQuotas); i { + switch v := v.(*ListWhitelistedDomainsResponse); i { case 0: return &v.state case 1: @@ -10652,7 +11033,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OrganizationQuotas); i { + switch v := v.(*User); i { case 0: return &v.state case 1: @@ -10664,7 +11045,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Project); i { + switch v := v.(*Service); i { case 0: return &v.state case 1: @@ -10676,7 +11057,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Deployment); i { + switch v := v.(*Organization); i { case 0: return &v.state case 1: @@ -10688,7 +11069,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OrganizationPermissions); i { + switch v := v.(*UserQuotas); i { case 0: return &v.state case 1: @@ -10700,7 +11081,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProjectPermissions); i { + switch v := v.(*OrganizationQuotas); i { case 0: return &v.state case 1: @@ -10712,7 +11093,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Member); i { + switch v := v.(*Project); i { case 0: return &v.state case 1: @@ -10724,7 +11105,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserInvite); i { + switch v := v.(*Deployment); i { case 0: return &v.state case 1: @@ -10736,7 +11117,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WhitelistedDomain); i { + switch v := v.(*OrganizationPermissions); i { case 0: return &v.state case 1: @@ -10748,7 +11129,7 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Bookmark); i { + switch v := v.(*ProjectPermissions); i { case 0: return &v.state case 1: @@ -10760,6 +11141,54 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Member); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rill_admin_v1_api_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserInvite); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rill_admin_v1_api_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WhitelistedDomain); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rill_admin_v1_api_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Bookmark); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rill_admin_v1_api_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServiceToken); i { case 0: return &v.state @@ -10773,32 +11202,36 @@ func file_rill_admin_v1_api_proto_init() { } } file_rill_admin_v1_api_proto_msgTypes[10].OneofWrappers = []interface{}{} - file_rill_admin_v1_api_proto_msgTypes[24].OneofWrappers = []interface{}{} - file_rill_admin_v1_api_proto_msgTypes[32].OneofWrappers = []interface{}{} - file_rill_admin_v1_api_proto_msgTypes[58].OneofWrappers = []interface{}{ + file_rill_admin_v1_api_proto_msgTypes[22].OneofWrappers = []interface{}{ + (*GetDeploymentCredentialsRequest_UserId)(nil), + (*GetDeploymentCredentialsRequest_Attrs)(nil), + } + file_rill_admin_v1_api_proto_msgTypes[28].OneofWrappers = []interface{}{} + file_rill_admin_v1_api_proto_msgTypes[36].OneofWrappers = []interface{}{} + file_rill_admin_v1_api_proto_msgTypes[62].OneofWrappers = []interface{}{ (*SudoGetResourceRequest_UserId)(nil), (*SudoGetResourceRequest_OrgId)(nil), (*SudoGetResourceRequest_ProjectId)(nil), (*SudoGetResourceRequest_DeploymentId)(nil), (*SudoGetResourceRequest_InstanceId)(nil), } - file_rill_admin_v1_api_proto_msgTypes[59].OneofWrappers = []interface{}{ + file_rill_admin_v1_api_proto_msgTypes[63].OneofWrappers = []interface{}{ (*SudoGetResourceResponse_User)(nil), (*SudoGetResourceResponse_Org)(nil), (*SudoGetResourceResponse_Project)(nil), (*SudoGetResourceResponse_Deployment)(nil), (*SudoGetResourceResponse_Instance)(nil), } - file_rill_admin_v1_api_proto_msgTypes[60].OneofWrappers = []interface{}{} - file_rill_admin_v1_api_proto_msgTypes[62].OneofWrappers = []interface{}{} - file_rill_admin_v1_api_proto_msgTypes[78].OneofWrappers = []interface{}{} + file_rill_admin_v1_api_proto_msgTypes[64].OneofWrappers = []interface{}{} + file_rill_admin_v1_api_proto_msgTypes[66].OneofWrappers = []interface{}{} + file_rill_admin_v1_api_proto_msgTypes[82].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_rill_admin_v1_api_proto_rawDesc, NumEnums: 1, - NumMessages: 129, + NumMessages: 133, NumExtensions: 0, NumServices: 1, }, diff --git a/proto/gen/rill/admin/v1/api.pb.gw.go b/proto/gen/rill/admin/v1/api.pb.gw.go index 12bdf1af618..a5a682f092a 100644 --- a/proto/gen/rill/admin/v1/api.pb.gw.go +++ b/proto/gen/rill/admin/v1/api.pb.gw.go @@ -2375,6 +2375,96 @@ func local_request_AdminService_SearchUsers_0(ctx context.Context, marshaler run } +var ( + filter_AdminService_SearchProjectUsers_0 = &utilities.DoubleArray{Encoding: map[string]int{"organization": 0, "project": 1}, Base: []int{1, 2, 4, 0, 0, 0, 0}, Check: []int{0, 1, 1, 2, 2, 3, 3}} +) + +func request_AdminService_SearchProjectUsers_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SearchProjectUsersRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["organization"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "organization") + } + + protoReq.Organization, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "organization", err) + } + + val, ok = pathParams["project"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "project") + } + + protoReq.Project, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "project", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AdminService_SearchProjectUsers_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.SearchProjectUsers(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_AdminService_SearchProjectUsers_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SearchProjectUsersRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["organization"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "organization") + } + + protoReq.Organization, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "organization", err) + } + + val, ok = pathParams["project"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "project") + } + + protoReq.Project, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "project", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AdminService_SearchProjectUsers_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.SearchProjectUsers(ctx, &protoReq) + return msg, metadata, err + +} + func request_AdminService_ListSuperusers_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq ListSuperusersRequest var metadata runtime.ServerMetadata @@ -2393,6 +2483,94 @@ func local_request_AdminService_ListSuperusers_0(ctx context.Context, marshaler } +func request_AdminService_GetDeploymentCredentials_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetDeploymentCredentialsRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["organization"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "organization") + } + + protoReq.Organization, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "organization", err) + } + + val, ok = pathParams["project"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "project") + } + + protoReq.Project, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "project", err) + } + + msg, err := client.GetDeploymentCredentials(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_AdminService_GetDeploymentCredentials_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetDeploymentCredentialsRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["organization"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "organization") + } + + protoReq.Organization, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "organization", err) + } + + val, ok = pathParams["project"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "project") + } + + protoReq.Project, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "project", err) + } + + msg, err := server.GetDeploymentCredentials(ctx, &protoReq) + return msg, metadata, err + +} + func request_AdminService_SetSuperuser_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq SetSuperuserRequest var metadata runtime.ServerMetadata @@ -4189,6 +4367,31 @@ func RegisterAdminServiceHandlerServer(ctx context.Context, mux *runtime.ServeMu }) + mux.Handle("GET", pattern_AdminService_SearchProjectUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/rill.admin.v1.AdminService/SearchProjectUsers", runtime.WithHTTPPathPattern("/v1/organizations/{organization}/projects/{project}/users/search")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_SearchProjectUsers_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_SearchProjectUsers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_AdminService_ListSuperusers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -4214,6 +4417,31 @@ func RegisterAdminServiceHandlerServer(ctx context.Context, mux *runtime.ServeMu }) + mux.Handle("POST", pattern_AdminService_GetDeploymentCredentials_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/rill.admin.v1.AdminService/GetDeploymentCredentials", runtime.WithHTTPPathPattern("/v1/organizations/{organization}/projects/{project}/credentials")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_GetDeploymentCredentials_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_GetDeploymentCredentials_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_AdminService_SetSuperuser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -5491,6 +5719,28 @@ func RegisterAdminServiceHandlerClient(ctx context.Context, mux *runtime.ServeMu }) + mux.Handle("GET", pattern_AdminService_SearchProjectUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/rill.admin.v1.AdminService/SearchProjectUsers", runtime.WithHTTPPathPattern("/v1/organizations/{organization}/projects/{project}/users/search")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AdminService_SearchProjectUsers_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_SearchProjectUsers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_AdminService_ListSuperusers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -5513,6 +5763,28 @@ func RegisterAdminServiceHandlerClient(ctx context.Context, mux *runtime.ServeMu }) + mux.Handle("POST", pattern_AdminService_GetDeploymentCredentials_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/rill.admin.v1.AdminService/GetDeploymentCredentials", runtime.WithHTTPPathPattern("/v1/organizations/{organization}/projects/{project}/credentials")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AdminService_GetDeploymentCredentials_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_GetDeploymentCredentials_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_AdminService_SetSuperuser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -5945,8 +6217,12 @@ var ( pattern_AdminService_SearchUsers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "users", "search"}, "")) + pattern_AdminService_SearchProjectUsers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5, 2, 6}, []string{"v1", "organizations", "organization", "projects", "project", "users", "search"}, "")) + pattern_AdminService_ListSuperusers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "superuser", "members"}, "")) + pattern_AdminService_GetDeploymentCredentials_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"v1", "organizations", "organization", "projects", "project", "credentials"}, "")) + pattern_AdminService_SetSuperuser_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "superuser", "members"}, "")) pattern_AdminService_SudoGetResource_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "superuser", "resource"}, "")) @@ -6057,8 +6333,12 @@ var ( forward_AdminService_SearchUsers_0 = runtime.ForwardResponseMessage + forward_AdminService_SearchProjectUsers_0 = runtime.ForwardResponseMessage + forward_AdminService_ListSuperusers_0 = runtime.ForwardResponseMessage + forward_AdminService_GetDeploymentCredentials_0 = runtime.ForwardResponseMessage + forward_AdminService_SetSuperuser_0 = runtime.ForwardResponseMessage forward_AdminService_SudoGetResource_0 = runtime.ForwardResponseMessage diff --git a/proto/gen/rill/admin/v1/api.pb.validate.go b/proto/gen/rill/admin/v1/api.pb.validate.go index a5e494b6de0..4f66926258e 100644 --- a/proto/gen/rill/admin/v1/api.pb.validate.go +++ b/proto/gen/rill/admin/v1/api.pb.validate.go @@ -2496,6 +2496,547 @@ var _ interface { ErrorName() string } = GetProjectVariablesResponseValidationError{} +// Validate checks the field values on SearchProjectUsersRequest 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 *SearchProjectUsersRequest) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on SearchProjectUsersRequest 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 +// SearchProjectUsersRequestMultiError, or nil if none found. +func (m *SearchProjectUsersRequest) ValidateAll() error { + return m.validate(true) +} + +func (m *SearchProjectUsersRequest) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Organization + + // no validation rules for Project + + // no validation rules for EmailQuery + + if m.GetPageSize() != 0 { + + if m.GetPageSize() > 1000 { + err := SearchProjectUsersRequestValidationError{ + field: "PageSize", + reason: "value must be less than or equal to 1000", + } + if !all { + return err + } + errors = append(errors, err) + } + + } + + // no validation rules for PageToken + + if len(errors) > 0 { + return SearchProjectUsersRequestMultiError(errors) + } + + return nil +} + +// SearchProjectUsersRequestMultiError is an error wrapping multiple validation +// errors returned by SearchProjectUsersRequest.ValidateAll() if the +// designated constraints aren't met. +type SearchProjectUsersRequestMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m SearchProjectUsersRequestMultiError) 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 SearchProjectUsersRequestMultiError) AllErrors() []error { return m } + +// SearchProjectUsersRequestValidationError is the validation error returned by +// SearchProjectUsersRequest.Validate if the designated constraints aren't met. +type SearchProjectUsersRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e SearchProjectUsersRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e SearchProjectUsersRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e SearchProjectUsersRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e SearchProjectUsersRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e SearchProjectUsersRequestValidationError) ErrorName() string { + return "SearchProjectUsersRequestValidationError" +} + +// Error satisfies the builtin error interface +func (e SearchProjectUsersRequestValidationError) 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 %sSearchProjectUsersRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = SearchProjectUsersRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = SearchProjectUsersRequestValidationError{} + +// Validate checks the field values on SearchProjectUsersResponse 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 *SearchProjectUsersResponse) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on SearchProjectUsersResponse 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 +// SearchProjectUsersResponseMultiError, or nil if none found. +func (m *SearchProjectUsersResponse) ValidateAll() error { + return m.validate(true) +} + +func (m *SearchProjectUsersResponse) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + for idx, item := range m.GetUsers() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, SearchProjectUsersResponseValidationError{ + field: fmt.Sprintf("Users[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, SearchProjectUsersResponseValidationError{ + field: fmt.Sprintf("Users[%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 SearchProjectUsersResponseValidationError{ + field: fmt.Sprintf("Users[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + // no validation rules for NextPageToken + + if len(errors) > 0 { + return SearchProjectUsersResponseMultiError(errors) + } + + return nil +} + +// SearchProjectUsersResponseMultiError is an error wrapping multiple +// validation errors returned by SearchProjectUsersResponse.ValidateAll() if +// the designated constraints aren't met. +type SearchProjectUsersResponseMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m SearchProjectUsersResponseMultiError) 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 SearchProjectUsersResponseMultiError) AllErrors() []error { return m } + +// SearchProjectUsersResponseValidationError is the validation error returned +// by SearchProjectUsersResponse.Validate if the designated constraints aren't met. +type SearchProjectUsersResponseValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e SearchProjectUsersResponseValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e SearchProjectUsersResponseValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e SearchProjectUsersResponseValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e SearchProjectUsersResponseValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e SearchProjectUsersResponseValidationError) ErrorName() string { + return "SearchProjectUsersResponseValidationError" +} + +// Error satisfies the builtin error interface +func (e SearchProjectUsersResponseValidationError) 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 %sSearchProjectUsersResponse.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = SearchProjectUsersResponseValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = SearchProjectUsersResponseValidationError{} + +// Validate checks the field values on GetDeploymentCredentialsRequest 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 *GetDeploymentCredentialsRequest) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on GetDeploymentCredentialsRequest 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 +// GetDeploymentCredentialsRequestMultiError, or nil if none found. +func (m *GetDeploymentCredentialsRequest) ValidateAll() error { + return m.validate(true) +} + +func (m *GetDeploymentCredentialsRequest) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Organization + + // no validation rules for Project + + // no validation rules for Branch + + switch v := m.For.(type) { + case *GetDeploymentCredentialsRequest_UserId: + if v == nil { + err := GetDeploymentCredentialsRequestValidationError{ + field: "For", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + // no validation rules for UserId + case *GetDeploymentCredentialsRequest_Attrs: + if v == nil { + err := GetDeploymentCredentialsRequestValidationError{ + field: "For", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetAttrs()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, GetDeploymentCredentialsRequestValidationError{ + field: "Attrs", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, GetDeploymentCredentialsRequestValidationError{ + field: "Attrs", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetAttrs()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return GetDeploymentCredentialsRequestValidationError{ + field: "Attrs", + reason: "embedded message failed validation", + cause: err, + } + } + } + + default: + _ = v // ensures v is used + } + + if len(errors) > 0 { + return GetDeploymentCredentialsRequestMultiError(errors) + } + + return nil +} + +// GetDeploymentCredentialsRequestMultiError is an error wrapping multiple +// validation errors returned by GetDeploymentCredentialsRequest.ValidateAll() +// if the designated constraints aren't met. +type GetDeploymentCredentialsRequestMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m GetDeploymentCredentialsRequestMultiError) 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 GetDeploymentCredentialsRequestMultiError) AllErrors() []error { return m } + +// GetDeploymentCredentialsRequestValidationError is the validation error +// returned by GetDeploymentCredentialsRequest.Validate if the designated +// constraints aren't met. +type GetDeploymentCredentialsRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e GetDeploymentCredentialsRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e GetDeploymentCredentialsRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e GetDeploymentCredentialsRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e GetDeploymentCredentialsRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e GetDeploymentCredentialsRequestValidationError) ErrorName() string { + return "GetDeploymentCredentialsRequestValidationError" +} + +// Error satisfies the builtin error interface +func (e GetDeploymentCredentialsRequestValidationError) 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 %sGetDeploymentCredentialsRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = GetDeploymentCredentialsRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = GetDeploymentCredentialsRequestValidationError{} + +// Validate checks the field values on GetDeploymentCredentialsResponse 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 *GetDeploymentCredentialsResponse) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on GetDeploymentCredentialsResponse 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 +// GetDeploymentCredentialsResponseMultiError, or nil if none found. +func (m *GetDeploymentCredentialsResponse) ValidateAll() error { + return m.validate(true) +} + +func (m *GetDeploymentCredentialsResponse) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for RuntimeHost + + // no validation rules for RuntimeInstanceId + + // no validation rules for Jwt + + if len(errors) > 0 { + return GetDeploymentCredentialsResponseMultiError(errors) + } + + return nil +} + +// GetDeploymentCredentialsResponseMultiError is an error wrapping multiple +// validation errors returned by +// GetDeploymentCredentialsResponse.ValidateAll() if the designated +// constraints aren't met. +type GetDeploymentCredentialsResponseMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m GetDeploymentCredentialsResponseMultiError) 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 GetDeploymentCredentialsResponseMultiError) AllErrors() []error { return m } + +// GetDeploymentCredentialsResponseValidationError is the validation error +// returned by GetDeploymentCredentialsResponse.Validate if the designated +// constraints aren't met. +type GetDeploymentCredentialsResponseValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e GetDeploymentCredentialsResponseValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e GetDeploymentCredentialsResponseValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e GetDeploymentCredentialsResponseValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e GetDeploymentCredentialsResponseValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e GetDeploymentCredentialsResponseValidationError) ErrorName() string { + return "GetDeploymentCredentialsResponseValidationError" +} + +// Error satisfies the builtin error interface +func (e GetDeploymentCredentialsResponseValidationError) 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 %sGetDeploymentCredentialsResponse.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = GetDeploymentCredentialsResponseValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = GetDeploymentCredentialsResponseValidationError{} + // Validate checks the field values on ListServicesRequest 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/proto/gen/rill/admin/v1/api_grpc.pb.go b/proto/gen/rill/admin/v1/api_grpc.pb.go index d421056305e..ba2359aa564 100644 --- a/proto/gen/rill/admin/v1/api_grpc.pb.go +++ b/proto/gen/rill/admin/v1/api_grpc.pb.go @@ -57,7 +57,9 @@ const ( AdminService_ListWhitelistedDomains_FullMethodName = "/rill.admin.v1.AdminService/ListWhitelistedDomains" AdminService_GetUser_FullMethodName = "/rill.admin.v1.AdminService/GetUser" AdminService_SearchUsers_FullMethodName = "/rill.admin.v1.AdminService/SearchUsers" + AdminService_SearchProjectUsers_FullMethodName = "/rill.admin.v1.AdminService/SearchProjectUsers" AdminService_ListSuperusers_FullMethodName = "/rill.admin.v1.AdminService/ListSuperusers" + AdminService_GetDeploymentCredentials_FullMethodName = "/rill.admin.v1.AdminService/GetDeploymentCredentials" AdminService_SetSuperuser_FullMethodName = "/rill.admin.v1.AdminService/SetSuperuser" AdminService_SudoGetResource_FullMethodName = "/rill.admin.v1.AdminService/SudoGetResource" AdminService_SudoUpdateUserQuotas_FullMethodName = "/rill.admin.v1.AdminService/SudoUpdateUserQuotas" @@ -157,8 +159,12 @@ type AdminServiceClient interface { GetUser(ctx context.Context, in *GetUserRequest, opts ...grpc.CallOption) (*GetUserResponse, error) // GetUsersByEmail returns users by email SearchUsers(ctx context.Context, in *SearchUsersRequest, opts ...grpc.CallOption) (*SearchUsersResponse, error) + // SearchProjectUsers returns users who has access to to a project (including org members that have access through a usergroup) + SearchProjectUsers(ctx context.Context, in *SearchProjectUsersRequest, opts ...grpc.CallOption) (*SearchProjectUsersResponse, error) // ListSuperusers lists all the superusers ListSuperusers(ctx context.Context, in *ListSuperusersRequest, opts ...grpc.CallOption) (*ListSuperusersResponse, error) + // GetDeploymentCredentials returns runtime info and JWT on behalf of a specific user, or alternatively for a raw set of JWT attributes + GetDeploymentCredentials(ctx context.Context, in *GetDeploymentCredentialsRequest, opts ...grpc.CallOption) (*GetDeploymentCredentialsResponse, error) // SetSuperuser adds/remove a superuser SetSuperuser(ctx context.Context, in *SetSuperuserRequest, opts ...grpc.CallOption) (*SetSuperuserResponse, error) // SudoGetResource returns details about a resource by ID lookup @@ -543,6 +549,15 @@ func (c *adminServiceClient) SearchUsers(ctx context.Context, in *SearchUsersReq return out, nil } +func (c *adminServiceClient) SearchProjectUsers(ctx context.Context, in *SearchProjectUsersRequest, opts ...grpc.CallOption) (*SearchProjectUsersResponse, error) { + out := new(SearchProjectUsersResponse) + err := c.cc.Invoke(ctx, AdminService_SearchProjectUsers_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *adminServiceClient) ListSuperusers(ctx context.Context, in *ListSuperusersRequest, opts ...grpc.CallOption) (*ListSuperusersResponse, error) { out := new(ListSuperusersResponse) err := c.cc.Invoke(ctx, AdminService_ListSuperusers_FullMethodName, in, out, opts...) @@ -552,6 +567,15 @@ func (c *adminServiceClient) ListSuperusers(ctx context.Context, in *ListSuperus return out, nil } +func (c *adminServiceClient) GetDeploymentCredentials(ctx context.Context, in *GetDeploymentCredentialsRequest, opts ...grpc.CallOption) (*GetDeploymentCredentialsResponse, error) { + out := new(GetDeploymentCredentialsResponse) + err := c.cc.Invoke(ctx, AdminService_GetDeploymentCredentials_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *adminServiceClient) SetSuperuser(ctx context.Context, in *SetSuperuserRequest, opts ...grpc.CallOption) (*SetSuperuserResponse, error) { out := new(SetSuperuserResponse) err := c.cc.Invoke(ctx, AdminService_SetSuperuser_FullMethodName, in, out, opts...) @@ -777,8 +801,12 @@ type AdminServiceServer interface { GetUser(context.Context, *GetUserRequest) (*GetUserResponse, error) // GetUsersByEmail returns users by email SearchUsers(context.Context, *SearchUsersRequest) (*SearchUsersResponse, error) + // SearchProjectUsers returns users who has access to to a project (including org members that have access through a usergroup) + SearchProjectUsers(context.Context, *SearchProjectUsersRequest) (*SearchProjectUsersResponse, error) // ListSuperusers lists all the superusers ListSuperusers(context.Context, *ListSuperusersRequest) (*ListSuperusersResponse, error) + // GetDeploymentCredentials returns runtime info and JWT on behalf of a specific user, or alternatively for a raw set of JWT attributes + GetDeploymentCredentials(context.Context, *GetDeploymentCredentialsRequest) (*GetDeploymentCredentialsResponse, error) // SetSuperuser adds/remove a superuser SetSuperuser(context.Context, *SetSuperuserRequest) (*SetSuperuserResponse, error) // SudoGetResource returns details about a resource by ID lookup @@ -932,9 +960,15 @@ func (UnimplementedAdminServiceServer) GetUser(context.Context, *GetUserRequest) func (UnimplementedAdminServiceServer) SearchUsers(context.Context, *SearchUsersRequest) (*SearchUsersResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method SearchUsers not implemented") } +func (UnimplementedAdminServiceServer) SearchProjectUsers(context.Context, *SearchProjectUsersRequest) (*SearchProjectUsersResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SearchProjectUsers not implemented") +} func (UnimplementedAdminServiceServer) ListSuperusers(context.Context, *ListSuperusersRequest) (*ListSuperusersResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListSuperusers not implemented") } +func (UnimplementedAdminServiceServer) GetDeploymentCredentials(context.Context, *GetDeploymentCredentialsRequest) (*GetDeploymentCredentialsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetDeploymentCredentials not implemented") +} func (UnimplementedAdminServiceServer) SetSuperuser(context.Context, *SetSuperuserRequest) (*SetSuperuserResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method SetSuperuser not implemented") } @@ -1680,6 +1714,24 @@ func _AdminService_SearchUsers_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _AdminService_SearchProjectUsers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SearchProjectUsersRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AdminServiceServer).SearchProjectUsers(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AdminService_SearchProjectUsers_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AdminServiceServer).SearchProjectUsers(ctx, req.(*SearchProjectUsersRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _AdminService_ListSuperusers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListSuperusersRequest) if err := dec(in); err != nil { @@ -1698,6 +1750,24 @@ func _AdminService_ListSuperusers_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } +func _AdminService_GetDeploymentCredentials_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetDeploymentCredentialsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AdminServiceServer).GetDeploymentCredentials(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AdminService_GetDeploymentCredentials_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AdminServiceServer).GetDeploymentCredentials(ctx, req.(*GetDeploymentCredentialsRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _AdminService_SetSuperuser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(SetSuperuserRequest) if err := dec(in); err != nil { @@ -2145,10 +2215,18 @@ var AdminService_ServiceDesc = grpc.ServiceDesc{ MethodName: "SearchUsers", Handler: _AdminService_SearchUsers_Handler, }, + { + MethodName: "SearchProjectUsers", + Handler: _AdminService_SearchProjectUsers_Handler, + }, { MethodName: "ListSuperusers", Handler: _AdminService_ListSuperusers_Handler, }, + { + MethodName: "GetDeploymentCredentials", + Handler: _AdminService_GetDeploymentCredentials_Handler, + }, { MethodName: "SetSuperuser", Handler: _AdminService_SetSuperuser_Handler, diff --git a/proto/gen/rill/runtime/v1/catalog.pb.go b/proto/gen/rill/runtime/v1/catalog.pb.go index 64f2e7ee96a..b63009d868f 100644 --- a/proto/gen/rill/runtime/v1/catalog.pb.go +++ b/proto/gen/rill/runtime/v1/catalog.pb.go @@ -77,55 +77,6 @@ func (ObjectType) EnumDescriptor() ([]byte, []int) { return file_rill_runtime_v1_catalog_proto_rawDescGZIP(), []int{0} } -type Source_ExtractPolicy_Strategy int32 - -const ( - Source_ExtractPolicy_STRATEGY_UNSPECIFIED Source_ExtractPolicy_Strategy = 0 - Source_ExtractPolicy_STRATEGY_HEAD Source_ExtractPolicy_Strategy = 1 - Source_ExtractPolicy_STRATEGY_TAIL Source_ExtractPolicy_Strategy = 2 -) - -// Enum value maps for Source_ExtractPolicy_Strategy. -var ( - Source_ExtractPolicy_Strategy_name = map[int32]string{ - 0: "STRATEGY_UNSPECIFIED", - 1: "STRATEGY_HEAD", - 2: "STRATEGY_TAIL", - } - Source_ExtractPolicy_Strategy_value = map[string]int32{ - "STRATEGY_UNSPECIFIED": 0, - "STRATEGY_HEAD": 1, - "STRATEGY_TAIL": 2, - } -) - -func (x Source_ExtractPolicy_Strategy) Enum() *Source_ExtractPolicy_Strategy { - p := new(Source_ExtractPolicy_Strategy) - *p = x - return p -} - -func (x Source_ExtractPolicy_Strategy) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (Source_ExtractPolicy_Strategy) Descriptor() protoreflect.EnumDescriptor { - return file_rill_runtime_v1_catalog_proto_enumTypes[1].Descriptor() -} - -func (Source_ExtractPolicy_Strategy) Type() protoreflect.EnumType { - return &file_rill_runtime_v1_catalog_proto_enumTypes[1] -} - -func (x Source_ExtractPolicy_Strategy) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use Source_ExtractPolicy_Strategy.Descriptor instead. -func (Source_ExtractPolicy_Strategy) EnumDescriptor() ([]byte, []int) { - return file_rill_runtime_v1_catalog_proto_rawDescGZIP(), []int{1, 0, 0} -} - // Dialects supported for models type Model_Dialect int32 @@ -157,11 +108,11 @@ func (x Model_Dialect) String() string { } func (Model_Dialect) Descriptor() protoreflect.EnumDescriptor { - return file_rill_runtime_v1_catalog_proto_enumTypes[2].Descriptor() + return file_rill_runtime_v1_catalog_proto_enumTypes[1].Descriptor() } func (Model_Dialect) Type() protoreflect.EnumType { - return &file_rill_runtime_v1_catalog_proto_enumTypes[2] + return &file_rill_runtime_v1_catalog_proto_enumTypes[1] } func (x Model_Dialect) Number() protoreflect.EnumNumber { @@ -257,8 +208,6 @@ type Source struct { Properties *structpb.Struct `protobuf:"bytes,3,opt,name=properties,proto3" json:"properties,omitempty"` // Detected schema of the source Schema *StructType `protobuf:"bytes,5,opt,name=schema,proto3" json:"schema,omitempty"` - // extraction policy for the source - Policy *Source_ExtractPolicy `protobuf:"bytes,6,opt,name=policy,proto3" json:"policy,omitempty"` // timeout for source ingestion in seconds TimeoutSeconds int32 `protobuf:"varint,7,opt,name=timeout_seconds,json=timeoutSeconds,proto3" json:"timeout_seconds,omitempty"` } @@ -323,13 +272,6 @@ func (x *Source) GetSchema() *StructType { return nil } -func (x *Source) GetPolicy() *Source_ExtractPolicy { - if x != nil { - return x.Policy - } - return nil -} - func (x *Source) GetTimeoutSeconds() int32 { if x != nil { return x.TimeoutSeconds @@ -561,83 +503,6 @@ func (x *MetricsView) GetSecurity() *MetricsView_Security { return nil } -// Extract policy for glob connectors -type Source_ExtractPolicy struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // strategy for selecting rows in a file - RowsStrategy Source_ExtractPolicy_Strategy `protobuf:"varint,1,opt,name=rows_strategy,json=rowsStrategy,proto3,enum=rill.runtime.v1.Source_ExtractPolicy_Strategy" json:"rows_strategy,omitempty"` - // could in future add: uint64 rows_limit = n; - // limit on data fetched in bytes - RowsLimitBytes uint64 `protobuf:"varint,2,opt,name=rows_limit_bytes,json=rowsLimitBytes,proto3" json:"rows_limit_bytes,omitempty"` - // strategy for selecting files - FilesStrategy Source_ExtractPolicy_Strategy `protobuf:"varint,3,opt,name=files_strategy,json=filesStrategy,proto3,enum=rill.runtime.v1.Source_ExtractPolicy_Strategy" json:"files_strategy,omitempty"` - // limit on number of files - FilesLimit uint64 `protobuf:"varint,4,opt,name=files_limit,json=filesLimit,proto3" json:"files_limit,omitempty"` -} - -func (x *Source_ExtractPolicy) Reset() { - *x = Source_ExtractPolicy{} - if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_catalog_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Source_ExtractPolicy) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Source_ExtractPolicy) ProtoMessage() {} - -func (x *Source_ExtractPolicy) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_catalog_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Source_ExtractPolicy.ProtoReflect.Descriptor instead. -func (*Source_ExtractPolicy) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_catalog_proto_rawDescGZIP(), []int{1, 0} -} - -func (x *Source_ExtractPolicy) GetRowsStrategy() Source_ExtractPolicy_Strategy { - if x != nil { - return x.RowsStrategy - } - return Source_ExtractPolicy_STRATEGY_UNSPECIFIED -} - -func (x *Source_ExtractPolicy) GetRowsLimitBytes() uint64 { - if x != nil { - return x.RowsLimitBytes - } - return 0 -} - -func (x *Source_ExtractPolicy) GetFilesStrategy() Source_ExtractPolicy_Strategy { - if x != nil { - return x.FilesStrategy - } - return Source_ExtractPolicy_STRATEGY_UNSPECIFIED -} - -func (x *Source_ExtractPolicy) GetFilesLimit() uint64 { - if x != nil { - return x.FilesLimit - } - return 0 -} - // Dimensions are columns to filter and group by type MetricsView_Dimension struct { state protoimpl.MessageState @@ -653,7 +518,7 @@ type MetricsView_Dimension struct { func (x *MetricsView_Dimension) Reset() { *x = MetricsView_Dimension{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_catalog_proto_msgTypes[5] + mi := &file_rill_runtime_v1_catalog_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -666,7 +531,7 @@ func (x *MetricsView_Dimension) String() string { func (*MetricsView_Dimension) ProtoMessage() {} func (x *MetricsView_Dimension) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_catalog_proto_msgTypes[5] + mi := &file_rill_runtime_v1_catalog_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -727,7 +592,7 @@ type MetricsView_Measure struct { func (x *MetricsView_Measure) Reset() { *x = MetricsView_Measure{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_catalog_proto_msgTypes[6] + mi := &file_rill_runtime_v1_catalog_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -740,7 +605,7 @@ func (x *MetricsView_Measure) String() string { func (*MetricsView_Measure) ProtoMessage() {} func (x *MetricsView_Measure) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_catalog_proto_msgTypes[6] + mi := &file_rill_runtime_v1_catalog_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -816,7 +681,7 @@ type MetricsView_Security struct { func (x *MetricsView_Security) Reset() { *x = MetricsView_Security{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_catalog_proto_msgTypes[7] + mi := &file_rill_runtime_v1_catalog_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -829,7 +694,7 @@ func (x *MetricsView_Security) String() string { func (*MetricsView_Security) ProtoMessage() {} func (x *MetricsView_Security) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_catalog_proto_msgTypes[7] + mi := &file_rill_runtime_v1_catalog_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -886,7 +751,7 @@ type MetricsView_Security_FieldCondition struct { func (x *MetricsView_Security_FieldCondition) Reset() { *x = MetricsView_Security_FieldCondition{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_catalog_proto_msgTypes[8] + mi := &file_rill_runtime_v1_catalog_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -899,7 +764,7 @@ func (x *MetricsView_Security_FieldCondition) String() string { func (*MetricsView_Security_FieldCondition) ProtoMessage() {} func (x *MetricsView_Security_FieldCondition) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_catalog_proto_msgTypes[8] + mi := &file_rill_runtime_v1_catalog_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -947,7 +812,7 @@ var file_rill_runtime_v1_catalog_proto_rawDesc = []byte{ 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x22, 0xe5, 0x04, 0x0a, 0x06, 0x53, + 0x08, 0x52, 0x07, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x22, 0xd1, 0x01, 0x0a, 0x06, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, @@ -958,142 +823,117 @@ var file_rill_runtime_v1_catalog_proto_rawDesc = []byte{ 0x12, 0x33, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x06, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x3d, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x45, - 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, - 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x74, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x1a, 0xd2, 0x02, - 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, - 0x53, 0x0a, 0x0d, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, - 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x53, 0x74, - 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x0c, 0x72, 0x6f, 0x77, 0x73, 0x53, 0x74, 0x72, 0x61, - 0x74, 0x65, 0x67, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, - 0x72, 0x6f, 0x77, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x55, - 0x0a, 0x0e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, - 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x53, 0x74, - 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x0d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x53, 0x74, 0x72, - 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x5f, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x65, - 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x4a, 0x0a, 0x08, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, - 0x67, 0x79, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x55, - 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, - 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x48, 0x45, 0x41, 0x44, 0x10, 0x01, 0x12, - 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x54, 0x41, 0x49, 0x4c, - 0x10, 0x02, 0x22, 0xf6, 0x01, 0x0a, 0x05, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, - 0x71, 0x6c, 0x12, 0x38, 0x0a, 0x07, 0x64, 0x69, 0x61, 0x6c, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x69, 0x61, 0x6c, - 0x65, 0x63, 0x74, 0x52, 0x07, 0x64, 0x69, 0x61, 0x6c, 0x65, 0x63, 0x74, 0x12, 0x33, 0x0a, 0x06, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, - 0x69, 0x7a, 0x65, 0x22, 0x36, 0x0a, 0x07, 0x44, 0x69, 0x61, 0x6c, 0x65, 0x63, 0x74, 0x12, 0x17, - 0x0a, 0x13, 0x44, 0x49, 0x41, 0x4c, 0x45, 0x43, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x49, 0x41, 0x4c, 0x45, - 0x43, 0x54, 0x5f, 0x44, 0x55, 0x43, 0x4b, 0x44, 0x42, 0x10, 0x01, 0x22, 0xef, 0x08, 0x0a, 0x0b, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x64, 0x69, - 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, - 0x69, 0x6d, 0x65, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0a, - 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x2e, 0x44, - 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x40, 0x0a, 0x08, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, - 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x56, 0x69, 0x65, 0x77, 0x2e, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52, 0x08, 0x6d, 0x65, - 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4a, - 0x0a, 0x13, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x65, 0x73, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, - 0x67, 0x72, 0x61, 0x69, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, 0x11, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x65, 0x73, - 0x74, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x12, 0x2c, 0x0a, 0x12, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x54, - 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x76, 0x61, 0x69, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x73, - 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x54, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x73, 0x12, 0x41, 0x0a, 0x08, 0x73, 0x65, - 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x72, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, + 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0xf6, + 0x01, 0x0a, 0x05, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, + 0x73, 0x71, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x38, + 0x0a, 0x07, 0x64, 0x69, 0x61, 0x6c, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x1e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x69, 0x61, 0x6c, 0x65, 0x63, 0x74, 0x52, + 0x07, 0x64, 0x69, 0x61, 0x6c, 0x65, 0x63, 0x74, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x20, 0x0a, + 0x0b, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0b, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x22, + 0x36, 0x0a, 0x07, 0x44, 0x69, 0x61, 0x6c, 0x65, 0x63, 0x74, 0x12, 0x17, 0x0a, 0x13, 0x44, 0x49, + 0x41, 0x4c, 0x45, 0x43, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x49, 0x41, 0x4c, 0x45, 0x43, 0x54, 0x5f, 0x44, + 0x55, 0x43, 0x4b, 0x44, 0x42, 0x10, 0x01, 0x22, 0xef, 0x08, 0x0a, 0x0b, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x44, + 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0a, 0x64, 0x69, 0x6d, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, - 0x69, 0x74, 0x79, 0x52, 0x08, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x1a, 0x6f, 0x0a, - 0x09, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x1a, 0xc2, - 0x01, 0x0a, 0x07, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 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, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x33, - 0x0a, 0x16, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x5f, - 0x6f, 0x66, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x4f, 0x66, 0x54, 0x6f, - 0x74, 0x61, 0x6c, 0x1a, 0xa7, 0x02, 0x0a, 0x08, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, - 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x6f, 0x77, 0x5f, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x6f, - 0x77, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x07, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x2e, 0x44, 0x69, 0x6d, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x40, 0x0a, 0x08, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, + 0x2e, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, + 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x13, 0x73, 0x6d, + 0x61, 0x6c, 0x6c, 0x65, 0x73, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x67, 0x72, 0x61, 0x69, + 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, + 0x61, 0x69, 0x6e, 0x52, 0x11, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x65, 0x73, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x12, 0x2c, 0x0a, 0x12, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x52, + 0x61, 0x6e, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x12, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x73, 0x12, 0x41, 0x0a, 0x08, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, + 0x74, 0x79, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x2e, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x12, 0x4e, 0x0a, 0x07, 0x65, 0x78, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x2e, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, - 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x1a, 0x44, 0x0a, 0x0e, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2a, 0x8d, 0x01, - 0x0a, 0x0a, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x17, - 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x4f, 0x42, 0x4a, - 0x45, 0x43, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x01, - 0x12, 0x16, 0x0a, 0x12, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x4f, 0x42, 0x4a, 0x45, - 0x43, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x4c, 0x10, 0x03, 0x12, - 0x1c, 0x0a, 0x18, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, - 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x56, 0x49, 0x45, 0x57, 0x10, 0x04, 0x42, 0xb5, 0x01, - 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x0c, 0x43, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x72, 0x69, 0x6c, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x72, 0x69, 0x6c, 0x6c, 0x2f, - 0x72, 0x69, 0x6c, 0x6c, 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x76, 0x31, 0x3b, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x52, 0x52, 0x58, 0xaa, - 0x02, 0x0f, 0x52, 0x69, 0x6c, 0x6c, 0x2e, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x56, - 0x31, 0xca, 0x02, 0x0f, 0x52, 0x69, 0x6c, 0x6c, 0x5c, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1b, 0x52, 0x69, 0x6c, 0x6c, 0x5c, 0x52, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0xea, 0x02, 0x11, 0x52, 0x69, 0x6c, 0x6c, 0x3a, 0x3a, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, + 0x08, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x1a, 0x6f, 0x0a, 0x09, 0x44, 0x69, 0x6d, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x1a, 0xc2, 0x01, 0x0a, 0x07, 0x4d, + 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 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, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x33, 0x0a, 0x16, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x5f, 0x6f, 0x66, 0x5f, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x4f, 0x66, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x1a, + 0xa7, 0x02, 0x0a, 0x08, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x6f, 0x77, 0x5f, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x6f, 0x77, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x07, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, + 0x65, 0x77, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x2e, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x12, 0x4e, 0x0a, 0x07, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, + 0x65, 0x77, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x2e, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x65, 0x78, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x1a, 0x44, 0x0a, 0x0e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2a, 0x8d, 0x01, 0x0a, 0x0a, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x4f, 0x42, 0x4a, 0x45, + 0x43, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, + 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, + 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x4f, 0x55, 0x52, + 0x43, 0x45, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x4c, 0x10, 0x03, 0x12, 0x1c, 0x0a, 0x18, 0x4f, + 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, + 0x43, 0x53, 0x5f, 0x56, 0x49, 0x45, 0x57, 0x10, 0x04, 0x42, 0xb5, 0x01, 0x0a, 0x13, 0x63, 0x6f, + 0x6d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x42, 0x0c, 0x43, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, + 0x01, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x69, + 0x6c, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x72, 0x69, 0x6c, 0x6c, 0x2f, 0x72, 0x69, 0x6c, 0x6c, + 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x52, 0x52, 0x58, 0xaa, 0x02, 0x0f, 0x52, 0x69, + 0x6c, 0x6c, 0x2e, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0f, + 0x52, 0x69, 0x6c, 0x6c, 0x5c, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5c, 0x56, 0x31, 0xe2, + 0x02, 0x1b, 0x52, 0x69, 0x6c, 0x6c, 0x5c, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5c, 0x56, + 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x11, + 0x52, 0x69, 0x6c, 0x6c, 0x3a, 0x3a, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x3a, 0x3a, 0x56, + 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1108,45 +948,40 @@ func file_rill_runtime_v1_catalog_proto_rawDescGZIP() []byte { return file_rill_runtime_v1_catalog_proto_rawDescData } -var file_rill_runtime_v1_catalog_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_rill_runtime_v1_catalog_proto_msgTypes = make([]protoimpl.MessageInfo, 9) +var file_rill_runtime_v1_catalog_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_rill_runtime_v1_catalog_proto_msgTypes = make([]protoimpl.MessageInfo, 8) var file_rill_runtime_v1_catalog_proto_goTypes = []interface{}{ (ObjectType)(0), // 0: rill.runtime.v1.ObjectType - (Source_ExtractPolicy_Strategy)(0), // 1: rill.runtime.v1.Source.ExtractPolicy.Strategy - (Model_Dialect)(0), // 2: rill.runtime.v1.Model.Dialect - (*Table)(nil), // 3: rill.runtime.v1.Table - (*Source)(nil), // 4: rill.runtime.v1.Source - (*Model)(nil), // 5: rill.runtime.v1.Model - (*MetricsView)(nil), // 6: rill.runtime.v1.MetricsView - (*Source_ExtractPolicy)(nil), // 7: rill.runtime.v1.Source.ExtractPolicy - (*MetricsView_Dimension)(nil), // 8: rill.runtime.v1.MetricsView.Dimension - (*MetricsView_Measure)(nil), // 9: rill.runtime.v1.MetricsView.Measure - (*MetricsView_Security)(nil), // 10: rill.runtime.v1.MetricsView.Security - (*MetricsView_Security_FieldCondition)(nil), // 11: rill.runtime.v1.MetricsView.Security.FieldCondition - (*StructType)(nil), // 12: rill.runtime.v1.StructType - (*structpb.Struct)(nil), // 13: google.protobuf.Struct - (TimeGrain)(0), // 14: rill.runtime.v1.TimeGrain + (Model_Dialect)(0), // 1: rill.runtime.v1.Model.Dialect + (*Table)(nil), // 2: rill.runtime.v1.Table + (*Source)(nil), // 3: rill.runtime.v1.Source + (*Model)(nil), // 4: rill.runtime.v1.Model + (*MetricsView)(nil), // 5: rill.runtime.v1.MetricsView + (*MetricsView_Dimension)(nil), // 6: rill.runtime.v1.MetricsView.Dimension + (*MetricsView_Measure)(nil), // 7: rill.runtime.v1.MetricsView.Measure + (*MetricsView_Security)(nil), // 8: rill.runtime.v1.MetricsView.Security + (*MetricsView_Security_FieldCondition)(nil), // 9: rill.runtime.v1.MetricsView.Security.FieldCondition + (*StructType)(nil), // 10: rill.runtime.v1.StructType + (*structpb.Struct)(nil), // 11: google.protobuf.Struct + (TimeGrain)(0), // 12: rill.runtime.v1.TimeGrain } var file_rill_runtime_v1_catalog_proto_depIdxs = []int32{ - 12, // 0: rill.runtime.v1.Table.schema:type_name -> rill.runtime.v1.StructType - 13, // 1: rill.runtime.v1.Source.properties:type_name -> google.protobuf.Struct - 12, // 2: rill.runtime.v1.Source.schema:type_name -> rill.runtime.v1.StructType - 7, // 3: rill.runtime.v1.Source.policy:type_name -> rill.runtime.v1.Source.ExtractPolicy - 2, // 4: rill.runtime.v1.Model.dialect:type_name -> rill.runtime.v1.Model.Dialect - 12, // 5: rill.runtime.v1.Model.schema:type_name -> rill.runtime.v1.StructType - 8, // 6: rill.runtime.v1.MetricsView.dimensions:type_name -> rill.runtime.v1.MetricsView.Dimension - 9, // 7: rill.runtime.v1.MetricsView.measures:type_name -> rill.runtime.v1.MetricsView.Measure - 14, // 8: rill.runtime.v1.MetricsView.smallest_time_grain:type_name -> rill.runtime.v1.TimeGrain - 10, // 9: rill.runtime.v1.MetricsView.security:type_name -> rill.runtime.v1.MetricsView.Security - 1, // 10: rill.runtime.v1.Source.ExtractPolicy.rows_strategy:type_name -> rill.runtime.v1.Source.ExtractPolicy.Strategy - 1, // 11: rill.runtime.v1.Source.ExtractPolicy.files_strategy:type_name -> rill.runtime.v1.Source.ExtractPolicy.Strategy - 11, // 12: rill.runtime.v1.MetricsView.Security.include:type_name -> rill.runtime.v1.MetricsView.Security.FieldCondition - 11, // 13: rill.runtime.v1.MetricsView.Security.exclude:type_name -> rill.runtime.v1.MetricsView.Security.FieldCondition - 14, // [14:14] is the sub-list for method output_type - 14, // [14:14] is the sub-list for method input_type - 14, // [14:14] is the sub-list for extension type_name - 14, // [14:14] is the sub-list for extension extendee - 0, // [0:14] is the sub-list for field type_name + 10, // 0: rill.runtime.v1.Table.schema:type_name -> rill.runtime.v1.StructType + 11, // 1: rill.runtime.v1.Source.properties:type_name -> google.protobuf.Struct + 10, // 2: rill.runtime.v1.Source.schema:type_name -> rill.runtime.v1.StructType + 1, // 3: rill.runtime.v1.Model.dialect:type_name -> rill.runtime.v1.Model.Dialect + 10, // 4: rill.runtime.v1.Model.schema:type_name -> rill.runtime.v1.StructType + 6, // 5: rill.runtime.v1.MetricsView.dimensions:type_name -> rill.runtime.v1.MetricsView.Dimension + 7, // 6: rill.runtime.v1.MetricsView.measures:type_name -> rill.runtime.v1.MetricsView.Measure + 12, // 7: rill.runtime.v1.MetricsView.smallest_time_grain:type_name -> rill.runtime.v1.TimeGrain + 8, // 8: rill.runtime.v1.MetricsView.security:type_name -> rill.runtime.v1.MetricsView.Security + 9, // 9: rill.runtime.v1.MetricsView.Security.include:type_name -> rill.runtime.v1.MetricsView.Security.FieldCondition + 9, // 10: rill.runtime.v1.MetricsView.Security.exclude:type_name -> rill.runtime.v1.MetricsView.Security.FieldCondition + 11, // [11:11] is the sub-list for method output_type + 11, // [11:11] is the sub-list for method input_type + 11, // [11:11] is the sub-list for extension type_name + 11, // [11:11] is the sub-list for extension extendee + 0, // [0:11] is the sub-list for field type_name } func init() { file_rill_runtime_v1_catalog_proto_init() } @@ -1206,18 +1041,6 @@ func file_rill_runtime_v1_catalog_proto_init() { } } file_rill_runtime_v1_catalog_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Source_ExtractPolicy); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_rill_runtime_v1_catalog_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MetricsView_Dimension); i { case 0: return &v.state @@ -1229,7 +1052,7 @@ func file_rill_runtime_v1_catalog_proto_init() { return nil } } - file_rill_runtime_v1_catalog_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_rill_runtime_v1_catalog_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MetricsView_Measure); i { case 0: return &v.state @@ -1241,7 +1064,7 @@ func file_rill_runtime_v1_catalog_proto_init() { return nil } } - file_rill_runtime_v1_catalog_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_rill_runtime_v1_catalog_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MetricsView_Security); i { case 0: return &v.state @@ -1253,7 +1076,7 @@ func file_rill_runtime_v1_catalog_proto_init() { return nil } } - file_rill_runtime_v1_catalog_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_rill_runtime_v1_catalog_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MetricsView_Security_FieldCondition); i { case 0: return &v.state @@ -1271,8 +1094,8 @@ func file_rill_runtime_v1_catalog_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_rill_runtime_v1_catalog_proto_rawDesc, - NumEnums: 3, - NumMessages: 9, + NumEnums: 2, + NumMessages: 8, NumExtensions: 0, NumServices: 0, }, diff --git a/proto/gen/rill/runtime/v1/catalog.pb.validate.go b/proto/gen/rill/runtime/v1/catalog.pb.validate.go index fb0b9b0d9cd..88ede591f61 100644 --- a/proto/gen/rill/runtime/v1/catalog.pb.validate.go +++ b/proto/gen/rill/runtime/v1/catalog.pb.validate.go @@ -249,35 +249,6 @@ func (m *Source) validate(all bool) error { } } - if all { - switch v := interface{}(m.GetPolicy()).(type) { - case interface{ ValidateAll() error }: - if err := v.ValidateAll(); err != nil { - errors = append(errors, SourceValidationError{ - field: "Policy", - reason: "embedded message failed validation", - cause: err, - }) - } - case interface{ Validate() error }: - if err := v.Validate(); err != nil { - errors = append(errors, SourceValidationError{ - field: "Policy", - reason: "embedded message failed validation", - cause: err, - }) - } - } - } else if v, ok := interface{}(m.GetPolicy()).(interface{ Validate() error }); ok { - if err := v.Validate(); err != nil { - return SourceValidationError{ - field: "Policy", - reason: "embedded message failed validation", - cause: err, - } - } - } - // no validation rules for TimeoutSeconds if len(errors) > 0 { @@ -702,116 +673,6 @@ var _ interface { ErrorName() string } = MetricsViewValidationError{} -// Validate checks the field values on Source_ExtractPolicy 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 *Source_ExtractPolicy) Validate() error { - return m.validate(false) -} - -// ValidateAll checks the field values on Source_ExtractPolicy 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 -// Source_ExtractPolicyMultiError, or nil if none found. -func (m *Source_ExtractPolicy) ValidateAll() error { - return m.validate(true) -} - -func (m *Source_ExtractPolicy) validate(all bool) error { - if m == nil { - return nil - } - - var errors []error - - // no validation rules for RowsStrategy - - // no validation rules for RowsLimitBytes - - // no validation rules for FilesStrategy - - // no validation rules for FilesLimit - - if len(errors) > 0 { - return Source_ExtractPolicyMultiError(errors) - } - - return nil -} - -// Source_ExtractPolicyMultiError is an error wrapping multiple validation -// errors returned by Source_ExtractPolicy.ValidateAll() if the designated -// constraints aren't met. -type Source_ExtractPolicyMultiError []error - -// Error returns a concatenation of all the error messages it wraps. -func (m Source_ExtractPolicyMultiError) 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 Source_ExtractPolicyMultiError) AllErrors() []error { return m } - -// Source_ExtractPolicyValidationError is the validation error returned by -// Source_ExtractPolicy.Validate if the designated constraints aren't met. -type Source_ExtractPolicyValidationError struct { - field string - reason string - cause error - key bool -} - -// Field function returns field value. -func (e Source_ExtractPolicyValidationError) Field() string { return e.field } - -// Reason function returns reason value. -func (e Source_ExtractPolicyValidationError) Reason() string { return e.reason } - -// Cause function returns cause value. -func (e Source_ExtractPolicyValidationError) Cause() error { return e.cause } - -// Key function returns key value. -func (e Source_ExtractPolicyValidationError) Key() bool { return e.key } - -// ErrorName returns error name. -func (e Source_ExtractPolicyValidationError) ErrorName() string { - return "Source_ExtractPolicyValidationError" -} - -// Error satisfies the builtin error interface -func (e Source_ExtractPolicyValidationError) 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 %sSource_ExtractPolicy.%s: %s%s", - key, - e.field, - e.reason, - cause) -} - -var _ error = Source_ExtractPolicyValidationError{} - -var _ interface { - Field() string - Reason() string - Key() bool - Cause() error - ErrorName() string -} = Source_ExtractPolicyValidationError{} - // Validate checks the field values on MetricsView_Dimension 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/proto/gen/rill/runtime/v1/connectors.pb.go b/proto/gen/rill/runtime/v1/connectors.pb.go index c9da2510be0..68e818179db 100644 --- a/proto/gen/rill/runtime/v1/connectors.pb.go +++ b/proto/gen/rill/runtime/v1/connectors.pb.go @@ -1496,6 +1496,163 @@ func (x *BigQueryListTablesResponse) GetNames() []string { return nil } +type ScanConnectorsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` +} + +func (x *ScanConnectorsRequest) Reset() { + *x = ScanConnectorsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_rill_runtime_v1_connectors_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ScanConnectorsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ScanConnectorsRequest) ProtoMessage() {} + +func (x *ScanConnectorsRequest) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_connectors_proto_msgTypes[23] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ScanConnectorsRequest.ProtoReflect.Descriptor instead. +func (*ScanConnectorsRequest) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_connectors_proto_rawDescGZIP(), []int{23} +} + +func (x *ScanConnectorsRequest) GetInstanceId() string { + if x != nil { + return x.InstanceId + } + return "" +} + +type ScanConnectorsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Connectors []*ScannedConnector `protobuf:"bytes,1,rep,name=connectors,proto3" json:"connectors,omitempty"` +} + +func (x *ScanConnectorsResponse) Reset() { + *x = ScanConnectorsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_rill_runtime_v1_connectors_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ScanConnectorsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ScanConnectorsResponse) ProtoMessage() {} + +func (x *ScanConnectorsResponse) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_connectors_proto_msgTypes[24] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ScanConnectorsResponse.ProtoReflect.Descriptor instead. +func (*ScanConnectorsResponse) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_connectors_proto_rawDescGZIP(), []int{24} +} + +func (x *ScanConnectorsResponse) GetConnectors() []*ScannedConnector { + if x != nil { + return x.Connectors + } + return nil +} + +type ScannedConnector struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + HasAnonymousAccess bool `protobuf:"varint,3,opt,name=has_anonymous_access,json=hasAnonymousAccess,proto3" json:"has_anonymous_access,omitempty"` // reports whether access is present without any credentials +} + +func (x *ScannedConnector) Reset() { + *x = ScannedConnector{} + if protoimpl.UnsafeEnabled { + mi := &file_rill_runtime_v1_connectors_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ScannedConnector) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ScannedConnector) ProtoMessage() {} + +func (x *ScannedConnector) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_connectors_proto_msgTypes[25] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ScannedConnector.ProtoReflect.Descriptor instead. +func (*ScannedConnector) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_connectors_proto_rawDescGZIP(), []int{25} +} + +func (x *ScannedConnector) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *ScannedConnector) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *ScannedConnector) GetHasAnonymousAccess() bool { + if x != nil { + return x.HasAnonymousAccess + } + return false +} + var File_rill_runtime_v1_connectors_proto protoreflect.FileDescriptor var file_rill_runtime_v1_connectors_proto_rawDesc = []byte{ @@ -1690,108 +1847,132 @@ var file_rill_runtime_v1_connectors_proto_rawDesc = []byte{ 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x32, 0x88, 0x0b, 0x0a, 0x10, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x76, 0x0a, 0x0d, 0x53, 0x33, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, - 0x12, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x33, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x33, 0x4c, 0x69, 0x73, 0x74, - 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x33, 0x2f, - 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x86, 0x01, 0x0a, 0x0d, 0x53, 0x33, 0x4c, 0x69, - 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x33, 0x4c, 0x69, - 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x33, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, - 0x12, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x33, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2f, - 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x7d, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x12, 0x99, 0x01, 0x0a, 0x13, 0x53, 0x33, 0x47, 0x65, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x33, 0x47, 0x65, 0x74, - 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x33, 0x47, 0x65, 0x74, 0x42, 0x75, 0x63, - 0x6b, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x12, 0x1f, 0x2f, 0x76, 0x31, - 0x2f, 0x73, 0x33, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2f, 0x7b, 0x62, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x7d, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x94, 0x01, 0x0a, - 0x14, 0x53, 0x33, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, - 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x33, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x33, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x12, 0x17, 0x2f, 0x76, 0x31, 0x2f, - 0x73, 0x33, 0x2f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x5f, 0x69, - 0x6e, 0x66, 0x6f, 0x12, 0x7a, 0x0a, 0x0e, 0x47, 0x43, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x43, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x42, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, + 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x38, 0x0a, 0x15, 0x53, 0x63, + 0x61, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x49, 0x64, 0x22, 0x5b, 0x0a, 0x16, 0x53, 0x63, 0x61, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, + 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x73, 0x22, 0x6c, 0x0a, 0x10, 0x53, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x30, 0x0a, + 0x14, 0x68, 0x61, 0x73, 0x5f, 0x61, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x5f, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x68, 0x61, 0x73, + 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x32, + 0x88, 0x0c, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x7e, 0x0a, 0x0e, 0x53, 0x63, 0x61, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, + 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, + 0x13, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x2f, + 0x73, 0x63, 0x61, 0x6e, 0x12, 0x76, 0x0a, 0x0d, 0x53, 0x33, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, + 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x33, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, + 0x63, 0x6b, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x72, + 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x33, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x76, + 0x31, 0x2f, 0x73, 0x33, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x86, 0x01, 0x0a, + 0x0d, 0x53, 0x33, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x25, + 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x33, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x33, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x33, 0x2f, 0x62, 0x75, + 0x63, 0x6b, 0x65, 0x74, 0x2f, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x7d, 0x2f, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x13, 0x53, 0x33, 0x47, 0x65, 0x74, 0x42, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x43, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x12, 0x0f, - 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x63, 0x73, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, - 0x8a, 0x01, 0x0a, 0x0e, 0x47, 0x43, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x12, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x43, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x72, 0x69, 0x6c, + 0x53, 0x33, 0x47, 0x65, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x72, 0x69, 0x6c, + 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x33, 0x47, + 0x65, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, + 0x12, 0x1f, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x33, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2f, + 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x7d, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x94, 0x01, 0x0a, 0x14, 0x53, 0x33, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x2e, 0x72, 0x69, 0x6c, + 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x33, 0x47, + 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x33, 0x47, 0x65, 0x74, + 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x12, + 0x17, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x33, 0x2f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x7a, 0x0a, 0x0e, 0x47, 0x43, 0x53, 0x4c, + 0x69, 0x73, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x43, 0x53, - 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x12, 0x1f, 0x2f, 0x76, 0x31, - 0x2f, 0x67, 0x63, 0x73, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2f, 0x7b, 0x62, 0x75, 0x63, - 0x6b, 0x65, 0x74, 0x7d, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x98, 0x01, 0x0a, - 0x15, 0x47, 0x43, 0x53, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, - 0x6c, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x43, 0x53, 0x47, 0x65, 0x74, 0x43, - 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x43, 0x53, 0x47, 0x65, 0x74, 0x43, 0x72, - 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, - 0x76, 0x31, 0x2f, 0x67, 0x63, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, - 0x6c, 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x7a, 0x0a, 0x0e, 0x4f, 0x4c, 0x41, 0x50, 0x4c, - 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x4c, 0x41, 0x50, - 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x4c, 0x41, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x11, 0x12, 0x0f, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x6c, 0x61, 0x70, 0x2f, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x73, 0x12, 0x92, 0x01, 0x0a, 0x14, 0x42, 0x69, 0x67, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x4c, 0x69, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x73, 0x12, 0x2c, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, - 0x69, 0x67, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x73, - 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x69, 0x6c, - 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x69, 0x67, + 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x43, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x11, 0x12, 0x0f, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x63, 0x73, 0x2f, 0x62, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x73, 0x12, 0x8a, 0x01, 0x0a, 0x0e, 0x47, 0x43, 0x53, 0x4c, 0x69, 0x73, 0x74, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x26, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x43, 0x53, 0x4c, 0x69, 0x73, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x43, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, + 0x12, 0x1f, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x63, 0x73, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x2f, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x7d, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x73, 0x12, 0x98, 0x01, 0x0a, 0x15, 0x47, 0x43, 0x53, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x2e, 0x72, 0x69, + 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x43, + 0x53, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x72, 0x69, 0x6c, + 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x43, 0x53, + 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x63, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x7a, 0x0a, 0x0e, + 0x4f, 0x4c, 0x41, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x26, + 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x4f, 0x4c, 0x41, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x4c, 0x41, 0x50, 0x4c, 0x69, 0x73, + 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x12, 0x0f, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x6c, 0x61, + 0x70, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x92, 0x01, 0x0a, 0x14, 0x42, 0x69, 0x67, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x17, 0x12, 0x15, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x67, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2f, - 0x64, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x73, 0x12, 0x8a, 0x01, 0x0a, 0x12, 0x42, 0x69, 0x67, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, - 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x42, 0x69, 0x67, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x69, - 0x67, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, - 0x12, 0x13, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x67, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2f, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x73, 0x42, 0xb8, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x0f, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, - 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x69, 0x6c, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x72, 0x69, 0x6c, 0x6c, 0x2f, 0x72, 0x69, 0x6c, 0x6c, 0x2f, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x52, 0x52, 0x58, 0xaa, 0x02, 0x0f, 0x52, 0x69, 0x6c, - 0x6c, 0x2e, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0f, 0x52, - 0x69, 0x6c, 0x6c, 0x5c, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5c, 0x56, 0x31, 0xe2, 0x02, - 0x1b, 0x52, 0x69, 0x6c, 0x6c, 0x5c, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5c, 0x56, 0x31, - 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x11, 0x52, - 0x69, 0x6c, 0x6c, 0x3a, 0x3a, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x3a, 0x3a, 0x56, 0x31, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x12, 0x2c, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x69, 0x67, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, + 0x44, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x42, 0x69, 0x67, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x61, + 0x74, 0x61, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x67, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x73, 0x12, 0x8a, 0x01, + 0x0a, 0x12, 0x42, 0x69, 0x67, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x12, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x69, 0x67, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, + 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x42, 0x69, 0x67, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x67, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x42, 0xb8, 0x01, 0x0a, 0x13, 0x63, + 0x6f, 0x6d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x42, 0x0f, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x72, 0x69, 0x6c, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x72, 0x69, 0x6c, 0x6c, 0x2f, + 0x72, 0x69, 0x6c, 0x6c, 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x76, 0x31, 0x3b, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x52, 0x52, 0x58, 0xaa, + 0x02, 0x0f, 0x52, 0x69, 0x6c, 0x6c, 0x2e, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x56, + 0x31, 0xca, 0x02, 0x0f, 0x52, 0x69, 0x6c, 0x6c, 0x5c, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1b, 0x52, 0x69, 0x6c, 0x6c, 0x5c, 0x52, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0xea, 0x02, 0x11, 0x52, 0x69, 0x6c, 0x6c, 0x3a, 0x3a, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1806,7 +1987,7 @@ func file_rill_runtime_v1_connectors_proto_rawDescGZIP() []byte { return file_rill_runtime_v1_connectors_proto_rawDescData } -var file_rill_runtime_v1_connectors_proto_msgTypes = make([]protoimpl.MessageInfo, 23) +var file_rill_runtime_v1_connectors_proto_msgTypes = make([]protoimpl.MessageInfo, 26) var file_rill_runtime_v1_connectors_proto_goTypes = []interface{}{ (*S3Object)(nil), // 0: rill.runtime.v1.S3Object (*S3ListBucketsRequest)(nil), // 1: rill.runtime.v1.S3ListBucketsRequest @@ -1831,39 +2012,45 @@ var file_rill_runtime_v1_connectors_proto_goTypes = []interface{}{ (*BigQueryListDatasetsResponse)(nil), // 20: rill.runtime.v1.BigQueryListDatasetsResponse (*BigQueryListTablesRequest)(nil), // 21: rill.runtime.v1.BigQueryListTablesRequest (*BigQueryListTablesResponse)(nil), // 22: rill.runtime.v1.BigQueryListTablesResponse - (*timestamppb.Timestamp)(nil), // 23: google.protobuf.Timestamp + (*ScanConnectorsRequest)(nil), // 23: rill.runtime.v1.ScanConnectorsRequest + (*ScanConnectorsResponse)(nil), // 24: rill.runtime.v1.ScanConnectorsResponse + (*ScannedConnector)(nil), // 25: rill.runtime.v1.ScannedConnector + (*timestamppb.Timestamp)(nil), // 26: google.protobuf.Timestamp } var file_rill_runtime_v1_connectors_proto_depIdxs = []int32{ - 23, // 0: rill.runtime.v1.S3Object.modified_on:type_name -> google.protobuf.Timestamp + 26, // 0: rill.runtime.v1.S3Object.modified_on:type_name -> google.protobuf.Timestamp 0, // 1: rill.runtime.v1.S3ListObjectsResponse.objects:type_name -> rill.runtime.v1.S3Object - 23, // 2: rill.runtime.v1.GCSObject.modified_on:type_name -> google.protobuf.Timestamp + 26, // 2: rill.runtime.v1.GCSObject.modified_on:type_name -> google.protobuf.Timestamp 9, // 3: rill.runtime.v1.GCSListObjectsResponse.objects:type_name -> rill.runtime.v1.GCSObject 18, // 4: rill.runtime.v1.OLAPListTablesResponse.tables:type_name -> rill.runtime.v1.TableInfo - 1, // 5: rill.runtime.v1.ConnectorService.S3ListBuckets:input_type -> rill.runtime.v1.S3ListBucketsRequest - 3, // 6: rill.runtime.v1.ConnectorService.S3ListObjects:input_type -> rill.runtime.v1.S3ListObjectsRequest - 5, // 7: rill.runtime.v1.ConnectorService.S3GetBucketMetadata:input_type -> rill.runtime.v1.S3GetBucketMetadataRequest - 7, // 8: rill.runtime.v1.ConnectorService.S3GetCredentialsInfo:input_type -> rill.runtime.v1.S3GetCredentialsInfoRequest - 10, // 9: rill.runtime.v1.ConnectorService.GCSListBuckets:input_type -> rill.runtime.v1.GCSListBucketsRequest - 12, // 10: rill.runtime.v1.ConnectorService.GCSListObjects:input_type -> rill.runtime.v1.GCSListObjectsRequest - 14, // 11: rill.runtime.v1.ConnectorService.GCSGetCredentialsInfo:input_type -> rill.runtime.v1.GCSGetCredentialsInfoRequest - 16, // 12: rill.runtime.v1.ConnectorService.OLAPListTables:input_type -> rill.runtime.v1.OLAPListTablesRequest - 19, // 13: rill.runtime.v1.ConnectorService.BigQueryListDatasets:input_type -> rill.runtime.v1.BigQueryListDatasetsRequest - 21, // 14: rill.runtime.v1.ConnectorService.BigQueryListTables:input_type -> rill.runtime.v1.BigQueryListTablesRequest - 2, // 15: rill.runtime.v1.ConnectorService.S3ListBuckets:output_type -> rill.runtime.v1.S3ListBucketsResponse - 4, // 16: rill.runtime.v1.ConnectorService.S3ListObjects:output_type -> rill.runtime.v1.S3ListObjectsResponse - 6, // 17: rill.runtime.v1.ConnectorService.S3GetBucketMetadata:output_type -> rill.runtime.v1.S3GetBucketMetadataResponse - 8, // 18: rill.runtime.v1.ConnectorService.S3GetCredentialsInfo:output_type -> rill.runtime.v1.S3GetCredentialsInfoResponse - 11, // 19: rill.runtime.v1.ConnectorService.GCSListBuckets:output_type -> rill.runtime.v1.GCSListBucketsResponse - 13, // 20: rill.runtime.v1.ConnectorService.GCSListObjects:output_type -> rill.runtime.v1.GCSListObjectsResponse - 15, // 21: rill.runtime.v1.ConnectorService.GCSGetCredentialsInfo:output_type -> rill.runtime.v1.GCSGetCredentialsInfoResponse - 17, // 22: rill.runtime.v1.ConnectorService.OLAPListTables:output_type -> rill.runtime.v1.OLAPListTablesResponse - 20, // 23: rill.runtime.v1.ConnectorService.BigQueryListDatasets:output_type -> rill.runtime.v1.BigQueryListDatasetsResponse - 22, // 24: rill.runtime.v1.ConnectorService.BigQueryListTables:output_type -> rill.runtime.v1.BigQueryListTablesResponse - 15, // [15:25] is the sub-list for method output_type - 5, // [5:15] is the sub-list for method input_type - 5, // [5:5] is the sub-list for extension type_name - 5, // [5:5] is the sub-list for extension extendee - 0, // [0:5] is the sub-list for field type_name + 25, // 5: rill.runtime.v1.ScanConnectorsResponse.connectors:type_name -> rill.runtime.v1.ScannedConnector + 23, // 6: rill.runtime.v1.ConnectorService.ScanConnectors:input_type -> rill.runtime.v1.ScanConnectorsRequest + 1, // 7: rill.runtime.v1.ConnectorService.S3ListBuckets:input_type -> rill.runtime.v1.S3ListBucketsRequest + 3, // 8: rill.runtime.v1.ConnectorService.S3ListObjects:input_type -> rill.runtime.v1.S3ListObjectsRequest + 5, // 9: rill.runtime.v1.ConnectorService.S3GetBucketMetadata:input_type -> rill.runtime.v1.S3GetBucketMetadataRequest + 7, // 10: rill.runtime.v1.ConnectorService.S3GetCredentialsInfo:input_type -> rill.runtime.v1.S3GetCredentialsInfoRequest + 10, // 11: rill.runtime.v1.ConnectorService.GCSListBuckets:input_type -> rill.runtime.v1.GCSListBucketsRequest + 12, // 12: rill.runtime.v1.ConnectorService.GCSListObjects:input_type -> rill.runtime.v1.GCSListObjectsRequest + 14, // 13: rill.runtime.v1.ConnectorService.GCSGetCredentialsInfo:input_type -> rill.runtime.v1.GCSGetCredentialsInfoRequest + 16, // 14: rill.runtime.v1.ConnectorService.OLAPListTables:input_type -> rill.runtime.v1.OLAPListTablesRequest + 19, // 15: rill.runtime.v1.ConnectorService.BigQueryListDatasets:input_type -> rill.runtime.v1.BigQueryListDatasetsRequest + 21, // 16: rill.runtime.v1.ConnectorService.BigQueryListTables:input_type -> rill.runtime.v1.BigQueryListTablesRequest + 24, // 17: rill.runtime.v1.ConnectorService.ScanConnectors:output_type -> rill.runtime.v1.ScanConnectorsResponse + 2, // 18: rill.runtime.v1.ConnectorService.S3ListBuckets:output_type -> rill.runtime.v1.S3ListBucketsResponse + 4, // 19: rill.runtime.v1.ConnectorService.S3ListObjects:output_type -> rill.runtime.v1.S3ListObjectsResponse + 6, // 20: rill.runtime.v1.ConnectorService.S3GetBucketMetadata:output_type -> rill.runtime.v1.S3GetBucketMetadataResponse + 8, // 21: rill.runtime.v1.ConnectorService.S3GetCredentialsInfo:output_type -> rill.runtime.v1.S3GetCredentialsInfoResponse + 11, // 22: rill.runtime.v1.ConnectorService.GCSListBuckets:output_type -> rill.runtime.v1.GCSListBucketsResponse + 13, // 23: rill.runtime.v1.ConnectorService.GCSListObjects:output_type -> rill.runtime.v1.GCSListObjectsResponse + 15, // 24: rill.runtime.v1.ConnectorService.GCSGetCredentialsInfo:output_type -> rill.runtime.v1.GCSGetCredentialsInfoResponse + 17, // 25: rill.runtime.v1.ConnectorService.OLAPListTables:output_type -> rill.runtime.v1.OLAPListTablesResponse + 20, // 26: rill.runtime.v1.ConnectorService.BigQueryListDatasets:output_type -> rill.runtime.v1.BigQueryListDatasetsResponse + 22, // 27: rill.runtime.v1.ConnectorService.BigQueryListTables:output_type -> rill.runtime.v1.BigQueryListTablesResponse + 17, // [17:28] is the sub-list for method output_type + 6, // [6:17] is the sub-list for method input_type + 6, // [6:6] is the sub-list for extension type_name + 6, // [6:6] is the sub-list for extension extendee + 0, // [0:6] is the sub-list for field type_name } func init() { file_rill_runtime_v1_connectors_proto_init() } @@ -2148,6 +2335,42 @@ func file_rill_runtime_v1_connectors_proto_init() { return nil } } + file_rill_runtime_v1_connectors_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ScanConnectorsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rill_runtime_v1_connectors_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ScanConnectorsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rill_runtime_v1_connectors_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ScannedConnector); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -2155,7 +2378,7 @@ func file_rill_runtime_v1_connectors_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_rill_runtime_v1_connectors_proto_rawDesc, NumEnums: 0, - NumMessages: 23, + NumMessages: 26, NumExtensions: 0, NumServices: 1, }, diff --git a/proto/gen/rill/runtime/v1/connectors.pb.gw.go b/proto/gen/rill/runtime/v1/connectors.pb.gw.go index fc2a1430d9a..4d019602f01 100644 --- a/proto/gen/rill/runtime/v1/connectors.pb.gw.go +++ b/proto/gen/rill/runtime/v1/connectors.pb.gw.go @@ -31,6 +31,42 @@ var _ = runtime.String var _ = utilities.NewDoubleArray var _ = metadata.Join +var ( + filter_ConnectorService_ScanConnectors_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_ConnectorService_ScanConnectors_0(ctx context.Context, marshaler runtime.Marshaler, client ConnectorServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ScanConnectorsRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ConnectorService_ScanConnectors_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ScanConnectors(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ConnectorService_ScanConnectors_0(ctx context.Context, marshaler runtime.Marshaler, server ConnectorServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ScanConnectorsRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ConnectorService_ScanConnectors_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ScanConnectors(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_ConnectorService_S3ListBuckets_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -499,6 +535,31 @@ func local_request_ConnectorService_BigQueryListTables_0(ctx context.Context, ma // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterConnectorServiceHandlerFromEndpoint instead. func RegisterConnectorServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server ConnectorServiceServer) error { + mux.Handle("GET", pattern_ConnectorService_ScanConnectors_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/rill.runtime.v1.ConnectorService/ScanConnectors", runtime.WithHTTPPathPattern("/v1/connectors/scan")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ConnectorService_ScanConnectors_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ConnectorService_ScanConnectors_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_ConnectorService_S3ListBuckets_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -790,6 +851,28 @@ func RegisterConnectorServiceHandler(ctx context.Context, mux *runtime.ServeMux, // "ConnectorServiceClient" to call the correct interceptors. func RegisterConnectorServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client ConnectorServiceClient) error { + mux.Handle("GET", pattern_ConnectorService_ScanConnectors_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/rill.runtime.v1.ConnectorService/ScanConnectors", runtime.WithHTTPPathPattern("/v1/connectors/scan")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ConnectorService_ScanConnectors_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ConnectorService_ScanConnectors_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_ConnectorService_S3ListBuckets_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1014,6 +1097,8 @@ func RegisterConnectorServiceHandlerClient(ctx context.Context, mux *runtime.Ser } var ( + pattern_ConnectorService_ScanConnectors_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "connectors", "scan"}, "")) + pattern_ConnectorService_S3ListBuckets_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "s3", "buckets"}, "")) pattern_ConnectorService_S3ListObjects_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"v1", "s3", "bucket", "objects"}, "")) @@ -1036,6 +1121,8 @@ var ( ) var ( + forward_ConnectorService_ScanConnectors_0 = runtime.ForwardResponseMessage + forward_ConnectorService_S3ListBuckets_0 = runtime.ForwardResponseMessage forward_ConnectorService_S3ListObjects_0 = runtime.ForwardResponseMessage diff --git a/proto/gen/rill/runtime/v1/connectors.pb.validate.go b/proto/gen/rill/runtime/v1/connectors.pb.validate.go index 703380b4af8..209df01af34 100644 --- a/proto/gen/rill/runtime/v1/connectors.pb.validate.go +++ b/proto/gen/rill/runtime/v1/connectors.pb.validate.go @@ -2756,3 +2756,349 @@ var _ interface { Cause() error ErrorName() string } = BigQueryListTablesResponseValidationError{} + +// Validate checks the field values on ScanConnectorsRequest 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 *ScanConnectorsRequest) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on ScanConnectorsRequest 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 +// ScanConnectorsRequestMultiError, or nil if none found. +func (m *ScanConnectorsRequest) ValidateAll() error { + return m.validate(true) +} + +func (m *ScanConnectorsRequest) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for InstanceId + + if len(errors) > 0 { + return ScanConnectorsRequestMultiError(errors) + } + + return nil +} + +// ScanConnectorsRequestMultiError is an error wrapping multiple validation +// errors returned by ScanConnectorsRequest.ValidateAll() if the designated +// constraints aren't met. +type ScanConnectorsRequestMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m ScanConnectorsRequestMultiError) 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 ScanConnectorsRequestMultiError) AllErrors() []error { return m } + +// ScanConnectorsRequestValidationError is the validation error returned by +// ScanConnectorsRequest.Validate if the designated constraints aren't met. +type ScanConnectorsRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e ScanConnectorsRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e ScanConnectorsRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e ScanConnectorsRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e ScanConnectorsRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e ScanConnectorsRequestValidationError) ErrorName() string { + return "ScanConnectorsRequestValidationError" +} + +// Error satisfies the builtin error interface +func (e ScanConnectorsRequestValidationError) 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 %sScanConnectorsRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = ScanConnectorsRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = ScanConnectorsRequestValidationError{} + +// Validate checks the field values on ScanConnectorsResponse 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 *ScanConnectorsResponse) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on ScanConnectorsResponse 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 +// ScanConnectorsResponseMultiError, or nil if none found. +func (m *ScanConnectorsResponse) ValidateAll() error { + return m.validate(true) +} + +func (m *ScanConnectorsResponse) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + for idx, item := range m.GetConnectors() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ScanConnectorsResponseValidationError{ + field: fmt.Sprintf("Connectors[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ScanConnectorsResponseValidationError{ + field: fmt.Sprintf("Connectors[%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 ScanConnectorsResponseValidationError{ + field: fmt.Sprintf("Connectors[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + if len(errors) > 0 { + return ScanConnectorsResponseMultiError(errors) + } + + return nil +} + +// ScanConnectorsResponseMultiError is an error wrapping multiple validation +// errors returned by ScanConnectorsResponse.ValidateAll() if the designated +// constraints aren't met. +type ScanConnectorsResponseMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m ScanConnectorsResponseMultiError) 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 ScanConnectorsResponseMultiError) AllErrors() []error { return m } + +// ScanConnectorsResponseValidationError is the validation error returned by +// ScanConnectorsResponse.Validate if the designated constraints aren't met. +type ScanConnectorsResponseValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e ScanConnectorsResponseValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e ScanConnectorsResponseValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e ScanConnectorsResponseValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e ScanConnectorsResponseValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e ScanConnectorsResponseValidationError) ErrorName() string { + return "ScanConnectorsResponseValidationError" +} + +// Error satisfies the builtin error interface +func (e ScanConnectorsResponseValidationError) 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 %sScanConnectorsResponse.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = ScanConnectorsResponseValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = ScanConnectorsResponseValidationError{} + +// Validate checks the field values on ScannedConnector 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 *ScannedConnector) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on ScannedConnector 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 +// ScannedConnectorMultiError, or nil if none found. +func (m *ScannedConnector) ValidateAll() error { + return m.validate(true) +} + +func (m *ScannedConnector) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Name + + // no validation rules for Type + + // no validation rules for HasAnonymousAccess + + if len(errors) > 0 { + return ScannedConnectorMultiError(errors) + } + + return nil +} + +// ScannedConnectorMultiError is an error wrapping multiple validation errors +// returned by ScannedConnector.ValidateAll() if the designated constraints +// aren't met. +type ScannedConnectorMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m ScannedConnectorMultiError) 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 ScannedConnectorMultiError) AllErrors() []error { return m } + +// ScannedConnectorValidationError is the validation error returned by +// ScannedConnector.Validate if the designated constraints aren't met. +type ScannedConnectorValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e ScannedConnectorValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e ScannedConnectorValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e ScannedConnectorValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e ScannedConnectorValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e ScannedConnectorValidationError) ErrorName() string { return "ScannedConnectorValidationError" } + +// Error satisfies the builtin error interface +func (e ScannedConnectorValidationError) 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 %sScannedConnector.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = ScannedConnectorValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = ScannedConnectorValidationError{} diff --git a/proto/gen/rill/runtime/v1/connectors_grpc.pb.go b/proto/gen/rill/runtime/v1/connectors_grpc.pb.go index ff27fb23b0d..d496778ab25 100644 --- a/proto/gen/rill/runtime/v1/connectors_grpc.pb.go +++ b/proto/gen/rill/runtime/v1/connectors_grpc.pb.go @@ -19,6 +19,7 @@ import ( const _ = grpc.SupportPackageIsVersion7 const ( + ConnectorService_ScanConnectors_FullMethodName = "/rill.runtime.v1.ConnectorService/ScanConnectors" ConnectorService_S3ListBuckets_FullMethodName = "/rill.runtime.v1.ConnectorService/S3ListBuckets" ConnectorService_S3ListObjects_FullMethodName = "/rill.runtime.v1.ConnectorService/S3ListObjects" ConnectorService_S3GetBucketMetadata_FullMethodName = "/rill.runtime.v1.ConnectorService/S3GetBucketMetadata" @@ -35,6 +36,10 @@ const ( // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type ConnectorServiceClient interface { + // ScanConnectors scans the artifacts for connectors and returns information about + // the connectors referenced in the artifacts. The information includes name,type and + // credentials for the connector. + ScanConnectors(ctx context.Context, in *ScanConnectorsRequest, opts ...grpc.CallOption) (*ScanConnectorsResponse, error) // S3ListBuckets lists buckets accessible with the configured credentials. S3ListBuckets(ctx context.Context, in *S3ListBucketsRequest, opts ...grpc.CallOption) (*S3ListBucketsResponse, error) // S3ListBuckets lists objects for the given bucket. @@ -65,6 +70,15 @@ func NewConnectorServiceClient(cc grpc.ClientConnInterface) ConnectorServiceClie return &connectorServiceClient{cc} } +func (c *connectorServiceClient) ScanConnectors(ctx context.Context, in *ScanConnectorsRequest, opts ...grpc.CallOption) (*ScanConnectorsResponse, error) { + out := new(ScanConnectorsResponse) + err := c.cc.Invoke(ctx, ConnectorService_ScanConnectors_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *connectorServiceClient) S3ListBuckets(ctx context.Context, in *S3ListBucketsRequest, opts ...grpc.CallOption) (*S3ListBucketsResponse, error) { out := new(S3ListBucketsResponse) err := c.cc.Invoke(ctx, ConnectorService_S3ListBuckets_FullMethodName, in, out, opts...) @@ -159,6 +173,10 @@ func (c *connectorServiceClient) BigQueryListTables(ctx context.Context, in *Big // All implementations must embed UnimplementedConnectorServiceServer // for forward compatibility type ConnectorServiceServer interface { + // ScanConnectors scans the artifacts for connectors and returns information about + // the connectors referenced in the artifacts. The information includes name,type and + // credentials for the connector. + ScanConnectors(context.Context, *ScanConnectorsRequest) (*ScanConnectorsResponse, error) // S3ListBuckets lists buckets accessible with the configured credentials. S3ListBuckets(context.Context, *S3ListBucketsRequest) (*S3ListBucketsResponse, error) // S3ListBuckets lists objects for the given bucket. @@ -186,6 +204,9 @@ type ConnectorServiceServer interface { type UnimplementedConnectorServiceServer struct { } +func (UnimplementedConnectorServiceServer) ScanConnectors(context.Context, *ScanConnectorsRequest) (*ScanConnectorsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ScanConnectors not implemented") +} func (UnimplementedConnectorServiceServer) S3ListBuckets(context.Context, *S3ListBucketsRequest) (*S3ListBucketsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method S3ListBuckets not implemented") } @@ -229,6 +250,24 @@ func RegisterConnectorServiceServer(s grpc.ServiceRegistrar, srv ConnectorServic s.RegisterService(&ConnectorService_ServiceDesc, srv) } +func _ConnectorService_ScanConnectors_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ScanConnectorsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ConnectorServiceServer).ScanConnectors(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ConnectorService_ScanConnectors_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ConnectorServiceServer).ScanConnectors(ctx, req.(*ScanConnectorsRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _ConnectorService_S3ListBuckets_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(S3ListBucketsRequest) if err := dec(in); err != nil { @@ -416,6 +455,10 @@ var ConnectorService_ServiceDesc = grpc.ServiceDesc{ ServiceName: "rill.runtime.v1.ConnectorService", HandlerType: (*ConnectorServiceServer)(nil), Methods: []grpc.MethodDesc{ + { + MethodName: "ScanConnectors", + Handler: _ConnectorService_ScanConnectors_Handler, + }, { MethodName: "S3ListBuckets", Handler: _ConnectorService_S3ListBuckets_Handler, diff --git a/proto/gen/rill/runtime/v1/queries.pb.go b/proto/gen/rill/runtime/v1/queries.pb.go index a8e7ab2e53f..b5e14b04a0d 100644 --- a/proto/gen/rill/runtime/v1/queries.pb.go +++ b/proto/gen/rill/runtime/v1/queries.pb.go @@ -77,6 +77,55 @@ func (ExportFormat) EnumDescriptor() ([]byte, []int) { return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{0} } +type BuiltinMeasure int32 + +const ( + BuiltinMeasure_BUILTIN_MEASURE_UNSPECIFIED BuiltinMeasure = 0 + BuiltinMeasure_BUILTIN_MEASURE_COUNT BuiltinMeasure = 1 + BuiltinMeasure_BUILTIN_MEASURE_COUNT_DISTINCT BuiltinMeasure = 2 +) + +// Enum value maps for BuiltinMeasure. +var ( + BuiltinMeasure_name = map[int32]string{ + 0: "BUILTIN_MEASURE_UNSPECIFIED", + 1: "BUILTIN_MEASURE_COUNT", + 2: "BUILTIN_MEASURE_COUNT_DISTINCT", + } + BuiltinMeasure_value = map[string]int32{ + "BUILTIN_MEASURE_UNSPECIFIED": 0, + "BUILTIN_MEASURE_COUNT": 1, + "BUILTIN_MEASURE_COUNT_DISTINCT": 2, + } +) + +func (x BuiltinMeasure) Enum() *BuiltinMeasure { + p := new(BuiltinMeasure) + *p = x + return p +} + +func (x BuiltinMeasure) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (BuiltinMeasure) Descriptor() protoreflect.EnumDescriptor { + return file_rill_runtime_v1_queries_proto_enumTypes[1].Descriptor() +} + +func (BuiltinMeasure) Type() protoreflect.EnumType { + return &file_rill_runtime_v1_queries_proto_enumTypes[1] +} + +func (x BuiltinMeasure) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use BuiltinMeasure.Descriptor instead. +func (BuiltinMeasure) EnumDescriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{1} +} + type MetricsViewComparisonSortType int32 const ( @@ -116,11 +165,11 @@ func (x MetricsViewComparisonSortType) String() string { } func (MetricsViewComparisonSortType) Descriptor() protoreflect.EnumDescriptor { - return file_rill_runtime_v1_queries_proto_enumTypes[1].Descriptor() + return file_rill_runtime_v1_queries_proto_enumTypes[2].Descriptor() } func (MetricsViewComparisonSortType) Type() protoreflect.EnumType { - return &file_rill_runtime_v1_queries_proto_enumTypes[1] + return &file_rill_runtime_v1_queries_proto_enumTypes[2] } func (x MetricsViewComparisonSortType) Number() protoreflect.EnumNumber { @@ -129,7 +178,7 @@ func (x MetricsViewComparisonSortType) Number() protoreflect.EnumNumber { // Deprecated: Use MetricsViewComparisonSortType.Descriptor instead. func (MetricsViewComparisonSortType) EnumDescriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{1} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{2} } type HistogramMethod int32 @@ -165,11 +214,11 @@ func (x HistogramMethod) String() string { } func (HistogramMethod) Descriptor() protoreflect.EnumDescriptor { - return file_rill_runtime_v1_queries_proto_enumTypes[2].Descriptor() + return file_rill_runtime_v1_queries_proto_enumTypes[3].Descriptor() } func (HistogramMethod) Type() protoreflect.EnumType { - return &file_rill_runtime_v1_queries_proto_enumTypes[2] + return &file_rill_runtime_v1_queries_proto_enumTypes[3] } func (x HistogramMethod) Number() protoreflect.EnumNumber { @@ -178,7 +227,7 @@ func (x HistogramMethod) Number() protoreflect.EnumNumber { // Deprecated: Use HistogramMethod.Descriptor instead. func (HistogramMethod) EnumDescriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{2} + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{3} } // Request message for QueryService.Query @@ -343,6 +392,7 @@ type ExportRequest struct { Format ExportFormat `protobuf:"varint,3,opt,name=format,proto3,enum=rill.runtime.v1.ExportFormat" json:"format,omitempty"` // Types that are assignable to Request: // + // *ExportRequest_MetricsViewAggregationRequest // *ExportRequest_MetricsViewToplistRequest // *ExportRequest_MetricsViewRowsRequest // *ExportRequest_MetricsViewTimeSeriesRequest @@ -409,6 +459,13 @@ func (m *ExportRequest) GetRequest() isExportRequest_Request { return nil } +func (x *ExportRequest) GetMetricsViewAggregationRequest() *MetricsViewAggregationRequest { + if x, ok := x.GetRequest().(*ExportRequest_MetricsViewAggregationRequest); ok { + return x.MetricsViewAggregationRequest + } + return nil +} + func (x *ExportRequest) GetMetricsViewToplistRequest() *MetricsViewToplistRequest { if x, ok := x.GetRequest().(*ExportRequest_MetricsViewToplistRequest); ok { return x.MetricsViewToplistRequest @@ -434,6 +491,10 @@ type isExportRequest_Request interface { isExportRequest_Request() } +type ExportRequest_MetricsViewAggregationRequest struct { + MetricsViewAggregationRequest *MetricsViewAggregationRequest `protobuf:"bytes,7,opt,name=metrics_view_aggregation_request,json=metricsViewAggregationRequest,proto3,oneof"` +} + type ExportRequest_MetricsViewToplistRequest struct { MetricsViewToplistRequest *MetricsViewToplistRequest `protobuf:"bytes,4,opt,name=metrics_view_toplist_request,json=metricsViewToplistRequest,proto3,oneof"` } @@ -446,6 +507,8 @@ type ExportRequest_MetricsViewTimeSeriesRequest struct { MetricsViewTimeSeriesRequest *MetricsViewTimeSeriesRequest `protobuf:"bytes,6,opt,name=metrics_view_time_series_request,json=metricsViewTimeSeriesRequest,proto3,oneof"` } +func (*ExportRequest_MetricsViewAggregationRequest) isExportRequest_Request() {} + func (*ExportRequest_MetricsViewToplistRequest) isExportRequest_Request() {} func (*ExportRequest_MetricsViewRowsRequest) isExportRequest_Request() {} @@ -500,28 +563,26 @@ func (x *ExportResponse) GetDownloadUrlPath() string { return "" } -// Request message for QueryService.MetricsViewToplist -type MetricsViewToplistRequest struct { +type MetricsViewAggregationRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` - MetricsViewName string `protobuf:"bytes,2,opt,name=metrics_view_name,json=metricsViewName,proto3" json:"metrics_view_name,omitempty"` - DimensionName string `protobuf:"bytes,3,opt,name=dimension_name,json=dimensionName,proto3" json:"dimension_name,omitempty"` - MeasureNames []string `protobuf:"bytes,4,rep,name=measure_names,json=measureNames,proto3" json:"measure_names,omitempty"` - InlineMeasures []*InlineMeasure `protobuf:"bytes,12,rep,name=inline_measures,json=inlineMeasures,proto3" json:"inline_measures,omitempty"` - TimeStart *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=time_start,json=timeStart,proto3" json:"time_start,omitempty"` - TimeEnd *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=time_end,json=timeEnd,proto3" json:"time_end,omitempty"` - Limit int64 `protobuf:"varint,7,opt,name=limit,proto3" json:"limit,omitempty"` - Offset int64 `protobuf:"varint,8,opt,name=offset,proto3" json:"offset,omitempty"` - Sort []*MetricsViewSort `protobuf:"bytes,9,rep,name=sort,proto3" json:"sort,omitempty"` - Filter *MetricsViewFilter `protobuf:"bytes,10,opt,name=filter,proto3" json:"filter,omitempty"` - Priority int32 `protobuf:"varint,11,opt,name=priority,proto3" json:"priority,omitempty"` -} - -func (x *MetricsViewToplistRequest) Reset() { - *x = MetricsViewToplistRequest{} + InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` + MetricsView string `protobuf:"bytes,2,opt,name=metrics_view,json=metricsView,proto3" json:"metrics_view,omitempty"` + Dimensions []*MetricsViewAggregationDimension `protobuf:"bytes,3,rep,name=dimensions,proto3" json:"dimensions,omitempty"` + Measures []*MetricsViewAggregationMeasure `protobuf:"bytes,4,rep,name=measures,proto3" json:"measures,omitempty"` + Sort []*MetricsViewAggregationSort `protobuf:"bytes,5,rep,name=sort,proto3" json:"sort,omitempty"` + TimeStart *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=time_start,json=timeStart,proto3" json:"time_start,omitempty"` + TimeEnd *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=time_end,json=timeEnd,proto3" json:"time_end,omitempty"` + Filter *MetricsViewFilter `protobuf:"bytes,8,opt,name=filter,proto3" json:"filter,omitempty"` + Limit int64 `protobuf:"varint,9,opt,name=limit,proto3" json:"limit,omitempty"` + Offset int64 `protobuf:"varint,10,opt,name=offset,proto3" json:"offset,omitempty"` + Priority int32 `protobuf:"varint,11,opt,name=priority,proto3" json:"priority,omitempty"` +} + +func (x *MetricsViewAggregationRequest) Reset() { + *x = MetricsViewAggregationRequest{} if protoimpl.UnsafeEnabled { mi := &file_rill_runtime_v1_queries_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -529,13 +590,13 @@ func (x *MetricsViewToplistRequest) Reset() { } } -func (x *MetricsViewToplistRequest) String() string { +func (x *MetricsViewAggregationRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MetricsViewToplistRequest) ProtoMessage() {} +func (*MetricsViewAggregationRequest) ProtoMessage() {} -func (x *MetricsViewToplistRequest) ProtoReflect() protoreflect.Message { +func (x *MetricsViewAggregationRequest) ProtoReflect() protoreflect.Message { mi := &file_rill_runtime_v1_queries_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -547,107 +608,99 @@ func (x *MetricsViewToplistRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use MetricsViewToplistRequest.ProtoReflect.Descriptor instead. -func (*MetricsViewToplistRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use MetricsViewAggregationRequest.ProtoReflect.Descriptor instead. +func (*MetricsViewAggregationRequest) Descriptor() ([]byte, []int) { return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{4} } -func (x *MetricsViewToplistRequest) GetInstanceId() string { +func (x *MetricsViewAggregationRequest) GetInstanceId() string { if x != nil { return x.InstanceId } return "" } -func (x *MetricsViewToplistRequest) GetMetricsViewName() string { +func (x *MetricsViewAggregationRequest) GetMetricsView() string { if x != nil { - return x.MetricsViewName + return x.MetricsView } return "" } -func (x *MetricsViewToplistRequest) GetDimensionName() string { +func (x *MetricsViewAggregationRequest) GetDimensions() []*MetricsViewAggregationDimension { if x != nil { - return x.DimensionName + return x.Dimensions } - return "" + return nil } -func (x *MetricsViewToplistRequest) GetMeasureNames() []string { +func (x *MetricsViewAggregationRequest) GetMeasures() []*MetricsViewAggregationMeasure { if x != nil { - return x.MeasureNames + return x.Measures } return nil } -func (x *MetricsViewToplistRequest) GetInlineMeasures() []*InlineMeasure { +func (x *MetricsViewAggregationRequest) GetSort() []*MetricsViewAggregationSort { if x != nil { - return x.InlineMeasures + return x.Sort } return nil } -func (x *MetricsViewToplistRequest) GetTimeStart() *timestamppb.Timestamp { +func (x *MetricsViewAggregationRequest) GetTimeStart() *timestamppb.Timestamp { if x != nil { return x.TimeStart } return nil } -func (x *MetricsViewToplistRequest) GetTimeEnd() *timestamppb.Timestamp { +func (x *MetricsViewAggregationRequest) GetTimeEnd() *timestamppb.Timestamp { if x != nil { return x.TimeEnd } return nil } -func (x *MetricsViewToplistRequest) GetLimit() int64 { +func (x *MetricsViewAggregationRequest) GetFilter() *MetricsViewFilter { if x != nil { - return x.Limit + return x.Filter } - return 0 + return nil } -func (x *MetricsViewToplistRequest) GetOffset() int64 { +func (x *MetricsViewAggregationRequest) GetLimit() int64 { if x != nil { - return x.Offset + return x.Limit } return 0 } -func (x *MetricsViewToplistRequest) GetSort() []*MetricsViewSort { - if x != nil { - return x.Sort - } - return nil -} - -func (x *MetricsViewToplistRequest) GetFilter() *MetricsViewFilter { +func (x *MetricsViewAggregationRequest) GetOffset() int64 { if x != nil { - return x.Filter + return x.Offset } - return nil + return 0 } -func (x *MetricsViewToplistRequest) GetPriority() int32 { +func (x *MetricsViewAggregationRequest) GetPriority() int32 { if x != nil { return x.Priority } return 0 } -// Response message for QueryService.MetricsViewToplist -type MetricsViewToplistResponse struct { +type MetricsViewAggregationResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Meta []*MetricsViewColumn `protobuf:"bytes,1,rep,name=meta,proto3" json:"meta,omitempty"` - Data []*structpb.Struct `protobuf:"bytes,2,rep,name=data,proto3" json:"data,omitempty"` + Schema *StructType `protobuf:"bytes,1,opt,name=schema,proto3" json:"schema,omitempty"` + Data []*structpb.Struct `protobuf:"bytes,2,rep,name=data,proto3" json:"data,omitempty"` } -func (x *MetricsViewToplistResponse) Reset() { - *x = MetricsViewToplistResponse{} +func (x *MetricsViewAggregationResponse) Reset() { + *x = MetricsViewAggregationResponse{} if protoimpl.UnsafeEnabled { mi := &file_rill_runtime_v1_queries_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -655,13 +708,13 @@ func (x *MetricsViewToplistResponse) Reset() { } } -func (x *MetricsViewToplistResponse) String() string { +func (x *MetricsViewAggregationResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MetricsViewToplistResponse) ProtoMessage() {} +func (*MetricsViewAggregationResponse) ProtoMessage() {} -func (x *MetricsViewToplistResponse) ProtoReflect() protoreflect.Message { +func (x *MetricsViewAggregationResponse) ProtoReflect() protoreflect.Message { mi := &file_rill_runtime_v1_queries_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -673,47 +726,37 @@ func (x *MetricsViewToplistResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use MetricsViewToplistResponse.ProtoReflect.Descriptor instead. -func (*MetricsViewToplistResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use MetricsViewAggregationResponse.ProtoReflect.Descriptor instead. +func (*MetricsViewAggregationResponse) Descriptor() ([]byte, []int) { return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{5} } -func (x *MetricsViewToplistResponse) GetMeta() []*MetricsViewColumn { +func (x *MetricsViewAggregationResponse) GetSchema() *StructType { if x != nil { - return x.Meta + return x.Schema } return nil } -func (x *MetricsViewToplistResponse) GetData() []*structpb.Struct { +func (x *MetricsViewAggregationResponse) GetData() []*structpb.Struct { if x != nil { return x.Data } return nil } -// Request message for QueryService.MetricsViewComparisonToplist -type MetricsViewComparisonToplistRequest struct { +type MetricsViewAggregationDimension struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` - MetricsViewName string `protobuf:"bytes,2,opt,name=metrics_view_name,json=metricsViewName,proto3" json:"metrics_view_name,omitempty"` - DimensionName string `protobuf:"bytes,3,opt,name=dimension_name,json=dimensionName,proto3" json:"dimension_name,omitempty"` - MeasureNames []string `protobuf:"bytes,4,rep,name=measure_names,json=measureNames,proto3" json:"measure_names,omitempty"` - InlineMeasures []*InlineMeasure `protobuf:"bytes,5,rep,name=inline_measures,json=inlineMeasures,proto3" json:"inline_measures,omitempty"` - BaseTimeRange *TimeRange `protobuf:"bytes,6,opt,name=base_time_range,json=baseTimeRange,proto3" json:"base_time_range,omitempty"` - ComparisonTimeRange *TimeRange `protobuf:"bytes,7,opt,name=comparison_time_range,json=comparisonTimeRange,proto3" json:"comparison_time_range,omitempty"` - Sort []*MetricsViewComparisonSort `protobuf:"bytes,8,rep,name=sort,proto3" json:"sort,omitempty"` - Filter *MetricsViewFilter `protobuf:"bytes,9,opt,name=filter,proto3" json:"filter,omitempty"` - Limit int64 `protobuf:"varint,10,opt,name=limit,proto3" json:"limit,omitempty"` - Offset int64 `protobuf:"varint,11,opt,name=offset,proto3" json:"offset,omitempty"` - Priority int32 `protobuf:"varint,12,opt,name=priority,proto3" json:"priority,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + TimeGrain TimeGrain `protobuf:"varint,2,opt,name=time_grain,json=timeGrain,proto3,enum=rill.runtime.v1.TimeGrain" json:"time_grain,omitempty"` + TimeZone string `protobuf:"bytes,3,opt,name=time_zone,json=timeZone,proto3" json:"time_zone,omitempty"` } -func (x *MetricsViewComparisonToplistRequest) Reset() { - *x = MetricsViewComparisonToplistRequest{} +func (x *MetricsViewAggregationDimension) Reset() { + *x = MetricsViewAggregationDimension{} if protoimpl.UnsafeEnabled { mi := &file_rill_runtime_v1_queries_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -721,13 +764,13 @@ func (x *MetricsViewComparisonToplistRequest) Reset() { } } -func (x *MetricsViewComparisonToplistRequest) String() string { +func (x *MetricsViewAggregationDimension) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MetricsViewComparisonToplistRequest) ProtoMessage() {} +func (*MetricsViewAggregationDimension) ProtoMessage() {} -func (x *MetricsViewComparisonToplistRequest) ProtoReflect() protoreflect.Message { +func (x *MetricsViewAggregationDimension) ProtoReflect() protoreflect.Message { mi := &file_rill_runtime_v1_queries_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -739,106 +782,44 @@ func (x *MetricsViewComparisonToplistRequest) ProtoReflect() protoreflect.Messag return mi.MessageOf(x) } -// Deprecated: Use MetricsViewComparisonToplistRequest.ProtoReflect.Descriptor instead. -func (*MetricsViewComparisonToplistRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use MetricsViewAggregationDimension.ProtoReflect.Descriptor instead. +func (*MetricsViewAggregationDimension) Descriptor() ([]byte, []int) { return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{6} } -func (x *MetricsViewComparisonToplistRequest) GetInstanceId() string { +func (x *MetricsViewAggregationDimension) GetName() string { if x != nil { - return x.InstanceId + return x.Name } return "" } -func (x *MetricsViewComparisonToplistRequest) GetMetricsViewName() string { +func (x *MetricsViewAggregationDimension) GetTimeGrain() TimeGrain { if x != nil { - return x.MetricsViewName + return x.TimeGrain } - return "" + return TimeGrain_TIME_GRAIN_UNSPECIFIED } -func (x *MetricsViewComparisonToplistRequest) GetDimensionName() string { +func (x *MetricsViewAggregationDimension) GetTimeZone() string { if x != nil { - return x.DimensionName + return x.TimeZone } return "" } -func (x *MetricsViewComparisonToplistRequest) GetMeasureNames() []string { - if x != nil { - return x.MeasureNames - } - return nil -} - -func (x *MetricsViewComparisonToplistRequest) GetInlineMeasures() []*InlineMeasure { - if x != nil { - return x.InlineMeasures - } - return nil -} - -func (x *MetricsViewComparisonToplistRequest) GetBaseTimeRange() *TimeRange { - if x != nil { - return x.BaseTimeRange - } - return nil -} - -func (x *MetricsViewComparisonToplistRequest) GetComparisonTimeRange() *TimeRange { - if x != nil { - return x.ComparisonTimeRange - } - return nil -} - -func (x *MetricsViewComparisonToplistRequest) GetSort() []*MetricsViewComparisonSort { - if x != nil { - return x.Sort - } - return nil -} - -func (x *MetricsViewComparisonToplistRequest) GetFilter() *MetricsViewFilter { - if x != nil { - return x.Filter - } - return nil -} - -func (x *MetricsViewComparisonToplistRequest) GetLimit() int64 { - if x != nil { - return x.Limit - } - return 0 -} - -func (x *MetricsViewComparisonToplistRequest) GetOffset() int64 { - if x != nil { - return x.Offset - } - return 0 -} - -func (x *MetricsViewComparisonToplistRequest) GetPriority() int32 { - if x != nil { - return x.Priority - } - return 0 -} - -// Response message for QueryService.MetricsViewComparisonToplist -type MetricsViewComparisonToplistResponse struct { +type MetricsViewAggregationMeasure struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Rows []*MetricsViewComparisonRow `protobuf:"bytes,1,rep,name=rows,proto3" json:"rows,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + BuiltinMeasure BuiltinMeasure `protobuf:"varint,2,opt,name=builtin_measure,json=builtinMeasure,proto3,enum=rill.runtime.v1.BuiltinMeasure" json:"builtin_measure,omitempty"` + BuiltinMeasureArgs []*structpb.Value `protobuf:"bytes,3,rep,name=builtin_measure_args,json=builtinMeasureArgs,proto3" json:"builtin_measure_args,omitempty"` } -func (x *MetricsViewComparisonToplistResponse) Reset() { - *x = MetricsViewComparisonToplistResponse{} +func (x *MetricsViewAggregationMeasure) Reset() { + *x = MetricsViewAggregationMeasure{} if protoimpl.UnsafeEnabled { mi := &file_rill_runtime_v1_queries_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -846,13 +827,13 @@ func (x *MetricsViewComparisonToplistResponse) Reset() { } } -func (x *MetricsViewComparisonToplistResponse) String() string { +func (x *MetricsViewAggregationMeasure) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MetricsViewComparisonToplistResponse) ProtoMessage() {} +func (*MetricsViewAggregationMeasure) ProtoMessage() {} -func (x *MetricsViewComparisonToplistResponse) ProtoReflect() protoreflect.Message { +func (x *MetricsViewAggregationMeasure) ProtoReflect() protoreflect.Message { mi := &file_rill_runtime_v1_queries_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -864,29 +845,43 @@ func (x *MetricsViewComparisonToplistResponse) ProtoReflect() protoreflect.Messa return mi.MessageOf(x) } -// Deprecated: Use MetricsViewComparisonToplistResponse.ProtoReflect.Descriptor instead. -func (*MetricsViewComparisonToplistResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use MetricsViewAggregationMeasure.ProtoReflect.Descriptor instead. +func (*MetricsViewAggregationMeasure) Descriptor() ([]byte, []int) { return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{7} } -func (x *MetricsViewComparisonToplistResponse) GetRows() []*MetricsViewComparisonRow { +func (x *MetricsViewAggregationMeasure) GetName() string { if x != nil { - return x.Rows + return x.Name + } + return "" +} + +func (x *MetricsViewAggregationMeasure) GetBuiltinMeasure() BuiltinMeasure { + if x != nil { + return x.BuiltinMeasure + } + return BuiltinMeasure_BUILTIN_MEASURE_UNSPECIFIED +} + +func (x *MetricsViewAggregationMeasure) GetBuiltinMeasureArgs() []*structpb.Value { + if x != nil { + return x.BuiltinMeasureArgs } return nil } -type TimeRange struct { +type MetricsViewAggregationSort struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Start *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=start,proto3" json:"start,omitempty"` - End *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=end,proto3" json:"end,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Desc bool `protobuf:"varint,2,opt,name=desc,proto3" json:"desc,omitempty"` } -func (x *TimeRange) Reset() { - *x = TimeRange{} +func (x *MetricsViewAggregationSort) Reset() { + *x = MetricsViewAggregationSort{} if protoimpl.UnsafeEnabled { mi := &file_rill_runtime_v1_queries_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -894,13 +889,13 @@ func (x *TimeRange) Reset() { } } -func (x *TimeRange) String() string { +func (x *MetricsViewAggregationSort) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TimeRange) ProtoMessage() {} +func (*MetricsViewAggregationSort) ProtoMessage() {} -func (x *TimeRange) ProtoReflect() protoreflect.Message { +func (x *MetricsViewAggregationSort) ProtoReflect() protoreflect.Message { mi := &file_rill_runtime_v1_queries_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -912,37 +907,47 @@ func (x *TimeRange) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TimeRange.ProtoReflect.Descriptor instead. -func (*TimeRange) Descriptor() ([]byte, []int) { +// Deprecated: Use MetricsViewAggregationSort.ProtoReflect.Descriptor instead. +func (*MetricsViewAggregationSort) Descriptor() ([]byte, []int) { return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{8} } -func (x *TimeRange) GetStart() *timestamppb.Timestamp { +func (x *MetricsViewAggregationSort) GetName() string { if x != nil { - return x.Start + return x.Name } - return nil + return "" } -func (x *TimeRange) GetEnd() *timestamppb.Timestamp { +func (x *MetricsViewAggregationSort) GetDesc() bool { if x != nil { - return x.End + return x.Desc } - return nil + return false } -type MetricsViewComparisonSort struct { - state protoimpl.MessageState +// Request message for QueryService.MetricsViewToplist +type MetricsViewToplistRequest struct { + state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MeasureName string `protobuf:"bytes,1,opt,name=measure_name,json=measureName,proto3" json:"measure_name,omitempty"` - Ascending bool `protobuf:"varint,2,opt,name=ascending,proto3" json:"ascending,omitempty"` - Type MetricsViewComparisonSortType `protobuf:"varint,3,opt,name=type,proto3,enum=rill.runtime.v1.MetricsViewComparisonSortType" json:"type,omitempty"` + InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` + MetricsViewName string `protobuf:"bytes,2,opt,name=metrics_view_name,json=metricsViewName,proto3" json:"metrics_view_name,omitempty"` + DimensionName string `protobuf:"bytes,3,opt,name=dimension_name,json=dimensionName,proto3" json:"dimension_name,omitempty"` + MeasureNames []string `protobuf:"bytes,4,rep,name=measure_names,json=measureNames,proto3" json:"measure_names,omitempty"` + InlineMeasures []*InlineMeasure `protobuf:"bytes,12,rep,name=inline_measures,json=inlineMeasures,proto3" json:"inline_measures,omitempty"` + TimeStart *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=time_start,json=timeStart,proto3" json:"time_start,omitempty"` + TimeEnd *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=time_end,json=timeEnd,proto3" json:"time_end,omitempty"` + Limit int64 `protobuf:"varint,7,opt,name=limit,proto3" json:"limit,omitempty"` + Offset int64 `protobuf:"varint,8,opt,name=offset,proto3" json:"offset,omitempty"` + Sort []*MetricsViewSort `protobuf:"bytes,9,rep,name=sort,proto3" json:"sort,omitempty"` + Filter *MetricsViewFilter `protobuf:"bytes,10,opt,name=filter,proto3" json:"filter,omitempty"` + Priority int32 `protobuf:"varint,11,opt,name=priority,proto3" json:"priority,omitempty"` } -func (x *MetricsViewComparisonSort) Reset() { - *x = MetricsViewComparisonSort{} +func (x *MetricsViewToplistRequest) Reset() { + *x = MetricsViewToplistRequest{} if protoimpl.UnsafeEnabled { mi := &file_rill_runtime_v1_queries_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -950,13 +955,13 @@ func (x *MetricsViewComparisonSort) Reset() { } } -func (x *MetricsViewComparisonSort) String() string { +func (x *MetricsViewToplistRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MetricsViewComparisonSort) ProtoMessage() {} +func (*MetricsViewToplistRequest) ProtoMessage() {} -func (x *MetricsViewComparisonSort) ProtoReflect() protoreflect.Message { +func (x *MetricsViewToplistRequest) ProtoReflect() protoreflect.Message { mi := &file_rill_runtime_v1_queries_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -968,116 +973,122 @@ func (x *MetricsViewComparisonSort) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use MetricsViewComparisonSort.ProtoReflect.Descriptor instead. -func (*MetricsViewComparisonSort) Descriptor() ([]byte, []int) { +// Deprecated: Use MetricsViewToplistRequest.ProtoReflect.Descriptor instead. +func (*MetricsViewToplistRequest) Descriptor() ([]byte, []int) { return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{9} } -func (x *MetricsViewComparisonSort) GetMeasureName() string { +func (x *MetricsViewToplistRequest) GetInstanceId() string { if x != nil { - return x.MeasureName + return x.InstanceId } return "" } -func (x *MetricsViewComparisonSort) GetAscending() bool { +func (x *MetricsViewToplistRequest) GetMetricsViewName() string { if x != nil { - return x.Ascending + return x.MetricsViewName } - return false + return "" } -func (x *MetricsViewComparisonSort) GetType() MetricsViewComparisonSortType { +func (x *MetricsViewToplistRequest) GetDimensionName() string { if x != nil { - return x.Type + return x.DimensionName } - return MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_UNSPECIFIED + return "" } -type MetricsViewComparisonRow struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - DimensionValue *structpb.Value `protobuf:"bytes,1,opt,name=dimension_value,json=dimensionValue,proto3" json:"dimension_value,omitempty"` - MeasureValues []*MetricsViewComparisonValue `protobuf:"bytes,2,rep,name=measure_values,json=measureValues,proto3" json:"measure_values,omitempty"` +func (x *MetricsViewToplistRequest) GetMeasureNames() []string { + if x != nil { + return x.MeasureNames + } + return nil } -func (x *MetricsViewComparisonRow) Reset() { - *x = MetricsViewComparisonRow{} - if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *MetricsViewToplistRequest) GetInlineMeasures() []*InlineMeasure { + if x != nil { + return x.InlineMeasures } + return nil } -func (x *MetricsViewComparisonRow) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *MetricsViewToplistRequest) GetTimeStart() *timestamppb.Timestamp { + if x != nil { + return x.TimeStart + } + return nil } -func (*MetricsViewComparisonRow) ProtoMessage() {} +func (x *MetricsViewToplistRequest) GetTimeEnd() *timestamppb.Timestamp { + if x != nil { + return x.TimeEnd + } + return nil +} -func (x *MetricsViewComparisonRow) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *MetricsViewToplistRequest) GetLimit() int64 { + if x != nil { + return x.Limit } - return mi.MessageOf(x) + return 0 } -// Deprecated: Use MetricsViewComparisonRow.ProtoReflect.Descriptor instead. -func (*MetricsViewComparisonRow) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{10} +func (x *MetricsViewToplistRequest) GetOffset() int64 { + if x != nil { + return x.Offset + } + return 0 } -func (x *MetricsViewComparisonRow) GetDimensionValue() *structpb.Value { +func (x *MetricsViewToplistRequest) GetSort() []*MetricsViewSort { if x != nil { - return x.DimensionValue + return x.Sort } return nil } -func (x *MetricsViewComparisonRow) GetMeasureValues() []*MetricsViewComparisonValue { +func (x *MetricsViewToplistRequest) GetFilter() *MetricsViewFilter { if x != nil { - return x.MeasureValues + return x.Filter } return nil } -type MetricsViewComparisonValue struct { +func (x *MetricsViewToplistRequest) GetPriority() int32 { + if x != nil { + return x.Priority + } + return 0 +} + +// Response message for QueryService.MetricsViewToplist +type MetricsViewToplistResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MeasureName string `protobuf:"bytes,1,opt,name=measure_name,json=measureName,proto3" json:"measure_name,omitempty"` - BaseValue *structpb.Value `protobuf:"bytes,2,opt,name=base_value,json=baseValue,proto3" json:"base_value,omitempty"` - ComparisonValue *structpb.Value `protobuf:"bytes,3,opt,name=comparison_value,json=comparisonValue,proto3" json:"comparison_value,omitempty"` - DeltaAbs *structpb.Value `protobuf:"bytes,4,opt,name=delta_abs,json=deltaAbs,proto3" json:"delta_abs,omitempty"` - DeltaRel *structpb.Value `protobuf:"bytes,5,opt,name=delta_rel,json=deltaRel,proto3" json:"delta_rel,omitempty"` + Meta []*MetricsViewColumn `protobuf:"bytes,1,rep,name=meta,proto3" json:"meta,omitempty"` + Data []*structpb.Struct `protobuf:"bytes,2,rep,name=data,proto3" json:"data,omitempty"` } -func (x *MetricsViewComparisonValue) Reset() { - *x = MetricsViewComparisonValue{} +func (x *MetricsViewToplistResponse) Reset() { + *x = MetricsViewToplistResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[11] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *MetricsViewComparisonValue) String() string { +func (x *MetricsViewToplistResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MetricsViewComparisonValue) ProtoMessage() {} +func (*MetricsViewToplistResponse) ProtoMessage() {} -func (x *MetricsViewComparisonValue) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[11] +func (x *MetricsViewToplistResponse) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1088,81 +1099,62 @@ func (x *MetricsViewComparisonValue) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use MetricsViewComparisonValue.ProtoReflect.Descriptor instead. -func (*MetricsViewComparisonValue) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{11} -} - -func (x *MetricsViewComparisonValue) GetMeasureName() string { - if x != nil { - return x.MeasureName - } - return "" -} - -func (x *MetricsViewComparisonValue) GetBaseValue() *structpb.Value { - if x != nil { - return x.BaseValue - } - return nil -} - -func (x *MetricsViewComparisonValue) GetComparisonValue() *structpb.Value { - if x != nil { - return x.ComparisonValue - } - return nil +// Deprecated: Use MetricsViewToplistResponse.ProtoReflect.Descriptor instead. +func (*MetricsViewToplistResponse) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{10} } -func (x *MetricsViewComparisonValue) GetDeltaAbs() *structpb.Value { +func (x *MetricsViewToplistResponse) GetMeta() []*MetricsViewColumn { if x != nil { - return x.DeltaAbs + return x.Meta } return nil } -func (x *MetricsViewComparisonValue) GetDeltaRel() *structpb.Value { +func (x *MetricsViewToplistResponse) GetData() []*structpb.Struct { if x != nil { - return x.DeltaRel + return x.Data } return nil } -// Request message for QueryService.MetricsViewTimeSeries -type MetricsViewTimeSeriesRequest struct { +// Request message for QueryService.MetricsViewComparisonToplist +type MetricsViewComparisonToplistRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` - MetricsViewName string `protobuf:"bytes,2,opt,name=metrics_view_name,json=metricsViewName,proto3" json:"metrics_view_name,omitempty"` - MeasureNames []string `protobuf:"bytes,3,rep,name=measure_names,json=measureNames,proto3" json:"measure_names,omitempty"` - InlineMeasures []*InlineMeasure `protobuf:"bytes,9,rep,name=inline_measures,json=inlineMeasures,proto3" json:"inline_measures,omitempty"` - TimeStart *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=time_start,json=timeStart,proto3" json:"time_start,omitempty"` - TimeEnd *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=time_end,json=timeEnd,proto3" json:"time_end,omitempty"` - TimeGranularity TimeGrain `protobuf:"varint,6,opt,name=time_granularity,json=timeGranularity,proto3,enum=rill.runtime.v1.TimeGrain" json:"time_granularity,omitempty"` - Filter *MetricsViewFilter `protobuf:"bytes,7,opt,name=filter,proto3" json:"filter,omitempty"` - TimeZone string `protobuf:"bytes,10,opt,name=time_zone,json=timeZone,proto3" json:"time_zone,omitempty"` - Priority int32 `protobuf:"varint,8,opt,name=priority,proto3" json:"priority,omitempty"` + InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` + MetricsViewName string `protobuf:"bytes,2,opt,name=metrics_view_name,json=metricsViewName,proto3" json:"metrics_view_name,omitempty"` + DimensionName string `protobuf:"bytes,3,opt,name=dimension_name,json=dimensionName,proto3" json:"dimension_name,omitempty"` + MeasureNames []string `protobuf:"bytes,4,rep,name=measure_names,json=measureNames,proto3" json:"measure_names,omitempty"` + InlineMeasures []*InlineMeasure `protobuf:"bytes,5,rep,name=inline_measures,json=inlineMeasures,proto3" json:"inline_measures,omitempty"` + BaseTimeRange *TimeRange `protobuf:"bytes,6,opt,name=base_time_range,json=baseTimeRange,proto3" json:"base_time_range,omitempty"` + ComparisonTimeRange *TimeRange `protobuf:"bytes,7,opt,name=comparison_time_range,json=comparisonTimeRange,proto3" json:"comparison_time_range,omitempty"` + Sort []*MetricsViewComparisonSort `protobuf:"bytes,8,rep,name=sort,proto3" json:"sort,omitempty"` + Filter *MetricsViewFilter `protobuf:"bytes,9,opt,name=filter,proto3" json:"filter,omitempty"` + Limit int64 `protobuf:"varint,10,opt,name=limit,proto3" json:"limit,omitempty"` + Offset int64 `protobuf:"varint,11,opt,name=offset,proto3" json:"offset,omitempty"` + Priority int32 `protobuf:"varint,12,opt,name=priority,proto3" json:"priority,omitempty"` } -func (x *MetricsViewTimeSeriesRequest) Reset() { - *x = MetricsViewTimeSeriesRequest{} +func (x *MetricsViewComparisonToplistRequest) Reset() { + *x = MetricsViewComparisonToplistRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[12] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *MetricsViewTimeSeriesRequest) String() string { +func (x *MetricsViewComparisonToplistRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MetricsViewTimeSeriesRequest) ProtoMessage() {} +func (*MetricsViewComparisonToplistRequest) ProtoMessage() {} -func (x *MetricsViewTimeSeriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[12] +func (x *MetricsViewComparisonToplistRequest) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1173,108 +1165,121 @@ func (x *MetricsViewTimeSeriesRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use MetricsViewTimeSeriesRequest.ProtoReflect.Descriptor instead. -func (*MetricsViewTimeSeriesRequest) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{12} +// Deprecated: Use MetricsViewComparisonToplistRequest.ProtoReflect.Descriptor instead. +func (*MetricsViewComparisonToplistRequest) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{11} } -func (x *MetricsViewTimeSeriesRequest) GetInstanceId() string { +func (x *MetricsViewComparisonToplistRequest) GetInstanceId() string { if x != nil { return x.InstanceId } return "" } -func (x *MetricsViewTimeSeriesRequest) GetMetricsViewName() string { +func (x *MetricsViewComparisonToplistRequest) GetMetricsViewName() string { if x != nil { return x.MetricsViewName } return "" } -func (x *MetricsViewTimeSeriesRequest) GetMeasureNames() []string { +func (x *MetricsViewComparisonToplistRequest) GetDimensionName() string { + if x != nil { + return x.DimensionName + } + return "" +} + +func (x *MetricsViewComparisonToplistRequest) GetMeasureNames() []string { if x != nil { return x.MeasureNames } return nil } -func (x *MetricsViewTimeSeriesRequest) GetInlineMeasures() []*InlineMeasure { +func (x *MetricsViewComparisonToplistRequest) GetInlineMeasures() []*InlineMeasure { if x != nil { return x.InlineMeasures } return nil } -func (x *MetricsViewTimeSeriesRequest) GetTimeStart() *timestamppb.Timestamp { +func (x *MetricsViewComparisonToplistRequest) GetBaseTimeRange() *TimeRange { if x != nil { - return x.TimeStart + return x.BaseTimeRange } return nil } -func (x *MetricsViewTimeSeriesRequest) GetTimeEnd() *timestamppb.Timestamp { +func (x *MetricsViewComparisonToplistRequest) GetComparisonTimeRange() *TimeRange { if x != nil { - return x.TimeEnd + return x.ComparisonTimeRange } return nil } -func (x *MetricsViewTimeSeriesRequest) GetTimeGranularity() TimeGrain { +func (x *MetricsViewComparisonToplistRequest) GetSort() []*MetricsViewComparisonSort { if x != nil { - return x.TimeGranularity + return x.Sort } - return TimeGrain_TIME_GRAIN_UNSPECIFIED + return nil } -func (x *MetricsViewTimeSeriesRequest) GetFilter() *MetricsViewFilter { +func (x *MetricsViewComparisonToplistRequest) GetFilter() *MetricsViewFilter { if x != nil { return x.Filter } return nil } -func (x *MetricsViewTimeSeriesRequest) GetTimeZone() string { +func (x *MetricsViewComparisonToplistRequest) GetLimit() int64 { if x != nil { - return x.TimeZone + return x.Limit } - return "" + return 0 } -func (x *MetricsViewTimeSeriesRequest) GetPriority() int32 { +func (x *MetricsViewComparisonToplistRequest) GetOffset() int64 { + if x != nil { + return x.Offset + } + return 0 +} + +func (x *MetricsViewComparisonToplistRequest) GetPriority() int32 { if x != nil { return x.Priority } return 0 } -// Response message for QueryService.MetricsViewTimeSeries -type MetricsViewTimeSeriesResponse struct { +// Response message for QueryService.MetricsViewComparisonToplist +type MetricsViewComparisonToplistResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Meta []*MetricsViewColumn `protobuf:"bytes,1,rep,name=meta,proto3" json:"meta,omitempty"` - Data []*TimeSeriesValue `protobuf:"bytes,2,rep,name=data,proto3" json:"data,omitempty"` + Rows []*MetricsViewComparisonRow `protobuf:"bytes,1,rep,name=rows,proto3" json:"rows,omitempty"` } -func (x *MetricsViewTimeSeriesResponse) Reset() { - *x = MetricsViewTimeSeriesResponse{} +func (x *MetricsViewComparisonToplistResponse) Reset() { + *x = MetricsViewComparisonToplistResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[13] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *MetricsViewTimeSeriesResponse) String() string { +func (x *MetricsViewComparisonToplistResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MetricsViewTimeSeriesResponse) ProtoMessage() {} +func (*MetricsViewComparisonToplistResponse) ProtoMessage() {} -func (x *MetricsViewTimeSeriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[13] +func (x *MetricsViewComparisonToplistResponse) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1285,58 +1290,44 @@ func (x *MetricsViewTimeSeriesResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use MetricsViewTimeSeriesResponse.ProtoReflect.Descriptor instead. -func (*MetricsViewTimeSeriesResponse) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{13} -} - -func (x *MetricsViewTimeSeriesResponse) GetMeta() []*MetricsViewColumn { - if x != nil { - return x.Meta - } - return nil +// Deprecated: Use MetricsViewComparisonToplistResponse.ProtoReflect.Descriptor instead. +func (*MetricsViewComparisonToplistResponse) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{12} } -func (x *MetricsViewTimeSeriesResponse) GetData() []*TimeSeriesValue { +func (x *MetricsViewComparisonToplistResponse) GetRows() []*MetricsViewComparisonRow { if x != nil { - return x.Data + return x.Rows } return nil } -// Request message for QueryService.MetricsViewTotals -type MetricsViewTotalsRequest struct { +type TimeRange struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` - MetricsViewName string `protobuf:"bytes,2,opt,name=metrics_view_name,json=metricsViewName,proto3" json:"metrics_view_name,omitempty"` - MeasureNames []string `protobuf:"bytes,3,rep,name=measure_names,json=measureNames,proto3" json:"measure_names,omitempty"` - InlineMeasures []*InlineMeasure `protobuf:"bytes,9,rep,name=inline_measures,json=inlineMeasures,proto3" json:"inline_measures,omitempty"` - TimeStart *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=time_start,json=timeStart,proto3" json:"time_start,omitempty"` - TimeEnd *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=time_end,json=timeEnd,proto3" json:"time_end,omitempty"` - Filter *MetricsViewFilter `protobuf:"bytes,7,opt,name=filter,proto3" json:"filter,omitempty"` - Priority int32 `protobuf:"varint,8,opt,name=priority,proto3" json:"priority,omitempty"` + Start *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=start,proto3" json:"start,omitempty"` + End *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=end,proto3" json:"end,omitempty"` } -func (x *MetricsViewTotalsRequest) Reset() { - *x = MetricsViewTotalsRequest{} +func (x *TimeRange) Reset() { + *x = TimeRange{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[14] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *MetricsViewTotalsRequest) String() string { +func (x *TimeRange) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MetricsViewTotalsRequest) ProtoMessage() {} +func (*TimeRange) ProtoMessage() {} -func (x *MetricsViewTotalsRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[14] +func (x *TimeRange) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1347,79 +1338,99 @@ func (x *MetricsViewTotalsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use MetricsViewTotalsRequest.ProtoReflect.Descriptor instead. -func (*MetricsViewTotalsRequest) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{14} +// Deprecated: Use TimeRange.ProtoReflect.Descriptor instead. +func (*TimeRange) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{13} } -func (x *MetricsViewTotalsRequest) GetInstanceId() string { +func (x *TimeRange) GetStart() *timestamppb.Timestamp { if x != nil { - return x.InstanceId + return x.Start } - return "" + return nil } -func (x *MetricsViewTotalsRequest) GetMetricsViewName() string { +func (x *TimeRange) GetEnd() *timestamppb.Timestamp { if x != nil { - return x.MetricsViewName + return x.End } - return "" + return nil } -func (x *MetricsViewTotalsRequest) GetMeasureNames() []string { - if x != nil { - return x.MeasureNames - } - return nil +type MetricsViewComparisonSort struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MeasureName string `protobuf:"bytes,1,opt,name=measure_name,json=measureName,proto3" json:"measure_name,omitempty"` + Ascending bool `protobuf:"varint,2,opt,name=ascending,proto3" json:"ascending,omitempty"` + Type MetricsViewComparisonSortType `protobuf:"varint,3,opt,name=type,proto3,enum=rill.runtime.v1.MetricsViewComparisonSortType" json:"type,omitempty"` } -func (x *MetricsViewTotalsRequest) GetInlineMeasures() []*InlineMeasure { - if x != nil { - return x.InlineMeasures +func (x *MetricsViewComparisonSort) Reset() { + *x = MetricsViewComparisonSort{} + if protoimpl.UnsafeEnabled { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *MetricsViewTotalsRequest) GetTimeStart() *timestamppb.Timestamp { - if x != nil { - return x.TimeStart +func (x *MetricsViewComparisonSort) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MetricsViewComparisonSort) ProtoMessage() {} + +func (x *MetricsViewComparisonSort) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *MetricsViewTotalsRequest) GetTimeEnd() *timestamppb.Timestamp { +// Deprecated: Use MetricsViewComparisonSort.ProtoReflect.Descriptor instead. +func (*MetricsViewComparisonSort) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{14} +} + +func (x *MetricsViewComparisonSort) GetMeasureName() string { if x != nil { - return x.TimeEnd + return x.MeasureName } - return nil + return "" } -func (x *MetricsViewTotalsRequest) GetFilter() *MetricsViewFilter { +func (x *MetricsViewComparisonSort) GetAscending() bool { if x != nil { - return x.Filter + return x.Ascending } - return nil + return false } -func (x *MetricsViewTotalsRequest) GetPriority() int32 { +func (x *MetricsViewComparisonSort) GetType() MetricsViewComparisonSortType { if x != nil { - return x.Priority + return x.Type } - return 0 + return MetricsViewComparisonSortType_METRICS_VIEW_COMPARISON_SORT_TYPE_UNSPECIFIED } -// Response message for QueryService.MetricsViewTotals -type MetricsViewTotalsResponse struct { +type MetricsViewComparisonRow struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Meta []*MetricsViewColumn `protobuf:"bytes,1,rep,name=meta,proto3" json:"meta,omitempty"` - Data *structpb.Struct `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + DimensionValue *structpb.Value `protobuf:"bytes,1,opt,name=dimension_value,json=dimensionValue,proto3" json:"dimension_value,omitempty"` + MeasureValues []*MetricsViewComparisonValue `protobuf:"bytes,2,rep,name=measure_values,json=measureValues,proto3" json:"measure_values,omitempty"` } -func (x *MetricsViewTotalsResponse) Reset() { - *x = MetricsViewTotalsResponse{} +func (x *MetricsViewComparisonRow) Reset() { + *x = MetricsViewComparisonRow{} if protoimpl.UnsafeEnabled { mi := &file_rill_runtime_v1_queries_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1427,13 +1438,13 @@ func (x *MetricsViewTotalsResponse) Reset() { } } -func (x *MetricsViewTotalsResponse) String() string { +func (x *MetricsViewComparisonRow) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MetricsViewTotalsResponse) ProtoMessage() {} +func (*MetricsViewComparisonRow) ProtoMessage() {} -func (x *MetricsViewTotalsResponse) ProtoReflect() protoreflect.Message { +func (x *MetricsViewComparisonRow) ProtoReflect() protoreflect.Message { mi := &file_rill_runtime_v1_queries_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1445,46 +1456,39 @@ func (x *MetricsViewTotalsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use MetricsViewTotalsResponse.ProtoReflect.Descriptor instead. -func (*MetricsViewTotalsResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use MetricsViewComparisonRow.ProtoReflect.Descriptor instead. +func (*MetricsViewComparisonRow) Descriptor() ([]byte, []int) { return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{15} } -func (x *MetricsViewTotalsResponse) GetMeta() []*MetricsViewColumn { +func (x *MetricsViewComparisonRow) GetDimensionValue() *structpb.Value { if x != nil { - return x.Meta + return x.DimensionValue } return nil } -func (x *MetricsViewTotalsResponse) GetData() *structpb.Struct { +func (x *MetricsViewComparisonRow) GetMeasureValues() []*MetricsViewComparisonValue { if x != nil { - return x.Data + return x.MeasureValues } return nil } -// Request message for QueryService.MetricsViewRows -type MetricsViewRowsRequest struct { +type MetricsViewComparisonValue struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` - MetricsViewName string `protobuf:"bytes,2,opt,name=metrics_view_name,json=metricsViewName,proto3" json:"metrics_view_name,omitempty"` - TimeStart *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=time_start,json=timeStart,proto3" json:"time_start,omitempty"` - TimeEnd *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=time_end,json=timeEnd,proto3" json:"time_end,omitempty"` - TimeGranularity TimeGrain `protobuf:"varint,10,opt,name=time_granularity,json=timeGranularity,proto3,enum=rill.runtime.v1.TimeGrain" json:"time_granularity,omitempty"` - Filter *MetricsViewFilter `protobuf:"bytes,5,opt,name=filter,proto3" json:"filter,omitempty"` - Sort []*MetricsViewSort `protobuf:"bytes,6,rep,name=sort,proto3" json:"sort,omitempty"` - Limit int32 `protobuf:"varint,7,opt,name=limit,proto3" json:"limit,omitempty"` - Offset int64 `protobuf:"varint,8,opt,name=offset,proto3" json:"offset,omitempty"` - Priority int32 `protobuf:"varint,9,opt,name=priority,proto3" json:"priority,omitempty"` - TimeZone string `protobuf:"bytes,11,opt,name=time_zone,json=timeZone,proto3" json:"time_zone,omitempty"` + MeasureName string `protobuf:"bytes,1,opt,name=measure_name,json=measureName,proto3" json:"measure_name,omitempty"` + BaseValue *structpb.Value `protobuf:"bytes,2,opt,name=base_value,json=baseValue,proto3" json:"base_value,omitempty"` + ComparisonValue *structpb.Value `protobuf:"bytes,3,opt,name=comparison_value,json=comparisonValue,proto3" json:"comparison_value,omitempty"` + DeltaAbs *structpb.Value `protobuf:"bytes,4,opt,name=delta_abs,json=deltaAbs,proto3" json:"delta_abs,omitempty"` + DeltaRel *structpb.Value `protobuf:"bytes,5,opt,name=delta_rel,json=deltaRel,proto3" json:"delta_rel,omitempty"` } -func (x *MetricsViewRowsRequest) Reset() { - *x = MetricsViewRowsRequest{} +func (x *MetricsViewComparisonValue) Reset() { + *x = MetricsViewComparisonValue{} if protoimpl.UnsafeEnabled { mi := &file_rill_runtime_v1_queries_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1492,13 +1496,13 @@ func (x *MetricsViewRowsRequest) Reset() { } } -func (x *MetricsViewRowsRequest) String() string { +func (x *MetricsViewComparisonValue) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MetricsViewRowsRequest) ProtoMessage() {} +func (*MetricsViewComparisonValue) ProtoMessage() {} -func (x *MetricsViewRowsRequest) ProtoReflect() protoreflect.Message { +func (x *MetricsViewComparisonValue) ProtoReflect() protoreflect.Message { mi := &file_rill_runtime_v1_queries_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1510,100 +1514,66 @@ func (x *MetricsViewRowsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use MetricsViewRowsRequest.ProtoReflect.Descriptor instead. -func (*MetricsViewRowsRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use MetricsViewComparisonValue.ProtoReflect.Descriptor instead. +func (*MetricsViewComparisonValue) Descriptor() ([]byte, []int) { return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{16} } -func (x *MetricsViewRowsRequest) GetInstanceId() string { - if x != nil { - return x.InstanceId - } - return "" -} - -func (x *MetricsViewRowsRequest) GetMetricsViewName() string { +func (x *MetricsViewComparisonValue) GetMeasureName() string { if x != nil { - return x.MetricsViewName + return x.MeasureName } return "" } -func (x *MetricsViewRowsRequest) GetTimeStart() *timestamppb.Timestamp { +func (x *MetricsViewComparisonValue) GetBaseValue() *structpb.Value { if x != nil { - return x.TimeStart + return x.BaseValue } return nil } -func (x *MetricsViewRowsRequest) GetTimeEnd() *timestamppb.Timestamp { +func (x *MetricsViewComparisonValue) GetComparisonValue() *structpb.Value { if x != nil { - return x.TimeEnd + return x.ComparisonValue } return nil } -func (x *MetricsViewRowsRequest) GetTimeGranularity() TimeGrain { +func (x *MetricsViewComparisonValue) GetDeltaAbs() *structpb.Value { if x != nil { - return x.TimeGranularity + return x.DeltaAbs } - return TimeGrain_TIME_GRAIN_UNSPECIFIED + return nil } -func (x *MetricsViewRowsRequest) GetFilter() *MetricsViewFilter { +func (x *MetricsViewComparisonValue) GetDeltaRel() *structpb.Value { if x != nil { - return x.Filter + return x.DeltaRel } return nil } -func (x *MetricsViewRowsRequest) GetSort() []*MetricsViewSort { - if x != nil { - return x.Sort - } - return nil -} - -func (x *MetricsViewRowsRequest) GetLimit() int32 { - if x != nil { - return x.Limit - } - return 0 -} - -func (x *MetricsViewRowsRequest) GetOffset() int64 { - if x != nil { - return x.Offset - } - return 0 -} - -func (x *MetricsViewRowsRequest) GetPriority() int32 { - if x != nil { - return x.Priority - } - return 0 -} - -func (x *MetricsViewRowsRequest) GetTimeZone() string { - if x != nil { - return x.TimeZone - } - return "" -} - -// Response message for QueryService.MetricsViewRows -type MetricsViewRowsResponse struct { +// Request message for QueryService.MetricsViewTimeSeries +type MetricsViewTimeSeriesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Meta []*MetricsViewColumn `protobuf:"bytes,1,rep,name=meta,proto3" json:"meta,omitempty"` - Data []*structpb.Struct `protobuf:"bytes,2,rep,name=data,proto3" json:"data,omitempty"` + InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` + MetricsViewName string `protobuf:"bytes,2,opt,name=metrics_view_name,json=metricsViewName,proto3" json:"metrics_view_name,omitempty"` + MeasureNames []string `protobuf:"bytes,3,rep,name=measure_names,json=measureNames,proto3" json:"measure_names,omitempty"` + InlineMeasures []*InlineMeasure `protobuf:"bytes,9,rep,name=inline_measures,json=inlineMeasures,proto3" json:"inline_measures,omitempty"` + TimeStart *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=time_start,json=timeStart,proto3" json:"time_start,omitempty"` + TimeEnd *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=time_end,json=timeEnd,proto3" json:"time_end,omitempty"` + TimeGranularity TimeGrain `protobuf:"varint,6,opt,name=time_granularity,json=timeGranularity,proto3,enum=rill.runtime.v1.TimeGrain" json:"time_granularity,omitempty"` + Filter *MetricsViewFilter `protobuf:"bytes,7,opt,name=filter,proto3" json:"filter,omitempty"` + TimeZone string `protobuf:"bytes,10,opt,name=time_zone,json=timeZone,proto3" json:"time_zone,omitempty"` + Priority int32 `protobuf:"varint,8,opt,name=priority,proto3" json:"priority,omitempty"` } -func (x *MetricsViewRowsResponse) Reset() { - *x = MetricsViewRowsResponse{} +func (x *MetricsViewTimeSeriesRequest) Reset() { + *x = MetricsViewTimeSeriesRequest{} if protoimpl.UnsafeEnabled { mi := &file_rill_runtime_v1_queries_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1611,13 +1581,13 @@ func (x *MetricsViewRowsResponse) Reset() { } } -func (x *MetricsViewRowsResponse) String() string { +func (x *MetricsViewTimeSeriesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MetricsViewRowsResponse) ProtoMessage() {} +func (*MetricsViewTimeSeriesRequest) ProtoMessage() {} -func (x *MetricsViewRowsResponse) ProtoReflect() protoreflect.Message { +func (x *MetricsViewTimeSeriesRequest) ProtoReflect() protoreflect.Message { mi := &file_rill_runtime_v1_queries_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1629,108 +1599,108 @@ func (x *MetricsViewRowsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use MetricsViewRowsResponse.ProtoReflect.Descriptor instead. -func (*MetricsViewRowsResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use MetricsViewTimeSeriesRequest.ProtoReflect.Descriptor instead. +func (*MetricsViewTimeSeriesRequest) Descriptor() ([]byte, []int) { return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{17} } -func (x *MetricsViewRowsResponse) GetMeta() []*MetricsViewColumn { +func (x *MetricsViewTimeSeriesRequest) GetInstanceId() string { if x != nil { - return x.Meta + return x.InstanceId } - return nil + return "" } -func (x *MetricsViewRowsResponse) GetData() []*structpb.Struct { +func (x *MetricsViewTimeSeriesRequest) GetMetricsViewName() string { if x != nil { - return x.Data + return x.MetricsViewName } - return nil + return "" } -// Sort clause for metrics view requests -type MetricsViewSort struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Ascending bool `protobuf:"varint,2,opt,name=ascending,proto3" json:"ascending,omitempty"` +func (x *MetricsViewTimeSeriesRequest) GetMeasureNames() []string { + if x != nil { + return x.MeasureNames + } + return nil } -func (x *MetricsViewSort) Reset() { - *x = MetricsViewSort{} - if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *MetricsViewTimeSeriesRequest) GetInlineMeasures() []*InlineMeasure { + if x != nil { + return x.InlineMeasures } + return nil } -func (x *MetricsViewSort) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *MetricsViewTimeSeriesRequest) GetTimeStart() *timestamppb.Timestamp { + if x != nil { + return x.TimeStart + } + return nil } -func (*MetricsViewSort) ProtoMessage() {} +func (x *MetricsViewTimeSeriesRequest) GetTimeEnd() *timestamppb.Timestamp { + if x != nil { + return x.TimeEnd + } + return nil +} -func (x *MetricsViewSort) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[18] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *MetricsViewTimeSeriesRequest) GetTimeGranularity() TimeGrain { + if x != nil { + return x.TimeGranularity } - return mi.MessageOf(x) + return TimeGrain_TIME_GRAIN_UNSPECIFIED } -// Deprecated: Use MetricsViewSort.ProtoReflect.Descriptor instead. -func (*MetricsViewSort) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{18} +func (x *MetricsViewTimeSeriesRequest) GetFilter() *MetricsViewFilter { + if x != nil { + return x.Filter + } + return nil } -func (x *MetricsViewSort) GetName() string { +func (x *MetricsViewTimeSeriesRequest) GetTimeZone() string { if x != nil { - return x.Name + return x.TimeZone } return "" } -func (x *MetricsViewSort) GetAscending() bool { +func (x *MetricsViewTimeSeriesRequest) GetPriority() int32 { if x != nil { - return x.Ascending + return x.Priority } - return false + return 0 } -// Filter clause for metrics view requests -type MetricsViewFilter struct { +// Response message for QueryService.MetricsViewTimeSeries +type MetricsViewTimeSeriesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Include []*MetricsViewFilter_Cond `protobuf:"bytes,2,rep,name=include,proto3" json:"include,omitempty"` - Exclude []*MetricsViewFilter_Cond `protobuf:"bytes,3,rep,name=exclude,proto3" json:"exclude,omitempty"` + Meta []*MetricsViewColumn `protobuf:"bytes,1,rep,name=meta,proto3" json:"meta,omitempty"` + Data []*TimeSeriesValue `protobuf:"bytes,2,rep,name=data,proto3" json:"data,omitempty"` } -func (x *MetricsViewFilter) Reset() { - *x = MetricsViewFilter{} +func (x *MetricsViewTimeSeriesResponse) Reset() { + *x = MetricsViewTimeSeriesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[19] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *MetricsViewFilter) String() string { +func (x *MetricsViewTimeSeriesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MetricsViewFilter) ProtoMessage() {} +func (*MetricsViewTimeSeriesResponse) ProtoMessage() {} -func (x *MetricsViewFilter) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[19] +func (x *MetricsViewTimeSeriesResponse) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1741,53 +1711,58 @@ func (x *MetricsViewFilter) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use MetricsViewFilter.ProtoReflect.Descriptor instead. -func (*MetricsViewFilter) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{19} +// Deprecated: Use MetricsViewTimeSeriesResponse.ProtoReflect.Descriptor instead. +func (*MetricsViewTimeSeriesResponse) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{18} } -func (x *MetricsViewFilter) GetInclude() []*MetricsViewFilter_Cond { +func (x *MetricsViewTimeSeriesResponse) GetMeta() []*MetricsViewColumn { if x != nil { - return x.Include + return x.Meta } return nil } -func (x *MetricsViewFilter) GetExclude() []*MetricsViewFilter_Cond { +func (x *MetricsViewTimeSeriesResponse) GetData() []*TimeSeriesValue { if x != nil { - return x.Exclude + return x.Data } return nil } -// MetricsViewColumn represents a column in a metrics view -type MetricsViewColumn struct { +// Request message for QueryService.MetricsViewTotals +type MetricsViewTotalsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` - Nullable bool `protobuf:"varint,3,opt,name=nullable,proto3" json:"nullable,omitempty"` + InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` + MetricsViewName string `protobuf:"bytes,2,opt,name=metrics_view_name,json=metricsViewName,proto3" json:"metrics_view_name,omitempty"` + MeasureNames []string `protobuf:"bytes,3,rep,name=measure_names,json=measureNames,proto3" json:"measure_names,omitempty"` + InlineMeasures []*InlineMeasure `protobuf:"bytes,9,rep,name=inline_measures,json=inlineMeasures,proto3" json:"inline_measures,omitempty"` + TimeStart *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=time_start,json=timeStart,proto3" json:"time_start,omitempty"` + TimeEnd *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=time_end,json=timeEnd,proto3" json:"time_end,omitempty"` + Filter *MetricsViewFilter `protobuf:"bytes,7,opt,name=filter,proto3" json:"filter,omitempty"` + Priority int32 `protobuf:"varint,8,opt,name=priority,proto3" json:"priority,omitempty"` } -func (x *MetricsViewColumn) Reset() { - *x = MetricsViewColumn{} +func (x *MetricsViewTotalsRequest) Reset() { + *x = MetricsViewTotalsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[20] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *MetricsViewColumn) String() string { +func (x *MetricsViewTotalsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MetricsViewColumn) ProtoMessage() {} +func (*MetricsViewTotalsRequest) ProtoMessage() {} -func (x *MetricsViewColumn) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[20] +func (x *MetricsViewTotalsRequest) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1798,59 +1773,94 @@ func (x *MetricsViewColumn) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use MetricsViewColumn.ProtoReflect.Descriptor instead. -func (*MetricsViewColumn) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{20} +// Deprecated: Use MetricsViewTotalsRequest.ProtoReflect.Descriptor instead. +func (*MetricsViewTotalsRequest) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{19} } -func (x *MetricsViewColumn) GetName() string { +func (x *MetricsViewTotalsRequest) GetInstanceId() string { if x != nil { - return x.Name + return x.InstanceId } return "" } -func (x *MetricsViewColumn) GetType() string { +func (x *MetricsViewTotalsRequest) GetMetricsViewName() string { if x != nil { - return x.Type + return x.MetricsViewName } return "" } -func (x *MetricsViewColumn) GetNullable() bool { +func (x *MetricsViewTotalsRequest) GetMeasureNames() []string { if x != nil { - return x.Nullable + return x.MeasureNames } - return false + return nil } -// InlineMeasure is a measure to inject in a metrics view query that is not defined in the underlying MetricsView -type InlineMeasure struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *MetricsViewTotalsRequest) GetInlineMeasures() []*InlineMeasure { + if x != nil { + return x.InlineMeasures + } + return nil +} - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Expression string `protobuf:"bytes,2,opt,name=expression,proto3" json:"expression,omitempty"` +func (x *MetricsViewTotalsRequest) GetTimeStart() *timestamppb.Timestamp { + if x != nil { + return x.TimeStart + } + return nil } -func (x *InlineMeasure) Reset() { - *x = InlineMeasure{} - if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[21] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *MetricsViewTotalsRequest) GetTimeEnd() *timestamppb.Timestamp { + if x != nil { + return x.TimeEnd } + return nil } -func (x *InlineMeasure) String() string { +func (x *MetricsViewTotalsRequest) GetFilter() *MetricsViewFilter { + if x != nil { + return x.Filter + } + return nil +} + +func (x *MetricsViewTotalsRequest) GetPriority() int32 { + if x != nil { + return x.Priority + } + return 0 +} + +// Response message for QueryService.MetricsViewTotals +type MetricsViewTotalsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Meta []*MetricsViewColumn `protobuf:"bytes,1,rep,name=meta,proto3" json:"meta,omitempty"` + Data *structpb.Struct `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` +} + +func (x *MetricsViewTotalsResponse) Reset() { + *x = MetricsViewTotalsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MetricsViewTotalsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*InlineMeasure) ProtoMessage() {} +func (*MetricsViewTotalsResponse) ProtoMessage() {} -func (x *InlineMeasure) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[21] +func (x *MetricsViewTotalsResponse) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1861,52 +1871,61 @@ func (x *InlineMeasure) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use InlineMeasure.ProtoReflect.Descriptor instead. -func (*InlineMeasure) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{21} +// Deprecated: Use MetricsViewTotalsResponse.ProtoReflect.Descriptor instead. +func (*MetricsViewTotalsResponse) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{20} } -func (x *InlineMeasure) GetName() string { +func (x *MetricsViewTotalsResponse) GetMeta() []*MetricsViewColumn { if x != nil { - return x.Name + return x.Meta } - return "" + return nil } -func (x *InlineMeasure) GetExpression() string { +func (x *MetricsViewTotalsResponse) GetData() *structpb.Struct { if x != nil { - return x.Expression + return x.Data } - return "" + return nil } -type MetricsViewTimeRangeRequest struct { +// Request message for QueryService.MetricsViewRows +type MetricsViewRowsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` - MetricsViewName string `protobuf:"bytes,2,opt,name=metrics_view_name,json=metricsViewName,proto3" json:"metrics_view_name,omitempty"` - Priority int32 `protobuf:"varint,3,opt,name=priority,proto3" json:"priority,omitempty"` + InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` + MetricsViewName string `protobuf:"bytes,2,opt,name=metrics_view_name,json=metricsViewName,proto3" json:"metrics_view_name,omitempty"` + TimeStart *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=time_start,json=timeStart,proto3" json:"time_start,omitempty"` + TimeEnd *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=time_end,json=timeEnd,proto3" json:"time_end,omitempty"` + TimeGranularity TimeGrain `protobuf:"varint,10,opt,name=time_granularity,json=timeGranularity,proto3,enum=rill.runtime.v1.TimeGrain" json:"time_granularity,omitempty"` + Filter *MetricsViewFilter `protobuf:"bytes,5,opt,name=filter,proto3" json:"filter,omitempty"` + Sort []*MetricsViewSort `protobuf:"bytes,6,rep,name=sort,proto3" json:"sort,omitempty"` + Limit int32 `protobuf:"varint,7,opt,name=limit,proto3" json:"limit,omitempty"` + Offset int64 `protobuf:"varint,8,opt,name=offset,proto3" json:"offset,omitempty"` + Priority int32 `protobuf:"varint,9,opt,name=priority,proto3" json:"priority,omitempty"` + TimeZone string `protobuf:"bytes,11,opt,name=time_zone,json=timeZone,proto3" json:"time_zone,omitempty"` } -func (x *MetricsViewTimeRangeRequest) Reset() { - *x = MetricsViewTimeRangeRequest{} +func (x *MetricsViewRowsRequest) Reset() { + *x = MetricsViewRowsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[22] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *MetricsViewTimeRangeRequest) String() string { +func (x *MetricsViewRowsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MetricsViewTimeRangeRequest) ProtoMessage() {} +func (*MetricsViewRowsRequest) ProtoMessage() {} -func (x *MetricsViewTimeRangeRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[22] +func (x *MetricsViewRowsRequest) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1917,107 +1936,115 @@ func (x *MetricsViewTimeRangeRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use MetricsViewTimeRangeRequest.ProtoReflect.Descriptor instead. -func (*MetricsViewTimeRangeRequest) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{22} +// Deprecated: Use MetricsViewRowsRequest.ProtoReflect.Descriptor instead. +func (*MetricsViewRowsRequest) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{21} } -func (x *MetricsViewTimeRangeRequest) GetInstanceId() string { +func (x *MetricsViewRowsRequest) GetInstanceId() string { if x != nil { return x.InstanceId } return "" } -func (x *MetricsViewTimeRangeRequest) GetMetricsViewName() string { +func (x *MetricsViewRowsRequest) GetMetricsViewName() string { if x != nil { return x.MetricsViewName } return "" } -func (x *MetricsViewTimeRangeRequest) GetPriority() int32 { +func (x *MetricsViewRowsRequest) GetTimeStart() *timestamppb.Timestamp { if x != nil { - return x.Priority + return x.TimeStart } - return 0 + return nil } -type MetricsViewTimeRangeResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *MetricsViewRowsRequest) GetTimeEnd() *timestamppb.Timestamp { + if x != nil { + return x.TimeEnd + } + return nil +} - TimeRangeSummary *TimeRangeSummary `protobuf:"bytes,1,opt,name=time_range_summary,json=timeRangeSummary,proto3" json:"time_range_summary,omitempty"` +func (x *MetricsViewRowsRequest) GetTimeGranularity() TimeGrain { + if x != nil { + return x.TimeGranularity + } + return TimeGrain_TIME_GRAIN_UNSPECIFIED } -func (x *MetricsViewTimeRangeResponse) Reset() { - *x = MetricsViewTimeRangeResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[23] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *MetricsViewRowsRequest) GetFilter() *MetricsViewFilter { + if x != nil { + return x.Filter } + return nil } -func (x *MetricsViewTimeRangeResponse) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *MetricsViewRowsRequest) GetSort() []*MetricsViewSort { + if x != nil { + return x.Sort + } + return nil } -func (*MetricsViewTimeRangeResponse) ProtoMessage() {} +func (x *MetricsViewRowsRequest) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} -func (x *MetricsViewTimeRangeResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[23] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *MetricsViewRowsRequest) GetOffset() int64 { + if x != nil { + return x.Offset } - return mi.MessageOf(x) + return 0 } -// Deprecated: Use MetricsViewTimeRangeResponse.ProtoReflect.Descriptor instead. -func (*MetricsViewTimeRangeResponse) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{23} +func (x *MetricsViewRowsRequest) GetPriority() int32 { + if x != nil { + return x.Priority + } + return 0 } -func (x *MetricsViewTimeRangeResponse) GetTimeRangeSummary() *TimeRangeSummary { +func (x *MetricsViewRowsRequest) GetTimeZone() string { if x != nil { - return x.TimeRangeSummary + return x.TimeZone } - return nil + return "" } -type ColumnRollupIntervalRequest struct { +// Response message for QueryService.MetricsViewRows +type MetricsViewRowsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` - TableName string `protobuf:"bytes,2,opt,name=table_name,json=tableName,proto3" json:"table_name,omitempty"` - ColumnName string `protobuf:"bytes,3,opt,name=column_name,json=columnName,proto3" json:"column_name,omitempty"` - Priority int32 `protobuf:"varint,4,opt,name=priority,proto3" json:"priority,omitempty"` + Meta []*MetricsViewColumn `protobuf:"bytes,1,rep,name=meta,proto3" json:"meta,omitempty"` + Data []*structpb.Struct `protobuf:"bytes,2,rep,name=data,proto3" json:"data,omitempty"` } -func (x *ColumnRollupIntervalRequest) Reset() { - *x = ColumnRollupIntervalRequest{} +func (x *MetricsViewRowsResponse) Reset() { + *x = MetricsViewRowsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[24] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ColumnRollupIntervalRequest) String() string { +func (x *MetricsViewRowsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ColumnRollupIntervalRequest) ProtoMessage() {} +func (*MetricsViewRowsResponse) ProtoMessage() {} -func (x *ColumnRollupIntervalRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[24] +func (x *MetricsViewRowsResponse) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2028,66 +2055,52 @@ func (x *ColumnRollupIntervalRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ColumnRollupIntervalRequest.ProtoReflect.Descriptor instead. -func (*ColumnRollupIntervalRequest) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{24} -} - -func (x *ColumnRollupIntervalRequest) GetInstanceId() string { - if x != nil { - return x.InstanceId - } - return "" -} - -func (x *ColumnRollupIntervalRequest) GetTableName() string { - if x != nil { - return x.TableName - } - return "" +// Deprecated: Use MetricsViewRowsResponse.ProtoReflect.Descriptor instead. +func (*MetricsViewRowsResponse) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{22} } -func (x *ColumnRollupIntervalRequest) GetColumnName() string { +func (x *MetricsViewRowsResponse) GetMeta() []*MetricsViewColumn { if x != nil { - return x.ColumnName + return x.Meta } - return "" + return nil } -func (x *ColumnRollupIntervalRequest) GetPriority() int32 { +func (x *MetricsViewRowsResponse) GetData() []*structpb.Struct { if x != nil { - return x.Priority + return x.Data } - return 0 + return nil } -type ColumnRollupIntervalResponse struct { +// Sort clause for metrics view requests +type MetricsViewSort struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Start *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=start,proto3" json:"start,omitempty"` - End *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=end,proto3" json:"end,omitempty"` - Interval TimeGrain `protobuf:"varint,3,opt,name=interval,proto3,enum=rill.runtime.v1.TimeGrain" json:"interval,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Ascending bool `protobuf:"varint,2,opt,name=ascending,proto3" json:"ascending,omitempty"` } -func (x *ColumnRollupIntervalResponse) Reset() { - *x = ColumnRollupIntervalResponse{} +func (x *MetricsViewSort) Reset() { + *x = MetricsViewSort{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[25] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ColumnRollupIntervalResponse) String() string { +func (x *MetricsViewSort) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ColumnRollupIntervalResponse) ProtoMessage() {} +func (*MetricsViewSort) ProtoMessage() {} -func (x *ColumnRollupIntervalResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[25] +func (x *MetricsViewSort) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2098,63 +2111,52 @@ func (x *ColumnRollupIntervalResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ColumnRollupIntervalResponse.ProtoReflect.Descriptor instead. -func (*ColumnRollupIntervalResponse) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{25} +// Deprecated: Use MetricsViewSort.ProtoReflect.Descriptor instead. +func (*MetricsViewSort) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{23} } -func (x *ColumnRollupIntervalResponse) GetStart() *timestamppb.Timestamp { - if x != nil { - return x.Start - } - return nil -} - -func (x *ColumnRollupIntervalResponse) GetEnd() *timestamppb.Timestamp { +func (x *MetricsViewSort) GetName() string { if x != nil { - return x.End + return x.Name } - return nil + return "" } -func (x *ColumnRollupIntervalResponse) GetInterval() TimeGrain { +func (x *MetricsViewSort) GetAscending() bool { if x != nil { - return x.Interval + return x.Ascending } - return TimeGrain_TIME_GRAIN_UNSPECIFIED + return false } -// Request for QueryService.ColumnTopK. Returns the top K values for a given column using agg function for table table_name. -type ColumnTopKRequest struct { +// Filter clause for metrics view requests +type MetricsViewFilter struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` - TableName string `protobuf:"bytes,2,opt,name=table_name,json=tableName,proto3" json:"table_name,omitempty"` - ColumnName string `protobuf:"bytes,3,opt,name=column_name,json=columnName,proto3" json:"column_name,omitempty"` - Agg string `protobuf:"bytes,4,opt,name=agg,proto3" json:"agg,omitempty"` // default is count(*) - K int32 `protobuf:"varint,5,opt,name=k,proto3" json:"k,omitempty"` // default is 50 - Priority int32 `protobuf:"varint,6,opt,name=priority,proto3" json:"priority,omitempty"` + Include []*MetricsViewFilter_Cond `protobuf:"bytes,2,rep,name=include,proto3" json:"include,omitempty"` + Exclude []*MetricsViewFilter_Cond `protobuf:"bytes,3,rep,name=exclude,proto3" json:"exclude,omitempty"` } -func (x *ColumnTopKRequest) Reset() { - *x = ColumnTopKRequest{} +func (x *MetricsViewFilter) Reset() { + *x = MetricsViewFilter{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[26] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ColumnTopKRequest) String() string { +func (x *MetricsViewFilter) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ColumnTopKRequest) ProtoMessage() {} +func (*MetricsViewFilter) ProtoMessage() {} -func (x *ColumnTopKRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[26] +func (x *MetricsViewFilter) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2165,78 +2167,116 @@ func (x *ColumnTopKRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ColumnTopKRequest.ProtoReflect.Descriptor instead. -func (*ColumnTopKRequest) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{26} +// Deprecated: Use MetricsViewFilter.ProtoReflect.Descriptor instead. +func (*MetricsViewFilter) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{24} } -func (x *ColumnTopKRequest) GetInstanceId() string { +func (x *MetricsViewFilter) GetInclude() []*MetricsViewFilter_Cond { if x != nil { - return x.InstanceId + return x.Include } - return "" + return nil } -func (x *ColumnTopKRequest) GetTableName() string { +func (x *MetricsViewFilter) GetExclude() []*MetricsViewFilter_Cond { if x != nil { - return x.TableName + return x.Exclude } - return "" + return nil } -func (x *ColumnTopKRequest) GetColumnName() string { - if x != nil { - return x.ColumnName +// MetricsViewColumn represents a column in a metrics view +type MetricsViewColumn struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + Nullable bool `protobuf:"varint,3,opt,name=nullable,proto3" json:"nullable,omitempty"` +} + +func (x *MetricsViewColumn) Reset() { + *x = MetricsViewColumn{} + if protoimpl.UnsafeEnabled { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *ColumnTopKRequest) GetAgg() string { +func (x *MetricsViewColumn) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MetricsViewColumn) ProtoMessage() {} + +func (x *MetricsViewColumn) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[25] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MetricsViewColumn.ProtoReflect.Descriptor instead. +func (*MetricsViewColumn) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{25} +} + +func (x *MetricsViewColumn) GetName() string { if x != nil { - return x.Agg + return x.Name } return "" } -func (x *ColumnTopKRequest) GetK() int32 { +func (x *MetricsViewColumn) GetType() string { if x != nil { - return x.K + return x.Type } - return 0 + return "" } -func (x *ColumnTopKRequest) GetPriority() int32 { +func (x *MetricsViewColumn) GetNullable() bool { if x != nil { - return x.Priority + return x.Nullable } - return 0 + return false } -type ColumnTopKResponse struct { +// InlineMeasure is a measure to inject in a metrics view query that is not defined in the underlying MetricsView +type InlineMeasure struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - CategoricalSummary *CategoricalSummary `protobuf:"bytes,1,opt,name=categorical_summary,json=categoricalSummary,proto3" json:"categorical_summary,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Expression string `protobuf:"bytes,2,opt,name=expression,proto3" json:"expression,omitempty"` } -func (x *ColumnTopKResponse) Reset() { - *x = ColumnTopKResponse{} +func (x *InlineMeasure) Reset() { + *x = InlineMeasure{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[27] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ColumnTopKResponse) String() string { +func (x *InlineMeasure) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ColumnTopKResponse) ProtoMessage() {} +func (*InlineMeasure) ProtoMessage() {} -func (x *ColumnTopKResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[27] +func (x *InlineMeasure) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2247,48 +2287,52 @@ func (x *ColumnTopKResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ColumnTopKResponse.ProtoReflect.Descriptor instead. -func (*ColumnTopKResponse) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{27} +// Deprecated: Use InlineMeasure.ProtoReflect.Descriptor instead. +func (*InlineMeasure) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{26} } -func (x *ColumnTopKResponse) GetCategoricalSummary() *CategoricalSummary { +func (x *InlineMeasure) GetName() string { if x != nil { - return x.CategoricalSummary + return x.Name } - return nil + return "" } -// Response for QueryService.ColumnTopK and QueryService.ColumnCardinality. Message will have either topK or cardinality set. -type CategoricalSummary struct { +func (x *InlineMeasure) GetExpression() string { + if x != nil { + return x.Expression + } + return "" +} + +type MetricsViewTimeRangeRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Types that are assignable to Case: - // - // *CategoricalSummary_TopK - // *CategoricalSummary_Cardinality - Case isCategoricalSummary_Case `protobuf_oneof:"case"` + InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` + MetricsViewName string `protobuf:"bytes,2,opt,name=metrics_view_name,json=metricsViewName,proto3" json:"metrics_view_name,omitempty"` + Priority int32 `protobuf:"varint,3,opt,name=priority,proto3" json:"priority,omitempty"` } -func (x *CategoricalSummary) Reset() { - *x = CategoricalSummary{} +func (x *MetricsViewTimeRangeRequest) Reset() { + *x = MetricsViewTimeRangeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[28] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CategoricalSummary) String() string { +func (x *MetricsViewTimeRangeRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CategoricalSummary) ProtoMessage() {} +func (*MetricsViewTimeRangeRequest) ProtoMessage() {} -func (x *CategoricalSummary) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[28] +func (x *MetricsViewTimeRangeRequest) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2299,73 +2343,57 @@ func (x *CategoricalSummary) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CategoricalSummary.ProtoReflect.Descriptor instead. -func (*CategoricalSummary) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{28} +// Deprecated: Use MetricsViewTimeRangeRequest.ProtoReflect.Descriptor instead. +func (*MetricsViewTimeRangeRequest) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{27} } -func (m *CategoricalSummary) GetCase() isCategoricalSummary_Case { - if m != nil { - return m.Case +func (x *MetricsViewTimeRangeRequest) GetInstanceId() string { + if x != nil { + return x.InstanceId } - return nil + return "" } -func (x *CategoricalSummary) GetTopK() *TopK { - if x, ok := x.GetCase().(*CategoricalSummary_TopK); ok { - return x.TopK +func (x *MetricsViewTimeRangeRequest) GetMetricsViewName() string { + if x != nil { + return x.MetricsViewName } - return nil + return "" } -func (x *CategoricalSummary) GetCardinality() float64 { - if x, ok := x.GetCase().(*CategoricalSummary_Cardinality); ok { - return x.Cardinality +func (x *MetricsViewTimeRangeRequest) GetPriority() int32 { + if x != nil { + return x.Priority } return 0 } -type isCategoricalSummary_Case interface { - isCategoricalSummary_Case() -} - -type CategoricalSummary_TopK struct { - TopK *TopK `protobuf:"bytes,1,opt,name=top_k,json=topK,proto3,oneof"` -} - -type CategoricalSummary_Cardinality struct { - Cardinality float64 `protobuf:"fixed64,2,opt,name=cardinality,proto3,oneof"` -} - -func (*CategoricalSummary_TopK) isCategoricalSummary_Case() {} - -func (*CategoricalSummary_Cardinality) isCategoricalSummary_Case() {} - -type TopK struct { +type MetricsViewTimeRangeResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Entries []*TopK_Entry `protobuf:"bytes,1,rep,name=entries,proto3" json:"entries,omitempty"` + TimeRangeSummary *TimeRangeSummary `protobuf:"bytes,1,opt,name=time_range_summary,json=timeRangeSummary,proto3" json:"time_range_summary,omitempty"` } -func (x *TopK) Reset() { - *x = TopK{} +func (x *MetricsViewTimeRangeResponse) Reset() { + *x = MetricsViewTimeRangeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[29] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *TopK) String() string { +func (x *MetricsViewTimeRangeResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TopK) ProtoMessage() {} +func (*MetricsViewTimeRangeResponse) ProtoMessage() {} -func (x *TopK) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[29] +func (x *MetricsViewTimeRangeResponse) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2376,20 +2404,19 @@ func (x *TopK) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TopK.ProtoReflect.Descriptor instead. -func (*TopK) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{29} +// Deprecated: Use MetricsViewTimeRangeResponse.ProtoReflect.Descriptor instead. +func (*MetricsViewTimeRangeResponse) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{28} } -func (x *TopK) GetEntries() []*TopK_Entry { +func (x *MetricsViewTimeRangeResponse) GetTimeRangeSummary() *TimeRangeSummary { if x != nil { - return x.Entries + return x.TimeRangeSummary } return nil } -// Request for QueryService.ColumnNullCount. Returns the null count for a given column for table table_name -type ColumnNullCountRequest struct { +type ColumnRollupIntervalRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -2400,23 +2427,23 @@ type ColumnNullCountRequest struct { Priority int32 `protobuf:"varint,4,opt,name=priority,proto3" json:"priority,omitempty"` } -func (x *ColumnNullCountRequest) Reset() { - *x = ColumnNullCountRequest{} +func (x *ColumnRollupIntervalRequest) Reset() { + *x = ColumnRollupIntervalRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[30] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ColumnNullCountRequest) String() string { +func (x *ColumnRollupIntervalRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ColumnNullCountRequest) ProtoMessage() {} +func (*ColumnRollupIntervalRequest) ProtoMessage() {} -func (x *ColumnNullCountRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[30] +func (x *ColumnRollupIntervalRequest) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2427,65 +2454,66 @@ func (x *ColumnNullCountRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ColumnNullCountRequest.ProtoReflect.Descriptor instead. -func (*ColumnNullCountRequest) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{30} +// Deprecated: Use ColumnRollupIntervalRequest.ProtoReflect.Descriptor instead. +func (*ColumnRollupIntervalRequest) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{29} } -func (x *ColumnNullCountRequest) GetInstanceId() string { +func (x *ColumnRollupIntervalRequest) GetInstanceId() string { if x != nil { return x.InstanceId } return "" } -func (x *ColumnNullCountRequest) GetTableName() string { +func (x *ColumnRollupIntervalRequest) GetTableName() string { if x != nil { return x.TableName } return "" } -func (x *ColumnNullCountRequest) GetColumnName() string { +func (x *ColumnRollupIntervalRequest) GetColumnName() string { if x != nil { return x.ColumnName } return "" } -func (x *ColumnNullCountRequest) GetPriority() int32 { +func (x *ColumnRollupIntervalRequest) GetPriority() int32 { if x != nil { return x.Priority } return 0 } -// Response for QueryService.ColumnNullCount -type ColumnNullCountResponse struct { +type ColumnRollupIntervalResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Count float64 `protobuf:"fixed64,1,opt,name=count,proto3" json:"count,omitempty"` + Start *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=start,proto3" json:"start,omitempty"` + End *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=end,proto3" json:"end,omitempty"` + Interval TimeGrain `protobuf:"varint,3,opt,name=interval,proto3,enum=rill.runtime.v1.TimeGrain" json:"interval,omitempty"` } -func (x *ColumnNullCountResponse) Reset() { - *x = ColumnNullCountResponse{} +func (x *ColumnRollupIntervalResponse) Reset() { + *x = ColumnRollupIntervalResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[31] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ColumnNullCountResponse) String() string { +func (x *ColumnRollupIntervalResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ColumnNullCountResponse) ProtoMessage() {} +func (*ColumnRollupIntervalResponse) ProtoMessage() {} -func (x *ColumnNullCountResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[31] +func (x *ColumnRollupIntervalResponse) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2496,20 +2524,34 @@ func (x *ColumnNullCountResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ColumnNullCountResponse.ProtoReflect.Descriptor instead. -func (*ColumnNullCountResponse) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{31} +// Deprecated: Use ColumnRollupIntervalResponse.ProtoReflect.Descriptor instead. +func (*ColumnRollupIntervalResponse) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{30} } -func (x *ColumnNullCountResponse) GetCount() float64 { +func (x *ColumnRollupIntervalResponse) GetStart() *timestamppb.Timestamp { if x != nil { - return x.Count + return x.Start } - return 0 + return nil } -// Request for QueryService.GetColumnDescriptiveStatisticsRequest. Returns the stats for a given column for table table_name -type ColumnDescriptiveStatisticsRequest struct { +func (x *ColumnRollupIntervalResponse) GetEnd() *timestamppb.Timestamp { + if x != nil { + return x.End + } + return nil +} + +func (x *ColumnRollupIntervalResponse) GetInterval() TimeGrain { + if x != nil { + return x.Interval + } + return TimeGrain_TIME_GRAIN_UNSPECIFIED +} + +// Request for QueryService.ColumnTopK. Returns the top K values for a given column using agg function for table table_name. +type ColumnTopKRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -2517,26 +2559,28 @@ type ColumnDescriptiveStatisticsRequest struct { InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` TableName string `protobuf:"bytes,2,opt,name=table_name,json=tableName,proto3" json:"table_name,omitempty"` ColumnName string `protobuf:"bytes,3,opt,name=column_name,json=columnName,proto3" json:"column_name,omitempty"` - Priority int32 `protobuf:"varint,4,opt,name=priority,proto3" json:"priority,omitempty"` + Agg string `protobuf:"bytes,4,opt,name=agg,proto3" json:"agg,omitempty"` // default is count(*) + K int32 `protobuf:"varint,5,opt,name=k,proto3" json:"k,omitempty"` // default is 50 + Priority int32 `protobuf:"varint,6,opt,name=priority,proto3" json:"priority,omitempty"` } -func (x *ColumnDescriptiveStatisticsRequest) Reset() { - *x = ColumnDescriptiveStatisticsRequest{} +func (x *ColumnTopKRequest) Reset() { + *x = ColumnTopKRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[32] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ColumnDescriptiveStatisticsRequest) String() string { +func (x *ColumnTopKRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ColumnDescriptiveStatisticsRequest) ProtoMessage() {} +func (*ColumnTopKRequest) ProtoMessage() {} -func (x *ColumnDescriptiveStatisticsRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[32] +func (x *ColumnTopKRequest) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2547,64 +2591,78 @@ func (x *ColumnDescriptiveStatisticsRequest) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use ColumnDescriptiveStatisticsRequest.ProtoReflect.Descriptor instead. -func (*ColumnDescriptiveStatisticsRequest) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{32} +// Deprecated: Use ColumnTopKRequest.ProtoReflect.Descriptor instead. +func (*ColumnTopKRequest) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{31} } -func (x *ColumnDescriptiveStatisticsRequest) GetInstanceId() string { +func (x *ColumnTopKRequest) GetInstanceId() string { if x != nil { return x.InstanceId } return "" } -func (x *ColumnDescriptiveStatisticsRequest) GetTableName() string { +func (x *ColumnTopKRequest) GetTableName() string { if x != nil { return x.TableName } return "" } -func (x *ColumnDescriptiveStatisticsRequest) GetColumnName() string { +func (x *ColumnTopKRequest) GetColumnName() string { if x != nil { return x.ColumnName } return "" } -func (x *ColumnDescriptiveStatisticsRequest) GetPriority() int32 { +func (x *ColumnTopKRequest) GetAgg() string { + if x != nil { + return x.Agg + } + return "" +} + +func (x *ColumnTopKRequest) GetK() int32 { + if x != nil { + return x.K + } + return 0 +} + +func (x *ColumnTopKRequest) GetPriority() int32 { if x != nil { return x.Priority } return 0 } -type ColumnDescriptiveStatisticsResponse struct { +type ColumnTopKResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - NumericSummary *NumericSummary `protobuf:"bytes,1,opt,name=numeric_summary,json=numericSummary,proto3" json:"numeric_summary,omitempty"` + CategoricalSummary *CategoricalSummary `protobuf:"bytes,1,opt,name=categorical_summary,json=categoricalSummary,proto3" json:"categorical_summary,omitempty"` } -func (x *ColumnDescriptiveStatisticsResponse) Reset() { - *x = ColumnDescriptiveStatisticsResponse{} +func (x *ColumnTopKResponse) Reset() { + *x = ColumnTopKResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[33] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ColumnDescriptiveStatisticsResponse) String() string { +func (x *ColumnTopKResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ColumnDescriptiveStatisticsResponse) ProtoMessage() {} +func (*ColumnTopKResponse) ProtoMessage() {} -func (x *ColumnDescriptiveStatisticsResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[33] +func (x *ColumnTopKResponse) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2615,50 +2673,48 @@ func (x *ColumnDescriptiveStatisticsResponse) ProtoReflect() protoreflect.Messag return mi.MessageOf(x) } -// Deprecated: Use ColumnDescriptiveStatisticsResponse.ProtoReflect.Descriptor instead. -func (*ColumnDescriptiveStatisticsResponse) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{33} +// Deprecated: Use ColumnTopKResponse.ProtoReflect.Descriptor instead. +func (*ColumnTopKResponse) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{32} } -func (x *ColumnDescriptiveStatisticsResponse) GetNumericSummary() *NumericSummary { +func (x *ColumnTopKResponse) GetCategoricalSummary() *CategoricalSummary { if x != nil { - return x.NumericSummary + return x.CategoricalSummary } return nil } -// Response for QueryService.ColumnNumericHistogram, QueryService.ColumnDescriptiveStatistics and QueryService.ColumnCardinality. -// Message will have either numericHistogramBins, numericStatistics or numericOutliers set. -type NumericSummary struct { +// Response for QueryService.ColumnTopK and QueryService.ColumnCardinality. Message will have either topK or cardinality set. +type CategoricalSummary struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Types that are assignable to Case: // - // *NumericSummary_NumericHistogramBins - // *NumericSummary_NumericStatistics - // *NumericSummary_NumericOutliers - Case isNumericSummary_Case `protobuf_oneof:"case"` + // *CategoricalSummary_TopK + // *CategoricalSummary_Cardinality + Case isCategoricalSummary_Case `protobuf_oneof:"case"` } -func (x *NumericSummary) Reset() { - *x = NumericSummary{} +func (x *CategoricalSummary) Reset() { + *x = CategoricalSummary{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[34] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NumericSummary) String() string { +func (x *CategoricalSummary) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NumericSummary) ProtoMessage() {} +func (*CategoricalSummary) ProtoMessage() {} -func (x *NumericSummary) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[34] +func (x *CategoricalSummary) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2669,86 +2725,73 @@ func (x *NumericSummary) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NumericSummary.ProtoReflect.Descriptor instead. -func (*NumericSummary) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{34} +// Deprecated: Use CategoricalSummary.ProtoReflect.Descriptor instead. +func (*CategoricalSummary) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{33} } -func (m *NumericSummary) GetCase() isNumericSummary_Case { +func (m *CategoricalSummary) GetCase() isCategoricalSummary_Case { if m != nil { return m.Case } return nil } -func (x *NumericSummary) GetNumericHistogramBins() *NumericHistogramBins { - if x, ok := x.GetCase().(*NumericSummary_NumericHistogramBins); ok { - return x.NumericHistogramBins - } - return nil -} - -func (x *NumericSummary) GetNumericStatistics() *NumericStatistics { - if x, ok := x.GetCase().(*NumericSummary_NumericStatistics); ok { - return x.NumericStatistics +func (x *CategoricalSummary) GetTopK() *TopK { + if x, ok := x.GetCase().(*CategoricalSummary_TopK); ok { + return x.TopK } return nil } -func (x *NumericSummary) GetNumericOutliers() *NumericOutliers { - if x, ok := x.GetCase().(*NumericSummary_NumericOutliers); ok { - return x.NumericOutliers +func (x *CategoricalSummary) GetCardinality() float64 { + if x, ok := x.GetCase().(*CategoricalSummary_Cardinality); ok { + return x.Cardinality } - return nil -} - -type isNumericSummary_Case interface { - isNumericSummary_Case() + return 0 } -type NumericSummary_NumericHistogramBins struct { - NumericHistogramBins *NumericHistogramBins `protobuf:"bytes,1,opt,name=numeric_histogram_bins,json=numericHistogramBins,proto3,oneof"` +type isCategoricalSummary_Case interface { + isCategoricalSummary_Case() } -type NumericSummary_NumericStatistics struct { - NumericStatistics *NumericStatistics `protobuf:"bytes,2,opt,name=numeric_statistics,json=numericStatistics,proto3,oneof"` +type CategoricalSummary_TopK struct { + TopK *TopK `protobuf:"bytes,1,opt,name=top_k,json=topK,proto3,oneof"` } -type NumericSummary_NumericOutliers struct { - NumericOutliers *NumericOutliers `protobuf:"bytes,3,opt,name=numeric_outliers,json=numericOutliers,proto3,oneof"` +type CategoricalSummary_Cardinality struct { + Cardinality float64 `protobuf:"fixed64,2,opt,name=cardinality,proto3,oneof"` } -func (*NumericSummary_NumericHistogramBins) isNumericSummary_Case() {} - -func (*NumericSummary_NumericStatistics) isNumericSummary_Case() {} +func (*CategoricalSummary_TopK) isCategoricalSummary_Case() {} -func (*NumericSummary_NumericOutliers) isNumericSummary_Case() {} +func (*CategoricalSummary_Cardinality) isCategoricalSummary_Case() {} -type NumericHistogramBins struct { +type TopK struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Bins []*NumericHistogramBins_Bin `protobuf:"bytes,1,rep,name=bins,proto3" json:"bins,omitempty"` + Entries []*TopK_Entry `protobuf:"bytes,1,rep,name=entries,proto3" json:"entries,omitempty"` } -func (x *NumericHistogramBins) Reset() { - *x = NumericHistogramBins{} +func (x *TopK) Reset() { + *x = TopK{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[35] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NumericHistogramBins) String() string { +func (x *TopK) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NumericHistogramBins) ProtoMessage() {} +func (*TopK) ProtoMessage() {} -func (x *NumericHistogramBins) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[35] +func (x *TopK) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2759,50 +2802,47 @@ func (x *NumericHistogramBins) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NumericHistogramBins.ProtoReflect.Descriptor instead. -func (*NumericHistogramBins) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{35} +// Deprecated: Use TopK.ProtoReflect.Descriptor instead. +func (*TopK) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{34} } -func (x *NumericHistogramBins) GetBins() []*NumericHistogramBins_Bin { +func (x *TopK) GetEntries() []*TopK_Entry { if x != nil { - return x.Bins + return x.Entries } return nil } -// Response for QueryService.ColumnDescriptiveStatistics -type NumericStatistics struct { +// Request for QueryService.ColumnNullCount. Returns the null count for a given column for table table_name +type ColumnNullCountRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Min float64 `protobuf:"fixed64,1,opt,name=min,proto3" json:"min,omitempty"` - Max float64 `protobuf:"fixed64,2,opt,name=max,proto3" json:"max,omitempty"` - Mean float64 `protobuf:"fixed64,3,opt,name=mean,proto3" json:"mean,omitempty"` - Q25 float64 `protobuf:"fixed64,4,opt,name=q25,proto3" json:"q25,omitempty"` - Q50 float64 `protobuf:"fixed64,5,opt,name=q50,proto3" json:"q50,omitempty"` - Q75 float64 `protobuf:"fixed64,6,opt,name=q75,proto3" json:"q75,omitempty"` - Sd float64 `protobuf:"fixed64,7,opt,name=sd,proto3" json:"sd,omitempty"` + InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` + TableName string `protobuf:"bytes,2,opt,name=table_name,json=tableName,proto3" json:"table_name,omitempty"` + ColumnName string `protobuf:"bytes,3,opt,name=column_name,json=columnName,proto3" json:"column_name,omitempty"` + Priority int32 `protobuf:"varint,4,opt,name=priority,proto3" json:"priority,omitempty"` } -func (x *NumericStatistics) Reset() { - *x = NumericStatistics{} +func (x *ColumnNullCountRequest) Reset() { + *x = ColumnNullCountRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[36] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NumericStatistics) String() string { +func (x *ColumnNullCountRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NumericStatistics) ProtoMessage() {} +func (*ColumnNullCountRequest) ProtoMessage() {} -func (x *NumericStatistics) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[36] +func (x *ColumnNullCountRequest) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2813,85 +2853,65 @@ func (x *NumericStatistics) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NumericStatistics.ProtoReflect.Descriptor instead. -func (*NumericStatistics) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{36} -} - -func (x *NumericStatistics) GetMin() float64 { - if x != nil { - return x.Min - } - return 0 -} - -func (x *NumericStatistics) GetMax() float64 { - if x != nil { - return x.Max - } - return 0 -} - -func (x *NumericStatistics) GetMean() float64 { - if x != nil { - return x.Mean - } - return 0 +// Deprecated: Use ColumnNullCountRequest.ProtoReflect.Descriptor instead. +func (*ColumnNullCountRequest) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{35} } -func (x *NumericStatistics) GetQ25() float64 { +func (x *ColumnNullCountRequest) GetInstanceId() string { if x != nil { - return x.Q25 + return x.InstanceId } - return 0 + return "" } -func (x *NumericStatistics) GetQ50() float64 { +func (x *ColumnNullCountRequest) GetTableName() string { if x != nil { - return x.Q50 + return x.TableName } - return 0 + return "" } -func (x *NumericStatistics) GetQ75() float64 { +func (x *ColumnNullCountRequest) GetColumnName() string { if x != nil { - return x.Q75 + return x.ColumnName } - return 0 + return "" } -func (x *NumericStatistics) GetSd() float64 { +func (x *ColumnNullCountRequest) GetPriority() int32 { if x != nil { - return x.Sd + return x.Priority } return 0 } -type NumericOutliers struct { +// Response for QueryService.ColumnNullCount +type ColumnNullCountResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Outliers []*NumericOutliers_Outlier `protobuf:"bytes,1,rep,name=outliers,proto3" json:"outliers,omitempty"` + Count float64 `protobuf:"fixed64,1,opt,name=count,proto3" json:"count,omitempty"` } -func (x *NumericOutliers) Reset() { - *x = NumericOutliers{} +func (x *ColumnNullCountResponse) Reset() { + *x = ColumnNullCountResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[37] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NumericOutliers) String() string { +func (x *ColumnNullCountResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NumericOutliers) ProtoMessage() {} +func (*ColumnNullCountResponse) ProtoMessage() {} -func (x *NumericOutliers) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[37] +func (x *ColumnNullCountResponse) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2902,20 +2922,20 @@ func (x *NumericOutliers) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NumericOutliers.ProtoReflect.Descriptor instead. -func (*NumericOutliers) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{37} +// Deprecated: Use ColumnNullCountResponse.ProtoReflect.Descriptor instead. +func (*ColumnNullCountResponse) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{36} } -func (x *NumericOutliers) GetOutliers() []*NumericOutliers_Outlier { +func (x *ColumnNullCountResponse) GetCount() float64 { if x != nil { - return x.Outliers + return x.Count } - return nil + return 0 } -// Request for QueryService.ColumnTimeGrainRequest -type ColumnTimeGrainRequest struct { +// Request for QueryService.GetColumnDescriptiveStatisticsRequest. Returns the stats for a given column for table table_name +type ColumnDescriptiveStatisticsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -2926,23 +2946,23 @@ type ColumnTimeGrainRequest struct { Priority int32 `protobuf:"varint,4,opt,name=priority,proto3" json:"priority,omitempty"` } -func (x *ColumnTimeGrainRequest) Reset() { - *x = ColumnTimeGrainRequest{} +func (x *ColumnDescriptiveStatisticsRequest) Reset() { + *x = ColumnDescriptiveStatisticsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[38] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ColumnTimeGrainRequest) String() string { +func (x *ColumnDescriptiveStatisticsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ColumnTimeGrainRequest) ProtoMessage() {} +func (*ColumnDescriptiveStatisticsRequest) ProtoMessage() {} -func (x *ColumnTimeGrainRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[38] +func (x *ColumnDescriptiveStatisticsRequest) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2953,65 +2973,64 @@ func (x *ColumnTimeGrainRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ColumnTimeGrainRequest.ProtoReflect.Descriptor instead. -func (*ColumnTimeGrainRequest) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{38} +// Deprecated: Use ColumnDescriptiveStatisticsRequest.ProtoReflect.Descriptor instead. +func (*ColumnDescriptiveStatisticsRequest) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{37} } -func (x *ColumnTimeGrainRequest) GetInstanceId() string { +func (x *ColumnDescriptiveStatisticsRequest) GetInstanceId() string { if x != nil { return x.InstanceId } return "" } -func (x *ColumnTimeGrainRequest) GetTableName() string { +func (x *ColumnDescriptiveStatisticsRequest) GetTableName() string { if x != nil { return x.TableName } return "" } -func (x *ColumnTimeGrainRequest) GetColumnName() string { +func (x *ColumnDescriptiveStatisticsRequest) GetColumnName() string { if x != nil { return x.ColumnName } return "" } -func (x *ColumnTimeGrainRequest) GetPriority() int32 { +func (x *ColumnDescriptiveStatisticsRequest) GetPriority() int32 { if x != nil { return x.Priority } return 0 } -// Response for QueryService.ColumnTimeGrain -type ColumnTimeGrainResponse struct { +type ColumnDescriptiveStatisticsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TimeGrain TimeGrain `protobuf:"varint,1,opt,name=time_grain,json=timeGrain,proto3,enum=rill.runtime.v1.TimeGrain" json:"time_grain,omitempty"` + NumericSummary *NumericSummary `protobuf:"bytes,1,opt,name=numeric_summary,json=numericSummary,proto3" json:"numeric_summary,omitempty"` } -func (x *ColumnTimeGrainResponse) Reset() { - *x = ColumnTimeGrainResponse{} +func (x *ColumnDescriptiveStatisticsResponse) Reset() { + *x = ColumnDescriptiveStatisticsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[39] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ColumnTimeGrainResponse) String() string { +func (x *ColumnDescriptiveStatisticsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ColumnTimeGrainResponse) ProtoMessage() {} +func (*ColumnDescriptiveStatisticsResponse) ProtoMessage() {} -func (x *ColumnTimeGrainResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[39] +func (x *ColumnDescriptiveStatisticsResponse) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3022,48 +3041,50 @@ func (x *ColumnTimeGrainResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ColumnTimeGrainResponse.ProtoReflect.Descriptor instead. -func (*ColumnTimeGrainResponse) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{39} +// Deprecated: Use ColumnDescriptiveStatisticsResponse.ProtoReflect.Descriptor instead. +func (*ColumnDescriptiveStatisticsResponse) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{38} } -func (x *ColumnTimeGrainResponse) GetTimeGrain() TimeGrain { +func (x *ColumnDescriptiveStatisticsResponse) GetNumericSummary() *NumericSummary { if x != nil { - return x.TimeGrain + return x.NumericSummary } - return TimeGrain_TIME_GRAIN_UNSPECIFIED + return nil } -// Request for QueryService.ColumnNumericHistogram. Returns the histogram for a given column for table table_name -type ColumnNumericHistogramRequest struct { +// Response for QueryService.ColumnNumericHistogram, QueryService.ColumnDescriptiveStatistics and QueryService.ColumnCardinality. +// Message will have either numericHistogramBins, numericStatistics or numericOutliers set. +type NumericSummary struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` - TableName string `protobuf:"bytes,2,opt,name=table_name,json=tableName,proto3" json:"table_name,omitempty"` - ColumnName string `protobuf:"bytes,3,opt,name=column_name,json=columnName,proto3" json:"column_name,omitempty"` - HistogramMethod HistogramMethod `protobuf:"varint,4,opt,name=histogram_method,json=histogramMethod,proto3,enum=rill.runtime.v1.HistogramMethod" json:"histogram_method,omitempty"` - Priority int32 `protobuf:"varint,5,opt,name=priority,proto3" json:"priority,omitempty"` + // Types that are assignable to Case: + // + // *NumericSummary_NumericHistogramBins + // *NumericSummary_NumericStatistics + // *NumericSummary_NumericOutliers + Case isNumericSummary_Case `protobuf_oneof:"case"` } -func (x *ColumnNumericHistogramRequest) Reset() { - *x = ColumnNumericHistogramRequest{} +func (x *NumericSummary) Reset() { + *x = NumericSummary{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[40] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ColumnNumericHistogramRequest) String() string { +func (x *NumericSummary) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ColumnNumericHistogramRequest) ProtoMessage() {} +func (*NumericSummary) ProtoMessage() {} -func (x *ColumnNumericHistogramRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[40] +func (x *NumericSummary) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3074,72 +3095,86 @@ func (x *ColumnNumericHistogramRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ColumnNumericHistogramRequest.ProtoReflect.Descriptor instead. -func (*ColumnNumericHistogramRequest) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{40} +// Deprecated: Use NumericSummary.ProtoReflect.Descriptor instead. +func (*NumericSummary) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{39} } -func (x *ColumnNumericHistogramRequest) GetInstanceId() string { - if x != nil { - return x.InstanceId +func (m *NumericSummary) GetCase() isNumericSummary_Case { + if m != nil { + return m.Case } - return "" + return nil } -func (x *ColumnNumericHistogramRequest) GetTableName() string { - if x != nil { - return x.TableName +func (x *NumericSummary) GetNumericHistogramBins() *NumericHistogramBins { + if x, ok := x.GetCase().(*NumericSummary_NumericHistogramBins); ok { + return x.NumericHistogramBins } - return "" + return nil } -func (x *ColumnNumericHistogramRequest) GetColumnName() string { - if x != nil { - return x.ColumnName +func (x *NumericSummary) GetNumericStatistics() *NumericStatistics { + if x, ok := x.GetCase().(*NumericSummary_NumericStatistics); ok { + return x.NumericStatistics } - return "" + return nil } -func (x *ColumnNumericHistogramRequest) GetHistogramMethod() HistogramMethod { - if x != nil { - return x.HistogramMethod +func (x *NumericSummary) GetNumericOutliers() *NumericOutliers { + if x, ok := x.GetCase().(*NumericSummary_NumericOutliers); ok { + return x.NumericOutliers } - return HistogramMethod_HISTOGRAM_METHOD_UNSPECIFIED + return nil } -func (x *ColumnNumericHistogramRequest) GetPriority() int32 { - if x != nil { - return x.Priority - } - return 0 +type isNumericSummary_Case interface { + isNumericSummary_Case() } -// Response for QueryService.ColumnNumericHistogram -type ColumnNumericHistogramResponse struct { +type NumericSummary_NumericHistogramBins struct { + NumericHistogramBins *NumericHistogramBins `protobuf:"bytes,1,opt,name=numeric_histogram_bins,json=numericHistogramBins,proto3,oneof"` +} + +type NumericSummary_NumericStatistics struct { + NumericStatistics *NumericStatistics `protobuf:"bytes,2,opt,name=numeric_statistics,json=numericStatistics,proto3,oneof"` +} + +type NumericSummary_NumericOutliers struct { + NumericOutliers *NumericOutliers `protobuf:"bytes,3,opt,name=numeric_outliers,json=numericOutliers,proto3,oneof"` +} + +func (*NumericSummary_NumericHistogramBins) isNumericSummary_Case() {} + +func (*NumericSummary_NumericStatistics) isNumericSummary_Case() {} + +func (*NumericSummary_NumericOutliers) isNumericSummary_Case() {} + +type NumericHistogramBins struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - NumericSummary *NumericSummary `protobuf:"bytes,1,opt,name=numeric_summary,json=numericSummary,proto3" json:"numeric_summary,omitempty"` + Bins []*NumericHistogramBins_Bin `protobuf:"bytes,1,rep,name=bins,proto3" json:"bins,omitempty"` } -func (x *ColumnNumericHistogramResponse) Reset() { - *x = ColumnNumericHistogramResponse{} +func (x *NumericHistogramBins) Reset() { + *x = NumericHistogramBins{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[41] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ColumnNumericHistogramResponse) String() string { +func (x *NumericHistogramBins) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ColumnNumericHistogramResponse) ProtoMessage() {} +func (*NumericHistogramBins) ProtoMessage() {} -func (x *ColumnNumericHistogramResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[41] +func (x *NumericHistogramBins) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3150,47 +3185,50 @@ func (x *ColumnNumericHistogramResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ColumnNumericHistogramResponse.ProtoReflect.Descriptor instead. -func (*ColumnNumericHistogramResponse) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{41} +// Deprecated: Use NumericHistogramBins.ProtoReflect.Descriptor instead. +func (*NumericHistogramBins) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{40} } -func (x *ColumnNumericHistogramResponse) GetNumericSummary() *NumericSummary { +func (x *NumericHistogramBins) GetBins() []*NumericHistogramBins_Bin { if x != nil { - return x.NumericSummary + return x.Bins } return nil } -// Request for QueryService.ColumnRugHistogram -type ColumnRugHistogramRequest struct { +// Response for QueryService.ColumnDescriptiveStatistics +type NumericStatistics struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` - TableName string `protobuf:"bytes,2,opt,name=table_name,json=tableName,proto3" json:"table_name,omitempty"` - ColumnName string `protobuf:"bytes,3,opt,name=column_name,json=columnName,proto3" json:"column_name,omitempty"` - Priority int32 `protobuf:"varint,4,opt,name=priority,proto3" json:"priority,omitempty"` + Min float64 `protobuf:"fixed64,1,opt,name=min,proto3" json:"min,omitempty"` + Max float64 `protobuf:"fixed64,2,opt,name=max,proto3" json:"max,omitempty"` + Mean float64 `protobuf:"fixed64,3,opt,name=mean,proto3" json:"mean,omitempty"` + Q25 float64 `protobuf:"fixed64,4,opt,name=q25,proto3" json:"q25,omitempty"` + Q50 float64 `protobuf:"fixed64,5,opt,name=q50,proto3" json:"q50,omitempty"` + Q75 float64 `protobuf:"fixed64,6,opt,name=q75,proto3" json:"q75,omitempty"` + Sd float64 `protobuf:"fixed64,7,opt,name=sd,proto3" json:"sd,omitempty"` } -func (x *ColumnRugHistogramRequest) Reset() { - *x = ColumnRugHistogramRequest{} +func (x *NumericStatistics) Reset() { + *x = NumericStatistics{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[42] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ColumnRugHistogramRequest) String() string { +func (x *NumericStatistics) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ColumnRugHistogramRequest) ProtoMessage() {} +func (*NumericStatistics) ProtoMessage() {} -func (x *ColumnRugHistogramRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[42] +func (x *NumericStatistics) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3201,64 +3239,85 @@ func (x *ColumnRugHistogramRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ColumnRugHistogramRequest.ProtoReflect.Descriptor instead. -func (*ColumnRugHistogramRequest) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{42} +// Deprecated: Use NumericStatistics.ProtoReflect.Descriptor instead. +func (*NumericStatistics) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{41} } -func (x *ColumnRugHistogramRequest) GetInstanceId() string { +func (x *NumericStatistics) GetMin() float64 { if x != nil { - return x.InstanceId + return x.Min } - return "" + return 0 } -func (x *ColumnRugHistogramRequest) GetTableName() string { +func (x *NumericStatistics) GetMax() float64 { if x != nil { - return x.TableName + return x.Max } - return "" + return 0 } -func (x *ColumnRugHistogramRequest) GetColumnName() string { +func (x *NumericStatistics) GetMean() float64 { if x != nil { - return x.ColumnName + return x.Mean } - return "" + return 0 } -func (x *ColumnRugHistogramRequest) GetPriority() int32 { +func (x *NumericStatistics) GetQ25() float64 { if x != nil { - return x.Priority + return x.Q25 } return 0 } -type ColumnRugHistogramResponse struct { +func (x *NumericStatistics) GetQ50() float64 { + if x != nil { + return x.Q50 + } + return 0 +} + +func (x *NumericStatistics) GetQ75() float64 { + if x != nil { + return x.Q75 + } + return 0 +} + +func (x *NumericStatistics) GetSd() float64 { + if x != nil { + return x.Sd + } + return 0 +} + +type NumericOutliers struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - NumericSummary *NumericSummary `protobuf:"bytes,1,opt,name=numeric_summary,json=numericSummary,proto3" json:"numeric_summary,omitempty"` + Outliers []*NumericOutliers_Outlier `protobuf:"bytes,1,rep,name=outliers,proto3" json:"outliers,omitempty"` } -func (x *ColumnRugHistogramResponse) Reset() { - *x = ColumnRugHistogramResponse{} +func (x *NumericOutliers) Reset() { + *x = NumericOutliers{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[43] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ColumnRugHistogramResponse) String() string { +func (x *NumericOutliers) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ColumnRugHistogramResponse) ProtoMessage() {} +func (*NumericOutliers) ProtoMessage() {} -func (x *ColumnRugHistogramResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[43] +func (x *NumericOutliers) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3269,20 +3328,20 @@ func (x *ColumnRugHistogramResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ColumnRugHistogramResponse.ProtoReflect.Descriptor instead. -func (*ColumnRugHistogramResponse) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{43} +// Deprecated: Use NumericOutliers.ProtoReflect.Descriptor instead. +func (*NumericOutliers) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{42} } -func (x *ColumnRugHistogramResponse) GetNumericSummary() *NumericSummary { +func (x *NumericOutliers) GetOutliers() []*NumericOutliers_Outlier { if x != nil { - return x.NumericSummary + return x.Outliers } return nil } -// Request for QueryService.ColumnTimeRange -type ColumnTimeRangeRequest struct { +// Request for QueryService.ColumnTimeGrainRequest +type ColumnTimeGrainRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -3293,23 +3352,23 @@ type ColumnTimeRangeRequest struct { Priority int32 `protobuf:"varint,4,opt,name=priority,proto3" json:"priority,omitempty"` } -func (x *ColumnTimeRangeRequest) Reset() { - *x = ColumnTimeRangeRequest{} +func (x *ColumnTimeGrainRequest) Reset() { + *x = ColumnTimeGrainRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[44] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ColumnTimeRangeRequest) String() string { +func (x *ColumnTimeGrainRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ColumnTimeRangeRequest) ProtoMessage() {} +func (*ColumnTimeGrainRequest) ProtoMessage() {} -func (x *ColumnTimeRangeRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[44] +func (x *ColumnTimeGrainRequest) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3320,64 +3379,65 @@ func (x *ColumnTimeRangeRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ColumnTimeRangeRequest.ProtoReflect.Descriptor instead. -func (*ColumnTimeRangeRequest) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{44} +// Deprecated: Use ColumnTimeGrainRequest.ProtoReflect.Descriptor instead. +func (*ColumnTimeGrainRequest) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{43} } -func (x *ColumnTimeRangeRequest) GetInstanceId() string { +func (x *ColumnTimeGrainRequest) GetInstanceId() string { if x != nil { return x.InstanceId } return "" } -func (x *ColumnTimeRangeRequest) GetTableName() string { +func (x *ColumnTimeGrainRequest) GetTableName() string { if x != nil { return x.TableName } return "" } -func (x *ColumnTimeRangeRequest) GetColumnName() string { +func (x *ColumnTimeGrainRequest) GetColumnName() string { if x != nil { return x.ColumnName } return "" } -func (x *ColumnTimeRangeRequest) GetPriority() int32 { +func (x *ColumnTimeGrainRequest) GetPriority() int32 { if x != nil { return x.Priority } return 0 } -type ColumnTimeRangeResponse struct { +// Response for QueryService.ColumnTimeGrain +type ColumnTimeGrainResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TimeRangeSummary *TimeRangeSummary `protobuf:"bytes,1,opt,name=time_range_summary,json=timeRangeSummary,proto3" json:"time_range_summary,omitempty"` + TimeGrain TimeGrain `protobuf:"varint,1,opt,name=time_grain,json=timeGrain,proto3,enum=rill.runtime.v1.TimeGrain" json:"time_grain,omitempty"` } -func (x *ColumnTimeRangeResponse) Reset() { - *x = ColumnTimeRangeResponse{} +func (x *ColumnTimeGrainResponse) Reset() { + *x = ColumnTimeGrainResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[45] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ColumnTimeRangeResponse) String() string { +func (x *ColumnTimeGrainResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ColumnTimeRangeResponse) ProtoMessage() {} +func (*ColumnTimeGrainResponse) ProtoMessage() {} -func (x *ColumnTimeRangeResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[45] +func (x *ColumnTimeGrainResponse) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3388,45 +3448,48 @@ func (x *ColumnTimeRangeResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ColumnTimeRangeResponse.ProtoReflect.Descriptor instead. -func (*ColumnTimeRangeResponse) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{45} +// Deprecated: Use ColumnTimeGrainResponse.ProtoReflect.Descriptor instead. +func (*ColumnTimeGrainResponse) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{44} } -func (x *ColumnTimeRangeResponse) GetTimeRangeSummary() *TimeRangeSummary { +func (x *ColumnTimeGrainResponse) GetTimeGrain() TimeGrain { if x != nil { - return x.TimeRangeSummary + return x.TimeGrain } - return nil + return TimeGrain_TIME_GRAIN_UNSPECIFIED } -type TimeRangeSummary struct { +// Request for QueryService.ColumnNumericHistogram. Returns the histogram for a given column for table table_name +type ColumnNumericHistogramRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Min *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=min,proto3" json:"min,omitempty"` - Max *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=max,proto3" json:"max,omitempty"` - Interval *TimeRangeSummary_Interval `protobuf:"bytes,3,opt,name=interval,proto3" json:"interval,omitempty"` + InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` + TableName string `protobuf:"bytes,2,opt,name=table_name,json=tableName,proto3" json:"table_name,omitempty"` + ColumnName string `protobuf:"bytes,3,opt,name=column_name,json=columnName,proto3" json:"column_name,omitempty"` + HistogramMethod HistogramMethod `protobuf:"varint,4,opt,name=histogram_method,json=histogramMethod,proto3,enum=rill.runtime.v1.HistogramMethod" json:"histogram_method,omitempty"` + Priority int32 `protobuf:"varint,5,opt,name=priority,proto3" json:"priority,omitempty"` } -func (x *TimeRangeSummary) Reset() { - *x = TimeRangeSummary{} +func (x *ColumnNumericHistogramRequest) Reset() { + *x = ColumnNumericHistogramRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[46] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *TimeRangeSummary) String() string { +func (x *ColumnNumericHistogramRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TimeRangeSummary) ProtoMessage() {} +func (*ColumnNumericHistogramRequest) ProtoMessage() {} -func (x *TimeRangeSummary) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[46] +func (x *ColumnNumericHistogramRequest) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3437,34 +3500,96 @@ func (x *TimeRangeSummary) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TimeRangeSummary.ProtoReflect.Descriptor instead. -func (*TimeRangeSummary) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{46} +// Deprecated: Use ColumnNumericHistogramRequest.ProtoReflect.Descriptor instead. +func (*ColumnNumericHistogramRequest) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{45} } -func (x *TimeRangeSummary) GetMin() *timestamppb.Timestamp { +func (x *ColumnNumericHistogramRequest) GetInstanceId() string { if x != nil { - return x.Min + return x.InstanceId } - return nil + return "" } -func (x *TimeRangeSummary) GetMax() *timestamppb.Timestamp { +func (x *ColumnNumericHistogramRequest) GetTableName() string { if x != nil { - return x.Max + return x.TableName } - return nil + return "" } -func (x *TimeRangeSummary) GetInterval() *TimeRangeSummary_Interval { +func (x *ColumnNumericHistogramRequest) GetColumnName() string { if x != nil { - return x.Interval + return x.ColumnName + } + return "" +} + +func (x *ColumnNumericHistogramRequest) GetHistogramMethod() HistogramMethod { + if x != nil { + return x.HistogramMethod + } + return HistogramMethod_HISTOGRAM_METHOD_UNSPECIFIED +} + +func (x *ColumnNumericHistogramRequest) GetPriority() int32 { + if x != nil { + return x.Priority + } + return 0 +} + +// Response for QueryService.ColumnNumericHistogram +type ColumnNumericHistogramResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NumericSummary *NumericSummary `protobuf:"bytes,1,opt,name=numeric_summary,json=numericSummary,proto3" json:"numeric_summary,omitempty"` +} + +func (x *ColumnNumericHistogramResponse) Reset() { + *x = ColumnNumericHistogramResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[46] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ColumnNumericHistogramResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ColumnNumericHistogramResponse) ProtoMessage() {} + +func (x *ColumnNumericHistogramResponse) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[46] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ColumnNumericHistogramResponse.ProtoReflect.Descriptor instead. +func (*ColumnNumericHistogramResponse) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{46} +} + +func (x *ColumnNumericHistogramResponse) GetNumericSummary() *NumericSummary { + if x != nil { + return x.NumericSummary } return nil } -// Request for QueryService.ColumnCardinality. Returns the cardinality for a given column for table table_name -type ColumnCardinalityRequest struct { +// Request for QueryService.ColumnRugHistogram +type ColumnRugHistogramRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -3475,8 +3600,8 @@ type ColumnCardinalityRequest struct { Priority int32 `protobuf:"varint,4,opt,name=priority,proto3" json:"priority,omitempty"` } -func (x *ColumnCardinalityRequest) Reset() { - *x = ColumnCardinalityRequest{} +func (x *ColumnRugHistogramRequest) Reset() { + *x = ColumnRugHistogramRequest{} if protoimpl.UnsafeEnabled { mi := &file_rill_runtime_v1_queries_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -3484,13 +3609,13 @@ func (x *ColumnCardinalityRequest) Reset() { } } -func (x *ColumnCardinalityRequest) String() string { +func (x *ColumnRugHistogramRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ColumnCardinalityRequest) ProtoMessage() {} +func (*ColumnRugHistogramRequest) ProtoMessage() {} -func (x *ColumnCardinalityRequest) ProtoReflect() protoreflect.Message { +func (x *ColumnRugHistogramRequest) ProtoReflect() protoreflect.Message { mi := &file_rill_runtime_v1_queries_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -3502,49 +3627,49 @@ func (x *ColumnCardinalityRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ColumnCardinalityRequest.ProtoReflect.Descriptor instead. -func (*ColumnCardinalityRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use ColumnRugHistogramRequest.ProtoReflect.Descriptor instead. +func (*ColumnRugHistogramRequest) Descriptor() ([]byte, []int) { return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{47} } -func (x *ColumnCardinalityRequest) GetInstanceId() string { +func (x *ColumnRugHistogramRequest) GetInstanceId() string { if x != nil { return x.InstanceId } return "" } -func (x *ColumnCardinalityRequest) GetTableName() string { +func (x *ColumnRugHistogramRequest) GetTableName() string { if x != nil { return x.TableName } return "" } -func (x *ColumnCardinalityRequest) GetColumnName() string { +func (x *ColumnRugHistogramRequest) GetColumnName() string { if x != nil { return x.ColumnName } return "" } -func (x *ColumnCardinalityRequest) GetPriority() int32 { +func (x *ColumnRugHistogramRequest) GetPriority() int32 { if x != nil { return x.Priority } return 0 } -type ColumnCardinalityResponse struct { +type ColumnRugHistogramResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - CategoricalSummary *CategoricalSummary `protobuf:"bytes,1,opt,name=categorical_summary,json=categoricalSummary,proto3" json:"categorical_summary,omitempty"` + NumericSummary *NumericSummary `protobuf:"bytes,1,opt,name=numeric_summary,json=numericSummary,proto3" json:"numeric_summary,omitempty"` } -func (x *ColumnCardinalityResponse) Reset() { - *x = ColumnCardinalityResponse{} +func (x *ColumnRugHistogramResponse) Reset() { + *x = ColumnRugHistogramResponse{} if protoimpl.UnsafeEnabled { mi := &file_rill_runtime_v1_queries_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -3552,13 +3677,13 @@ func (x *ColumnCardinalityResponse) Reset() { } } -func (x *ColumnCardinalityResponse) String() string { +func (x *ColumnRugHistogramResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ColumnCardinalityResponse) ProtoMessage() {} +func (*ColumnRugHistogramResponse) ProtoMessage() {} -func (x *ColumnCardinalityResponse) ProtoReflect() protoreflect.Message { +func (x *ColumnRugHistogramResponse) ProtoReflect() protoreflect.Message { mi := &file_rill_runtime_v1_queries_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -3570,36 +3695,32 @@ func (x *ColumnCardinalityResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ColumnCardinalityResponse.ProtoReflect.Descriptor instead. -func (*ColumnCardinalityResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use ColumnRugHistogramResponse.ProtoReflect.Descriptor instead. +func (*ColumnRugHistogramResponse) Descriptor() ([]byte, []int) { return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{48} } -func (x *ColumnCardinalityResponse) GetCategoricalSummary() *CategoricalSummary { +func (x *ColumnRugHistogramResponse) GetNumericSummary() *NumericSummary { if x != nil { - return x.CategoricalSummary + return x.NumericSummary } return nil } -type ColumnTimeSeriesRequest struct { +// Request for QueryService.ColumnTimeRange +type ColumnTimeRangeRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` - TableName string `protobuf:"bytes,2,opt,name=table_name,json=tableName,proto3" json:"table_name,omitempty"` - Measures []*ColumnTimeSeriesRequest_BasicMeasure `protobuf:"bytes,3,rep,name=measures,proto3" json:"measures,omitempty"` - TimestampColumnName string `protobuf:"bytes,4,opt,name=timestamp_column_name,json=timestampColumnName,proto3" json:"timestamp_column_name,omitempty"` - TimeRange *TimeSeriesTimeRange `protobuf:"bytes,5,opt,name=time_range,json=timeRange,proto3" json:"time_range,omitempty"` - Pixels int32 `protobuf:"varint,7,opt,name=pixels,proto3" json:"pixels,omitempty"` - SampleSize int32 `protobuf:"varint,8,opt,name=sample_size,json=sampleSize,proto3" json:"sample_size,omitempty"` - Priority int32 `protobuf:"varint,9,opt,name=priority,proto3" json:"priority,omitempty"` - TimeZone string `protobuf:"bytes,10,opt,name=time_zone,json=timeZone,proto3" json:"time_zone,omitempty"` + InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` + TableName string `protobuf:"bytes,2,opt,name=table_name,json=tableName,proto3" json:"table_name,omitempty"` + ColumnName string `protobuf:"bytes,3,opt,name=column_name,json=columnName,proto3" json:"column_name,omitempty"` + Priority int32 `protobuf:"varint,4,opt,name=priority,proto3" json:"priority,omitempty"` } -func (x *ColumnTimeSeriesRequest) Reset() { - *x = ColumnTimeSeriesRequest{} +func (x *ColumnTimeRangeRequest) Reset() { + *x = ColumnTimeRangeRequest{} if protoimpl.UnsafeEnabled { mi := &file_rill_runtime_v1_queries_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -3607,13 +3728,13 @@ func (x *ColumnTimeSeriesRequest) Reset() { } } -func (x *ColumnTimeSeriesRequest) String() string { +func (x *ColumnTimeRangeRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ColumnTimeSeriesRequest) ProtoMessage() {} +func (*ColumnTimeRangeRequest) ProtoMessage() {} -func (x *ColumnTimeSeriesRequest) ProtoReflect() protoreflect.Message { +func (x *ColumnTimeRangeRequest) ProtoReflect() protoreflect.Message { mi := &file_rill_runtime_v1_queries_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -3625,84 +3746,49 @@ func (x *ColumnTimeSeriesRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ColumnTimeSeriesRequest.ProtoReflect.Descriptor instead. -func (*ColumnTimeSeriesRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use ColumnTimeRangeRequest.ProtoReflect.Descriptor instead. +func (*ColumnTimeRangeRequest) Descriptor() ([]byte, []int) { return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{49} } -func (x *ColumnTimeSeriesRequest) GetInstanceId() string { +func (x *ColumnTimeRangeRequest) GetInstanceId() string { if x != nil { return x.InstanceId } return "" } -func (x *ColumnTimeSeriesRequest) GetTableName() string { +func (x *ColumnTimeRangeRequest) GetTableName() string { if x != nil { return x.TableName } return "" } -func (x *ColumnTimeSeriesRequest) GetMeasures() []*ColumnTimeSeriesRequest_BasicMeasure { - if x != nil { - return x.Measures - } - return nil -} - -func (x *ColumnTimeSeriesRequest) GetTimestampColumnName() string { +func (x *ColumnTimeRangeRequest) GetColumnName() string { if x != nil { - return x.TimestampColumnName + return x.ColumnName } return "" } -func (x *ColumnTimeSeriesRequest) GetTimeRange() *TimeSeriesTimeRange { - if x != nil { - return x.TimeRange - } - return nil -} - -func (x *ColumnTimeSeriesRequest) GetPixels() int32 { - if x != nil { - return x.Pixels - } - return 0 -} - -func (x *ColumnTimeSeriesRequest) GetSampleSize() int32 { - if x != nil { - return x.SampleSize - } - return 0 -} - -func (x *ColumnTimeSeriesRequest) GetPriority() int32 { +func (x *ColumnTimeRangeRequest) GetPriority() int32 { if x != nil { return x.Priority } return 0 } -func (x *ColumnTimeSeriesRequest) GetTimeZone() string { - if x != nil { - return x.TimeZone - } - return "" -} - -type ColumnTimeSeriesResponse struct { +type ColumnTimeRangeResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Rollup *TimeSeriesResponse `protobuf:"bytes,1,opt,name=rollup,proto3" json:"rollup,omitempty"` + TimeRangeSummary *TimeRangeSummary `protobuf:"bytes,1,opt,name=time_range_summary,json=timeRangeSummary,proto3" json:"time_range_summary,omitempty"` } -func (x *ColumnTimeSeriesResponse) Reset() { - *x = ColumnTimeSeriesResponse{} +func (x *ColumnTimeRangeResponse) Reset() { + *x = ColumnTimeRangeResponse{} if protoimpl.UnsafeEnabled { mi := &file_rill_runtime_v1_queries_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -3710,13 +3796,13 @@ func (x *ColumnTimeSeriesResponse) Reset() { } } -func (x *ColumnTimeSeriesResponse) String() string { +func (x *ColumnTimeRangeResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ColumnTimeSeriesResponse) ProtoMessage() {} +func (*ColumnTimeRangeResponse) ProtoMessage() {} -func (x *ColumnTimeSeriesResponse) ProtoReflect() protoreflect.Message { +func (x *ColumnTimeRangeResponse) ProtoReflect() protoreflect.Message { mi := &file_rill_runtime_v1_queries_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -3728,30 +3814,30 @@ func (x *ColumnTimeSeriesResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ColumnTimeSeriesResponse.ProtoReflect.Descriptor instead. -func (*ColumnTimeSeriesResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use ColumnTimeRangeResponse.ProtoReflect.Descriptor instead. +func (*ColumnTimeRangeResponse) Descriptor() ([]byte, []int) { return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{50} } -func (x *ColumnTimeSeriesResponse) GetRollup() *TimeSeriesResponse { +func (x *ColumnTimeRangeResponse) GetTimeRangeSummary() *TimeRangeSummary { if x != nil { - return x.Rollup + return x.TimeRangeSummary } return nil } -type TimeSeriesTimeRange struct { +type TimeRangeSummary struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Start *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=start,proto3" json:"start,omitempty"` - End *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=end,proto3" json:"end,omitempty"` - Interval TimeGrain `protobuf:"varint,4,opt,name=interval,proto3,enum=rill.runtime.v1.TimeGrain" json:"interval,omitempty"` + Min *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=min,proto3" json:"min,omitempty"` + Max *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=max,proto3" json:"max,omitempty"` + Interval *TimeRangeSummary_Interval `protobuf:"bytes,3,opt,name=interval,proto3" json:"interval,omitempty"` } -func (x *TimeSeriesTimeRange) Reset() { - *x = TimeSeriesTimeRange{} +func (x *TimeRangeSummary) Reset() { + *x = TimeRangeSummary{} if protoimpl.UnsafeEnabled { mi := &file_rill_runtime_v1_queries_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -3759,13 +3845,13 @@ func (x *TimeSeriesTimeRange) Reset() { } } -func (x *TimeSeriesTimeRange) String() string { +func (x *TimeRangeSummary) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TimeSeriesTimeRange) ProtoMessage() {} +func (*TimeRangeSummary) ProtoMessage() {} -func (x *TimeSeriesTimeRange) ProtoReflect() protoreflect.Message { +func (x *TimeRangeSummary) ProtoReflect() protoreflect.Message { mi := &file_rill_runtime_v1_queries_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -3777,44 +3863,46 @@ func (x *TimeSeriesTimeRange) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TimeSeriesTimeRange.ProtoReflect.Descriptor instead. -func (*TimeSeriesTimeRange) Descriptor() ([]byte, []int) { +// Deprecated: Use TimeRangeSummary.ProtoReflect.Descriptor instead. +func (*TimeRangeSummary) Descriptor() ([]byte, []int) { return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{51} } -func (x *TimeSeriesTimeRange) GetStart() *timestamppb.Timestamp { +func (x *TimeRangeSummary) GetMin() *timestamppb.Timestamp { if x != nil { - return x.Start + return x.Min } return nil } -func (x *TimeSeriesTimeRange) GetEnd() *timestamppb.Timestamp { +func (x *TimeRangeSummary) GetMax() *timestamppb.Timestamp { if x != nil { - return x.End + return x.Max } return nil } -func (x *TimeSeriesTimeRange) GetInterval() TimeGrain { +func (x *TimeRangeSummary) GetInterval() *TimeRangeSummary_Interval { if x != nil { return x.Interval } - return TimeGrain_TIME_GRAIN_UNSPECIFIED + return nil } -type TimeSeriesResponse struct { +// Request for QueryService.ColumnCardinality. Returns the cardinality for a given column for table table_name +type ColumnCardinalityRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Results []*TimeSeriesValue `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` - Spark []*TimeSeriesValue `protobuf:"bytes,2,rep,name=spark,proto3" json:"spark,omitempty"` - SampleSize int32 `protobuf:"varint,4,opt,name=sample_size,json=sampleSize,proto3" json:"sample_size,omitempty"` -} - -func (x *TimeSeriesResponse) Reset() { - *x = TimeSeriesResponse{} + InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` + TableName string `protobuf:"bytes,2,opt,name=table_name,json=tableName,proto3" json:"table_name,omitempty"` + ColumnName string `protobuf:"bytes,3,opt,name=column_name,json=columnName,proto3" json:"column_name,omitempty"` + Priority int32 `protobuf:"varint,4,opt,name=priority,proto3" json:"priority,omitempty"` +} + +func (x *ColumnCardinalityRequest) Reset() { + *x = ColumnCardinalityRequest{} if protoimpl.UnsafeEnabled { mi := &file_rill_runtime_v1_queries_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -3822,13 +3910,13 @@ func (x *TimeSeriesResponse) Reset() { } } -func (x *TimeSeriesResponse) String() string { +func (x *ColumnCardinalityRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TimeSeriesResponse) ProtoMessage() {} +func (*ColumnCardinalityRequest) ProtoMessage() {} -func (x *TimeSeriesResponse) ProtoReflect() protoreflect.Message { +func (x *ColumnCardinalityRequest) ProtoReflect() protoreflect.Message { mi := &file_rill_runtime_v1_queries_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -3840,44 +3928,49 @@ func (x *TimeSeriesResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TimeSeriesResponse.ProtoReflect.Descriptor instead. -func (*TimeSeriesResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use ColumnCardinalityRequest.ProtoReflect.Descriptor instead. +func (*ColumnCardinalityRequest) Descriptor() ([]byte, []int) { return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{52} } -func (x *TimeSeriesResponse) GetResults() []*TimeSeriesValue { +func (x *ColumnCardinalityRequest) GetInstanceId() string { if x != nil { - return x.Results + return x.InstanceId } - return nil + return "" } -func (x *TimeSeriesResponse) GetSpark() []*TimeSeriesValue { +func (x *ColumnCardinalityRequest) GetTableName() string { if x != nil { - return x.Spark + return x.TableName } - return nil + return "" } -func (x *TimeSeriesResponse) GetSampleSize() int32 { +func (x *ColumnCardinalityRequest) GetColumnName() string { if x != nil { - return x.SampleSize + return x.ColumnName + } + return "" +} + +func (x *ColumnCardinalityRequest) GetPriority() int32 { + if x != nil { + return x.Priority } return 0 } -type TimeSeriesValue struct { +type ColumnCardinalityResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Ts *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=ts,proto3" json:"ts,omitempty"` - Bin float64 `protobuf:"fixed64,2,opt,name=bin,proto3" json:"bin,omitempty"` - Records *structpb.Struct `protobuf:"bytes,3,opt,name=records,proto3" json:"records,omitempty"` + CategoricalSummary *CategoricalSummary `protobuf:"bytes,1,opt,name=categorical_summary,json=categoricalSummary,proto3" json:"categorical_summary,omitempty"` } -func (x *TimeSeriesValue) Reset() { - *x = TimeSeriesValue{} +func (x *ColumnCardinalityResponse) Reset() { + *x = ColumnCardinalityResponse{} if protoimpl.UnsafeEnabled { mi := &file_rill_runtime_v1_queries_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -3885,13 +3978,13 @@ func (x *TimeSeriesValue) Reset() { } } -func (x *TimeSeriesValue) String() string { +func (x *ColumnCardinalityResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TimeSeriesValue) ProtoMessage() {} +func (*ColumnCardinalityResponse) ProtoMessage() {} -func (x *TimeSeriesValue) ProtoReflect() protoreflect.Message { +func (x *ColumnCardinalityResponse) ProtoReflect() protoreflect.Message { mi := &file_rill_runtime_v1_queries_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -3903,44 +3996,36 @@ func (x *TimeSeriesValue) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TimeSeriesValue.ProtoReflect.Descriptor instead. -func (*TimeSeriesValue) Descriptor() ([]byte, []int) { +// Deprecated: Use ColumnCardinalityResponse.ProtoReflect.Descriptor instead. +func (*ColumnCardinalityResponse) Descriptor() ([]byte, []int) { return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{53} } -func (x *TimeSeriesValue) GetTs() *timestamppb.Timestamp { - if x != nil { - return x.Ts - } - return nil -} - -func (x *TimeSeriesValue) GetBin() float64 { - if x != nil { - return x.Bin - } - return 0 -} - -func (x *TimeSeriesValue) GetRecords() *structpb.Struct { +func (x *ColumnCardinalityResponse) GetCategoricalSummary() *CategoricalSummary { if x != nil { - return x.Records + return x.CategoricalSummary } return nil } -type TableCardinalityRequest struct { +type ColumnTimeSeriesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` - TableName string `protobuf:"bytes,2,opt,name=table_name,json=tableName,proto3" json:"table_name,omitempty"` - Priority int32 `protobuf:"varint,3,opt,name=priority,proto3" json:"priority,omitempty"` + InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` + TableName string `protobuf:"bytes,2,opt,name=table_name,json=tableName,proto3" json:"table_name,omitempty"` + Measures []*ColumnTimeSeriesRequest_BasicMeasure `protobuf:"bytes,3,rep,name=measures,proto3" json:"measures,omitempty"` + TimestampColumnName string `protobuf:"bytes,4,opt,name=timestamp_column_name,json=timestampColumnName,proto3" json:"timestamp_column_name,omitempty"` + TimeRange *TimeSeriesTimeRange `protobuf:"bytes,5,opt,name=time_range,json=timeRange,proto3" json:"time_range,omitempty"` + Pixels int32 `protobuf:"varint,7,opt,name=pixels,proto3" json:"pixels,omitempty"` + SampleSize int32 `protobuf:"varint,8,opt,name=sample_size,json=sampleSize,proto3" json:"sample_size,omitempty"` + Priority int32 `protobuf:"varint,9,opt,name=priority,proto3" json:"priority,omitempty"` + TimeZone string `protobuf:"bytes,10,opt,name=time_zone,json=timeZone,proto3" json:"time_zone,omitempty"` } -func (x *TableCardinalityRequest) Reset() { - *x = TableCardinalityRequest{} +func (x *ColumnTimeSeriesRequest) Reset() { + *x = ColumnTimeSeriesRequest{} if protoimpl.UnsafeEnabled { mi := &file_rill_runtime_v1_queries_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -3948,13 +4033,13 @@ func (x *TableCardinalityRequest) Reset() { } } -func (x *TableCardinalityRequest) String() string { +func (x *ColumnTimeSeriesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TableCardinalityRequest) ProtoMessage() {} +func (*ColumnTimeSeriesRequest) ProtoMessage() {} -func (x *TableCardinalityRequest) ProtoReflect() protoreflect.Message { +func (x *ColumnTimeSeriesRequest) ProtoReflect() protoreflect.Message { mi := &file_rill_runtime_v1_queries_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -3966,42 +4051,84 @@ func (x *TableCardinalityRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TableCardinalityRequest.ProtoReflect.Descriptor instead. -func (*TableCardinalityRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use ColumnTimeSeriesRequest.ProtoReflect.Descriptor instead. +func (*ColumnTimeSeriesRequest) Descriptor() ([]byte, []int) { return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{54} } -func (x *TableCardinalityRequest) GetInstanceId() string { +func (x *ColumnTimeSeriesRequest) GetInstanceId() string { if x != nil { return x.InstanceId } return "" } -func (x *TableCardinalityRequest) GetTableName() string { +func (x *ColumnTimeSeriesRequest) GetTableName() string { if x != nil { return x.TableName } return "" } -func (x *TableCardinalityRequest) GetPriority() int32 { +func (x *ColumnTimeSeriesRequest) GetMeasures() []*ColumnTimeSeriesRequest_BasicMeasure { + if x != nil { + return x.Measures + } + return nil +} + +func (x *ColumnTimeSeriesRequest) GetTimestampColumnName() string { + if x != nil { + return x.TimestampColumnName + } + return "" +} + +func (x *ColumnTimeSeriesRequest) GetTimeRange() *TimeSeriesTimeRange { + if x != nil { + return x.TimeRange + } + return nil +} + +func (x *ColumnTimeSeriesRequest) GetPixels() int32 { + if x != nil { + return x.Pixels + } + return 0 +} + +func (x *ColumnTimeSeriesRequest) GetSampleSize() int32 { + if x != nil { + return x.SampleSize + } + return 0 +} + +func (x *ColumnTimeSeriesRequest) GetPriority() int32 { if x != nil { return x.Priority } return 0 } -type TableCardinalityResponse struct { +func (x *ColumnTimeSeriesRequest) GetTimeZone() string { + if x != nil { + return x.TimeZone + } + return "" +} + +type ColumnTimeSeriesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Cardinality int64 `protobuf:"varint,1,opt,name=cardinality,proto3" json:"cardinality,omitempty"` + Rollup *TimeSeriesResponse `protobuf:"bytes,1,opt,name=rollup,proto3" json:"rollup,omitempty"` } -func (x *TableCardinalityResponse) Reset() { - *x = TableCardinalityResponse{} +func (x *ColumnTimeSeriesResponse) Reset() { + *x = ColumnTimeSeriesResponse{} if protoimpl.UnsafeEnabled { mi := &file_rill_runtime_v1_queries_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -4009,13 +4136,13 @@ func (x *TableCardinalityResponse) Reset() { } } -func (x *TableCardinalityResponse) String() string { +func (x *ColumnTimeSeriesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TableCardinalityResponse) ProtoMessage() {} +func (*ColumnTimeSeriesResponse) ProtoMessage() {} -func (x *TableCardinalityResponse) ProtoReflect() protoreflect.Message { +func (x *ColumnTimeSeriesResponse) ProtoReflect() protoreflect.Message { mi := &file_rill_runtime_v1_queries_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -4027,30 +4154,30 @@ func (x *TableCardinalityResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TableCardinalityResponse.ProtoReflect.Descriptor instead. -func (*TableCardinalityResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use ColumnTimeSeriesResponse.ProtoReflect.Descriptor instead. +func (*ColumnTimeSeriesResponse) Descriptor() ([]byte, []int) { return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{55} } -func (x *TableCardinalityResponse) GetCardinality() int64 { +func (x *ColumnTimeSeriesResponse) GetRollup() *TimeSeriesResponse { if x != nil { - return x.Cardinality + return x.Rollup } - return 0 + return nil } -type TableColumnsRequest struct { +type TimeSeriesTimeRange struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` - TableName string `protobuf:"bytes,2,opt,name=table_name,json=tableName,proto3" json:"table_name,omitempty"` - Priority int32 `protobuf:"varint,3,opt,name=priority,proto3" json:"priority,omitempty"` + Start *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=start,proto3" json:"start,omitempty"` + End *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=end,proto3" json:"end,omitempty"` + Interval TimeGrain `protobuf:"varint,4,opt,name=interval,proto3,enum=rill.runtime.v1.TimeGrain" json:"interval,omitempty"` } -func (x *TableColumnsRequest) Reset() { - *x = TableColumnsRequest{} +func (x *TimeSeriesTimeRange) Reset() { + *x = TimeSeriesTimeRange{} if protoimpl.UnsafeEnabled { mi := &file_rill_runtime_v1_queries_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -4058,13 +4185,13 @@ func (x *TableColumnsRequest) Reset() { } } -func (x *TableColumnsRequest) String() string { +func (x *TimeSeriesTimeRange) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TableColumnsRequest) ProtoMessage() {} +func (*TimeSeriesTimeRange) ProtoMessage() {} -func (x *TableColumnsRequest) ProtoReflect() protoreflect.Message { +func (x *TimeSeriesTimeRange) ProtoReflect() protoreflect.Message { mi := &file_rill_runtime_v1_queries_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -4076,42 +4203,44 @@ func (x *TableColumnsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TableColumnsRequest.ProtoReflect.Descriptor instead. -func (*TableColumnsRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use TimeSeriesTimeRange.ProtoReflect.Descriptor instead. +func (*TimeSeriesTimeRange) Descriptor() ([]byte, []int) { return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{56} } -func (x *TableColumnsRequest) GetInstanceId() string { +func (x *TimeSeriesTimeRange) GetStart() *timestamppb.Timestamp { if x != nil { - return x.InstanceId + return x.Start } - return "" + return nil } -func (x *TableColumnsRequest) GetTableName() string { +func (x *TimeSeriesTimeRange) GetEnd() *timestamppb.Timestamp { if x != nil { - return x.TableName + return x.End } - return "" + return nil } -func (x *TableColumnsRequest) GetPriority() int32 { +func (x *TimeSeriesTimeRange) GetInterval() TimeGrain { if x != nil { - return x.Priority + return x.Interval } - return 0 + return TimeGrain_TIME_GRAIN_UNSPECIFIED } -type TableColumnsResponse struct { +type TimeSeriesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ProfileColumns []*ProfileColumn `protobuf:"bytes,1,rep,name=profile_columns,json=profileColumns,proto3" json:"profile_columns,omitempty"` + Results []*TimeSeriesValue `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` + Spark []*TimeSeriesValue `protobuf:"bytes,2,rep,name=spark,proto3" json:"spark,omitempty"` + SampleSize int32 `protobuf:"varint,4,opt,name=sample_size,json=sampleSize,proto3" json:"sample_size,omitempty"` } -func (x *TableColumnsResponse) Reset() { - *x = TableColumnsResponse{} +func (x *TimeSeriesResponse) Reset() { + *x = TimeSeriesResponse{} if protoimpl.UnsafeEnabled { mi := &file_rill_runtime_v1_queries_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -4119,13 +4248,13 @@ func (x *TableColumnsResponse) Reset() { } } -func (x *TableColumnsResponse) String() string { +func (x *TimeSeriesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TableColumnsResponse) ProtoMessage() {} +func (*TimeSeriesResponse) ProtoMessage() {} -func (x *TableColumnsResponse) ProtoReflect() protoreflect.Message { +func (x *TimeSeriesResponse) ProtoReflect() protoreflect.Message { mi := &file_rill_runtime_v1_queries_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -4137,30 +4266,44 @@ func (x *TableColumnsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TableColumnsResponse.ProtoReflect.Descriptor instead. -func (*TableColumnsResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use TimeSeriesResponse.ProtoReflect.Descriptor instead. +func (*TimeSeriesResponse) Descriptor() ([]byte, []int) { return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{57} } -func (x *TableColumnsResponse) GetProfileColumns() []*ProfileColumn { +func (x *TimeSeriesResponse) GetResults() []*TimeSeriesValue { if x != nil { - return x.ProfileColumns + return x.Results } return nil } -type ProfileColumn struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *TimeSeriesResponse) GetSpark() []*TimeSeriesValue { + if x != nil { + return x.Spark + } + return nil +} - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` - LargestStringLength int32 `protobuf:"varint,3,opt,name=largest_string_length,json=largestStringLength,proto3" json:"largest_string_length,omitempty"` +func (x *TimeSeriesResponse) GetSampleSize() int32 { + if x != nil { + return x.SampleSize + } + return 0 } -func (x *ProfileColumn) Reset() { - *x = ProfileColumn{} +type TimeSeriesValue struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Ts *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=ts,proto3" json:"ts,omitempty"` + Bin float64 `protobuf:"fixed64,2,opt,name=bin,proto3" json:"bin,omitempty"` + Records *structpb.Struct `protobuf:"bytes,3,opt,name=records,proto3" json:"records,omitempty"` +} + +func (x *TimeSeriesValue) Reset() { + *x = TimeSeriesValue{} if protoimpl.UnsafeEnabled { mi := &file_rill_runtime_v1_queries_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -4168,13 +4311,13 @@ func (x *ProfileColumn) Reset() { } } -func (x *ProfileColumn) String() string { +func (x *TimeSeriesValue) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ProfileColumn) ProtoMessage() {} +func (*TimeSeriesValue) ProtoMessage() {} -func (x *ProfileColumn) ProtoReflect() protoreflect.Message { +func (x *TimeSeriesValue) ProtoReflect() protoreflect.Message { mi := &file_rill_runtime_v1_queries_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -4186,45 +4329,44 @@ func (x *ProfileColumn) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ProfileColumn.ProtoReflect.Descriptor instead. -func (*ProfileColumn) Descriptor() ([]byte, []int) { +// Deprecated: Use TimeSeriesValue.ProtoReflect.Descriptor instead. +func (*TimeSeriesValue) Descriptor() ([]byte, []int) { return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{58} } -func (x *ProfileColumn) GetName() string { +func (x *TimeSeriesValue) GetTs() *timestamppb.Timestamp { if x != nil { - return x.Name + return x.Ts } - return "" + return nil } -func (x *ProfileColumn) GetType() string { +func (x *TimeSeriesValue) GetBin() float64 { if x != nil { - return x.Type + return x.Bin } - return "" + return 0 } -func (x *ProfileColumn) GetLargestStringLength() int32 { +func (x *TimeSeriesValue) GetRecords() *structpb.Struct { if x != nil { - return x.LargestStringLength + return x.Records } - return 0 + return nil } -type TableRowsRequest struct { +type TableCardinalityRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` TableName string `protobuf:"bytes,2,opt,name=table_name,json=tableName,proto3" json:"table_name,omitempty"` - Limit int32 `protobuf:"varint,3,opt,name=limit,proto3" json:"limit,omitempty"` - Priority int32 `protobuf:"varint,4,opt,name=priority,proto3" json:"priority,omitempty"` + Priority int32 `protobuf:"varint,3,opt,name=priority,proto3" json:"priority,omitempty"` } -func (x *TableRowsRequest) Reset() { - *x = TableRowsRequest{} +func (x *TableCardinalityRequest) Reset() { + *x = TableCardinalityRequest{} if protoimpl.UnsafeEnabled { mi := &file_rill_runtime_v1_queries_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -4232,13 +4374,13 @@ func (x *TableRowsRequest) Reset() { } } -func (x *TableRowsRequest) String() string { +func (x *TableCardinalityRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TableRowsRequest) ProtoMessage() {} +func (*TableCardinalityRequest) ProtoMessage() {} -func (x *TableRowsRequest) ProtoReflect() protoreflect.Message { +func (x *TableCardinalityRequest) ProtoReflect() protoreflect.Message { mi := &file_rill_runtime_v1_queries_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -4250,49 +4392,42 @@ func (x *TableRowsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TableRowsRequest.ProtoReflect.Descriptor instead. -func (*TableRowsRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use TableCardinalityRequest.ProtoReflect.Descriptor instead. +func (*TableCardinalityRequest) Descriptor() ([]byte, []int) { return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{59} } -func (x *TableRowsRequest) GetInstanceId() string { +func (x *TableCardinalityRequest) GetInstanceId() string { if x != nil { return x.InstanceId } return "" } -func (x *TableRowsRequest) GetTableName() string { +func (x *TableCardinalityRequest) GetTableName() string { if x != nil { return x.TableName } return "" } -func (x *TableRowsRequest) GetLimit() int32 { - if x != nil { - return x.Limit - } - return 0 -} - -func (x *TableRowsRequest) GetPriority() int32 { +func (x *TableCardinalityRequest) GetPriority() int32 { if x != nil { return x.Priority } return 0 } -type TableRowsResponse struct { +type TableCardinalityResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Data []*structpb.Struct `protobuf:"bytes,1,rep,name=data,proto3" json:"data,omitempty"` + Cardinality int64 `protobuf:"varint,1,opt,name=cardinality,proto3" json:"cardinality,omitempty"` } -func (x *TableRowsResponse) Reset() { - *x = TableRowsResponse{} +func (x *TableCardinalityResponse) Reset() { + *x = TableCardinalityResponse{} if protoimpl.UnsafeEnabled { mi := &file_rill_runtime_v1_queries_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -4300,13 +4435,13 @@ func (x *TableRowsResponse) Reset() { } } -func (x *TableRowsResponse) String() string { +func (x *TableCardinalityResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TableRowsResponse) ProtoMessage() {} +func (*TableCardinalityResponse) ProtoMessage() {} -func (x *TableRowsResponse) ProtoReflect() protoreflect.Message { +func (x *TableCardinalityResponse) ProtoReflect() protoreflect.Message { mi := &file_rill_runtime_v1_queries_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -4318,50 +4453,30 @@ func (x *TableRowsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TableRowsResponse.ProtoReflect.Descriptor instead. -func (*TableRowsResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use TableCardinalityResponse.ProtoReflect.Descriptor instead. +func (*TableCardinalityResponse) Descriptor() ([]byte, []int) { return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{60} } -func (x *TableRowsResponse) GetData() []*structpb.Struct { +func (x *TableCardinalityResponse) GetCardinality() int64 { if x != nil { - return x.Data + return x.Cardinality } - return nil + return 0 } -type QueryBatchEntry struct { +type TableColumnsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Since response could out of order `key` is used to co-relate a specific response to request. - Key int32 `protobuf:"varint,1,opt,name=key,proto3" json:"key,omitempty"` - // Types that are assignable to Query: - // - // *QueryBatchEntry_MetricsViewToplistRequest - // *QueryBatchEntry_MetricsViewComparisonToplistRequest - // *QueryBatchEntry_MetricsViewTimeSeriesRequest - // *QueryBatchEntry_MetricsViewTotalsRequest - // *QueryBatchEntry_MetricsViewRowsRequest - // *QueryBatchEntry_ColumnRollupIntervalRequest - // *QueryBatchEntry_ColumnTopKRequest - // *QueryBatchEntry_ColumnNullCountRequest - // *QueryBatchEntry_ColumnDescriptiveStatisticsRequest - // *QueryBatchEntry_ColumnTimeGrainRequest - // *QueryBatchEntry_ColumnNumericHistogramRequest - // *QueryBatchEntry_ColumnRugHistogramRequest - // *QueryBatchEntry_ColumnTimeRangeRequest - // *QueryBatchEntry_ColumnCardinalityRequest - // *QueryBatchEntry_ColumnTimeSeriesRequest - // *QueryBatchEntry_TableCardinalityRequest - // *QueryBatchEntry_TableColumnsRequest - // *QueryBatchEntry_TableRowsRequest - Query isQueryBatchEntry_Query `protobuf_oneof:"query"` + InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` + TableName string `protobuf:"bytes,2,opt,name=table_name,json=tableName,proto3" json:"table_name,omitempty"` + Priority int32 `protobuf:"varint,3,opt,name=priority,proto3" json:"priority,omitempty"` } -func (x *QueryBatchEntry) Reset() { - *x = QueryBatchEntry{} +func (x *TableColumnsRequest) Reset() { + *x = TableColumnsRequest{} if protoimpl.UnsafeEnabled { mi := &file_rill_runtime_v1_queries_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -4369,13 +4484,13 @@ func (x *QueryBatchEntry) Reset() { } } -func (x *QueryBatchEntry) String() string { +func (x *TableColumnsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*QueryBatchEntry) ProtoMessage() {} +func (*TableColumnsRequest) ProtoMessage() {} -func (x *QueryBatchEntry) ProtoReflect() protoreflect.Message { +func (x *TableColumnsRequest) ProtoReflect() protoreflect.Message { mi := &file_rill_runtime_v1_queries_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -4387,289 +4502,238 @@ func (x *QueryBatchEntry) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use QueryBatchEntry.ProtoReflect.Descriptor instead. -func (*QueryBatchEntry) Descriptor() ([]byte, []int) { +// Deprecated: Use TableColumnsRequest.ProtoReflect.Descriptor instead. +func (*TableColumnsRequest) Descriptor() ([]byte, []int) { return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{61} } -func (x *QueryBatchEntry) GetKey() int32 { +func (x *TableColumnsRequest) GetInstanceId() string { if x != nil { - return x.Key + return x.InstanceId } - return 0 + return "" } -func (m *QueryBatchEntry) GetQuery() isQueryBatchEntry_Query { - if m != nil { - return m.Query +func (x *TableColumnsRequest) GetTableName() string { + if x != nil { + return x.TableName } - return nil + return "" } -func (x *QueryBatchEntry) GetMetricsViewToplistRequest() *MetricsViewToplistRequest { - if x, ok := x.GetQuery().(*QueryBatchEntry_MetricsViewToplistRequest); ok { - return x.MetricsViewToplistRequest +func (x *TableColumnsRequest) GetPriority() int32 { + if x != nil { + return x.Priority } - return nil + return 0 } -func (x *QueryBatchEntry) GetMetricsViewComparisonToplistRequest() *MetricsViewComparisonToplistRequest { - if x, ok := x.GetQuery().(*QueryBatchEntry_MetricsViewComparisonToplistRequest); ok { - return x.MetricsViewComparisonToplistRequest - } - return nil +type TableColumnsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ProfileColumns []*ProfileColumn `protobuf:"bytes,1,rep,name=profile_columns,json=profileColumns,proto3" json:"profile_columns,omitempty"` } -func (x *QueryBatchEntry) GetMetricsViewTimeSeriesRequest() *MetricsViewTimeSeriesRequest { - if x, ok := x.GetQuery().(*QueryBatchEntry_MetricsViewTimeSeriesRequest); ok { - return x.MetricsViewTimeSeriesRequest +func (x *TableColumnsResponse) Reset() { + *x = TableColumnsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[62] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *QueryBatchEntry) GetMetricsViewTotalsRequest() *MetricsViewTotalsRequest { - if x, ok := x.GetQuery().(*QueryBatchEntry_MetricsViewTotalsRequest); ok { - return x.MetricsViewTotalsRequest - } - return nil +func (x *TableColumnsResponse) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *QueryBatchEntry) GetMetricsViewRowsRequest() *MetricsViewRowsRequest { - if x, ok := x.GetQuery().(*QueryBatchEntry_MetricsViewRowsRequest); ok { - return x.MetricsViewRowsRequest +func (*TableColumnsResponse) ProtoMessage() {} + +func (x *TableColumnsResponse) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[62] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *QueryBatchEntry) GetColumnRollupIntervalRequest() *ColumnRollupIntervalRequest { - if x, ok := x.GetQuery().(*QueryBatchEntry_ColumnRollupIntervalRequest); ok { - return x.ColumnRollupIntervalRequest - } - return nil +// Deprecated: Use TableColumnsResponse.ProtoReflect.Descriptor instead. +func (*TableColumnsResponse) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{62} } -func (x *QueryBatchEntry) GetColumnTopKRequest() *ColumnTopKRequest { - if x, ok := x.GetQuery().(*QueryBatchEntry_ColumnTopKRequest); ok { - return x.ColumnTopKRequest +func (x *TableColumnsResponse) GetProfileColumns() []*ProfileColumn { + if x != nil { + return x.ProfileColumns } return nil } -func (x *QueryBatchEntry) GetColumnNullCountRequest() *ColumnNullCountRequest { - if x, ok := x.GetQuery().(*QueryBatchEntry_ColumnNullCountRequest); ok { - return x.ColumnNullCountRequest - } - return nil +type ProfileColumn struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + LargestStringLength int32 `protobuf:"varint,3,opt,name=largest_string_length,json=largestStringLength,proto3" json:"largest_string_length,omitempty"` } -func (x *QueryBatchEntry) GetColumnDescriptiveStatisticsRequest() *ColumnDescriptiveStatisticsRequest { - if x, ok := x.GetQuery().(*QueryBatchEntry_ColumnDescriptiveStatisticsRequest); ok { - return x.ColumnDescriptiveStatisticsRequest +func (x *ProfileColumn) Reset() { + *x = ProfileColumn{} + if protoimpl.UnsafeEnabled { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[63] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *QueryBatchEntry) GetColumnTimeGrainRequest() *ColumnTimeGrainRequest { - if x, ok := x.GetQuery().(*QueryBatchEntry_ColumnTimeGrainRequest); ok { - return x.ColumnTimeGrainRequest - } - return nil +func (x *ProfileColumn) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *QueryBatchEntry) GetColumnNumericHistogramRequest() *ColumnNumericHistogramRequest { - if x, ok := x.GetQuery().(*QueryBatchEntry_ColumnNumericHistogramRequest); ok { - return x.ColumnNumericHistogramRequest - } - return nil -} - -func (x *QueryBatchEntry) GetColumnRugHistogramRequest() *ColumnRugHistogramRequest { - if x, ok := x.GetQuery().(*QueryBatchEntry_ColumnRugHistogramRequest); ok { - return x.ColumnRugHistogramRequest - } - return nil -} - -func (x *QueryBatchEntry) GetColumnTimeRangeRequest() *ColumnTimeRangeRequest { - if x, ok := x.GetQuery().(*QueryBatchEntry_ColumnTimeRangeRequest); ok { - return x.ColumnTimeRangeRequest - } - return nil -} +func (*ProfileColumn) ProtoMessage() {} -func (x *QueryBatchEntry) GetColumnCardinalityRequest() *ColumnCardinalityRequest { - if x, ok := x.GetQuery().(*QueryBatchEntry_ColumnCardinalityRequest); ok { - return x.ColumnCardinalityRequest +func (x *ProfileColumn) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[63] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *QueryBatchEntry) GetColumnTimeSeriesRequest() *ColumnTimeSeriesRequest { - if x, ok := x.GetQuery().(*QueryBatchEntry_ColumnTimeSeriesRequest); ok { - return x.ColumnTimeSeriesRequest - } - return nil +// Deprecated: Use ProfileColumn.ProtoReflect.Descriptor instead. +func (*ProfileColumn) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{63} } -func (x *QueryBatchEntry) GetTableCardinalityRequest() *TableCardinalityRequest { - if x, ok := x.GetQuery().(*QueryBatchEntry_TableCardinalityRequest); ok { - return x.TableCardinalityRequest +func (x *ProfileColumn) GetName() string { + if x != nil { + return x.Name } - return nil + return "" } -func (x *QueryBatchEntry) GetTableColumnsRequest() *TableColumnsRequest { - if x, ok := x.GetQuery().(*QueryBatchEntry_TableColumnsRequest); ok { - return x.TableColumnsRequest +func (x *ProfileColumn) GetType() string { + if x != nil { + return x.Type } - return nil + return "" } -func (x *QueryBatchEntry) GetTableRowsRequest() *TableRowsRequest { - if x, ok := x.GetQuery().(*QueryBatchEntry_TableRowsRequest); ok { - return x.TableRowsRequest +func (x *ProfileColumn) GetLargestStringLength() int32 { + if x != nil { + return x.LargestStringLength } - return nil -} - -type isQueryBatchEntry_Query interface { - isQueryBatchEntry_Query() -} - -type QueryBatchEntry_MetricsViewToplistRequest struct { - MetricsViewToplistRequest *MetricsViewToplistRequest `protobuf:"bytes,2,opt,name=metrics_view_toplist_request,json=metricsViewToplistRequest,proto3,oneof"` -} - -type QueryBatchEntry_MetricsViewComparisonToplistRequest struct { - MetricsViewComparisonToplistRequest *MetricsViewComparisonToplistRequest `protobuf:"bytes,3,opt,name=metrics_view_comparison_toplist_request,json=metricsViewComparisonToplistRequest,proto3,oneof"` -} - -type QueryBatchEntry_MetricsViewTimeSeriesRequest struct { - MetricsViewTimeSeriesRequest *MetricsViewTimeSeriesRequest `protobuf:"bytes,4,opt,name=metrics_view_time_series_request,json=metricsViewTimeSeriesRequest,proto3,oneof"` -} - -type QueryBatchEntry_MetricsViewTotalsRequest struct { - MetricsViewTotalsRequest *MetricsViewTotalsRequest `protobuf:"bytes,5,opt,name=metrics_view_totals_request,json=metricsViewTotalsRequest,proto3,oneof"` -} - -type QueryBatchEntry_MetricsViewRowsRequest struct { - MetricsViewRowsRequest *MetricsViewRowsRequest `protobuf:"bytes,6,opt,name=metrics_view_rows_request,json=metricsViewRowsRequest,proto3,oneof"` -} - -type QueryBatchEntry_ColumnRollupIntervalRequest struct { - ColumnRollupIntervalRequest *ColumnRollupIntervalRequest `protobuf:"bytes,7,opt,name=column_rollup_interval_request,json=columnRollupIntervalRequest,proto3,oneof"` -} - -type QueryBatchEntry_ColumnTopKRequest struct { - ColumnTopKRequest *ColumnTopKRequest `protobuf:"bytes,8,opt,name=column_top_k_request,json=columnTopKRequest,proto3,oneof"` + return 0 } -type QueryBatchEntry_ColumnNullCountRequest struct { - ColumnNullCountRequest *ColumnNullCountRequest `protobuf:"bytes,9,opt,name=column_null_count_request,json=columnNullCountRequest,proto3,oneof"` -} +type TableRowsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -type QueryBatchEntry_ColumnDescriptiveStatisticsRequest struct { - ColumnDescriptiveStatisticsRequest *ColumnDescriptiveStatisticsRequest `protobuf:"bytes,10,opt,name=column_descriptive_statistics_request,json=columnDescriptiveStatisticsRequest,proto3,oneof"` + InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` + TableName string `protobuf:"bytes,2,opt,name=table_name,json=tableName,proto3" json:"table_name,omitempty"` + Limit int32 `protobuf:"varint,3,opt,name=limit,proto3" json:"limit,omitempty"` + Priority int32 `protobuf:"varint,4,opt,name=priority,proto3" json:"priority,omitempty"` } -type QueryBatchEntry_ColumnTimeGrainRequest struct { - ColumnTimeGrainRequest *ColumnTimeGrainRequest `protobuf:"bytes,11,opt,name=column_time_grain_request,json=columnTimeGrainRequest,proto3,oneof"` +func (x *TableRowsRequest) Reset() { + *x = TableRowsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[64] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -type QueryBatchEntry_ColumnNumericHistogramRequest struct { - ColumnNumericHistogramRequest *ColumnNumericHistogramRequest `protobuf:"bytes,12,opt,name=column_numeric_histogram_request,json=columnNumericHistogramRequest,proto3,oneof"` +func (x *TableRowsRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -type QueryBatchEntry_ColumnRugHistogramRequest struct { - ColumnRugHistogramRequest *ColumnRugHistogramRequest `protobuf:"bytes,13,opt,name=column_rug_histogram_request,json=columnRugHistogramRequest,proto3,oneof"` -} +func (*TableRowsRequest) ProtoMessage() {} -type QueryBatchEntry_ColumnTimeRangeRequest struct { - ColumnTimeRangeRequest *ColumnTimeRangeRequest `protobuf:"bytes,14,opt,name=column_time_range_request,json=columnTimeRangeRequest,proto3,oneof"` +func (x *TableRowsRequest) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[64] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -type QueryBatchEntry_ColumnCardinalityRequest struct { - ColumnCardinalityRequest *ColumnCardinalityRequest `protobuf:"bytes,15,opt,name=column_cardinality_request,json=columnCardinalityRequest,proto3,oneof"` +// Deprecated: Use TableRowsRequest.ProtoReflect.Descriptor instead. +func (*TableRowsRequest) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{64} } -type QueryBatchEntry_ColumnTimeSeriesRequest struct { - ColumnTimeSeriesRequest *ColumnTimeSeriesRequest `protobuf:"bytes,16,opt,name=column_time_series_request,json=columnTimeSeriesRequest,proto3,oneof"` +func (x *TableRowsRequest) GetInstanceId() string { + if x != nil { + return x.InstanceId + } + return "" } -type QueryBatchEntry_TableCardinalityRequest struct { - TableCardinalityRequest *TableCardinalityRequest `protobuf:"bytes,17,opt,name=table_cardinality_request,json=tableCardinalityRequest,proto3,oneof"` +func (x *TableRowsRequest) GetTableName() string { + if x != nil { + return x.TableName + } + return "" } -type QueryBatchEntry_TableColumnsRequest struct { - TableColumnsRequest *TableColumnsRequest `protobuf:"bytes,18,opt,name=table_columns_request,json=tableColumnsRequest,proto3,oneof"` +func (x *TableRowsRequest) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 } -type QueryBatchEntry_TableRowsRequest struct { - TableRowsRequest *TableRowsRequest `protobuf:"bytes,19,opt,name=table_rows_request,json=tableRowsRequest,proto3,oneof"` +func (x *TableRowsRequest) GetPriority() int32 { + if x != nil { + return x.Priority + } + return 0 } -func (*QueryBatchEntry_MetricsViewToplistRequest) isQueryBatchEntry_Query() {} - -func (*QueryBatchEntry_MetricsViewComparisonToplistRequest) isQueryBatchEntry_Query() {} - -func (*QueryBatchEntry_MetricsViewTimeSeriesRequest) isQueryBatchEntry_Query() {} - -func (*QueryBatchEntry_MetricsViewTotalsRequest) isQueryBatchEntry_Query() {} - -func (*QueryBatchEntry_MetricsViewRowsRequest) isQueryBatchEntry_Query() {} - -func (*QueryBatchEntry_ColumnRollupIntervalRequest) isQueryBatchEntry_Query() {} - -func (*QueryBatchEntry_ColumnTopKRequest) isQueryBatchEntry_Query() {} - -func (*QueryBatchEntry_ColumnNullCountRequest) isQueryBatchEntry_Query() {} - -func (*QueryBatchEntry_ColumnDescriptiveStatisticsRequest) isQueryBatchEntry_Query() {} - -func (*QueryBatchEntry_ColumnTimeGrainRequest) isQueryBatchEntry_Query() {} - -func (*QueryBatchEntry_ColumnNumericHistogramRequest) isQueryBatchEntry_Query() {} - -func (*QueryBatchEntry_ColumnRugHistogramRequest) isQueryBatchEntry_Query() {} - -func (*QueryBatchEntry_ColumnTimeRangeRequest) isQueryBatchEntry_Query() {} - -func (*QueryBatchEntry_ColumnCardinalityRequest) isQueryBatchEntry_Query() {} - -func (*QueryBatchEntry_ColumnTimeSeriesRequest) isQueryBatchEntry_Query() {} - -func (*QueryBatchEntry_TableCardinalityRequest) isQueryBatchEntry_Query() {} - -func (*QueryBatchEntry_TableColumnsRequest) isQueryBatchEntry_Query() {} - -func (*QueryBatchEntry_TableRowsRequest) isQueryBatchEntry_Query() {} - -type QueryBatchRequest struct { +type TableRowsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` - Queries []*QueryBatchEntry `protobuf:"bytes,3,rep,name=queries,proto3" json:"queries,omitempty"` + Data []*structpb.Struct `protobuf:"bytes,1,rep,name=data,proto3" json:"data,omitempty"` } -func (x *QueryBatchRequest) Reset() { - *x = QueryBatchRequest{} +func (x *TableRowsResponse) Reset() { + *x = TableRowsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[62] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *QueryBatchRequest) String() string { +func (x *TableRowsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*QueryBatchRequest) ProtoMessage() {} +func (*TableRowsResponse) ProtoMessage() {} -func (x *QueryBatchRequest) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[62] +func (x *TableRowsResponse) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4680,72 +4744,66 @@ func (x *QueryBatchRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use QueryBatchRequest.ProtoReflect.Descriptor instead. -func (*QueryBatchRequest) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{62} -} - -func (x *QueryBatchRequest) GetInstanceId() string { - if x != nil { - return x.InstanceId - } - return "" +// Deprecated: Use TableRowsResponse.ProtoReflect.Descriptor instead. +func (*TableRowsResponse) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{65} } -func (x *QueryBatchRequest) GetQueries() []*QueryBatchEntry { +func (x *TableRowsResponse) GetData() []*structpb.Struct { if x != nil { - return x.Queries + return x.Data } return nil } -type QueryBatchResponse struct { +type QueryBatchEntry struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Key int32 `protobuf:"varint,1,opt,name=key,proto3" json:"key,omitempty"` - Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` - // Types that are assignable to Result: + // Since response could out of order `key` is used to co-relate a specific response to request. + Key int32 `protobuf:"varint,1,opt,name=key,proto3" json:"key,omitempty"` + // Types that are assignable to Query: // - // *QueryBatchResponse_MetricsViewToplistResponse - // *QueryBatchResponse_MetricsViewComparisonToplistResponse - // *QueryBatchResponse_MetricsViewTimeSeriesResponse - // *QueryBatchResponse_MetricsViewTotalsResponse - // *QueryBatchResponse_MetricsViewRowsResponse - // *QueryBatchResponse_ColumnRollupIntervalResponse - // *QueryBatchResponse_ColumnTopKResponse - // *QueryBatchResponse_ColumnNullCountResponse - // *QueryBatchResponse_ColumnDescriptiveStatisticsResponse - // *QueryBatchResponse_ColumnTimeGrainResponse - // *QueryBatchResponse_ColumnNumericHistogramResponse - // *QueryBatchResponse_ColumnRugHistogramResponse - // *QueryBatchResponse_ColumnTimeRangeResponse - // *QueryBatchResponse_ColumnCardinalityResponse - // *QueryBatchResponse_ColumnTimeSeriesResponse - // *QueryBatchResponse_TableCardinalityResponse - // *QueryBatchResponse_TableColumnsResponse - // *QueryBatchResponse_TableRowsResponse - Result isQueryBatchResponse_Result `protobuf_oneof:"result"` + // *QueryBatchEntry_MetricsViewAggregationRequest + // *QueryBatchEntry_MetricsViewToplistRequest + // *QueryBatchEntry_MetricsViewComparisonToplistRequest + // *QueryBatchEntry_MetricsViewTimeSeriesRequest + // *QueryBatchEntry_MetricsViewTotalsRequest + // *QueryBatchEntry_MetricsViewRowsRequest + // *QueryBatchEntry_ColumnRollupIntervalRequest + // *QueryBatchEntry_ColumnTopKRequest + // *QueryBatchEntry_ColumnNullCountRequest + // *QueryBatchEntry_ColumnDescriptiveStatisticsRequest + // *QueryBatchEntry_ColumnTimeGrainRequest + // *QueryBatchEntry_ColumnNumericHistogramRequest + // *QueryBatchEntry_ColumnRugHistogramRequest + // *QueryBatchEntry_ColumnTimeRangeRequest + // *QueryBatchEntry_ColumnCardinalityRequest + // *QueryBatchEntry_ColumnTimeSeriesRequest + // *QueryBatchEntry_TableCardinalityRequest + // *QueryBatchEntry_TableColumnsRequest + // *QueryBatchEntry_TableRowsRequest + Query isQueryBatchEntry_Query `protobuf_oneof:"query"` } -func (x *QueryBatchResponse) Reset() { - *x = QueryBatchResponse{} +func (x *QueryBatchEntry) Reset() { + *x = QueryBatchEntry{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[63] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *QueryBatchResponse) String() string { +func (x *QueryBatchEntry) String() string { return protoimpl.X.MessageStringOf(x) } -func (*QueryBatchResponse) ProtoMessage() {} +func (*QueryBatchEntry) ProtoMessage() {} -func (x *QueryBatchResponse) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[63] +func (x *QueryBatchEntry) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4756,297 +4814,302 @@ func (x *QueryBatchResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use QueryBatchResponse.ProtoReflect.Descriptor instead. -func (*QueryBatchResponse) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{63} +// Deprecated: Use QueryBatchEntry.ProtoReflect.Descriptor instead. +func (*QueryBatchEntry) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{66} } -func (x *QueryBatchResponse) GetKey() int32 { +func (x *QueryBatchEntry) GetKey() int32 { if x != nil { return x.Key } return 0 } -func (x *QueryBatchResponse) GetError() string { - if x != nil { - return x.Error +func (m *QueryBatchEntry) GetQuery() isQueryBatchEntry_Query { + if m != nil { + return m.Query } - return "" + return nil } -func (m *QueryBatchResponse) GetResult() isQueryBatchResponse_Result { - if m != nil { - return m.Result +func (x *QueryBatchEntry) GetMetricsViewAggregationRequest() *MetricsViewAggregationRequest { + if x, ok := x.GetQuery().(*QueryBatchEntry_MetricsViewAggregationRequest); ok { + return x.MetricsViewAggregationRequest } return nil } -func (x *QueryBatchResponse) GetMetricsViewToplistResponse() *MetricsViewToplistResponse { - if x, ok := x.GetResult().(*QueryBatchResponse_MetricsViewToplistResponse); ok { - return x.MetricsViewToplistResponse +func (x *QueryBatchEntry) GetMetricsViewToplistRequest() *MetricsViewToplistRequest { + if x, ok := x.GetQuery().(*QueryBatchEntry_MetricsViewToplistRequest); ok { + return x.MetricsViewToplistRequest } return nil } -func (x *QueryBatchResponse) GetMetricsViewComparisonToplistResponse() *MetricsViewComparisonToplistResponse { - if x, ok := x.GetResult().(*QueryBatchResponse_MetricsViewComparisonToplistResponse); ok { - return x.MetricsViewComparisonToplistResponse +func (x *QueryBatchEntry) GetMetricsViewComparisonToplistRequest() *MetricsViewComparisonToplistRequest { + if x, ok := x.GetQuery().(*QueryBatchEntry_MetricsViewComparisonToplistRequest); ok { + return x.MetricsViewComparisonToplistRequest } return nil } -func (x *QueryBatchResponse) GetMetricsViewTimeSeriesResponse() *MetricsViewTimeSeriesResponse { - if x, ok := x.GetResult().(*QueryBatchResponse_MetricsViewTimeSeriesResponse); ok { - return x.MetricsViewTimeSeriesResponse +func (x *QueryBatchEntry) GetMetricsViewTimeSeriesRequest() *MetricsViewTimeSeriesRequest { + if x, ok := x.GetQuery().(*QueryBatchEntry_MetricsViewTimeSeriesRequest); ok { + return x.MetricsViewTimeSeriesRequest } return nil } -func (x *QueryBatchResponse) GetMetricsViewTotalsResponse() *MetricsViewTotalsResponse { - if x, ok := x.GetResult().(*QueryBatchResponse_MetricsViewTotalsResponse); ok { - return x.MetricsViewTotalsResponse +func (x *QueryBatchEntry) GetMetricsViewTotalsRequest() *MetricsViewTotalsRequest { + if x, ok := x.GetQuery().(*QueryBatchEntry_MetricsViewTotalsRequest); ok { + return x.MetricsViewTotalsRequest } return nil } -func (x *QueryBatchResponse) GetMetricsViewRowsResponse() *MetricsViewRowsResponse { - if x, ok := x.GetResult().(*QueryBatchResponse_MetricsViewRowsResponse); ok { - return x.MetricsViewRowsResponse +func (x *QueryBatchEntry) GetMetricsViewRowsRequest() *MetricsViewRowsRequest { + if x, ok := x.GetQuery().(*QueryBatchEntry_MetricsViewRowsRequest); ok { + return x.MetricsViewRowsRequest } return nil } -func (x *QueryBatchResponse) GetColumnRollupIntervalResponse() *ColumnRollupIntervalResponse { - if x, ok := x.GetResult().(*QueryBatchResponse_ColumnRollupIntervalResponse); ok { - return x.ColumnRollupIntervalResponse +func (x *QueryBatchEntry) GetColumnRollupIntervalRequest() *ColumnRollupIntervalRequest { + if x, ok := x.GetQuery().(*QueryBatchEntry_ColumnRollupIntervalRequest); ok { + return x.ColumnRollupIntervalRequest } return nil } -func (x *QueryBatchResponse) GetColumnTopKResponse() *ColumnTopKResponse { - if x, ok := x.GetResult().(*QueryBatchResponse_ColumnTopKResponse); ok { - return x.ColumnTopKResponse +func (x *QueryBatchEntry) GetColumnTopKRequest() *ColumnTopKRequest { + if x, ok := x.GetQuery().(*QueryBatchEntry_ColumnTopKRequest); ok { + return x.ColumnTopKRequest } return nil } -func (x *QueryBatchResponse) GetColumnNullCountResponse() *ColumnNullCountResponse { - if x, ok := x.GetResult().(*QueryBatchResponse_ColumnNullCountResponse); ok { - return x.ColumnNullCountResponse +func (x *QueryBatchEntry) GetColumnNullCountRequest() *ColumnNullCountRequest { + if x, ok := x.GetQuery().(*QueryBatchEntry_ColumnNullCountRequest); ok { + return x.ColumnNullCountRequest } return nil } -func (x *QueryBatchResponse) GetColumnDescriptiveStatisticsResponse() *ColumnDescriptiveStatisticsResponse { - if x, ok := x.GetResult().(*QueryBatchResponse_ColumnDescriptiveStatisticsResponse); ok { - return x.ColumnDescriptiveStatisticsResponse +func (x *QueryBatchEntry) GetColumnDescriptiveStatisticsRequest() *ColumnDescriptiveStatisticsRequest { + if x, ok := x.GetQuery().(*QueryBatchEntry_ColumnDescriptiveStatisticsRequest); ok { + return x.ColumnDescriptiveStatisticsRequest } return nil } -func (x *QueryBatchResponse) GetColumnTimeGrainResponse() *ColumnTimeGrainResponse { - if x, ok := x.GetResult().(*QueryBatchResponse_ColumnTimeGrainResponse); ok { - return x.ColumnTimeGrainResponse +func (x *QueryBatchEntry) GetColumnTimeGrainRequest() *ColumnTimeGrainRequest { + if x, ok := x.GetQuery().(*QueryBatchEntry_ColumnTimeGrainRequest); ok { + return x.ColumnTimeGrainRequest } return nil } -func (x *QueryBatchResponse) GetColumnNumericHistogramResponse() *ColumnNumericHistogramResponse { - if x, ok := x.GetResult().(*QueryBatchResponse_ColumnNumericHistogramResponse); ok { - return x.ColumnNumericHistogramResponse +func (x *QueryBatchEntry) GetColumnNumericHistogramRequest() *ColumnNumericHistogramRequest { + if x, ok := x.GetQuery().(*QueryBatchEntry_ColumnNumericHistogramRequest); ok { + return x.ColumnNumericHistogramRequest } return nil } -func (x *QueryBatchResponse) GetColumnRugHistogramResponse() *ColumnRugHistogramResponse { - if x, ok := x.GetResult().(*QueryBatchResponse_ColumnRugHistogramResponse); ok { - return x.ColumnRugHistogramResponse +func (x *QueryBatchEntry) GetColumnRugHistogramRequest() *ColumnRugHistogramRequest { + if x, ok := x.GetQuery().(*QueryBatchEntry_ColumnRugHistogramRequest); ok { + return x.ColumnRugHistogramRequest } return nil } -func (x *QueryBatchResponse) GetColumnTimeRangeResponse() *ColumnTimeRangeResponse { - if x, ok := x.GetResult().(*QueryBatchResponse_ColumnTimeRangeResponse); ok { - return x.ColumnTimeRangeResponse +func (x *QueryBatchEntry) GetColumnTimeRangeRequest() *ColumnTimeRangeRequest { + if x, ok := x.GetQuery().(*QueryBatchEntry_ColumnTimeRangeRequest); ok { + return x.ColumnTimeRangeRequest } return nil } -func (x *QueryBatchResponse) GetColumnCardinalityResponse() *ColumnCardinalityResponse { - if x, ok := x.GetResult().(*QueryBatchResponse_ColumnCardinalityResponse); ok { - return x.ColumnCardinalityResponse +func (x *QueryBatchEntry) GetColumnCardinalityRequest() *ColumnCardinalityRequest { + if x, ok := x.GetQuery().(*QueryBatchEntry_ColumnCardinalityRequest); ok { + return x.ColumnCardinalityRequest } return nil } -func (x *QueryBatchResponse) GetColumnTimeSeriesResponse() *ColumnTimeSeriesResponse { - if x, ok := x.GetResult().(*QueryBatchResponse_ColumnTimeSeriesResponse); ok { - return x.ColumnTimeSeriesResponse +func (x *QueryBatchEntry) GetColumnTimeSeriesRequest() *ColumnTimeSeriesRequest { + if x, ok := x.GetQuery().(*QueryBatchEntry_ColumnTimeSeriesRequest); ok { + return x.ColumnTimeSeriesRequest } return nil } -func (x *QueryBatchResponse) GetTableCardinalityResponse() *TableCardinalityResponse { - if x, ok := x.GetResult().(*QueryBatchResponse_TableCardinalityResponse); ok { - return x.TableCardinalityResponse +func (x *QueryBatchEntry) GetTableCardinalityRequest() *TableCardinalityRequest { + if x, ok := x.GetQuery().(*QueryBatchEntry_TableCardinalityRequest); ok { + return x.TableCardinalityRequest } return nil } -func (x *QueryBatchResponse) GetTableColumnsResponse() *TableColumnsResponse { - if x, ok := x.GetResult().(*QueryBatchResponse_TableColumnsResponse); ok { - return x.TableColumnsResponse +func (x *QueryBatchEntry) GetTableColumnsRequest() *TableColumnsRequest { + if x, ok := x.GetQuery().(*QueryBatchEntry_TableColumnsRequest); ok { + return x.TableColumnsRequest } return nil } -func (x *QueryBatchResponse) GetTableRowsResponse() *TableRowsResponse { - if x, ok := x.GetResult().(*QueryBatchResponse_TableRowsResponse); ok { - return x.TableRowsResponse +func (x *QueryBatchEntry) GetTableRowsRequest() *TableRowsRequest { + if x, ok := x.GetQuery().(*QueryBatchEntry_TableRowsRequest); ok { + return x.TableRowsRequest } return nil } -type isQueryBatchResponse_Result interface { - isQueryBatchResponse_Result() +type isQueryBatchEntry_Query interface { + isQueryBatchEntry_Query() } -type QueryBatchResponse_MetricsViewToplistResponse struct { - MetricsViewToplistResponse *MetricsViewToplistResponse `protobuf:"bytes,3,opt,name=metrics_view_toplist_response,json=metricsViewToplistResponse,proto3,oneof"` +type QueryBatchEntry_MetricsViewAggregationRequest struct { + MetricsViewAggregationRequest *MetricsViewAggregationRequest `protobuf:"bytes,20,opt,name=metrics_view_aggregation_request,json=metricsViewAggregationRequest,proto3,oneof"` } -type QueryBatchResponse_MetricsViewComparisonToplistResponse struct { - MetricsViewComparisonToplistResponse *MetricsViewComparisonToplistResponse `protobuf:"bytes,4,opt,name=metrics_view_comparison_toplist_response,json=metricsViewComparisonToplistResponse,proto3,oneof"` +type QueryBatchEntry_MetricsViewToplistRequest struct { + MetricsViewToplistRequest *MetricsViewToplistRequest `protobuf:"bytes,2,opt,name=metrics_view_toplist_request,json=metricsViewToplistRequest,proto3,oneof"` } -type QueryBatchResponse_MetricsViewTimeSeriesResponse struct { - MetricsViewTimeSeriesResponse *MetricsViewTimeSeriesResponse `protobuf:"bytes,5,opt,name=metrics_view_time_series_response,json=metricsViewTimeSeriesResponse,proto3,oneof"` +type QueryBatchEntry_MetricsViewComparisonToplistRequest struct { + MetricsViewComparisonToplistRequest *MetricsViewComparisonToplistRequest `protobuf:"bytes,3,opt,name=metrics_view_comparison_toplist_request,json=metricsViewComparisonToplistRequest,proto3,oneof"` } -type QueryBatchResponse_MetricsViewTotalsResponse struct { - MetricsViewTotalsResponse *MetricsViewTotalsResponse `protobuf:"bytes,6,opt,name=metrics_view_totals_response,json=metricsViewTotalsResponse,proto3,oneof"` +type QueryBatchEntry_MetricsViewTimeSeriesRequest struct { + MetricsViewTimeSeriesRequest *MetricsViewTimeSeriesRequest `protobuf:"bytes,4,opt,name=metrics_view_time_series_request,json=metricsViewTimeSeriesRequest,proto3,oneof"` } -type QueryBatchResponse_MetricsViewRowsResponse struct { - MetricsViewRowsResponse *MetricsViewRowsResponse `protobuf:"bytes,7,opt,name=metrics_view_rows_response,json=metricsViewRowsResponse,proto3,oneof"` +type QueryBatchEntry_MetricsViewTotalsRequest struct { + MetricsViewTotalsRequest *MetricsViewTotalsRequest `protobuf:"bytes,5,opt,name=metrics_view_totals_request,json=metricsViewTotalsRequest,proto3,oneof"` } -type QueryBatchResponse_ColumnRollupIntervalResponse struct { - ColumnRollupIntervalResponse *ColumnRollupIntervalResponse `protobuf:"bytes,8,opt,name=column_rollup_interval_response,json=columnRollupIntervalResponse,proto3,oneof"` +type QueryBatchEntry_MetricsViewRowsRequest struct { + MetricsViewRowsRequest *MetricsViewRowsRequest `protobuf:"bytes,6,opt,name=metrics_view_rows_request,json=metricsViewRowsRequest,proto3,oneof"` } -type QueryBatchResponse_ColumnTopKResponse struct { - ColumnTopKResponse *ColumnTopKResponse `protobuf:"bytes,9,opt,name=column_top_k_response,json=columnTopKResponse,proto3,oneof"` +type QueryBatchEntry_ColumnRollupIntervalRequest struct { + ColumnRollupIntervalRequest *ColumnRollupIntervalRequest `protobuf:"bytes,7,opt,name=column_rollup_interval_request,json=columnRollupIntervalRequest,proto3,oneof"` } -type QueryBatchResponse_ColumnNullCountResponse struct { - ColumnNullCountResponse *ColumnNullCountResponse `protobuf:"bytes,10,opt,name=column_null_count_response,json=columnNullCountResponse,proto3,oneof"` +type QueryBatchEntry_ColumnTopKRequest struct { + ColumnTopKRequest *ColumnTopKRequest `protobuf:"bytes,8,opt,name=column_top_k_request,json=columnTopKRequest,proto3,oneof"` } -type QueryBatchResponse_ColumnDescriptiveStatisticsResponse struct { - ColumnDescriptiveStatisticsResponse *ColumnDescriptiveStatisticsResponse `protobuf:"bytes,11,opt,name=column_descriptive_statistics_response,json=columnDescriptiveStatisticsResponse,proto3,oneof"` +type QueryBatchEntry_ColumnNullCountRequest struct { + ColumnNullCountRequest *ColumnNullCountRequest `protobuf:"bytes,9,opt,name=column_null_count_request,json=columnNullCountRequest,proto3,oneof"` } -type QueryBatchResponse_ColumnTimeGrainResponse struct { - ColumnTimeGrainResponse *ColumnTimeGrainResponse `protobuf:"bytes,12,opt,name=column_time_grain_response,json=columnTimeGrainResponse,proto3,oneof"` +type QueryBatchEntry_ColumnDescriptiveStatisticsRequest struct { + ColumnDescriptiveStatisticsRequest *ColumnDescriptiveStatisticsRequest `protobuf:"bytes,10,opt,name=column_descriptive_statistics_request,json=columnDescriptiveStatisticsRequest,proto3,oneof"` } -type QueryBatchResponse_ColumnNumericHistogramResponse struct { - ColumnNumericHistogramResponse *ColumnNumericHistogramResponse `protobuf:"bytes,13,opt,name=column_numeric_histogram_response,json=columnNumericHistogramResponse,proto3,oneof"` +type QueryBatchEntry_ColumnTimeGrainRequest struct { + ColumnTimeGrainRequest *ColumnTimeGrainRequest `protobuf:"bytes,11,opt,name=column_time_grain_request,json=columnTimeGrainRequest,proto3,oneof"` } -type QueryBatchResponse_ColumnRugHistogramResponse struct { - ColumnRugHistogramResponse *ColumnRugHistogramResponse `protobuf:"bytes,14,opt,name=column_rug_histogram_response,json=columnRugHistogramResponse,proto3,oneof"` +type QueryBatchEntry_ColumnNumericHistogramRequest struct { + ColumnNumericHistogramRequest *ColumnNumericHistogramRequest `protobuf:"bytes,12,opt,name=column_numeric_histogram_request,json=columnNumericHistogramRequest,proto3,oneof"` } -type QueryBatchResponse_ColumnTimeRangeResponse struct { - ColumnTimeRangeResponse *ColumnTimeRangeResponse `protobuf:"bytes,15,opt,name=column_time_range_response,json=columnTimeRangeResponse,proto3,oneof"` +type QueryBatchEntry_ColumnRugHistogramRequest struct { + ColumnRugHistogramRequest *ColumnRugHistogramRequest `protobuf:"bytes,13,opt,name=column_rug_histogram_request,json=columnRugHistogramRequest,proto3,oneof"` } -type QueryBatchResponse_ColumnCardinalityResponse struct { - ColumnCardinalityResponse *ColumnCardinalityResponse `protobuf:"bytes,16,opt,name=column_cardinality_response,json=columnCardinalityResponse,proto3,oneof"` +type QueryBatchEntry_ColumnTimeRangeRequest struct { + ColumnTimeRangeRequest *ColumnTimeRangeRequest `protobuf:"bytes,14,opt,name=column_time_range_request,json=columnTimeRangeRequest,proto3,oneof"` } -type QueryBatchResponse_ColumnTimeSeriesResponse struct { - ColumnTimeSeriesResponse *ColumnTimeSeriesResponse `protobuf:"bytes,17,opt,name=column_time_series_response,json=columnTimeSeriesResponse,proto3,oneof"` +type QueryBatchEntry_ColumnCardinalityRequest struct { + ColumnCardinalityRequest *ColumnCardinalityRequest `protobuf:"bytes,15,opt,name=column_cardinality_request,json=columnCardinalityRequest,proto3,oneof"` } -type QueryBatchResponse_TableCardinalityResponse struct { - TableCardinalityResponse *TableCardinalityResponse `protobuf:"bytes,18,opt,name=table_cardinality_response,json=tableCardinalityResponse,proto3,oneof"` +type QueryBatchEntry_ColumnTimeSeriesRequest struct { + ColumnTimeSeriesRequest *ColumnTimeSeriesRequest `protobuf:"bytes,16,opt,name=column_time_series_request,json=columnTimeSeriesRequest,proto3,oneof"` } -type QueryBatchResponse_TableColumnsResponse struct { - TableColumnsResponse *TableColumnsResponse `protobuf:"bytes,19,opt,name=table_columns_response,json=tableColumnsResponse,proto3,oneof"` +type QueryBatchEntry_TableCardinalityRequest struct { + TableCardinalityRequest *TableCardinalityRequest `protobuf:"bytes,17,opt,name=table_cardinality_request,json=tableCardinalityRequest,proto3,oneof"` } -type QueryBatchResponse_TableRowsResponse struct { - TableRowsResponse *TableRowsResponse `protobuf:"bytes,20,opt,name=table_rows_response,json=tableRowsResponse,proto3,oneof"` +type QueryBatchEntry_TableColumnsRequest struct { + TableColumnsRequest *TableColumnsRequest `protobuf:"bytes,18,opt,name=table_columns_request,json=tableColumnsRequest,proto3,oneof"` } -func (*QueryBatchResponse_MetricsViewToplistResponse) isQueryBatchResponse_Result() {} +type QueryBatchEntry_TableRowsRequest struct { + TableRowsRequest *TableRowsRequest `protobuf:"bytes,19,opt,name=table_rows_request,json=tableRowsRequest,proto3,oneof"` +} -func (*QueryBatchResponse_MetricsViewComparisonToplistResponse) isQueryBatchResponse_Result() {} +func (*QueryBatchEntry_MetricsViewAggregationRequest) isQueryBatchEntry_Query() {} -func (*QueryBatchResponse_MetricsViewTimeSeriesResponse) isQueryBatchResponse_Result() {} +func (*QueryBatchEntry_MetricsViewToplistRequest) isQueryBatchEntry_Query() {} -func (*QueryBatchResponse_MetricsViewTotalsResponse) isQueryBatchResponse_Result() {} +func (*QueryBatchEntry_MetricsViewComparisonToplistRequest) isQueryBatchEntry_Query() {} -func (*QueryBatchResponse_MetricsViewRowsResponse) isQueryBatchResponse_Result() {} +func (*QueryBatchEntry_MetricsViewTimeSeriesRequest) isQueryBatchEntry_Query() {} -func (*QueryBatchResponse_ColumnRollupIntervalResponse) isQueryBatchResponse_Result() {} +func (*QueryBatchEntry_MetricsViewTotalsRequest) isQueryBatchEntry_Query() {} -func (*QueryBatchResponse_ColumnTopKResponse) isQueryBatchResponse_Result() {} +func (*QueryBatchEntry_MetricsViewRowsRequest) isQueryBatchEntry_Query() {} -func (*QueryBatchResponse_ColumnNullCountResponse) isQueryBatchResponse_Result() {} +func (*QueryBatchEntry_ColumnRollupIntervalRequest) isQueryBatchEntry_Query() {} -func (*QueryBatchResponse_ColumnDescriptiveStatisticsResponse) isQueryBatchResponse_Result() {} +func (*QueryBatchEntry_ColumnTopKRequest) isQueryBatchEntry_Query() {} -func (*QueryBatchResponse_ColumnTimeGrainResponse) isQueryBatchResponse_Result() {} +func (*QueryBatchEntry_ColumnNullCountRequest) isQueryBatchEntry_Query() {} -func (*QueryBatchResponse_ColumnNumericHistogramResponse) isQueryBatchResponse_Result() {} +func (*QueryBatchEntry_ColumnDescriptiveStatisticsRequest) isQueryBatchEntry_Query() {} -func (*QueryBatchResponse_ColumnRugHistogramResponse) isQueryBatchResponse_Result() {} +func (*QueryBatchEntry_ColumnTimeGrainRequest) isQueryBatchEntry_Query() {} -func (*QueryBatchResponse_ColumnTimeRangeResponse) isQueryBatchResponse_Result() {} +func (*QueryBatchEntry_ColumnNumericHistogramRequest) isQueryBatchEntry_Query() {} -func (*QueryBatchResponse_ColumnCardinalityResponse) isQueryBatchResponse_Result() {} +func (*QueryBatchEntry_ColumnRugHistogramRequest) isQueryBatchEntry_Query() {} -func (*QueryBatchResponse_ColumnTimeSeriesResponse) isQueryBatchResponse_Result() {} +func (*QueryBatchEntry_ColumnTimeRangeRequest) isQueryBatchEntry_Query() {} -func (*QueryBatchResponse_TableCardinalityResponse) isQueryBatchResponse_Result() {} +func (*QueryBatchEntry_ColumnCardinalityRequest) isQueryBatchEntry_Query() {} -func (*QueryBatchResponse_TableColumnsResponse) isQueryBatchResponse_Result() {} +func (*QueryBatchEntry_ColumnTimeSeriesRequest) isQueryBatchEntry_Query() {} -func (*QueryBatchResponse_TableRowsResponse) isQueryBatchResponse_Result() {} +func (*QueryBatchEntry_TableCardinalityRequest) isQueryBatchEntry_Query() {} -type MetricsViewFilter_Cond struct { +func (*QueryBatchEntry_TableColumnsRequest) isQueryBatchEntry_Query() {} + +func (*QueryBatchEntry_TableRowsRequest) isQueryBatchEntry_Query() {} + +type QueryBatchRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - In []*structpb.Value `protobuf:"bytes,2,rep,name=in,proto3" json:"in,omitempty"` - Like []string `protobuf:"bytes,3,rep,name=like,proto3" json:"like,omitempty"` + InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` + Queries []*QueryBatchEntry `protobuf:"bytes,3,rep,name=queries,proto3" json:"queries,omitempty"` } -func (x *MetricsViewFilter_Cond) Reset() { - *x = MetricsViewFilter_Cond{} +func (x *QueryBatchRequest) Reset() { + *x = QueryBatchRequest{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[64] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *MetricsViewFilter_Cond) String() string { +func (x *QueryBatchRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MetricsViewFilter_Cond) ProtoMessage() {} +func (*QueryBatchRequest) ProtoMessage() {} -func (x *MetricsViewFilter_Cond) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[64] +func (x *QueryBatchRequest) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5057,58 +5120,73 @@ func (x *MetricsViewFilter_Cond) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use MetricsViewFilter_Cond.ProtoReflect.Descriptor instead. -func (*MetricsViewFilter_Cond) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{19, 0} +// Deprecated: Use QueryBatchRequest.ProtoReflect.Descriptor instead. +func (*QueryBatchRequest) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{67} } -func (x *MetricsViewFilter_Cond) GetName() string { +func (x *QueryBatchRequest) GetInstanceId() string { if x != nil { - return x.Name + return x.InstanceId } return "" } -func (x *MetricsViewFilter_Cond) GetIn() []*structpb.Value { - if x != nil { - return x.In - } - return nil -} - -func (x *MetricsViewFilter_Cond) GetLike() []string { +func (x *QueryBatchRequest) GetQueries() []*QueryBatchEntry { if x != nil { - return x.Like + return x.Queries } return nil } -type TopK_Entry struct { +type QueryBatchResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Value *structpb.Value `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` - Count float64 `protobuf:"fixed64,2,opt,name=count,proto3" json:"count,omitempty"` + Key int32 `protobuf:"varint,1,opt,name=key,proto3" json:"key,omitempty"` + Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` + // Types that are assignable to Result: + // + // *QueryBatchResponse_MetricsViewAggregationResponse + // *QueryBatchResponse_MetricsViewToplistResponse + // *QueryBatchResponse_MetricsViewComparisonToplistResponse + // *QueryBatchResponse_MetricsViewTimeSeriesResponse + // *QueryBatchResponse_MetricsViewTotalsResponse + // *QueryBatchResponse_MetricsViewRowsResponse + // *QueryBatchResponse_ColumnRollupIntervalResponse + // *QueryBatchResponse_ColumnTopKResponse + // *QueryBatchResponse_ColumnNullCountResponse + // *QueryBatchResponse_ColumnDescriptiveStatisticsResponse + // *QueryBatchResponse_ColumnTimeGrainResponse + // *QueryBatchResponse_ColumnNumericHistogramResponse + // *QueryBatchResponse_ColumnRugHistogramResponse + // *QueryBatchResponse_ColumnTimeRangeResponse + // *QueryBatchResponse_ColumnCardinalityResponse + // *QueryBatchResponse_ColumnTimeSeriesResponse + // *QueryBatchResponse_TableCardinalityResponse + // *QueryBatchResponse_TableColumnsResponse + // *QueryBatchResponse_TableRowsResponse + Result isQueryBatchResponse_Result `protobuf_oneof:"result"` } -func (x *TopK_Entry) Reset() { - *x = TopK_Entry{} +func (x *QueryBatchResponse) Reset() { + *x = QueryBatchResponse{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[65] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *TopK_Entry) String() string { +func (x *QueryBatchResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TopK_Entry) ProtoMessage() {} +func (*QueryBatchResponse) ProtoMessage() {} -func (x *TopK_Entry) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[65] +func (x *QueryBatchResponse) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5119,210 +5197,310 @@ func (x *TopK_Entry) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TopK_Entry.ProtoReflect.Descriptor instead. -func (*TopK_Entry) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{29, 0} +// Deprecated: Use QueryBatchResponse.ProtoReflect.Descriptor instead. +func (*QueryBatchResponse) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{68} } -func (x *TopK_Entry) GetValue() *structpb.Value { +func (x *QueryBatchResponse) GetKey() int32 { if x != nil { - return x.Value + return x.Key } - return nil + return 0 } -func (x *TopK_Entry) GetCount() float64 { +func (x *QueryBatchResponse) GetError() string { if x != nil { - return x.Count + return x.Error } - return 0 + return "" } -type NumericHistogramBins_Bin struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Bucket int32 `protobuf:"varint,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Low float64 `protobuf:"fixed64,2,opt,name=low,proto3" json:"low,omitempty"` - Midpoint float64 `protobuf:"fixed64,3,opt,name=midpoint,proto3" json:"midpoint,omitempty"` - High float64 `protobuf:"fixed64,4,opt,name=high,proto3" json:"high,omitempty"` - Count float64 `protobuf:"fixed64,5,opt,name=count,proto3" json:"count,omitempty"` +func (m *QueryBatchResponse) GetResult() isQueryBatchResponse_Result { + if m != nil { + return m.Result + } + return nil } -func (x *NumericHistogramBins_Bin) Reset() { - *x = NumericHistogramBins_Bin{} - if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[66] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *QueryBatchResponse) GetMetricsViewAggregationResponse() *MetricsViewAggregationResponse { + if x, ok := x.GetResult().(*QueryBatchResponse_MetricsViewAggregationResponse); ok { + return x.MetricsViewAggregationResponse } + return nil } -func (x *NumericHistogramBins_Bin) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *QueryBatchResponse) GetMetricsViewToplistResponse() *MetricsViewToplistResponse { + if x, ok := x.GetResult().(*QueryBatchResponse_MetricsViewToplistResponse); ok { + return x.MetricsViewToplistResponse + } + return nil } -func (*NumericHistogramBins_Bin) ProtoMessage() {} - -func (x *NumericHistogramBins_Bin) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[66] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *QueryBatchResponse) GetMetricsViewComparisonToplistResponse() *MetricsViewComparisonToplistResponse { + if x, ok := x.GetResult().(*QueryBatchResponse_MetricsViewComparisonToplistResponse); ok { + return x.MetricsViewComparisonToplistResponse } - return mi.MessageOf(x) + return nil } -// Deprecated: Use NumericHistogramBins_Bin.ProtoReflect.Descriptor instead. -func (*NumericHistogramBins_Bin) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{35, 0} +func (x *QueryBatchResponse) GetMetricsViewTimeSeriesResponse() *MetricsViewTimeSeriesResponse { + if x, ok := x.GetResult().(*QueryBatchResponse_MetricsViewTimeSeriesResponse); ok { + return x.MetricsViewTimeSeriesResponse + } + return nil } -func (x *NumericHistogramBins_Bin) GetBucket() int32 { - if x != nil { - return x.Bucket +func (x *QueryBatchResponse) GetMetricsViewTotalsResponse() *MetricsViewTotalsResponse { + if x, ok := x.GetResult().(*QueryBatchResponse_MetricsViewTotalsResponse); ok { + return x.MetricsViewTotalsResponse } - return 0 + return nil } -func (x *NumericHistogramBins_Bin) GetLow() float64 { - if x != nil { - return x.Low +func (x *QueryBatchResponse) GetMetricsViewRowsResponse() *MetricsViewRowsResponse { + if x, ok := x.GetResult().(*QueryBatchResponse_MetricsViewRowsResponse); ok { + return x.MetricsViewRowsResponse } - return 0 + return nil } -func (x *NumericHistogramBins_Bin) GetMidpoint() float64 { - if x != nil { - return x.Midpoint +func (x *QueryBatchResponse) GetColumnRollupIntervalResponse() *ColumnRollupIntervalResponse { + if x, ok := x.GetResult().(*QueryBatchResponse_ColumnRollupIntervalResponse); ok { + return x.ColumnRollupIntervalResponse } - return 0 + return nil } -func (x *NumericHistogramBins_Bin) GetHigh() float64 { - if x != nil { - return x.High +func (x *QueryBatchResponse) GetColumnTopKResponse() *ColumnTopKResponse { + if x, ok := x.GetResult().(*QueryBatchResponse_ColumnTopKResponse); ok { + return x.ColumnTopKResponse } - return 0 + return nil } -func (x *NumericHistogramBins_Bin) GetCount() float64 { - if x != nil { - return x.Count +func (x *QueryBatchResponse) GetColumnNullCountResponse() *ColumnNullCountResponse { + if x, ok := x.GetResult().(*QueryBatchResponse_ColumnNullCountResponse); ok { + return x.ColumnNullCountResponse } - return 0 + return nil } -type NumericOutliers_Outlier struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *QueryBatchResponse) GetColumnDescriptiveStatisticsResponse() *ColumnDescriptiveStatisticsResponse { + if x, ok := x.GetResult().(*QueryBatchResponse_ColumnDescriptiveStatisticsResponse); ok { + return x.ColumnDescriptiveStatisticsResponse + } + return nil +} - Bucket int32 `protobuf:"varint,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - Low float64 `protobuf:"fixed64,2,opt,name=low,proto3" json:"low,omitempty"` - High float64 `protobuf:"fixed64,3,opt,name=high,proto3" json:"high,omitempty"` - Present bool `protobuf:"varint,4,opt,name=present,proto3" json:"present,omitempty"` - Count int32 `protobuf:"varint,5,opt,name=count,proto3" json:"count,omitempty"` +func (x *QueryBatchResponse) GetColumnTimeGrainResponse() *ColumnTimeGrainResponse { + if x, ok := x.GetResult().(*QueryBatchResponse_ColumnTimeGrainResponse); ok { + return x.ColumnTimeGrainResponse + } + return nil } -func (x *NumericOutliers_Outlier) Reset() { - *x = NumericOutliers_Outlier{} - if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[67] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *QueryBatchResponse) GetColumnNumericHistogramResponse() *ColumnNumericHistogramResponse { + if x, ok := x.GetResult().(*QueryBatchResponse_ColumnNumericHistogramResponse); ok { + return x.ColumnNumericHistogramResponse } + return nil } -func (x *NumericOutliers_Outlier) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *QueryBatchResponse) GetColumnRugHistogramResponse() *ColumnRugHistogramResponse { + if x, ok := x.GetResult().(*QueryBatchResponse_ColumnRugHistogramResponse); ok { + return x.ColumnRugHistogramResponse + } + return nil } -func (*NumericOutliers_Outlier) ProtoMessage() {} - -func (x *NumericOutliers_Outlier) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[67] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *QueryBatchResponse) GetColumnTimeRangeResponse() *ColumnTimeRangeResponse { + if x, ok := x.GetResult().(*QueryBatchResponse_ColumnTimeRangeResponse); ok { + return x.ColumnTimeRangeResponse } - return mi.MessageOf(x) + return nil } -// Deprecated: Use NumericOutliers_Outlier.ProtoReflect.Descriptor instead. -func (*NumericOutliers_Outlier) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{37, 0} +func (x *QueryBatchResponse) GetColumnCardinalityResponse() *ColumnCardinalityResponse { + if x, ok := x.GetResult().(*QueryBatchResponse_ColumnCardinalityResponse); ok { + return x.ColumnCardinalityResponse + } + return nil } -func (x *NumericOutliers_Outlier) GetBucket() int32 { - if x != nil { - return x.Bucket +func (x *QueryBatchResponse) GetColumnTimeSeriesResponse() *ColumnTimeSeriesResponse { + if x, ok := x.GetResult().(*QueryBatchResponse_ColumnTimeSeriesResponse); ok { + return x.ColumnTimeSeriesResponse } - return 0 + return nil } -func (x *NumericOutliers_Outlier) GetLow() float64 { - if x != nil { - return x.Low +func (x *QueryBatchResponse) GetTableCardinalityResponse() *TableCardinalityResponse { + if x, ok := x.GetResult().(*QueryBatchResponse_TableCardinalityResponse); ok { + return x.TableCardinalityResponse } - return 0 + return nil } -func (x *NumericOutliers_Outlier) GetHigh() float64 { - if x != nil { - return x.High +func (x *QueryBatchResponse) GetTableColumnsResponse() *TableColumnsResponse { + if x, ok := x.GetResult().(*QueryBatchResponse_TableColumnsResponse); ok { + return x.TableColumnsResponse } - return 0 + return nil } -func (x *NumericOutliers_Outlier) GetPresent() bool { - if x != nil { - return x.Present +func (x *QueryBatchResponse) GetTableRowsResponse() *TableRowsResponse { + if x, ok := x.GetResult().(*QueryBatchResponse_TableRowsResponse); ok { + return x.TableRowsResponse } - return false + return nil } -func (x *NumericOutliers_Outlier) GetCount() int32 { - if x != nil { - return x.Count - } - return 0 +type isQueryBatchResponse_Result interface { + isQueryBatchResponse_Result() } -type TimeRangeSummary_Interval struct { +type QueryBatchResponse_MetricsViewAggregationResponse struct { + MetricsViewAggregationResponse *MetricsViewAggregationResponse `protobuf:"bytes,21,opt,name=metrics_view_aggregation_response,json=metricsViewAggregationResponse,proto3,oneof"` +} + +type QueryBatchResponse_MetricsViewToplistResponse struct { + MetricsViewToplistResponse *MetricsViewToplistResponse `protobuf:"bytes,3,opt,name=metrics_view_toplist_response,json=metricsViewToplistResponse,proto3,oneof"` +} + +type QueryBatchResponse_MetricsViewComparisonToplistResponse struct { + MetricsViewComparisonToplistResponse *MetricsViewComparisonToplistResponse `protobuf:"bytes,4,opt,name=metrics_view_comparison_toplist_response,json=metricsViewComparisonToplistResponse,proto3,oneof"` +} + +type QueryBatchResponse_MetricsViewTimeSeriesResponse struct { + MetricsViewTimeSeriesResponse *MetricsViewTimeSeriesResponse `protobuf:"bytes,5,opt,name=metrics_view_time_series_response,json=metricsViewTimeSeriesResponse,proto3,oneof"` +} + +type QueryBatchResponse_MetricsViewTotalsResponse struct { + MetricsViewTotalsResponse *MetricsViewTotalsResponse `protobuf:"bytes,6,opt,name=metrics_view_totals_response,json=metricsViewTotalsResponse,proto3,oneof"` +} + +type QueryBatchResponse_MetricsViewRowsResponse struct { + MetricsViewRowsResponse *MetricsViewRowsResponse `protobuf:"bytes,7,opt,name=metrics_view_rows_response,json=metricsViewRowsResponse,proto3,oneof"` +} + +type QueryBatchResponse_ColumnRollupIntervalResponse struct { + ColumnRollupIntervalResponse *ColumnRollupIntervalResponse `protobuf:"bytes,8,opt,name=column_rollup_interval_response,json=columnRollupIntervalResponse,proto3,oneof"` +} + +type QueryBatchResponse_ColumnTopKResponse struct { + ColumnTopKResponse *ColumnTopKResponse `protobuf:"bytes,9,opt,name=column_top_k_response,json=columnTopKResponse,proto3,oneof"` +} + +type QueryBatchResponse_ColumnNullCountResponse struct { + ColumnNullCountResponse *ColumnNullCountResponse `protobuf:"bytes,10,opt,name=column_null_count_response,json=columnNullCountResponse,proto3,oneof"` +} + +type QueryBatchResponse_ColumnDescriptiveStatisticsResponse struct { + ColumnDescriptiveStatisticsResponse *ColumnDescriptiveStatisticsResponse `protobuf:"bytes,11,opt,name=column_descriptive_statistics_response,json=columnDescriptiveStatisticsResponse,proto3,oneof"` +} + +type QueryBatchResponse_ColumnTimeGrainResponse struct { + ColumnTimeGrainResponse *ColumnTimeGrainResponse `protobuf:"bytes,12,opt,name=column_time_grain_response,json=columnTimeGrainResponse,proto3,oneof"` +} + +type QueryBatchResponse_ColumnNumericHistogramResponse struct { + ColumnNumericHistogramResponse *ColumnNumericHistogramResponse `protobuf:"bytes,13,opt,name=column_numeric_histogram_response,json=columnNumericHistogramResponse,proto3,oneof"` +} + +type QueryBatchResponse_ColumnRugHistogramResponse struct { + ColumnRugHistogramResponse *ColumnRugHistogramResponse `protobuf:"bytes,14,opt,name=column_rug_histogram_response,json=columnRugHistogramResponse,proto3,oneof"` +} + +type QueryBatchResponse_ColumnTimeRangeResponse struct { + ColumnTimeRangeResponse *ColumnTimeRangeResponse `protobuf:"bytes,15,opt,name=column_time_range_response,json=columnTimeRangeResponse,proto3,oneof"` +} + +type QueryBatchResponse_ColumnCardinalityResponse struct { + ColumnCardinalityResponse *ColumnCardinalityResponse `protobuf:"bytes,16,opt,name=column_cardinality_response,json=columnCardinalityResponse,proto3,oneof"` +} + +type QueryBatchResponse_ColumnTimeSeriesResponse struct { + ColumnTimeSeriesResponse *ColumnTimeSeriesResponse `protobuf:"bytes,17,opt,name=column_time_series_response,json=columnTimeSeriesResponse,proto3,oneof"` +} + +type QueryBatchResponse_TableCardinalityResponse struct { + TableCardinalityResponse *TableCardinalityResponse `protobuf:"bytes,18,opt,name=table_cardinality_response,json=tableCardinalityResponse,proto3,oneof"` +} + +type QueryBatchResponse_TableColumnsResponse struct { + TableColumnsResponse *TableColumnsResponse `protobuf:"bytes,19,opt,name=table_columns_response,json=tableColumnsResponse,proto3,oneof"` +} + +type QueryBatchResponse_TableRowsResponse struct { + TableRowsResponse *TableRowsResponse `protobuf:"bytes,20,opt,name=table_rows_response,json=tableRowsResponse,proto3,oneof"` +} + +func (*QueryBatchResponse_MetricsViewAggregationResponse) isQueryBatchResponse_Result() {} + +func (*QueryBatchResponse_MetricsViewToplistResponse) isQueryBatchResponse_Result() {} + +func (*QueryBatchResponse_MetricsViewComparisonToplistResponse) isQueryBatchResponse_Result() {} + +func (*QueryBatchResponse_MetricsViewTimeSeriesResponse) isQueryBatchResponse_Result() {} + +func (*QueryBatchResponse_MetricsViewTotalsResponse) isQueryBatchResponse_Result() {} + +func (*QueryBatchResponse_MetricsViewRowsResponse) isQueryBatchResponse_Result() {} + +func (*QueryBatchResponse_ColumnRollupIntervalResponse) isQueryBatchResponse_Result() {} + +func (*QueryBatchResponse_ColumnTopKResponse) isQueryBatchResponse_Result() {} + +func (*QueryBatchResponse_ColumnNullCountResponse) isQueryBatchResponse_Result() {} + +func (*QueryBatchResponse_ColumnDescriptiveStatisticsResponse) isQueryBatchResponse_Result() {} + +func (*QueryBatchResponse_ColumnTimeGrainResponse) isQueryBatchResponse_Result() {} + +func (*QueryBatchResponse_ColumnNumericHistogramResponse) isQueryBatchResponse_Result() {} + +func (*QueryBatchResponse_ColumnRugHistogramResponse) isQueryBatchResponse_Result() {} + +func (*QueryBatchResponse_ColumnTimeRangeResponse) isQueryBatchResponse_Result() {} + +func (*QueryBatchResponse_ColumnCardinalityResponse) isQueryBatchResponse_Result() {} + +func (*QueryBatchResponse_ColumnTimeSeriesResponse) isQueryBatchResponse_Result() {} + +func (*QueryBatchResponse_TableCardinalityResponse) isQueryBatchResponse_Result() {} + +func (*QueryBatchResponse_TableColumnsResponse) isQueryBatchResponse_Result() {} + +func (*QueryBatchResponse_TableRowsResponse) isQueryBatchResponse_Result() {} + +type MetricsViewFilter_Cond struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Months int32 `protobuf:"varint,1,opt,name=months,proto3" json:"months,omitempty"` - Days int32 `protobuf:"varint,2,opt,name=days,proto3" json:"days,omitempty"` - Micros int64 `protobuf:"varint,3,opt,name=micros,proto3" json:"micros,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + In []*structpb.Value `protobuf:"bytes,2,rep,name=in,proto3" json:"in,omitempty"` + Like []string `protobuf:"bytes,3,rep,name=like,proto3" json:"like,omitempty"` } -func (x *TimeRangeSummary_Interval) Reset() { - *x = TimeRangeSummary_Interval{} +func (x *MetricsViewFilter_Cond) Reset() { + *x = MetricsViewFilter_Cond{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[68] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *TimeRangeSummary_Interval) String() string { +func (x *MetricsViewFilter_Cond) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TimeRangeSummary_Interval) ProtoMessage() {} +func (*MetricsViewFilter_Cond) ProtoMessage() {} -func (x *TimeRangeSummary_Interval) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[68] +func (x *MetricsViewFilter_Cond) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5333,61 +5511,58 @@ func (x *TimeRangeSummary_Interval) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TimeRangeSummary_Interval.ProtoReflect.Descriptor instead. -func (*TimeRangeSummary_Interval) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{46, 0} +// Deprecated: Use MetricsViewFilter_Cond.ProtoReflect.Descriptor instead. +func (*MetricsViewFilter_Cond) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{24, 0} } -func (x *TimeRangeSummary_Interval) GetMonths() int32 { +func (x *MetricsViewFilter_Cond) GetName() string { if x != nil { - return x.Months + return x.Name } - return 0 + return "" } -func (x *TimeRangeSummary_Interval) GetDays() int32 { +func (x *MetricsViewFilter_Cond) GetIn() []*structpb.Value { if x != nil { - return x.Days + return x.In } - return 0 + return nil } -func (x *TimeRangeSummary_Interval) GetMicros() int64 { +func (x *MetricsViewFilter_Cond) GetLike() []string { if x != nil { - return x.Micros + return x.Like } - return 0 + return nil } -type ColumnTimeSeriesRequest_BasicMeasure struct { +type TopK_Entry struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - // mandatory user defined metadata - Expression string `protobuf:"bytes,2,opt,name=expression,proto3" json:"expression,omitempty"` - // optional user defined metadata - SqlName string `protobuf:"bytes,3,opt,name=sql_name,json=sqlName,proto3" json:"sql_name,omitempty"` + Value *structpb.Value `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` + Count float64 `protobuf:"fixed64,2,opt,name=count,proto3" json:"count,omitempty"` } -func (x *ColumnTimeSeriesRequest_BasicMeasure) Reset() { - *x = ColumnTimeSeriesRequest_BasicMeasure{} +func (x *TopK_Entry) Reset() { + *x = TopK_Entry{} if protoimpl.UnsafeEnabled { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[69] + mi := &file_rill_runtime_v1_queries_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ColumnTimeSeriesRequest_BasicMeasure) String() string { +func (x *TopK_Entry) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ColumnTimeSeriesRequest_BasicMeasure) ProtoMessage() {} +func (*TopK_Entry) ProtoMessage() {} -func (x *ColumnTimeSeriesRequest_BasicMeasure) ProtoReflect() protoreflect.Message { - mi := &file_rill_runtime_v1_queries_proto_msgTypes[69] +func (x *TopK_Entry) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5398,28 +5573,307 @@ func (x *ColumnTimeSeriesRequest_BasicMeasure) ProtoReflect() protoreflect.Messa return mi.MessageOf(x) } -// Deprecated: Use ColumnTimeSeriesRequest_BasicMeasure.ProtoReflect.Descriptor instead. -func (*ColumnTimeSeriesRequest_BasicMeasure) Descriptor() ([]byte, []int) { - return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{49, 0} +// Deprecated: Use TopK_Entry.ProtoReflect.Descriptor instead. +func (*TopK_Entry) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{34, 0} } -func (x *ColumnTimeSeriesRequest_BasicMeasure) GetId() string { +func (x *TopK_Entry) GetValue() *structpb.Value { if x != nil { - return x.Id + return x.Value } - return "" + return nil } -func (x *ColumnTimeSeriesRequest_BasicMeasure) GetExpression() string { +func (x *TopK_Entry) GetCount() float64 { if x != nil { - return x.Expression + return x.Count } - return "" + return 0 } -func (x *ColumnTimeSeriesRequest_BasicMeasure) GetSqlName() string { - if x != nil { - return x.SqlName +type NumericHistogramBins_Bin struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Bucket int32 `protobuf:"varint,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Low float64 `protobuf:"fixed64,2,opt,name=low,proto3" json:"low,omitempty"` + Midpoint float64 `protobuf:"fixed64,3,opt,name=midpoint,proto3" json:"midpoint,omitempty"` + High float64 `protobuf:"fixed64,4,opt,name=high,proto3" json:"high,omitempty"` + Count float64 `protobuf:"fixed64,5,opt,name=count,proto3" json:"count,omitempty"` +} + +func (x *NumericHistogramBins_Bin) Reset() { + *x = NumericHistogramBins_Bin{} + if protoimpl.UnsafeEnabled { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[71] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NumericHistogramBins_Bin) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NumericHistogramBins_Bin) ProtoMessage() {} + +func (x *NumericHistogramBins_Bin) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[71] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NumericHistogramBins_Bin.ProtoReflect.Descriptor instead. +func (*NumericHistogramBins_Bin) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{40, 0} +} + +func (x *NumericHistogramBins_Bin) GetBucket() int32 { + if x != nil { + return x.Bucket + } + return 0 +} + +func (x *NumericHistogramBins_Bin) GetLow() float64 { + if x != nil { + return x.Low + } + return 0 +} + +func (x *NumericHistogramBins_Bin) GetMidpoint() float64 { + if x != nil { + return x.Midpoint + } + return 0 +} + +func (x *NumericHistogramBins_Bin) GetHigh() float64 { + if x != nil { + return x.High + } + return 0 +} + +func (x *NumericHistogramBins_Bin) GetCount() float64 { + if x != nil { + return x.Count + } + return 0 +} + +type NumericOutliers_Outlier struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Bucket int32 `protobuf:"varint,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Low float64 `protobuf:"fixed64,2,opt,name=low,proto3" json:"low,omitempty"` + High float64 `protobuf:"fixed64,3,opt,name=high,proto3" json:"high,omitempty"` + Present bool `protobuf:"varint,4,opt,name=present,proto3" json:"present,omitempty"` + Count int32 `protobuf:"varint,5,opt,name=count,proto3" json:"count,omitempty"` +} + +func (x *NumericOutliers_Outlier) Reset() { + *x = NumericOutliers_Outlier{} + if protoimpl.UnsafeEnabled { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[72] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NumericOutliers_Outlier) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NumericOutliers_Outlier) ProtoMessage() {} + +func (x *NumericOutliers_Outlier) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[72] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NumericOutliers_Outlier.ProtoReflect.Descriptor instead. +func (*NumericOutliers_Outlier) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{42, 0} +} + +func (x *NumericOutliers_Outlier) GetBucket() int32 { + if x != nil { + return x.Bucket + } + return 0 +} + +func (x *NumericOutliers_Outlier) GetLow() float64 { + if x != nil { + return x.Low + } + return 0 +} + +func (x *NumericOutliers_Outlier) GetHigh() float64 { + if x != nil { + return x.High + } + return 0 +} + +func (x *NumericOutliers_Outlier) GetPresent() bool { + if x != nil { + return x.Present + } + return false +} + +func (x *NumericOutliers_Outlier) GetCount() int32 { + if x != nil { + return x.Count + } + return 0 +} + +type TimeRangeSummary_Interval struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Months int32 `protobuf:"varint,1,opt,name=months,proto3" json:"months,omitempty"` + Days int32 `protobuf:"varint,2,opt,name=days,proto3" json:"days,omitempty"` + Micros int64 `protobuf:"varint,3,opt,name=micros,proto3" json:"micros,omitempty"` +} + +func (x *TimeRangeSummary_Interval) Reset() { + *x = TimeRangeSummary_Interval{} + if protoimpl.UnsafeEnabled { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[73] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TimeRangeSummary_Interval) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TimeRangeSummary_Interval) ProtoMessage() {} + +func (x *TimeRangeSummary_Interval) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[73] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TimeRangeSummary_Interval.ProtoReflect.Descriptor instead. +func (*TimeRangeSummary_Interval) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{51, 0} +} + +func (x *TimeRangeSummary_Interval) GetMonths() int32 { + if x != nil { + return x.Months + } + return 0 +} + +func (x *TimeRangeSummary_Interval) GetDays() int32 { + if x != nil { + return x.Days + } + return 0 +} + +func (x *TimeRangeSummary_Interval) GetMicros() int64 { + if x != nil { + return x.Micros + } + return 0 +} + +type ColumnTimeSeriesRequest_BasicMeasure struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // mandatory user defined metadata + Expression string `protobuf:"bytes,2,opt,name=expression,proto3" json:"expression,omitempty"` + // optional user defined metadata + SqlName string `protobuf:"bytes,3,opt,name=sql_name,json=sqlName,proto3" json:"sql_name,omitempty"` +} + +func (x *ColumnTimeSeriesRequest_BasicMeasure) Reset() { + *x = ColumnTimeSeriesRequest_BasicMeasure{} + if protoimpl.UnsafeEnabled { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[74] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ColumnTimeSeriesRequest_BasicMeasure) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ColumnTimeSeriesRequest_BasicMeasure) ProtoMessage() {} + +func (x *ColumnTimeSeriesRequest_BasicMeasure) ProtoReflect() protoreflect.Message { + mi := &file_rill_runtime_v1_queries_proto_msgTypes[74] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ColumnTimeSeriesRequest_BasicMeasure.ProtoReflect.Descriptor instead. +func (*ColumnTimeSeriesRequest_BasicMeasure) Descriptor() ([]byte, []int) { + return file_rill_runtime_v1_queries_proto_rawDescGZIP(), []int{54, 0} +} + +func (x *ColumnTimeSeriesRequest_BasicMeasure) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *ColumnTimeSeriesRequest_BasicMeasure) GetExpression() string { + if x != nil { + return x.Expression + } + return "" +} + +func (x *ColumnTimeSeriesRequest_BasicMeasure) GetSqlName() string { + if x != nil { + return x.SqlName } return "" } @@ -5462,7 +5916,7 @@ var file_rill_runtime_v1_queries_proto_rawDesc = []byte{ 0x79, 0x70, 0x65, 0x52, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xe5, 0x03, 0x0a, 0x0d, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xe0, 0x04, 0x0a, 0x0d, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x05, 0x6c, 0x69, 0x6d, @@ -5470,341 +5924,492 @@ var file_rill_runtime_v1_queries_proto_rawDesc = []byte{ 0x74, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x6d, 0x0a, 0x1c, 0x6d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x6f, 0x70, 0x6c, - 0x69, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, - 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, - 0x19, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x70, 0x6c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x64, 0x0a, 0x19, 0x6d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, - 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x52, 0x6f, 0x77, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x16, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x56, 0x69, 0x65, 0x77, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x77, 0x0a, 0x20, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x72, 0x69, 0x6c, + 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x79, 0x0a, 0x20, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x61, 0x67, 0x67, 0x72, + 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, + 0x69, 0x65, 0x77, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x1d, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x56, 0x69, 0x65, 0x77, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x6d, 0x0a, 0x1c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, + 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x19, 0x6d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x64, 0x0a, 0x19, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x48, 0x00, 0x52, 0x16, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, + 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x77, 0x0a, 0x20, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, + 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x1c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, + 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, + 0x08, 0x0a, 0x06, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x3c, 0x0a, 0x0e, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x64, + 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x72, 0x6c, 0x5f, 0x70, 0x61, 0x74, 0x68, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, + 0x55, 0x72, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x22, 0xd5, 0x04, 0x0a, 0x1d, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x0c, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x12, 0x50, 0x0a, 0x0a, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x1c, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x3c, - 0x0a, 0x0e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x2a, 0x0a, 0x11, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x72, 0x6c, - 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x6f, 0x77, - 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x72, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x22, 0xcf, 0x04, 0x0a, - 0x19, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x70, 0x6c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x11, 0x6d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, - 0x0f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x2e, 0x0a, 0x0e, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, - 0x01, 0x52, 0x0d, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x5f, - 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, - 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52, 0x0e, - 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x12, 0x39, - 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x64, 0x69, + 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4a, 0x0a, 0x08, 0x6d, 0x65, 0x61, 0x73, + 0x75, 0x72, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x72, 0x69, 0x6c, + 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x61, 0x73, + 0x75, 0x72, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, + 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x72, 0x74, 0x52, + 0x04, 0x73, 0x6f, 0x72, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x12, 0x35, 0x0a, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x74, 0x69, 0x6d, - 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x64, - 0x12, 0x1d, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, 0x00, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x1f, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, 0x00, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, - 0x12, 0x34, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, - 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x53, 0x6f, 0x72, 0x74, - 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x12, 0x3a, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, + 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x64, 0x12, 0x3a, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x56, 0x69, 0x65, 0x77, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, 0x00, 0x52, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x12, 0x1f, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, 0x00, 0x52, 0x06, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, + 0x82, 0x01, 0x0a, 0x1e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x41, + 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x2b, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x22, 0x8d, 0x01, 0x0a, 0x1f, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x56, 0x69, 0x65, 0x77, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, + 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, + 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x67, 0x72, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x5f, + 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, + 0x5a, 0x6f, 0x6e, 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x1d, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x56, 0x69, 0x65, 0x77, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, + 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x48, 0x0a, 0x0f, 0x62, 0x75, + 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x4d, 0x65, 0x61, + 0x73, 0x75, 0x72, 0x65, 0x52, 0x0e, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x4d, 0x65, 0x61, + 0x73, 0x75, 0x72, 0x65, 0x12, 0x48, 0x0a, 0x14, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, + 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x12, 0x62, 0x75, 0x69, 0x6c, + 0x74, 0x69, 0x6e, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x41, 0x72, 0x67, 0x73, 0x22, 0x44, + 0x0a, 0x1a, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x41, 0x67, 0x67, + 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, + 0x64, 0x65, 0x73, 0x63, 0x22, 0xcf, 0x04, 0x0a, 0x19, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x11, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, + 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x56, 0x69, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x0e, 0x64, 0x69, 0x6d, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0d, 0x64, 0x69, 0x6d, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x65, 0x61, 0x73, + 0x75, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0c, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x47, 0x0a, + 0x0f, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, + 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x4d, + 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52, 0x0e, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x4d, 0x65, + 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x12, 0x35, 0x0a, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x07, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x64, 0x12, 0x1d, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, 0x00, + 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1f, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, 0x00, + 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x34, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, + 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x56, 0x69, 0x65, 0x77, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x81, - 0x01, 0x0a, 0x1a, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, - 0x70, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, - 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, - 0x04, 0x6d, 0x65, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x04, 0x64, 0x61, - 0x74, 0x61, 0x22, 0x85, 0x05, 0x0a, 0x23, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, - 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x54, 0x6f, 0x70, 0x6c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x11, 0x6d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, - 0x0f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x2e, 0x0a, 0x0e, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, - 0x01, 0x52, 0x0d, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x5f, - 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, + 0x56, 0x69, 0x65, 0x77, 0x53, 0x6f, 0x72, 0x74, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x12, 0x3a, + 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52, 0x0e, - 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x12, 0x42, - 0x0a, 0x0f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, - 0x6e, 0x67, 0x65, 0x52, 0x0d, 0x62, 0x61, 0x73, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, - 0x67, 0x65, 0x12, 0x4e, 0x0a, 0x15, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x13, 0x63, - 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, - 0x67, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, - 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x53, 0x6f, 0x72, 0x74, 0x52, 0x04, 0x73, 0x6f, - 0x72, 0x74, 0x12, 0x3a, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, - 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1d, - 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, - 0x42, 0x04, 0x22, 0x02, 0x28, 0x00, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1f, 0x0a, - 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, - 0x42, 0x04, 0x22, 0x02, 0x28, 0x00, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x65, 0x0a, 0x24, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, - 0x73, 0x6f, 0x6e, 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, - 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, - 0x73, 0x22, 0x6b, 0x0a, 0x09, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x30, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x12, 0x2c, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0xa9, - 0x01, 0x0a, 0x19, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, - 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x53, 0x6f, 0x72, 0x74, 0x12, 0x2a, 0x0a, 0x0c, - 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x6d, 0x65, 0x61, - 0x73, 0x75, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x73, 0x63, 0x65, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x73, 0x63, - 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x42, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, - 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x53, 0x6f, 0x72, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xaf, 0x01, 0x0a, 0x18, 0x4d, + 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x46, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, + 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, + 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x81, 0x01, 0x0a, 0x1a, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, + 0x77, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x12, 0x2b, 0x0a, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x85, 0x05, 0x0a, 0x23, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, - 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x6f, 0x77, 0x12, 0x3f, 0x0a, 0x0f, 0x64, 0x69, 0x6d, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x52, 0x0a, 0x0e, 0x6d, 0x65, 0x61, 0x73, - 0x75, 0x72, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x2b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, - 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x6d, - 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xa3, 0x02, 0x0a, - 0x1a, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, - 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, - 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, - 0x0a, 0x0a, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, 0x62, 0x61, 0x73, 0x65, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x41, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, - 0x73, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, - 0x73, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x74, - 0x61, 0x5f, 0x61, 0x62, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x08, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x41, 0x62, 0x73, 0x12, 0x33, 0x0a, - 0x09, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x72, 0x65, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x52, - 0x65, 0x6c, 0x22, 0x9a, 0x04, 0x0a, 0x1c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, - 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x11, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, - 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x56, 0x69, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x0d, 0x6d, 0x65, 0x61, - 0x73, 0x75, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, - 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, 0x52, 0x0c, 0x6d, 0x65, 0x61, 0x73, - 0x75, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x69, 0x6e, 0x6c, 0x69, - 0x6e, 0x65, 0x5f, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, - 0x65, 0x52, 0x0e, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, - 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x35, 0x0a, 0x08, - 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x65, 0x6e, 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, 0x07, 0x74, 0x69, 0x6d, 0x65, - 0x45, 0x6e, 0x64, 0x12, 0x45, 0x0a, 0x10, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x67, 0x72, 0x61, 0x6e, - 0x75, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, - 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x47, - 0x72, 0x61, 0x6e, 0x75, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, 0x12, 0x3a, 0x0a, 0x06, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, - 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, - 0x6f, 0x6e, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x5a, - 0x6f, 0x6e, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, - 0x8d, 0x01, 0x0a, 0x1d, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, - 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x36, 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6c, - 0x75, 0x6d, 0x6e, 0x52, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x12, 0x34, 0x0a, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, - 0x72, 0x69, 0x65, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, - 0xb2, 0x03, 0x0a, 0x18, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, - 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x33, 0x0a, - 0x11, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, - 0x01, 0x52, 0x0f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x0d, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, - 0x02, 0x08, 0x01, 0x52, 0x0c, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6d, 0x65, 0x61, 0x73, - 0x75, 0x72, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x72, 0x69, 0x6c, - 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x6c, - 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52, 0x0e, 0x69, 0x6e, 0x6c, 0x69, - 0x6e, 0x65, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x74, 0x69, - 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x65, 0x6e, - 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, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x64, 0x12, 0x3a, 0x0a, 0x06, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, - 0x72, 0x69, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, - 0x72, 0x69, 0x74, 0x79, 0x22, 0x80, 0x01, 0x0a, 0x19, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x36, 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x04, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x92, 0x04, 0x0a, 0x16, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x69, 0x73, 0x6f, 0x6e, 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x11, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x56, 0x69, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, - 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x56, 0x69, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x0e, 0x64, 0x69, 0x6d, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0d, 0x64, 0x69, 0x6d, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x65, 0x61, 0x73, + 0x75, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0c, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x47, 0x0a, + 0x0f, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x4d, + 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52, 0x0e, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x4d, 0x65, + 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x0f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0d, 0x62, 0x61, 0x73, + 0x65, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x4e, 0x0a, 0x15, 0x63, 0x6f, + 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x13, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, + 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x73, 0x6f, + 0x72, 0x74, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, + 0x53, 0x6f, 0x72, 0x74, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x12, 0x3a, 0x0a, 0x06, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, + 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, 0x00, 0x52, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1f, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, 0x00, 0x52, 0x06, + 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, + 0x74, 0x79, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, + 0x74, 0x79, 0x22, 0x65, 0x0a, 0x24, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, + 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x54, 0x6f, 0x70, 0x6c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x04, 0x72, 0x6f, + 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, + 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x6b, 0x0a, 0x09, 0x54, 0x69, 0x6d, + 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x64, 0x12, 0x45, 0x0a, 0x10, 0x74, 0x69, - 0x6d, 0x65, 0x5f, 0x67, 0x72, 0x61, 0x6e, 0x75, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, - 0x52, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x6e, 0x75, 0x6c, 0x61, 0x72, 0x69, 0x74, - 0x79, 0x12, 0x3a, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x46, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x34, 0x0a, - 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x53, 0x6f, 0x72, 0x74, 0x52, 0x04, 0x73, - 0x6f, 0x72, 0x74, 0x12, 0x1d, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x05, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x1a, 0x02, 0x28, 0x00, 0x52, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x12, 0x1f, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, 0x00, 0x52, 0x06, 0x6f, 0x66, 0x66, - 0x73, 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, - 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x22, 0x7e, 0x0a, 0x17, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x52, 0x6f, 0x77, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, - 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x12, - 0x2b, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x70, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0xa9, 0x01, 0x0a, 0x19, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, + 0x53, 0x6f, 0x72, 0x74, 0x12, 0x2a, 0x0a, 0x0c, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, + 0x02, 0x10, 0x01, 0x52, 0x0b, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x42, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x72, + 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, + 0x69, 0x73, 0x6f, 0x6e, 0x53, 0x6f, 0x72, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x22, 0xaf, 0x01, 0x0a, 0x18, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, + 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x6f, 0x77, 0x12, + 0x3f, 0x0a, 0x0f, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x0e, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x52, 0x0a, 0x0e, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x22, 0xa3, 0x02, 0x0a, 0x1a, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x65, 0x61, 0x73, 0x75, + 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x0a, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x09, 0x62, 0x61, 0x73, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x41, 0x0a, + 0x10, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x0f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x33, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x61, 0x62, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x64, 0x65, 0x6c, + 0x74, 0x61, 0x41, 0x62, 0x73, 0x12, 0x33, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x72, + 0x65, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x08, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x52, 0x65, 0x6c, 0x22, 0x9a, 0x04, 0x0a, 0x1c, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, + 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x11, + 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, + 0x52, 0x0f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x2d, 0x0a, 0x0d, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, + 0x08, 0x01, 0x52, 0x0c, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x12, 0x47, 0x0a, 0x0f, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6d, 0x65, 0x61, 0x73, 0x75, + 0x72, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x6c, 0x69, + 0x6e, 0x65, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52, 0x0e, 0x69, 0x6e, 0x6c, 0x69, 0x6e, + 0x65, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x74, 0x69, 0x6d, + 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x4c, 0x0a, 0x0f, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x53, 0x6f, 0x72, 0x74, 0x12, - 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, - 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x61, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x09, 0x61, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x22, 0xf1, 0x01, 0x0a, 0x11, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x12, 0x41, 0x0a, 0x07, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x46, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x52, 0x07, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x12, 0x41, 0x0a, 0x07, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x65, 0x6e, 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, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x64, 0x12, 0x45, 0x0a, 0x10, 0x74, + 0x69, 0x6d, 0x65, 0x5f, 0x67, 0x72, 0x61, 0x6e, 0x75, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, + 0x6e, 0x52, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x6e, 0x75, 0x6c, 0x61, 0x72, 0x69, + 0x74, 0x79, 0x12, 0x3a, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1b, + 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, + 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, + 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x8d, 0x01, 0x0a, 0x1d, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x04, 0x6d, 0x65, 0x74, + 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x04, 0x6d, 0x65, 0x74, + 0x61, 0x12, 0x34, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xb2, 0x03, 0x0a, 0x18, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x11, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0f, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x0d, 0x6d, 0x65, + 0x61, 0x73, 0x75, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, 0x52, 0x0c, 0x6d, 0x65, 0x61, + 0x73, 0x75, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x69, 0x6e, 0x6c, + 0x69, 0x6e, 0x65, 0x5f, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x61, 0x73, 0x75, + 0x72, 0x65, 0x52, 0x0e, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, + 0x65, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x35, 0x0a, + 0x08, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x65, 0x6e, 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, 0x07, 0x74, 0x69, 0x6d, + 0x65, 0x45, 0x6e, 0x64, 0x12, 0x3a, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, - 0x65, 0x77, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x52, 0x07, 0x65, - 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x1a, 0x56, 0x0a, 0x04, 0x43, 0x6f, 0x6e, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x02, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x02, 0x69, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, - 0x6b, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6b, 0x65, 0x22, 0x57, - 0x0a, 0x11, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6c, - 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x55, 0x0a, 0x0d, 0x49, 0x6e, 0x6c, 0x69, 0x6e, - 0x65, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, - 0x10, 0x01, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x8f, - 0x01, 0x0a, 0x1b, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x69, - 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, - 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, - 0x33, 0x0a, 0x11, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x0f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, - 0x22, 0x6f, 0x0a, 0x1c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, - 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x4f, 0x0a, 0x12, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x73, - 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x72, + 0x65, 0x77, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x80, 0x01, 0x0a, + 0x19, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x74, 0x61, + 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x04, 0x6d, 0x65, + 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x04, 0x6d, 0x65, + 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, + 0x92, 0x04, 0x0a, 0x16, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x52, + 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x11, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, + 0x0f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x39, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x74, + 0x69, 0x6d, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x45, + 0x6e, 0x64, 0x12, 0x45, 0x0a, 0x10, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x67, 0x72, 0x61, 0x6e, 0x75, + 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x72, + 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x47, 0x72, + 0x61, 0x6e, 0x75, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, 0x12, 0x3a, 0x0a, 0x06, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, + 0x77, 0x53, 0x6f, 0x72, 0x74, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x12, 0x1d, 0x0a, 0x05, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x1a, + 0x02, 0x28, 0x00, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1f, 0x0a, 0x06, 0x6f, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, + 0x02, 0x28, 0x00, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, + 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, + 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x5f, + 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, + 0x5a, 0x6f, 0x6e, 0x65, 0x22, 0x7e, 0x0a, 0x17, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, + 0x69, 0x65, 0x77, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x36, 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x52, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x22, 0x4c, 0x0a, 0x0f, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, + 0x69, 0x65, 0x77, 0x53, 0x6f, 0x72, 0x74, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x22, 0xf1, 0x01, 0x0a, 0x11, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, + 0x65, 0x77, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x07, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x6f, + 0x6e, 0x64, 0x52, 0x07, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x12, 0x41, 0x0a, 0x07, 0x65, + 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x72, + 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x52, 0x07, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x1a, 0x56, + 0x0a, 0x04, 0x43, 0x6f, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x02, 0x69, 0x6e, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x02, + 0x69, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6b, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x04, 0x6c, 0x69, 0x6b, 0x65, 0x22, 0x57, 0x0a, 0x11, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x22, + 0x55, 0x0a, 0x0d, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, + 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, + 0x0a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x72, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x8f, 0x01, 0x0a, 0x1b, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x11, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0f, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, + 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x6f, 0x0a, 0x1c, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x12, 0x74, 0x69, 0x6d, 0x65, + 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, + 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x10, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, + 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x22, 0xac, 0x01, 0x0a, 0x1b, 0x43, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, + 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, + 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, + 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0xb6, 0x01, 0x0a, 0x1c, 0x43, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x52, 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, + 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x03, 0x65, + 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x36, 0x0a, 0x08, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x72, 0x69, + 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, + 0x6c, 0x22, 0xc2, 0x01, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x6f, 0x70, 0x4b, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, + 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x28, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, + 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x67, + 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x67, 0x67, 0x12, 0x0c, 0x0a, 0x01, + 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x6b, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, + 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, + 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x6a, 0x0a, 0x12, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x54, 0x6f, 0x70, 0x4b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x13, + 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x74, 0x65, + 0x67, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x12, + 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x75, 0x6d, 0x6d, 0x61, + 0x72, 0x79, 0x22, 0x6e, 0x0a, 0x12, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x63, 0x61, + 0x6c, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x5f, + 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x70, 0x4b, 0x48, 0x00, + 0x52, 0x04, 0x74, 0x6f, 0x70, 0x4b, 0x12, 0x22, 0x0a, 0x0b, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, + 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x0b, 0x63, + 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x42, 0x06, 0x0a, 0x04, 0x63, 0x61, + 0x73, 0x65, 0x22, 0x8a, 0x01, 0x0a, 0x04, 0x54, 0x6f, 0x70, 0x4b, 0x12, 0x35, 0x0a, 0x07, 0x65, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, - 0x10, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, - 0x79, 0x22, 0xac, 0x01, 0x0a, 0x1b, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x6f, 0x6c, 0x6c, - 0x75, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x6f, 0x70, 0x4b, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x1a, 0x4b, 0x0a, 0x05, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, + 0xa7, 0x01, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, + 0x01, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x2f, 0x0a, 0x17, 0x43, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xb3, 0x01, 0x0a, 0x22, 0x43, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x76, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, @@ -5814,156 +6419,124 @@ var file_rill_runtime_v1_queries_proto_rawDesc = []byte{ 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, - 0x22, 0xb6, 0x01, 0x0a, 0x1c, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x6f, 0x6c, 0x6c, 0x75, - 0x70, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x03, 0x65, 0x6e, - 0x64, 0x12, 0x36, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, - 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0xc2, 0x01, 0x0a, 0x11, 0x43, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x6f, 0x70, 0x4b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, - 0x12, 0x26, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, - 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x67, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x61, 0x67, 0x67, 0x12, 0x0c, 0x0a, 0x01, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x01, 0x6b, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x6a, - 0x0a, 0x12, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x6f, 0x70, 0x4b, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x13, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, - 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, - 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x12, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, - 0x63, 0x61, 0x6c, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x22, 0x6e, 0x0a, 0x12, 0x43, 0x61, - 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, - 0x12, 0x2c, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x5f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x6f, 0x70, 0x4b, 0x48, 0x00, 0x52, 0x04, 0x74, 0x6f, 0x70, 0x4b, 0x12, 0x22, - 0x0a, 0x0b, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x0b, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, - 0x74, 0x79, 0x42, 0x06, 0x0a, 0x04, 0x63, 0x61, 0x73, 0x65, 0x22, 0x8a, 0x01, 0x0a, 0x04, 0x54, - 0x6f, 0x70, 0x4b, 0x12, 0x35, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x70, 0x4b, 0x2e, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x1a, 0x4b, 0x0a, 0x05, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xa7, 0x01, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, - 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0b, 0x63, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, - 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, - 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, - 0x79, 0x22, 0x2f, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x22, 0xb3, 0x01, 0x0a, 0x22, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x44, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, - 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, - 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, - 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, - 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x6f, 0x0a, 0x23, 0x43, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x61, - 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x48, 0x0a, 0x0f, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, - 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, - 0x69, 0x63, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x65, 0x72, - 0x69, 0x63, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x22, 0x9b, 0x02, 0x0a, 0x0e, 0x4e, 0x75, - 0x6d, 0x65, 0x72, 0x69, 0x63, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x5d, 0x0a, 0x16, - 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, - 0x6d, 0x5f, 0x62, 0x69, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, + 0x22, 0x6f, 0x0a, 0x23, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0f, 0x6e, 0x75, 0x6d, 0x65, 0x72, + 0x69, 0x63, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x79, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x79, 0x22, 0x9b, 0x02, 0x0a, 0x0e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x53, 0x75, 0x6d, + 0x6d, 0x61, 0x72, 0x79, 0x12, 0x5d, 0x0a, 0x16, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, + 0x68, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x62, 0x69, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, + 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x42, 0x69, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x14, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x42, - 0x69, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x14, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, - 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x42, 0x69, 0x6e, 0x73, 0x12, 0x53, 0x0a, 0x12, 0x6e, - 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, - 0x63, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x48, 0x00, 0x52, 0x11, 0x6e, - 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, - 0x12, 0x4d, 0x0a, 0x10, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x6f, 0x75, 0x74, 0x6c, - 0x69, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x69, 0x6c, - 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x75, 0x6d, - 0x65, 0x72, 0x69, 0x63, 0x4f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x73, 0x48, 0x00, 0x52, 0x0f, - 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x4f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x73, 0x42, - 0x06, 0x0a, 0x04, 0x63, 0x61, 0x73, 0x65, 0x22, 0xcc, 0x01, 0x0a, 0x14, 0x4e, 0x75, 0x6d, 0x65, - 0x72, 0x69, 0x63, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x42, 0x69, 0x6e, 0x73, - 0x12, 0x3d, 0x0a, 0x04, 0x62, 0x69, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, + 0x69, 0x6e, 0x73, 0x12, 0x53, 0x0a, 0x12, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, + 0x69, 0x63, 0x73, 0x48, 0x00, 0x52, 0x11, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x53, 0x74, + 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x4d, 0x0a, 0x10, 0x6e, 0x75, 0x6d, 0x65, + 0x72, 0x69, 0x63, 0x5f, 0x6f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x4f, 0x75, 0x74, 0x6c, + 0x69, 0x65, 0x72, 0x73, 0x48, 0x00, 0x52, 0x0f, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x4f, + 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x73, 0x42, 0x06, 0x0a, 0x04, 0x63, 0x61, 0x73, 0x65, 0x22, + 0xcc, 0x01, 0x0a, 0x14, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, 0x73, 0x74, 0x6f, + 0x67, 0x72, 0x61, 0x6d, 0x42, 0x69, 0x6e, 0x73, 0x12, 0x3d, 0x0a, 0x04, 0x62, 0x69, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, + 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x42, 0x69, 0x6e, 0x73, 0x2e, 0x42, 0x69, + 0x6e, 0x52, 0x04, 0x62, 0x69, 0x6e, 0x73, 0x1a, 0x75, 0x0a, 0x03, 0x42, 0x69, 0x6e, 0x12, 0x16, + 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, + 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x03, 0x6c, 0x6f, 0x77, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x69, 0x64, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x6d, 0x69, 0x64, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x69, 0x67, 0x68, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x04, 0x68, 0x69, 0x67, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x91, + 0x01, 0x0a, 0x11, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, + 0x74, 0x69, 0x63, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x65, 0x61, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x6d, 0x65, 0x61, 0x6e, 0x12, 0x10, 0x0a, 0x03, + 0x71, 0x32, 0x35, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x71, 0x32, 0x35, 0x12, 0x10, + 0x0a, 0x03, 0x71, 0x35, 0x30, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x71, 0x35, 0x30, + 0x12, 0x10, 0x0a, 0x03, 0x71, 0x37, 0x35, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x71, + 0x37, 0x35, 0x12, 0x0e, 0x0a, 0x02, 0x73, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x52, 0x02, + 0x73, 0x64, 0x22, 0xd0, 0x01, 0x0a, 0x0f, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x4f, 0x75, + 0x74, 0x6c, 0x69, 0x65, 0x72, 0x73, 0x12, 0x44, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x6c, 0x69, 0x65, + 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, + 0x69, 0x63, 0x4f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x73, 0x2e, 0x4f, 0x75, 0x74, 0x6c, 0x69, + 0x65, 0x72, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x73, 0x1a, 0x77, 0x0a, 0x07, + 0x4f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, + 0x10, 0x0a, 0x03, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x6c, 0x6f, + 0x77, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x69, 0x67, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x04, 0x68, 0x69, 0x67, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xa7, 0x01, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, + 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, + 0x54, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, + 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x74, 0x69, + 0x6d, 0x65, 0x5f, 0x67, 0x72, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, - 0x6d, 0x42, 0x69, 0x6e, 0x73, 0x2e, 0x42, 0x69, 0x6e, 0x52, 0x04, 0x62, 0x69, 0x6e, 0x73, 0x1a, - 0x75, 0x0a, 0x03, 0x42, 0x69, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, - 0x0a, 0x03, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x6c, 0x6f, 0x77, - 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x69, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x08, 0x6d, 0x69, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x68, 0x69, 0x67, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x68, 0x69, 0x67, 0x68, - 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x91, 0x01, 0x0a, 0x11, 0x4e, 0x75, 0x6d, 0x65, 0x72, - 0x69, 0x63, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x10, 0x0a, 0x03, - 0x6d, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x10, - 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x6d, 0x61, 0x78, - 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x65, 0x61, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, - 0x6d, 0x65, 0x61, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x71, 0x32, 0x35, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x03, 0x71, 0x32, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x71, 0x35, 0x30, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x03, 0x71, 0x35, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x71, 0x37, 0x35, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x71, 0x37, 0x35, 0x12, 0x0e, 0x0a, 0x02, 0x73, 0x64, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x52, 0x02, 0x73, 0x64, 0x22, 0xd0, 0x01, 0x0a, 0x0f, 0x4e, - 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x4f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x73, 0x12, 0x44, - 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x4f, 0x75, 0x74, 0x6c, 0x69, 0x65, - 0x72, 0x73, 0x2e, 0x4f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x6c, - 0x69, 0x65, 0x72, 0x73, 0x1a, 0x77, 0x0a, 0x07, 0x4f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x12, - 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x6f, 0x77, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x6c, 0x6f, 0x77, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x69, 0x67, - 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x68, 0x69, 0x67, 0x68, 0x12, 0x18, 0x0a, - 0x07, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, - 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xa7, 0x01, - 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, - 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x28, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, - 0x0a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, - 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, - 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x54, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x75, 0x6d, - 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x67, 0x72, 0x61, 0x69, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, - 0x69, 0x6e, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x22, 0xfb, 0x01, - 0x0a, 0x1d, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, - 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x47, 0x72, 0x61, 0x69, 0x6e, 0x22, 0xfb, 0x01, 0x0a, 0x1d, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, + 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x28, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, + 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4b, 0x0a, 0x10, 0x68, 0x69, + 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, + 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x0f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, + 0x6d, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x22, 0x6a, 0x0a, 0x1e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6d, + 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0f, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, + 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, + 0x0e, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x22, + 0xaa, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x75, 0x67, 0x48, 0x69, 0x73, + 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, + 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, + 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x66, 0x0a, 0x1a, + 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x75, 0x67, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, + 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0f, 0x6e, 0x75, + 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x53, 0x75, 0x6d, + 0x6d, 0x61, 0x72, 0x79, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x53, 0x75, 0x6d, + 0x6d, 0x61, 0x72, 0x79, 0x22, 0xa7, 0x01, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, + 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, @@ -5971,771 +6544,767 @@ var file_rill_runtime_v1_queries_proto_rawDesc = []byte{ 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x4b, 0x0a, 0x10, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, - 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x48, - 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x0f, - 0x68, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, - 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x6a, 0x0a, 0x1e, 0x43, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, 0x73, 0x74, - 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, - 0x0f, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, - 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, - 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x22, 0xaa, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x52, 0x75, 0x67, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, - 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x63, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, - 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, - 0x72, 0x69, 0x74, 0x79, 0x22, 0x66, 0x0a, 0x1a, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x75, - 0x67, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0f, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x75, - 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x75, - 0x6d, 0x65, 0x72, 0x69, 0x63, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x0e, 0x6e, 0x75, - 0x6d, 0x65, 0x72, 0x69, 0x63, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x22, 0xa7, 0x01, 0x0a, - 0x16, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, + 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x6a, + 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x12, 0x74, 0x69, 0x6d, + 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, + 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x10, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x61, + 0x6e, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x22, 0x86, 0x02, 0x0a, 0x10, 0x54, + 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, + 0x2c, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x2c, 0x0a, + 0x03, 0x6d, 0x61, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, 0x46, 0x0a, 0x08, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, + 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x76, 0x61, 0x6c, 0x1a, 0x4e, 0x0a, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, + 0x16, 0x0a, 0x06, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x06, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x79, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x64, 0x61, 0x79, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6d, + 0x69, 0x63, 0x72, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, 0x69, 0x63, + 0x72, 0x6f, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x43, 0x61, + 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, + 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, + 0x71, 0x0a, 0x19, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, + 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x13, + 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x74, 0x65, + 0x67, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x12, + 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x75, 0x6d, 0x6d, 0x61, + 0x72, 0x79, 0x22, 0xa9, 0x04, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, + 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, + 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, + 0x26, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x08, 0x6d, 0x65, 0x61, 0x73, 0x75, + 0x72, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, + 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, 0x52, 0x08, 0x6d, 0x65, 0x61, 0x73, + 0x75, 0x72, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x15, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x13, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x43, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, + 0x65, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x06, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x1a, 0x02, 0x28, 0x00, 0x52, + 0x06, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x12, 0x28, 0x0a, 0x0b, 0x73, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xfa, 0x42, + 0x04, 0x1a, 0x02, 0x28, 0x00, 0x52, 0x0a, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x53, 0x69, 0x7a, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x1b, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x1a, 0x62, 0x0a, 0x0c, 0x42, 0x61, + 0x73, 0x69, 0x63, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x27, 0x0a, 0x0a, 0x65, 0x78, + 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x71, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x71, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x57, + 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x06, 0x72, 0x6f, + 0x6c, 0x6c, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x72, 0x69, 0x6c, + 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, + 0x06, 0x72, 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x22, 0xb7, 0x01, 0x0a, 0x13, 0x54, 0x69, 0x6d, 0x65, + 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, + 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x12, 0x2c, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, + 0x40, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x1a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x42, 0x08, 0xfa, + 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, + 0x6c, 0x22, 0xa9, 0x01, 0x0a, 0x12, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x73, 0x12, 0x36, 0x0a, 0x05, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x12, 0x1f, 0x0a, 0x0b, + 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0a, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x82, 0x01, + 0x0a, 0x0f, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x12, 0x2a, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x02, 0x74, 0x73, 0x12, 0x10, 0x0a, + 0x03, 0x62, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x62, 0x69, 0x6e, 0x12, + 0x31, 0x0a, 0x07, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, 0x65, 0x63, 0x6f, 0x72, + 0x64, 0x73, 0x22, 0x7e, 0x0a, 0x17, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x72, 0x64, 0x69, + 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, + 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, + 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, + 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, + 0x74, 0x79, 0x22, 0x3c, 0x0a, 0x18, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x72, 0x64, 0x69, + 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, + 0x0a, 0x0b, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, + 0x22, 0x7a, 0x0a, 0x13, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x28, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, - 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, - 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x6a, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, - 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x4f, 0x0a, 0x12, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, - 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, - 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, - 0x52, 0x10, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, - 0x72, 0x79, 0x22, 0x86, 0x02, 0x0a, 0x10, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, - 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x2c, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x2c, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x03, - 0x6d, 0x61, 0x78, 0x12, 0x46, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, - 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, - 0x6c, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x1a, 0x4e, 0x0a, 0x08, 0x49, - 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x6f, 0x6e, 0x74, 0x68, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x73, 0x12, - 0x12, 0x0a, 0x04, 0x64, 0x61, 0x79, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x64, - 0x61, 0x79, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x18, - 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, - 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x28, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, - 0x0a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, - 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, - 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x71, 0x0a, 0x19, 0x43, 0x6f, 0x6c, 0x75, 0x6d, - 0x6e, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x13, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, - 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, - 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x12, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, - 0x63, 0x61, 0x6c, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x22, 0xa9, 0x04, 0x0a, 0x17, 0x43, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x5b, 0x0a, 0x08, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x35, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, - 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x42, 0x61, 0x73, 0x69, - 0x63, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, - 0x08, 0x01, 0x52, 0x08, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x15, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x72, 0x02, 0x10, 0x01, 0x52, 0x13, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x43, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x0a, 0x74, 0x69, 0x6d, - 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x5f, 0x0a, 0x14, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, + 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, - 0x6e, 0x67, 0x65, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1f, - 0x0a, 0x06, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, - 0xfa, 0x42, 0x04, 0x1a, 0x02, 0x28, 0x00, 0x52, 0x06, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x12, - 0x28, 0x0a, 0x0b, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x1a, 0x02, 0x28, 0x00, 0x52, 0x0a, 0x73, - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, - 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, - 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, - 0x6e, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x5a, 0x6f, - 0x6e, 0x65, 0x1a, 0x62, 0x0a, 0x0c, 0x42, 0x61, 0x73, 0x69, 0x63, 0x4d, 0x65, 0x61, 0x73, 0x75, - 0x72, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x27, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, - 0x0a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x73, - 0x71, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, - 0x71, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x57, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, - 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x06, 0x72, 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x06, 0x72, 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x22, - 0xb7, 0x01, 0x0a, 0x13, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x54, 0x69, - 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x03, 0x65, 0x6e, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x40, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x76, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x47, 0x72, 0x61, 0x69, 0x6e, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, - 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0xa9, 0x01, 0x0a, 0x12, 0x54, 0x69, - 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x3a, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x36, 0x0a, 0x05, - 0x73, 0x70, 0x61, 0x72, 0x6b, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x73, - 0x70, 0x61, 0x72, 0x6b, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x73, - 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x61, 0x6d, 0x70, 0x6c, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x82, 0x01, 0x0a, 0x0f, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, - 0x72, 0x69, 0x65, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2a, 0x0a, 0x02, 0x74, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x02, 0x74, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x62, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x03, 0x62, 0x69, 0x6e, 0x12, 0x31, 0x0a, 0x07, 0x72, 0x65, 0x63, 0x6f, 0x72, - 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x52, 0x07, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x22, 0x7e, 0x0a, 0x17, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x3c, 0x0a, 0x18, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, - 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x61, 0x72, - 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x22, 0x7a, 0x0a, 0x13, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x0e, 0x70, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x22, 0x6b, 0x0a, + 0x0d, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x73, + 0x74, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x73, 0x74, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x96, 0x01, 0x0a, 0x10, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, - 0x72, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, - 0x72, 0x69, 0x74, 0x79, 0x22, 0x5f, 0x0a, 0x14, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, - 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x0f, - 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x43, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x22, 0x6b, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x32, - 0x0a, 0x15, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x6c, - 0x61, 0x72, 0x67, 0x65, 0x73, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x65, 0x6e, 0x67, - 0x74, 0x68, 0x22, 0x96, 0x01, 0x0a, 0x10, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, - 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x1d, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x1a, 0x02, 0x28, 0x00, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x40, 0x0a, 0x11, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x2b, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xd3, 0x0f, - 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, 0x74, 0x63, 0x68, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x6d, 0x0a, 0x1c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, - 0x69, 0x65, 0x77, 0x5f, 0x74, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, + 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x1a, 0x02, 0x28, 0x00, + 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x22, 0x40, 0x0a, 0x11, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xce, 0x10, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, + 0x61, 0x74, 0x63, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x79, 0x0a, 0x20, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x61, 0x67, 0x67, 0x72, + 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, + 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, + 0x69, 0x65, 0x77, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x1d, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x56, 0x69, 0x65, 0x77, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x6d, 0x0a, 0x1c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, + 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x19, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x19, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x8c, 0x01, 0x0a, 0x27, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, - 0x69, 0x65, 0x77, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x5f, 0x74, - 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x8c, 0x01, 0x0a, 0x27, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, + 0x6e, 0x5f, 0x74, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x54, + 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, + 0x23, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, + 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x77, 0x0a, 0x20, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, + 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, + 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, + 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, + 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, + 0x1c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, + 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x6a, 0x0a, + 0x1b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, + 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, + 0x18, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x74, 0x61, + 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x64, 0x0a, 0x19, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x72, + 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x16, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x56, 0x69, 0x65, 0x77, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x73, 0x0a, 0x1e, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x72, 0x6f, 0x6c, 0x6c, 0x75, 0x70, + 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x52, 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x1b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, + 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x55, 0x0a, 0x14, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x74, + 0x6f, 0x70, 0x5f, 0x6b, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x6f, 0x70, 0x4b, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x11, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x54, 0x6f, 0x70, 0x4b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x64, 0x0a, 0x19, 0x63, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, + 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x16, 0x63, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x88, 0x01, 0x0a, 0x25, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, + 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x33, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x22, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, + 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x64, 0x0a, 0x19, + 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x67, 0x72, 0x61, 0x69, + 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x16, 0x63, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x79, 0x0a, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x75, 0x6d, + 0x65, 0x72, 0x69, 0x63, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x72, + 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, 0x73, 0x74, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x1d, + 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, 0x73, + 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x6d, 0x0a, + 0x1c, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x72, 0x75, 0x67, 0x5f, 0x68, 0x69, 0x73, 0x74, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x75, 0x67, 0x48, + 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, + 0x00, 0x52, 0x19, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x75, 0x67, 0x48, 0x69, 0x73, 0x74, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x64, 0x0a, 0x19, + 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, + 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x16, 0x63, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x69, 0x0a, 0x1a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x63, 0x61, 0x72, + 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x43, + 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x48, 0x00, 0x52, 0x18, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x43, 0x61, 0x72, 0x64, 0x69, + 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x67, 0x0a, + 0x1a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, + 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x17, 0x63, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x66, 0x0a, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x17, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x72, 0x64, + 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5a, + 0x0a, 0x15, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x5f, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x13, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x51, 0x0a, 0x12, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x6f, + 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x10, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x07, 0x0a, + 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x70, 0x0a, 0x11, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, + 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x07, + 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, 0x74, 0x63, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, 0xa1, 0x11, 0x0a, 0x12, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x7c, 0x0a, 0x21, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x15, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, + 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x1e, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, + 0x65, 0x77, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x1d, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x72, + 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x1a, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8f, 0x01, 0x0a, 0x28, 0x6d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, + 0x73, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x72, 0x69, 0x6c, + 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, + 0x6f, 0x6e, 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x48, 0x00, 0x52, 0x24, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, + 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7a, 0x0a, 0x21, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, + 0x65, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, - 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x54, 0x6f, 0x70, 0x6c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x23, 0x6d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, - 0x73, 0x6f, 0x6e, 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x77, 0x0a, 0x20, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, - 0x77, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x72, 0x69, + 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x1d, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, + 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x1c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x5f, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x1c, 0x6d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x6a, 0x0a, 0x1b, 0x6d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x74, - 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x18, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x64, 0x0a, 0x19, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x48, 0x00, 0x52, 0x16, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, - 0x77, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x73, 0x0a, 0x1e, - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x72, 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x5f, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x6f, 0x6c, - 0x6c, 0x75, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x48, 0x00, 0x52, 0x1b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x6f, 0x6c, 0x6c, - 0x75, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x55, 0x0a, 0x14, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x74, 0x6f, 0x70, 0x5f, - 0x6b, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x6f, 0x70, 0x4b, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x11, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x6f, 0x70, - 0x4b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x64, 0x0a, 0x19, 0x63, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x5f, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x16, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, - 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x88, - 0x01, 0x0a, 0x25, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, - 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, - 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x22, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x44, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, - 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x64, 0x0a, 0x19, 0x63, 0x6f, 0x6c, - 0x75, 0x6d, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x67, 0x72, 0x61, 0x69, 0x6e, 0x5f, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x16, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, - 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x79, 0x0a, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, - 0x63, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x19, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x1a, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, + 0x76, 0x69, 0x65, 0x77, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x48, 0x00, 0x52, 0x17, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, + 0x77, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, + 0x1f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x72, 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x5f, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, + 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x1c, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, + 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x15, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, + 0x74, 0x6f, 0x70, 0x5f, 0x6b, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x6f, 0x70, + 0x4b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x12, 0x63, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x54, 0x6f, 0x70, 0x4b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x67, 0x0a, 0x1a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, + 0x17, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x26, 0x63, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x76, 0x65, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, - 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x1d, 0x63, 0x6f, 0x6c, + 0x6d, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, + 0x00, 0x52, 0x23, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x1a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x67, 0x72, 0x61, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x69, 0x6c, + 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x17, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, + 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x7c, 0x0a, 0x21, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, + 0x63, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x72, 0x69, 0x6c, + 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, - 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x6d, 0x0a, 0x1c, 0x63, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x72, 0x75, 0x67, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, - 0x61, 0x6d, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x75, 0x67, 0x48, 0x69, 0x73, 0x74, - 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x19, - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x75, 0x67, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, - 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x64, 0x0a, 0x19, 0x63, 0x6f, 0x6c, - 0x75, 0x6d, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x16, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, - 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x69, 0x0a, 0x1a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, - 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x43, 0x61, 0x72, 0x64, - 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, - 0x52, 0x18, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, - 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x67, 0x0a, 0x1a, 0x63, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, - 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, - 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x17, 0x63, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x66, 0x0a, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x61, 0x72, - 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, + 0x72, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x1e, 0x63, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, 0x73, 0x74, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, + 0x1d, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x72, 0x75, 0x67, 0x5f, 0x68, 0x69, 0x73, 0x74, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x0e, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x75, 0x67, + 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x48, 0x00, 0x52, 0x1a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x75, 0x67, 0x48, 0x69, + 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x67, 0x0a, 0x1a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, + 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x0f, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, + 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, + 0x17, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6c, 0x0a, 0x1b, 0x63, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, + 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x19, 0x63, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x1b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x69, + 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x18, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x69, 0x0a, 0x1a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x61, 0x72, 0x64, + 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, - 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x48, 0x00, 0x52, 0x17, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, - 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5a, 0x0a, 0x15, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x5f, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x72, 0x69, 0x6c, - 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x48, 0x00, 0x52, 0x13, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x51, 0x0a, 0x12, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x13, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x10, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, - 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x07, 0x0a, 0x05, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x22, 0x70, 0x0a, 0x11, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, 0x74, 0x63, - 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x07, 0x71, 0x75, 0x65, - 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x69, 0x6c, - 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x42, 0x61, 0x74, 0x63, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x71, 0x75, - 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, 0xa3, 0x10, 0x0a, 0x12, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, - 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x12, 0x70, 0x0a, 0x1d, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, - 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x1a, 0x6d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8f, 0x01, 0x0a, 0x28, 0x6d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, - 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x72, 0x69, 0x6c, 0x6c, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, + 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x48, 0x00, 0x52, 0x18, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, + 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5d, 0x0a, + 0x16, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x5f, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x14, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x13, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, + 0x11, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2a, 0x77, 0x0a, 0x0c, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x1d, 0x0a, 0x19, + 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x55, 0x4e, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x45, + 0x58, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x43, 0x53, 0x56, + 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x46, 0x4f, 0x52, + 0x4d, 0x41, 0x54, 0x5f, 0x58, 0x4c, 0x53, 0x58, 0x10, 0x02, 0x12, 0x19, 0x0a, 0x15, 0x45, 0x58, + 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x50, 0x41, 0x52, 0x51, + 0x55, 0x45, 0x54, 0x10, 0x03, 0x2a, 0x70, 0x0a, 0x0e, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, + 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x12, 0x1f, 0x0a, 0x1b, 0x42, 0x55, 0x49, 0x4c, 0x54, + 0x49, 0x4e, 0x5f, 0x4d, 0x45, 0x41, 0x53, 0x55, 0x52, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x42, 0x55, 0x49, 0x4c, + 0x54, 0x49, 0x4e, 0x5f, 0x4d, 0x45, 0x41, 0x53, 0x55, 0x52, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, + 0x54, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x42, 0x55, 0x49, 0x4c, 0x54, 0x49, 0x4e, 0x5f, 0x4d, + 0x45, 0x41, 0x53, 0x55, 0x52, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x44, 0x49, 0x53, + 0x54, 0x49, 0x4e, 0x43, 0x54, 0x10, 0x02, 0x2a, 0x9e, 0x02, 0x0a, 0x1d, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, - 0x6e, 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x48, 0x00, 0x52, 0x24, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, - 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7a, 0x0a, 0x21, 0x6d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, - 0x72, 0x69, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, - 0x77, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x1d, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, - 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x1c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, - 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, 0x69, 0x6c, - 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x19, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x1a, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, - 0x69, 0x65, 0x77, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x56, 0x69, 0x65, 0x77, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x48, 0x00, 0x52, 0x17, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, - 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x1f, - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x72, 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x5f, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x6f, - 0x6c, 0x6c, 0x75, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x1c, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x6f, - 0x6c, 0x6c, 0x75, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x15, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x74, - 0x6f, 0x70, 0x5f, 0x6b, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x6f, 0x70, 0x4b, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x12, 0x63, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x54, 0x6f, 0x70, 0x4b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, - 0x0a, 0x1a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x17, - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x26, 0x63, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x73, - 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, - 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, - 0x52, 0x23, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x1a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x67, 0x72, 0x61, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x17, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, - 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, - 0x0a, 0x21, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, - 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, - 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x1e, 0x63, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, 0x73, 0x74, 0x6f, - 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x1d, - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x72, 0x75, 0x67, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, - 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x75, 0x67, 0x48, - 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x48, 0x00, 0x52, 0x1a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x75, 0x67, 0x48, 0x69, 0x73, - 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, - 0x0a, 0x1a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x61, - 0x6e, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x0f, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x52, - 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x17, - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6c, 0x0a, 0x1b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, - 0x6e, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x19, 0x63, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x1b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x69, 0x6c, - 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, - 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x18, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, - 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x69, 0x0a, 0x1a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x69, - 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, - 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x72, - 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x48, 0x00, 0x52, 0x18, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, - 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5d, 0x0a, 0x16, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x5f, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x14, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x13, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x11, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2a, 0x77, 0x0a, 0x0c, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x1d, 0x0a, 0x19, 0x45, - 0x58, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x55, 0x4e, 0x53, - 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x45, 0x58, - 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x43, 0x53, 0x56, 0x10, - 0x01, 0x12, 0x16, 0x0a, 0x12, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, - 0x41, 0x54, 0x5f, 0x58, 0x4c, 0x53, 0x58, 0x10, 0x02, 0x12, 0x19, 0x0a, 0x15, 0x45, 0x58, 0x50, - 0x4f, 0x52, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x50, 0x41, 0x52, 0x51, 0x55, - 0x45, 0x54, 0x10, 0x03, 0x2a, 0x9e, 0x02, 0x0a, 0x1d, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x53, 0x6f, - 0x72, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x31, 0x0a, 0x2d, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, - 0x53, 0x5f, 0x56, 0x49, 0x45, 0x57, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, - 0x4e, 0x5f, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x30, 0x0a, 0x2c, 0x4d, 0x45, 0x54, + 0x6e, 0x53, 0x6f, 0x72, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x31, 0x0a, 0x2d, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x56, 0x49, 0x45, 0x57, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, - 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, - 0x41, 0x53, 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x01, 0x12, 0x36, 0x0a, 0x32, 0x4d, - 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x56, 0x49, 0x45, 0x57, 0x5f, 0x43, 0x4f, 0x4d, 0x50, - 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x56, 0x41, 0x4c, 0x55, - 0x45, 0x10, 0x02, 0x12, 0x2f, 0x0a, 0x2b, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x56, - 0x49, 0x45, 0x57, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x53, - 0x4f, 0x52, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x42, 0x53, 0x5f, 0x44, 0x45, 0x4c, - 0x54, 0x41, 0x10, 0x03, 0x12, 0x2f, 0x0a, 0x2b, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, - 0x56, 0x49, 0x45, 0x57, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, - 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x4c, 0x5f, 0x44, 0x45, - 0x4c, 0x54, 0x41, 0x10, 0x04, 0x2a, 0x6d, 0x0a, 0x0f, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, - 0x61, 0x6d, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x20, 0x0a, 0x1c, 0x48, 0x49, 0x53, 0x54, - 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x55, 0x4e, 0x53, - 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x49, - 0x53, 0x54, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x46, - 0x44, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x48, 0x49, 0x53, 0x54, 0x4f, 0x47, 0x52, 0x41, 0x4d, - 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x44, 0x49, 0x41, 0x47, 0x4e, 0x4f, 0x53, 0x54, - 0x49, 0x43, 0x10, 0x02, 0x32, 0x8b, 0x20, 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x74, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1d, - 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, - 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x3a, 0x01, 0x2a, 0x22, 0x21, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x80, 0x01, 0x0a, 0x06, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x3a, - 0x01, 0x2a, 0x22, 0x2a, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, - 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x12, 0xc7, - 0x01, 0x0a, 0x12, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, - 0x70, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, - 0x69, 0x65, 0x77, 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, - 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x58, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x52, 0x3a, 0x01, 0x2a, 0x22, 0x4d, 0x2f, 0x76, 0x31, 0x2f, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x6d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2d, 0x76, 0x69, 0x65, 0x77, 0x73, 0x2f, 0x7b, 0x6d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, - 0x2f, 0x74, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x12, 0xed, 0x01, 0x0a, 0x1c, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, - 0x6f, 0x6e, 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x34, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, + 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x30, 0x0a, 0x2c, + 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x56, 0x49, 0x45, 0x57, 0x5f, 0x43, 0x4f, 0x4d, + 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x01, 0x12, 0x36, + 0x0a, 0x32, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x56, 0x49, 0x45, 0x57, 0x5f, 0x43, + 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x56, + 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x2f, 0x0a, 0x2b, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, + 0x53, 0x5f, 0x56, 0x49, 0x45, 0x57, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, + 0x4e, 0x5f, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x42, 0x53, 0x5f, + 0x44, 0x45, 0x4c, 0x54, 0x41, 0x10, 0x03, 0x12, 0x2f, 0x0a, 0x2b, 0x4d, 0x45, 0x54, 0x52, 0x49, + 0x43, 0x53, 0x5f, 0x56, 0x49, 0x45, 0x57, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, + 0x4f, 0x4e, 0x5f, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x4c, + 0x5f, 0x44, 0x45, 0x4c, 0x54, 0x41, 0x10, 0x04, 0x2a, 0x6d, 0x0a, 0x0f, 0x48, 0x69, 0x73, 0x74, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x20, 0x0a, 0x1c, 0x48, + 0x49, 0x53, 0x54, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, + 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x17, 0x0a, + 0x13, 0x48, 0x49, 0x53, 0x54, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, + 0x44, 0x5f, 0x46, 0x44, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x48, 0x49, 0x53, 0x54, 0x4f, 0x47, + 0x52, 0x41, 0x4d, 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x44, 0x49, 0x41, 0x47, 0x4e, + 0x4f, 0x53, 0x54, 0x49, 0x43, 0x10, 0x02, 0x32, 0xe0, 0x21, 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x74, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x12, 0x1d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x3a, 0x01, 0x2a, 0x22, 0x21, 0x2f, 0x76, 0x31, + 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x80, + 0x01, 0x0a, 0x06, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x2f, 0x3a, 0x01, 0x2a, 0x22, 0x2a, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, + 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x65, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x12, 0xd2, 0x01, 0x0a, 0x16, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, + 0x77, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x2e, 0x72, + 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x72, + 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x57, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x51, 0x3a, 0x01, 0x2a, 0x22, 0x4c, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x2d, 0x76, 0x69, 0x65, 0x77, 0x73, 0x2f, 0x7b, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x7d, 0x2f, 0x61, 0x67, 0x67, 0x72, 0x65, + 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0xc7, 0x01, 0x0a, 0x12, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x2a, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x70, 0x6c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, - 0x6e, 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x35, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, - 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x60, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x5a, 0x3a, 0x01, - 0x2a, 0x22, 0x55, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, + 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x58, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x52, 0x3a, 0x01, + 0x2a, 0x22, 0x4d, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2d, 0x76, 0x69, 0x65, 0x77, 0x73, 0x2f, 0x7b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, - 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, - 0x2d, 0x74, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x12, 0xd3, 0x01, 0x0a, 0x15, 0x4d, 0x65, 0x74, + 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x74, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, + 0x12, 0xed, 0x01, 0x0a, 0x1c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, + 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, + 0x74, 0x12, 0x34, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, + 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x54, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x56, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x54, + 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x60, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x5a, 0x3a, 0x01, 0x2a, 0x22, 0x55, 0x2f, 0x76, 0x31, 0x2f, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2d, 0x76, 0x69, 0x65, 0x77, 0x73, 0x2f, 0x7b, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x2d, 0x74, 0x6f, 0x70, 0x6c, 0x69, 0x73, 0x74, + 0x12, 0xd3, 0x01, 0x0a, 0x15, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, + 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2d, 0x2e, 0x72, 0x69, 0x6c, + 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, - 0x65, 0x73, 0x12, 0x2d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, - 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, - 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x5b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x55, 0x3a, 0x01, 0x2a, 0x22, 0x50, 0x2f, 0x76, - 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, - 0x73, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2d, 0x76, 0x69, 0x65, 0x77, 0x73, 0x2f, - 0x7b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x7d, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0xc3, - 0x01, 0x0a, 0x11, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, - 0x74, 0x61, 0x6c, 0x73, 0x12, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, - 0x65, 0x77, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x74, - 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x57, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x51, 0x3a, 0x01, 0x2a, 0x22, 0x4c, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, - 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x6d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x2d, 0x76, 0x69, 0x65, 0x77, 0x73, 0x2f, 0x7b, 0x6d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x73, 0x12, 0xbb, 0x01, 0x0a, 0x0f, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x56, 0x69, 0x65, 0x77, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x52, - 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x55, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x4f, 0x3a, 0x01, 0x2a, 0x22, 0x4a, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, - 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x6d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x2d, 0x76, 0x69, 0x65, 0x77, 0x73, 0x2f, 0x7b, 0x6d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x72, 0x6f, - 0x77, 0x73, 0x12, 0xd8, 0x01, 0x0a, 0x14, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, - 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x2c, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, - 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x63, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x5d, - 0x3a, 0x01, 0x2a, 0x22, 0x58, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, - 0x2f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x2d, 0x76, 0x69, 0x65, 0x77, 0x73, 0x2f, 0x7b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, - 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x2d, - 0x72, 0x61, 0x6e, 0x67, 0x65, 0x2d, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0xc7, 0x01, - 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x49, 0x6e, - 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x2c, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, - 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x6f, 0x6c, - 0x6c, 0x75, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x52, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4c, 0x3a, 0x01, 0x2a, 0x22, 0x47, - 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x72, - 0x69, 0x65, 0x73, 0x2f, 0x72, 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x76, 0x61, 0x6c, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2f, 0x7b, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x9e, 0x01, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x54, 0x6f, 0x70, 0x4b, 0x12, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, - 0x6f, 0x70, 0x4b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x72, 0x69, 0x6c, - 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, - 0x75, 0x6d, 0x6e, 0x54, 0x6f, 0x70, 0x4b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x47, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x41, 0x3a, 0x01, 0x2a, 0x22, 0x3c, 0x2f, 0x76, 0x31, 0x2f, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, - 0x74, 0x6f, 0x70, 0x6b, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2f, 0x7b, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0xb0, 0x01, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, - 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x27, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, - 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x4a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x44, 0x12, 0x42, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x6e, 0x75, 0x6c, - 0x6c, 0x2d, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2f, 0x7b, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0xe0, 0x01, 0x0a, 0x1b, - 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x76, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x33, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x76, 0x65, 0x53, - 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x34, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x56, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x50, 0x12, 0x4e, + 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5b, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x55, 0x3a, 0x01, 0x2a, 0x22, 0x50, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, + 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x2d, 0x76, 0x69, 0x65, 0x77, 0x73, 0x2f, 0x7b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0xc3, 0x01, 0x0a, 0x11, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x12, 0x29, 0x2e, 0x72, + 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x57, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x51, 0x3a, 0x01, 0x2a, 0x22, 0x4c, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x72, - 0x69, 0x65, 0x73, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x76, 0x65, 0x2d, - 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x2f, 0x7b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0xb9, - 0x01, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, - 0x69, 0x6e, 0x12, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x47, - 0x72, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x53, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4d, 0x12, 0x4b, 0x2f, - 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x69, - 0x65, 0x73, 0x2f, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x65, 0x73, 0x74, 0x2d, 0x74, 0x69, 0x6d, 0x65, - 0x2d, 0x67, 0x72, 0x61, 0x69, 0x6e, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2f, 0x7b, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0xcc, 0x01, 0x0a, 0x16, 0x43, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, 0x73, 0x74, - 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x2e, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, - 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, - 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4b, 0x12, 0x49, + 0x69, 0x65, 0x73, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2d, 0x76, 0x69, 0x65, 0x77, + 0x73, 0x2f, 0x7b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x12, 0xbb, 0x01, 0x0a, + 0x0f, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x52, 0x6f, 0x77, 0x73, + 0x12, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x52, 0x6f, + 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x55, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4f, 0x3a, 0x01, 0x2a, 0x22, 0x4a, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x72, - 0x69, 0x65, 0x73, 0x2f, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x2d, 0x68, 0x69, 0x73, 0x74, - 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2f, 0x7b, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0xbc, 0x01, 0x0a, 0x12, 0x43, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x75, 0x67, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, - 0x12, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x75, 0x67, 0x48, 0x69, 0x73, 0x74, - 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x75, 0x67, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, - 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4d, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x47, 0x12, 0x45, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, - 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x71, - 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x72, 0x75, 0x67, 0x2d, 0x68, 0x69, 0x73, 0x74, 0x6f, - 0x67, 0x72, 0x61, 0x6d, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2f, 0x7b, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0xb8, 0x01, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, - 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x27, 0x2e, 0x72, + 0x69, 0x65, 0x73, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2d, 0x76, 0x69, 0x65, 0x77, + 0x73, 0x2f, 0x7b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x72, 0x6f, 0x77, 0x73, 0x12, 0xd8, 0x01, 0x0a, 0x14, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, + 0x6e, 0x67, 0x65, 0x12, 0x2c, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, + 0x77, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x56, 0x69, 0x65, 0x77, 0x54, + 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x63, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x5d, 0x3a, 0x01, 0x2a, 0x22, 0x58, 0x2f, 0x76, 0x31, + 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, + 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2d, 0x76, 0x69, 0x65, 0x77, 0x73, 0x2f, 0x7b, + 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x7d, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x2d, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x2d, 0x73, 0x75, + 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0xc7, 0x01, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x52, 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x2c, + 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, - 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x52, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4c, 0x12, 0x4a, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x74, 0x69, 0x6d, - 0x65, 0x2d, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x2d, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x2f, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x76, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x52, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x4c, 0x3a, 0x01, 0x2a, 0x22, 0x47, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x72, 0x6f, 0x6c, 0x6c, + 0x75, 0x70, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x2f, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x2f, 0x7b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, + 0x9e, 0x01, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x6f, 0x70, 0x4b, 0x12, 0x22, + 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x6f, 0x70, 0x4b, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x6f, 0x70, 0x4b, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x47, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x41, 0x3a, + 0x01, 0x2a, 0x22, 0x3c, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, + 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x74, 0x6f, 0x70, 0x6b, 0x2f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x2f, 0x7b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, + 0x12, 0xb0, 0x01, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6c, + 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x44, 0x12, + 0x42, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, + 0x72, 0x69, 0x65, 0x73, 0x2f, 0x6e, 0x75, 0x6c, 0x6c, 0x2d, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2f, 0x7b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x7d, 0x12, 0xbe, 0x01, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x43, 0x61, - 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x43, 0x61, 0x72, - 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x52, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4c, 0x12, 0x4a, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x63, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x2d, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, - 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2f, 0x7b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x7d, 0x12, 0xb6, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, - 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x7d, 0x12, 0xe0, 0x01, 0x0a, 0x1b, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x44, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, + 0x69, 0x63, 0x73, 0x12, 0x33, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x56, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x50, 0x12, 0x4e, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x76, 0x65, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, + 0x63, 0x73, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2f, 0x7b, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0xb9, 0x01, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x12, 0x27, 0x2e, 0x72, 0x69, 0x6c, + 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, - 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4d, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x47, 0x3a, 0x01, 0x2a, 0x22, 0x42, 0x2f, 0x76, 0x31, 0x2f, 0x69, + 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x53, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x4d, 0x12, 0x4b, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, + 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x73, 0x6d, 0x61, 0x6c, 0x6c, + 0x65, 0x73, 0x74, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x2d, 0x67, 0x72, 0x61, 0x69, 0x6e, 0x2f, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2f, 0x7b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x7d, 0x12, 0xcc, 0x01, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6d, + 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x2e, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, 0x73, + 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x48, 0x69, 0x73, + 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4b, 0x12, 0x49, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x6e, 0x75, 0x6d, 0x65, + 0x72, 0x69, 0x63, 0x2d, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x2f, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x2f, 0x7b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x7d, 0x12, 0xbc, 0x01, 0x0a, 0x12, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x75, 0x67, 0x48, + 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x2a, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x52, 0x75, 0x67, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x75, 0x67, + 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x4d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x47, 0x12, 0x45, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, - 0x2f, 0x7b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0xba, 0x01, - 0x0a, 0x10, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, - 0x74, 0x79, 0x12, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, - 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x72, - 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4b, 0x12, - 0x49, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, + 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x72, + 0x75, 0x67, 0x2d, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x2f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x2f, 0x7b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, + 0x12, 0xb8, 0x01, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x52, + 0x61, 0x6e, 0x67, 0x65, 0x12, 0x27, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, + 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, + 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x52, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4c, 0x12, + 0x4a, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, - 0x72, 0x69, 0x65, 0x73, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x63, 0x61, 0x72, 0x64, 0x69, - 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2f, 0x7b, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0xac, 0x01, 0x0a, 0x0c, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x24, 0x2e, 0x72, 0x69, - 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x49, - 0x22, 0x47, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, + 0x72, 0x69, 0x65, 0x73, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x2d, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x2d, + 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2f, 0x7b, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0xbe, 0x01, 0x0a, 0x11, + 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, + 0x79, 0x12, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, + 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x72, + 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x52, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4c, + 0x12, 0x4a, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75, - 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x2d, 0x70, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2f, 0x7b, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x98, 0x01, 0x0a, 0x09, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x21, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, - 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x72, 0x69, 0x6c, + 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x2d, 0x63, 0x61, 0x72, + 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2f, + 0x7b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0xb6, 0x01, 0x0a, + 0x10, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, + 0x73, 0x12, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, + 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x72, 0x69, + 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x47, 0x3a, 0x01, + 0x2a, 0x22, 0x42, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, + 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x71, + 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x65, 0x72, 0x69, 0x65, + 0x73, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2f, 0x7b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0xba, 0x01, 0x0a, 0x10, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, + 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x28, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x44, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3e, 0x12, 0x3c, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, - 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x72, 0x6f, 0x77, 0x73, - 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2f, 0x7b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x8b, 0x01, 0x0a, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, - 0x74, 0x63, 0x68, 0x12, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, 0x74, 0x63, 0x68, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, - 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x2c, 0x3a, 0x01, 0x2a, 0x22, 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, + 0x6c, 0x65, 0x43, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x72, 0x64, + 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4b, 0x12, 0x49, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2f, 0x62, 0x61, 0x74, 0x63, 0x68, - 0x30, 0x01, 0x42, 0xb5, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x0c, 0x51, 0x75, 0x65, 0x72, - 0x69, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x69, 0x6c, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2f, - 0x72, 0x69, 0x6c, 0x6c, 0x2f, 0x72, 0x69, 0x6c, 0x6c, 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x76, 0x31, 0xa2, 0x02, - 0x03, 0x52, 0x52, 0x58, 0xaa, 0x02, 0x0f, 0x52, 0x69, 0x6c, 0x6c, 0x2e, 0x52, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0f, 0x52, 0x69, 0x6c, 0x6c, 0x5c, 0x52, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1b, 0x52, 0x69, 0x6c, 0x6c, 0x5c, - 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x11, 0x52, 0x69, 0x6c, 0x6c, 0x3a, 0x3a, 0x52, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2d, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x2f, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2f, 0x7b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x7d, 0x12, 0xac, 0x01, 0x0a, 0x0c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x73, 0x12, 0x24, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x72, 0x69, 0x6c, 0x6c, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x4f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x49, 0x22, 0x47, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x63, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x2d, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x2f, 0x7b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x7d, 0x12, 0x98, 0x01, 0x0a, 0x09, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x73, 0x12, + 0x21, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3e, 0x12, 0x3c, + 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x2f, 0x72, 0x6f, 0x77, 0x73, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2f, + 0x7b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x8b, 0x01, 0x0a, + 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x22, 0x2e, 0x72, 0x69, + 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x23, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x3a, 0x01, 0x2a, 0x22, + 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x2f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x30, 0x01, 0x42, 0xb5, 0x01, 0x0a, 0x13, 0x63, + 0x6f, 0x6d, 0x2e, 0x72, 0x69, 0x6c, 0x6c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x42, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x50, 0x01, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, + 0x69, 0x6c, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x72, 0x69, 0x6c, 0x6c, 0x2f, 0x72, 0x69, 0x6c, + 0x6c, 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x52, 0x52, 0x58, 0xaa, 0x02, 0x0f, 0x52, + 0x69, 0x6c, 0x6c, 0x2e, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x56, 0x31, 0xca, 0x02, + 0x0f, 0x52, 0x69, 0x6c, 0x6c, 0x5c, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5c, 0x56, 0x31, + 0xe2, 0x02, 0x1b, 0x52, 0x69, 0x6c, 0x6c, 0x5c, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5c, + 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, + 0x11, 0x52, 0x69, 0x6c, 0x6c, 0x3a, 0x3a, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x3a, 0x3a, + 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -6750,262 +7319,284 @@ func file_rill_runtime_v1_queries_proto_rawDescGZIP() []byte { return file_rill_runtime_v1_queries_proto_rawDescData } -var file_rill_runtime_v1_queries_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_rill_runtime_v1_queries_proto_msgTypes = make([]protoimpl.MessageInfo, 70) +var file_rill_runtime_v1_queries_proto_enumTypes = make([]protoimpl.EnumInfo, 4) +var file_rill_runtime_v1_queries_proto_msgTypes = make([]protoimpl.MessageInfo, 75) var file_rill_runtime_v1_queries_proto_goTypes = []interface{}{ (ExportFormat)(0), // 0: rill.runtime.v1.ExportFormat - (MetricsViewComparisonSortType)(0), // 1: rill.runtime.v1.MetricsViewComparisonSortType - (HistogramMethod)(0), // 2: rill.runtime.v1.HistogramMethod - (*QueryRequest)(nil), // 3: rill.runtime.v1.QueryRequest - (*QueryResponse)(nil), // 4: rill.runtime.v1.QueryResponse - (*ExportRequest)(nil), // 5: rill.runtime.v1.ExportRequest - (*ExportResponse)(nil), // 6: rill.runtime.v1.ExportResponse - (*MetricsViewToplistRequest)(nil), // 7: rill.runtime.v1.MetricsViewToplistRequest - (*MetricsViewToplistResponse)(nil), // 8: rill.runtime.v1.MetricsViewToplistResponse - (*MetricsViewComparisonToplistRequest)(nil), // 9: rill.runtime.v1.MetricsViewComparisonToplistRequest - (*MetricsViewComparisonToplistResponse)(nil), // 10: rill.runtime.v1.MetricsViewComparisonToplistResponse - (*TimeRange)(nil), // 11: rill.runtime.v1.TimeRange - (*MetricsViewComparisonSort)(nil), // 12: rill.runtime.v1.MetricsViewComparisonSort - (*MetricsViewComparisonRow)(nil), // 13: rill.runtime.v1.MetricsViewComparisonRow - (*MetricsViewComparisonValue)(nil), // 14: rill.runtime.v1.MetricsViewComparisonValue - (*MetricsViewTimeSeriesRequest)(nil), // 15: rill.runtime.v1.MetricsViewTimeSeriesRequest - (*MetricsViewTimeSeriesResponse)(nil), // 16: rill.runtime.v1.MetricsViewTimeSeriesResponse - (*MetricsViewTotalsRequest)(nil), // 17: rill.runtime.v1.MetricsViewTotalsRequest - (*MetricsViewTotalsResponse)(nil), // 18: rill.runtime.v1.MetricsViewTotalsResponse - (*MetricsViewRowsRequest)(nil), // 19: rill.runtime.v1.MetricsViewRowsRequest - (*MetricsViewRowsResponse)(nil), // 20: rill.runtime.v1.MetricsViewRowsResponse - (*MetricsViewSort)(nil), // 21: rill.runtime.v1.MetricsViewSort - (*MetricsViewFilter)(nil), // 22: rill.runtime.v1.MetricsViewFilter - (*MetricsViewColumn)(nil), // 23: rill.runtime.v1.MetricsViewColumn - (*InlineMeasure)(nil), // 24: rill.runtime.v1.InlineMeasure - (*MetricsViewTimeRangeRequest)(nil), // 25: rill.runtime.v1.MetricsViewTimeRangeRequest - (*MetricsViewTimeRangeResponse)(nil), // 26: rill.runtime.v1.MetricsViewTimeRangeResponse - (*ColumnRollupIntervalRequest)(nil), // 27: rill.runtime.v1.ColumnRollupIntervalRequest - (*ColumnRollupIntervalResponse)(nil), // 28: rill.runtime.v1.ColumnRollupIntervalResponse - (*ColumnTopKRequest)(nil), // 29: rill.runtime.v1.ColumnTopKRequest - (*ColumnTopKResponse)(nil), // 30: rill.runtime.v1.ColumnTopKResponse - (*CategoricalSummary)(nil), // 31: rill.runtime.v1.CategoricalSummary - (*TopK)(nil), // 32: rill.runtime.v1.TopK - (*ColumnNullCountRequest)(nil), // 33: rill.runtime.v1.ColumnNullCountRequest - (*ColumnNullCountResponse)(nil), // 34: rill.runtime.v1.ColumnNullCountResponse - (*ColumnDescriptiveStatisticsRequest)(nil), // 35: rill.runtime.v1.ColumnDescriptiveStatisticsRequest - (*ColumnDescriptiveStatisticsResponse)(nil), // 36: rill.runtime.v1.ColumnDescriptiveStatisticsResponse - (*NumericSummary)(nil), // 37: rill.runtime.v1.NumericSummary - (*NumericHistogramBins)(nil), // 38: rill.runtime.v1.NumericHistogramBins - (*NumericStatistics)(nil), // 39: rill.runtime.v1.NumericStatistics - (*NumericOutliers)(nil), // 40: rill.runtime.v1.NumericOutliers - (*ColumnTimeGrainRequest)(nil), // 41: rill.runtime.v1.ColumnTimeGrainRequest - (*ColumnTimeGrainResponse)(nil), // 42: rill.runtime.v1.ColumnTimeGrainResponse - (*ColumnNumericHistogramRequest)(nil), // 43: rill.runtime.v1.ColumnNumericHistogramRequest - (*ColumnNumericHistogramResponse)(nil), // 44: rill.runtime.v1.ColumnNumericHistogramResponse - (*ColumnRugHistogramRequest)(nil), // 45: rill.runtime.v1.ColumnRugHistogramRequest - (*ColumnRugHistogramResponse)(nil), // 46: rill.runtime.v1.ColumnRugHistogramResponse - (*ColumnTimeRangeRequest)(nil), // 47: rill.runtime.v1.ColumnTimeRangeRequest - (*ColumnTimeRangeResponse)(nil), // 48: rill.runtime.v1.ColumnTimeRangeResponse - (*TimeRangeSummary)(nil), // 49: rill.runtime.v1.TimeRangeSummary - (*ColumnCardinalityRequest)(nil), // 50: rill.runtime.v1.ColumnCardinalityRequest - (*ColumnCardinalityResponse)(nil), // 51: rill.runtime.v1.ColumnCardinalityResponse - (*ColumnTimeSeriesRequest)(nil), // 52: rill.runtime.v1.ColumnTimeSeriesRequest - (*ColumnTimeSeriesResponse)(nil), // 53: rill.runtime.v1.ColumnTimeSeriesResponse - (*TimeSeriesTimeRange)(nil), // 54: rill.runtime.v1.TimeSeriesTimeRange - (*TimeSeriesResponse)(nil), // 55: rill.runtime.v1.TimeSeriesResponse - (*TimeSeriesValue)(nil), // 56: rill.runtime.v1.TimeSeriesValue - (*TableCardinalityRequest)(nil), // 57: rill.runtime.v1.TableCardinalityRequest - (*TableCardinalityResponse)(nil), // 58: rill.runtime.v1.TableCardinalityResponse - (*TableColumnsRequest)(nil), // 59: rill.runtime.v1.TableColumnsRequest - (*TableColumnsResponse)(nil), // 60: rill.runtime.v1.TableColumnsResponse - (*ProfileColumn)(nil), // 61: rill.runtime.v1.ProfileColumn - (*TableRowsRequest)(nil), // 62: rill.runtime.v1.TableRowsRequest - (*TableRowsResponse)(nil), // 63: rill.runtime.v1.TableRowsResponse - (*QueryBatchEntry)(nil), // 64: rill.runtime.v1.QueryBatchEntry - (*QueryBatchRequest)(nil), // 65: rill.runtime.v1.QueryBatchRequest - (*QueryBatchResponse)(nil), // 66: rill.runtime.v1.QueryBatchResponse - (*MetricsViewFilter_Cond)(nil), // 67: rill.runtime.v1.MetricsViewFilter.Cond - (*TopK_Entry)(nil), // 68: rill.runtime.v1.TopK.Entry - (*NumericHistogramBins_Bin)(nil), // 69: rill.runtime.v1.NumericHistogramBins.Bin - (*NumericOutliers_Outlier)(nil), // 70: rill.runtime.v1.NumericOutliers.Outlier - (*TimeRangeSummary_Interval)(nil), // 71: rill.runtime.v1.TimeRangeSummary.Interval - (*ColumnTimeSeriesRequest_BasicMeasure)(nil), // 72: rill.runtime.v1.ColumnTimeSeriesRequest.BasicMeasure - (*structpb.Value)(nil), // 73: google.protobuf.Value - (*StructType)(nil), // 74: rill.runtime.v1.StructType - (*structpb.Struct)(nil), // 75: google.protobuf.Struct - (*timestamppb.Timestamp)(nil), // 76: google.protobuf.Timestamp - (TimeGrain)(0), // 77: rill.runtime.v1.TimeGrain + (BuiltinMeasure)(0), // 1: rill.runtime.v1.BuiltinMeasure + (MetricsViewComparisonSortType)(0), // 2: rill.runtime.v1.MetricsViewComparisonSortType + (HistogramMethod)(0), // 3: rill.runtime.v1.HistogramMethod + (*QueryRequest)(nil), // 4: rill.runtime.v1.QueryRequest + (*QueryResponse)(nil), // 5: rill.runtime.v1.QueryResponse + (*ExportRequest)(nil), // 6: rill.runtime.v1.ExportRequest + (*ExportResponse)(nil), // 7: rill.runtime.v1.ExportResponse + (*MetricsViewAggregationRequest)(nil), // 8: rill.runtime.v1.MetricsViewAggregationRequest + (*MetricsViewAggregationResponse)(nil), // 9: rill.runtime.v1.MetricsViewAggregationResponse + (*MetricsViewAggregationDimension)(nil), // 10: rill.runtime.v1.MetricsViewAggregationDimension + (*MetricsViewAggregationMeasure)(nil), // 11: rill.runtime.v1.MetricsViewAggregationMeasure + (*MetricsViewAggregationSort)(nil), // 12: rill.runtime.v1.MetricsViewAggregationSort + (*MetricsViewToplistRequest)(nil), // 13: rill.runtime.v1.MetricsViewToplistRequest + (*MetricsViewToplistResponse)(nil), // 14: rill.runtime.v1.MetricsViewToplistResponse + (*MetricsViewComparisonToplistRequest)(nil), // 15: rill.runtime.v1.MetricsViewComparisonToplistRequest + (*MetricsViewComparisonToplistResponse)(nil), // 16: rill.runtime.v1.MetricsViewComparisonToplistResponse + (*TimeRange)(nil), // 17: rill.runtime.v1.TimeRange + (*MetricsViewComparisonSort)(nil), // 18: rill.runtime.v1.MetricsViewComparisonSort + (*MetricsViewComparisonRow)(nil), // 19: rill.runtime.v1.MetricsViewComparisonRow + (*MetricsViewComparisonValue)(nil), // 20: rill.runtime.v1.MetricsViewComparisonValue + (*MetricsViewTimeSeriesRequest)(nil), // 21: rill.runtime.v1.MetricsViewTimeSeriesRequest + (*MetricsViewTimeSeriesResponse)(nil), // 22: rill.runtime.v1.MetricsViewTimeSeriesResponse + (*MetricsViewTotalsRequest)(nil), // 23: rill.runtime.v1.MetricsViewTotalsRequest + (*MetricsViewTotalsResponse)(nil), // 24: rill.runtime.v1.MetricsViewTotalsResponse + (*MetricsViewRowsRequest)(nil), // 25: rill.runtime.v1.MetricsViewRowsRequest + (*MetricsViewRowsResponse)(nil), // 26: rill.runtime.v1.MetricsViewRowsResponse + (*MetricsViewSort)(nil), // 27: rill.runtime.v1.MetricsViewSort + (*MetricsViewFilter)(nil), // 28: rill.runtime.v1.MetricsViewFilter + (*MetricsViewColumn)(nil), // 29: rill.runtime.v1.MetricsViewColumn + (*InlineMeasure)(nil), // 30: rill.runtime.v1.InlineMeasure + (*MetricsViewTimeRangeRequest)(nil), // 31: rill.runtime.v1.MetricsViewTimeRangeRequest + (*MetricsViewTimeRangeResponse)(nil), // 32: rill.runtime.v1.MetricsViewTimeRangeResponse + (*ColumnRollupIntervalRequest)(nil), // 33: rill.runtime.v1.ColumnRollupIntervalRequest + (*ColumnRollupIntervalResponse)(nil), // 34: rill.runtime.v1.ColumnRollupIntervalResponse + (*ColumnTopKRequest)(nil), // 35: rill.runtime.v1.ColumnTopKRequest + (*ColumnTopKResponse)(nil), // 36: rill.runtime.v1.ColumnTopKResponse + (*CategoricalSummary)(nil), // 37: rill.runtime.v1.CategoricalSummary + (*TopK)(nil), // 38: rill.runtime.v1.TopK + (*ColumnNullCountRequest)(nil), // 39: rill.runtime.v1.ColumnNullCountRequest + (*ColumnNullCountResponse)(nil), // 40: rill.runtime.v1.ColumnNullCountResponse + (*ColumnDescriptiveStatisticsRequest)(nil), // 41: rill.runtime.v1.ColumnDescriptiveStatisticsRequest + (*ColumnDescriptiveStatisticsResponse)(nil), // 42: rill.runtime.v1.ColumnDescriptiveStatisticsResponse + (*NumericSummary)(nil), // 43: rill.runtime.v1.NumericSummary + (*NumericHistogramBins)(nil), // 44: rill.runtime.v1.NumericHistogramBins + (*NumericStatistics)(nil), // 45: rill.runtime.v1.NumericStatistics + (*NumericOutliers)(nil), // 46: rill.runtime.v1.NumericOutliers + (*ColumnTimeGrainRequest)(nil), // 47: rill.runtime.v1.ColumnTimeGrainRequest + (*ColumnTimeGrainResponse)(nil), // 48: rill.runtime.v1.ColumnTimeGrainResponse + (*ColumnNumericHistogramRequest)(nil), // 49: rill.runtime.v1.ColumnNumericHistogramRequest + (*ColumnNumericHistogramResponse)(nil), // 50: rill.runtime.v1.ColumnNumericHistogramResponse + (*ColumnRugHistogramRequest)(nil), // 51: rill.runtime.v1.ColumnRugHistogramRequest + (*ColumnRugHistogramResponse)(nil), // 52: rill.runtime.v1.ColumnRugHistogramResponse + (*ColumnTimeRangeRequest)(nil), // 53: rill.runtime.v1.ColumnTimeRangeRequest + (*ColumnTimeRangeResponse)(nil), // 54: rill.runtime.v1.ColumnTimeRangeResponse + (*TimeRangeSummary)(nil), // 55: rill.runtime.v1.TimeRangeSummary + (*ColumnCardinalityRequest)(nil), // 56: rill.runtime.v1.ColumnCardinalityRequest + (*ColumnCardinalityResponse)(nil), // 57: rill.runtime.v1.ColumnCardinalityResponse + (*ColumnTimeSeriesRequest)(nil), // 58: rill.runtime.v1.ColumnTimeSeriesRequest + (*ColumnTimeSeriesResponse)(nil), // 59: rill.runtime.v1.ColumnTimeSeriesResponse + (*TimeSeriesTimeRange)(nil), // 60: rill.runtime.v1.TimeSeriesTimeRange + (*TimeSeriesResponse)(nil), // 61: rill.runtime.v1.TimeSeriesResponse + (*TimeSeriesValue)(nil), // 62: rill.runtime.v1.TimeSeriesValue + (*TableCardinalityRequest)(nil), // 63: rill.runtime.v1.TableCardinalityRequest + (*TableCardinalityResponse)(nil), // 64: rill.runtime.v1.TableCardinalityResponse + (*TableColumnsRequest)(nil), // 65: rill.runtime.v1.TableColumnsRequest + (*TableColumnsResponse)(nil), // 66: rill.runtime.v1.TableColumnsResponse + (*ProfileColumn)(nil), // 67: rill.runtime.v1.ProfileColumn + (*TableRowsRequest)(nil), // 68: rill.runtime.v1.TableRowsRequest + (*TableRowsResponse)(nil), // 69: rill.runtime.v1.TableRowsResponse + (*QueryBatchEntry)(nil), // 70: rill.runtime.v1.QueryBatchEntry + (*QueryBatchRequest)(nil), // 71: rill.runtime.v1.QueryBatchRequest + (*QueryBatchResponse)(nil), // 72: rill.runtime.v1.QueryBatchResponse + (*MetricsViewFilter_Cond)(nil), // 73: rill.runtime.v1.MetricsViewFilter.Cond + (*TopK_Entry)(nil), // 74: rill.runtime.v1.TopK.Entry + (*NumericHistogramBins_Bin)(nil), // 75: rill.runtime.v1.NumericHistogramBins.Bin + (*NumericOutliers_Outlier)(nil), // 76: rill.runtime.v1.NumericOutliers.Outlier + (*TimeRangeSummary_Interval)(nil), // 77: rill.runtime.v1.TimeRangeSummary.Interval + (*ColumnTimeSeriesRequest_BasicMeasure)(nil), // 78: rill.runtime.v1.ColumnTimeSeriesRequest.BasicMeasure + (*structpb.Value)(nil), // 79: google.protobuf.Value + (*StructType)(nil), // 80: rill.runtime.v1.StructType + (*structpb.Struct)(nil), // 81: google.protobuf.Struct + (*timestamppb.Timestamp)(nil), // 82: google.protobuf.Timestamp + (TimeGrain)(0), // 83: rill.runtime.v1.TimeGrain } var file_rill_runtime_v1_queries_proto_depIdxs = []int32{ - 73, // 0: rill.runtime.v1.QueryRequest.args:type_name -> google.protobuf.Value - 74, // 1: rill.runtime.v1.QueryResponse.meta:type_name -> rill.runtime.v1.StructType - 75, // 2: rill.runtime.v1.QueryResponse.data:type_name -> google.protobuf.Struct + 79, // 0: rill.runtime.v1.QueryRequest.args:type_name -> google.protobuf.Value + 80, // 1: rill.runtime.v1.QueryResponse.meta:type_name -> rill.runtime.v1.StructType + 81, // 2: rill.runtime.v1.QueryResponse.data:type_name -> google.protobuf.Struct 0, // 3: rill.runtime.v1.ExportRequest.format:type_name -> rill.runtime.v1.ExportFormat - 7, // 4: rill.runtime.v1.ExportRequest.metrics_view_toplist_request:type_name -> rill.runtime.v1.MetricsViewToplistRequest - 19, // 5: rill.runtime.v1.ExportRequest.metrics_view_rows_request:type_name -> rill.runtime.v1.MetricsViewRowsRequest - 15, // 6: rill.runtime.v1.ExportRequest.metrics_view_time_series_request:type_name -> rill.runtime.v1.MetricsViewTimeSeriesRequest - 24, // 7: rill.runtime.v1.MetricsViewToplistRequest.inline_measures:type_name -> rill.runtime.v1.InlineMeasure - 76, // 8: rill.runtime.v1.MetricsViewToplistRequest.time_start:type_name -> google.protobuf.Timestamp - 76, // 9: rill.runtime.v1.MetricsViewToplistRequest.time_end:type_name -> google.protobuf.Timestamp - 21, // 10: rill.runtime.v1.MetricsViewToplistRequest.sort:type_name -> rill.runtime.v1.MetricsViewSort - 22, // 11: rill.runtime.v1.MetricsViewToplistRequest.filter:type_name -> rill.runtime.v1.MetricsViewFilter - 23, // 12: rill.runtime.v1.MetricsViewToplistResponse.meta:type_name -> rill.runtime.v1.MetricsViewColumn - 75, // 13: rill.runtime.v1.MetricsViewToplistResponse.data:type_name -> google.protobuf.Struct - 24, // 14: rill.runtime.v1.MetricsViewComparisonToplistRequest.inline_measures:type_name -> rill.runtime.v1.InlineMeasure - 11, // 15: rill.runtime.v1.MetricsViewComparisonToplistRequest.base_time_range:type_name -> rill.runtime.v1.TimeRange - 11, // 16: rill.runtime.v1.MetricsViewComparisonToplistRequest.comparison_time_range:type_name -> rill.runtime.v1.TimeRange - 12, // 17: rill.runtime.v1.MetricsViewComparisonToplistRequest.sort:type_name -> rill.runtime.v1.MetricsViewComparisonSort - 22, // 18: rill.runtime.v1.MetricsViewComparisonToplistRequest.filter:type_name -> rill.runtime.v1.MetricsViewFilter - 13, // 19: rill.runtime.v1.MetricsViewComparisonToplistResponse.rows:type_name -> rill.runtime.v1.MetricsViewComparisonRow - 76, // 20: rill.runtime.v1.TimeRange.start:type_name -> google.protobuf.Timestamp - 76, // 21: rill.runtime.v1.TimeRange.end:type_name -> google.protobuf.Timestamp - 1, // 22: rill.runtime.v1.MetricsViewComparisonSort.type:type_name -> rill.runtime.v1.MetricsViewComparisonSortType - 73, // 23: rill.runtime.v1.MetricsViewComparisonRow.dimension_value:type_name -> google.protobuf.Value - 14, // 24: rill.runtime.v1.MetricsViewComparisonRow.measure_values:type_name -> rill.runtime.v1.MetricsViewComparisonValue - 73, // 25: rill.runtime.v1.MetricsViewComparisonValue.base_value:type_name -> google.protobuf.Value - 73, // 26: rill.runtime.v1.MetricsViewComparisonValue.comparison_value:type_name -> google.protobuf.Value - 73, // 27: rill.runtime.v1.MetricsViewComparisonValue.delta_abs:type_name -> google.protobuf.Value - 73, // 28: rill.runtime.v1.MetricsViewComparisonValue.delta_rel:type_name -> google.protobuf.Value - 24, // 29: rill.runtime.v1.MetricsViewTimeSeriesRequest.inline_measures:type_name -> rill.runtime.v1.InlineMeasure - 76, // 30: rill.runtime.v1.MetricsViewTimeSeriesRequest.time_start:type_name -> google.protobuf.Timestamp - 76, // 31: rill.runtime.v1.MetricsViewTimeSeriesRequest.time_end:type_name -> google.protobuf.Timestamp - 77, // 32: rill.runtime.v1.MetricsViewTimeSeriesRequest.time_granularity:type_name -> rill.runtime.v1.TimeGrain - 22, // 33: rill.runtime.v1.MetricsViewTimeSeriesRequest.filter:type_name -> rill.runtime.v1.MetricsViewFilter - 23, // 34: rill.runtime.v1.MetricsViewTimeSeriesResponse.meta:type_name -> rill.runtime.v1.MetricsViewColumn - 56, // 35: rill.runtime.v1.MetricsViewTimeSeriesResponse.data:type_name -> rill.runtime.v1.TimeSeriesValue - 24, // 36: rill.runtime.v1.MetricsViewTotalsRequest.inline_measures:type_name -> rill.runtime.v1.InlineMeasure - 76, // 37: rill.runtime.v1.MetricsViewTotalsRequest.time_start:type_name -> google.protobuf.Timestamp - 76, // 38: rill.runtime.v1.MetricsViewTotalsRequest.time_end:type_name -> google.protobuf.Timestamp - 22, // 39: rill.runtime.v1.MetricsViewTotalsRequest.filter:type_name -> rill.runtime.v1.MetricsViewFilter - 23, // 40: rill.runtime.v1.MetricsViewTotalsResponse.meta:type_name -> rill.runtime.v1.MetricsViewColumn - 75, // 41: rill.runtime.v1.MetricsViewTotalsResponse.data:type_name -> google.protobuf.Struct - 76, // 42: rill.runtime.v1.MetricsViewRowsRequest.time_start:type_name -> google.protobuf.Timestamp - 76, // 43: rill.runtime.v1.MetricsViewRowsRequest.time_end:type_name -> google.protobuf.Timestamp - 77, // 44: rill.runtime.v1.MetricsViewRowsRequest.time_granularity:type_name -> rill.runtime.v1.TimeGrain - 22, // 45: rill.runtime.v1.MetricsViewRowsRequest.filter:type_name -> rill.runtime.v1.MetricsViewFilter - 21, // 46: rill.runtime.v1.MetricsViewRowsRequest.sort:type_name -> rill.runtime.v1.MetricsViewSort - 23, // 47: rill.runtime.v1.MetricsViewRowsResponse.meta:type_name -> rill.runtime.v1.MetricsViewColumn - 75, // 48: rill.runtime.v1.MetricsViewRowsResponse.data:type_name -> google.protobuf.Struct - 67, // 49: rill.runtime.v1.MetricsViewFilter.include:type_name -> rill.runtime.v1.MetricsViewFilter.Cond - 67, // 50: rill.runtime.v1.MetricsViewFilter.exclude:type_name -> rill.runtime.v1.MetricsViewFilter.Cond - 49, // 51: rill.runtime.v1.MetricsViewTimeRangeResponse.time_range_summary:type_name -> rill.runtime.v1.TimeRangeSummary - 76, // 52: rill.runtime.v1.ColumnRollupIntervalResponse.start:type_name -> google.protobuf.Timestamp - 76, // 53: rill.runtime.v1.ColumnRollupIntervalResponse.end:type_name -> google.protobuf.Timestamp - 77, // 54: rill.runtime.v1.ColumnRollupIntervalResponse.interval:type_name -> rill.runtime.v1.TimeGrain - 31, // 55: rill.runtime.v1.ColumnTopKResponse.categorical_summary:type_name -> rill.runtime.v1.CategoricalSummary - 32, // 56: rill.runtime.v1.CategoricalSummary.top_k:type_name -> rill.runtime.v1.TopK - 68, // 57: rill.runtime.v1.TopK.entries:type_name -> rill.runtime.v1.TopK.Entry - 37, // 58: rill.runtime.v1.ColumnDescriptiveStatisticsResponse.numeric_summary:type_name -> rill.runtime.v1.NumericSummary - 38, // 59: rill.runtime.v1.NumericSummary.numeric_histogram_bins:type_name -> rill.runtime.v1.NumericHistogramBins - 39, // 60: rill.runtime.v1.NumericSummary.numeric_statistics:type_name -> rill.runtime.v1.NumericStatistics - 40, // 61: rill.runtime.v1.NumericSummary.numeric_outliers:type_name -> rill.runtime.v1.NumericOutliers - 69, // 62: rill.runtime.v1.NumericHistogramBins.bins:type_name -> rill.runtime.v1.NumericHistogramBins.Bin - 70, // 63: rill.runtime.v1.NumericOutliers.outliers:type_name -> rill.runtime.v1.NumericOutliers.Outlier - 77, // 64: rill.runtime.v1.ColumnTimeGrainResponse.time_grain:type_name -> rill.runtime.v1.TimeGrain - 2, // 65: rill.runtime.v1.ColumnNumericHistogramRequest.histogram_method:type_name -> rill.runtime.v1.HistogramMethod - 37, // 66: rill.runtime.v1.ColumnNumericHistogramResponse.numeric_summary:type_name -> rill.runtime.v1.NumericSummary - 37, // 67: rill.runtime.v1.ColumnRugHistogramResponse.numeric_summary:type_name -> rill.runtime.v1.NumericSummary - 49, // 68: rill.runtime.v1.ColumnTimeRangeResponse.time_range_summary:type_name -> rill.runtime.v1.TimeRangeSummary - 76, // 69: rill.runtime.v1.TimeRangeSummary.min:type_name -> google.protobuf.Timestamp - 76, // 70: rill.runtime.v1.TimeRangeSummary.max:type_name -> google.protobuf.Timestamp - 71, // 71: rill.runtime.v1.TimeRangeSummary.interval:type_name -> rill.runtime.v1.TimeRangeSummary.Interval - 31, // 72: rill.runtime.v1.ColumnCardinalityResponse.categorical_summary:type_name -> rill.runtime.v1.CategoricalSummary - 72, // 73: rill.runtime.v1.ColumnTimeSeriesRequest.measures:type_name -> rill.runtime.v1.ColumnTimeSeriesRequest.BasicMeasure - 54, // 74: rill.runtime.v1.ColumnTimeSeriesRequest.time_range:type_name -> rill.runtime.v1.TimeSeriesTimeRange - 55, // 75: rill.runtime.v1.ColumnTimeSeriesResponse.rollup:type_name -> rill.runtime.v1.TimeSeriesResponse - 76, // 76: rill.runtime.v1.TimeSeriesTimeRange.start:type_name -> google.protobuf.Timestamp - 76, // 77: rill.runtime.v1.TimeSeriesTimeRange.end:type_name -> google.protobuf.Timestamp - 77, // 78: rill.runtime.v1.TimeSeriesTimeRange.interval:type_name -> rill.runtime.v1.TimeGrain - 56, // 79: rill.runtime.v1.TimeSeriesResponse.results:type_name -> rill.runtime.v1.TimeSeriesValue - 56, // 80: rill.runtime.v1.TimeSeriesResponse.spark:type_name -> rill.runtime.v1.TimeSeriesValue - 76, // 81: rill.runtime.v1.TimeSeriesValue.ts:type_name -> google.protobuf.Timestamp - 75, // 82: rill.runtime.v1.TimeSeriesValue.records:type_name -> google.protobuf.Struct - 61, // 83: rill.runtime.v1.TableColumnsResponse.profile_columns:type_name -> rill.runtime.v1.ProfileColumn - 75, // 84: rill.runtime.v1.TableRowsResponse.data:type_name -> google.protobuf.Struct - 7, // 85: rill.runtime.v1.QueryBatchEntry.metrics_view_toplist_request:type_name -> rill.runtime.v1.MetricsViewToplistRequest - 9, // 86: rill.runtime.v1.QueryBatchEntry.metrics_view_comparison_toplist_request:type_name -> rill.runtime.v1.MetricsViewComparisonToplistRequest - 15, // 87: rill.runtime.v1.QueryBatchEntry.metrics_view_time_series_request:type_name -> rill.runtime.v1.MetricsViewTimeSeriesRequest - 17, // 88: rill.runtime.v1.QueryBatchEntry.metrics_view_totals_request:type_name -> rill.runtime.v1.MetricsViewTotalsRequest - 19, // 89: rill.runtime.v1.QueryBatchEntry.metrics_view_rows_request:type_name -> rill.runtime.v1.MetricsViewRowsRequest - 27, // 90: rill.runtime.v1.QueryBatchEntry.column_rollup_interval_request:type_name -> rill.runtime.v1.ColumnRollupIntervalRequest - 29, // 91: rill.runtime.v1.QueryBatchEntry.column_top_k_request:type_name -> rill.runtime.v1.ColumnTopKRequest - 33, // 92: rill.runtime.v1.QueryBatchEntry.column_null_count_request:type_name -> rill.runtime.v1.ColumnNullCountRequest - 35, // 93: rill.runtime.v1.QueryBatchEntry.column_descriptive_statistics_request:type_name -> rill.runtime.v1.ColumnDescriptiveStatisticsRequest - 41, // 94: rill.runtime.v1.QueryBatchEntry.column_time_grain_request:type_name -> rill.runtime.v1.ColumnTimeGrainRequest - 43, // 95: rill.runtime.v1.QueryBatchEntry.column_numeric_histogram_request:type_name -> rill.runtime.v1.ColumnNumericHistogramRequest - 45, // 96: rill.runtime.v1.QueryBatchEntry.column_rug_histogram_request:type_name -> rill.runtime.v1.ColumnRugHistogramRequest - 47, // 97: rill.runtime.v1.QueryBatchEntry.column_time_range_request:type_name -> rill.runtime.v1.ColumnTimeRangeRequest - 50, // 98: rill.runtime.v1.QueryBatchEntry.column_cardinality_request:type_name -> rill.runtime.v1.ColumnCardinalityRequest - 52, // 99: rill.runtime.v1.QueryBatchEntry.column_time_series_request:type_name -> rill.runtime.v1.ColumnTimeSeriesRequest - 57, // 100: rill.runtime.v1.QueryBatchEntry.table_cardinality_request:type_name -> rill.runtime.v1.TableCardinalityRequest - 59, // 101: rill.runtime.v1.QueryBatchEntry.table_columns_request:type_name -> rill.runtime.v1.TableColumnsRequest - 62, // 102: rill.runtime.v1.QueryBatchEntry.table_rows_request:type_name -> rill.runtime.v1.TableRowsRequest - 64, // 103: rill.runtime.v1.QueryBatchRequest.queries:type_name -> rill.runtime.v1.QueryBatchEntry - 8, // 104: rill.runtime.v1.QueryBatchResponse.metrics_view_toplist_response:type_name -> rill.runtime.v1.MetricsViewToplistResponse - 10, // 105: rill.runtime.v1.QueryBatchResponse.metrics_view_comparison_toplist_response:type_name -> rill.runtime.v1.MetricsViewComparisonToplistResponse - 16, // 106: rill.runtime.v1.QueryBatchResponse.metrics_view_time_series_response:type_name -> rill.runtime.v1.MetricsViewTimeSeriesResponse - 18, // 107: rill.runtime.v1.QueryBatchResponse.metrics_view_totals_response:type_name -> rill.runtime.v1.MetricsViewTotalsResponse - 20, // 108: rill.runtime.v1.QueryBatchResponse.metrics_view_rows_response:type_name -> rill.runtime.v1.MetricsViewRowsResponse - 28, // 109: rill.runtime.v1.QueryBatchResponse.column_rollup_interval_response:type_name -> rill.runtime.v1.ColumnRollupIntervalResponse - 30, // 110: rill.runtime.v1.QueryBatchResponse.column_top_k_response:type_name -> rill.runtime.v1.ColumnTopKResponse - 34, // 111: rill.runtime.v1.QueryBatchResponse.column_null_count_response:type_name -> rill.runtime.v1.ColumnNullCountResponse - 36, // 112: rill.runtime.v1.QueryBatchResponse.column_descriptive_statistics_response:type_name -> rill.runtime.v1.ColumnDescriptiveStatisticsResponse - 42, // 113: rill.runtime.v1.QueryBatchResponse.column_time_grain_response:type_name -> rill.runtime.v1.ColumnTimeGrainResponse - 44, // 114: rill.runtime.v1.QueryBatchResponse.column_numeric_histogram_response:type_name -> rill.runtime.v1.ColumnNumericHistogramResponse - 46, // 115: rill.runtime.v1.QueryBatchResponse.column_rug_histogram_response:type_name -> rill.runtime.v1.ColumnRugHistogramResponse - 48, // 116: rill.runtime.v1.QueryBatchResponse.column_time_range_response:type_name -> rill.runtime.v1.ColumnTimeRangeResponse - 51, // 117: rill.runtime.v1.QueryBatchResponse.column_cardinality_response:type_name -> rill.runtime.v1.ColumnCardinalityResponse - 53, // 118: rill.runtime.v1.QueryBatchResponse.column_time_series_response:type_name -> rill.runtime.v1.ColumnTimeSeriesResponse - 58, // 119: rill.runtime.v1.QueryBatchResponse.table_cardinality_response:type_name -> rill.runtime.v1.TableCardinalityResponse - 60, // 120: rill.runtime.v1.QueryBatchResponse.table_columns_response:type_name -> rill.runtime.v1.TableColumnsResponse - 63, // 121: rill.runtime.v1.QueryBatchResponse.table_rows_response:type_name -> rill.runtime.v1.TableRowsResponse - 73, // 122: rill.runtime.v1.MetricsViewFilter.Cond.in:type_name -> google.protobuf.Value - 73, // 123: rill.runtime.v1.TopK.Entry.value:type_name -> google.protobuf.Value - 3, // 124: rill.runtime.v1.QueryService.Query:input_type -> rill.runtime.v1.QueryRequest - 5, // 125: rill.runtime.v1.QueryService.Export:input_type -> rill.runtime.v1.ExportRequest - 7, // 126: rill.runtime.v1.QueryService.MetricsViewToplist:input_type -> rill.runtime.v1.MetricsViewToplistRequest - 9, // 127: rill.runtime.v1.QueryService.MetricsViewComparisonToplist:input_type -> rill.runtime.v1.MetricsViewComparisonToplistRequest - 15, // 128: rill.runtime.v1.QueryService.MetricsViewTimeSeries:input_type -> rill.runtime.v1.MetricsViewTimeSeriesRequest - 17, // 129: rill.runtime.v1.QueryService.MetricsViewTotals:input_type -> rill.runtime.v1.MetricsViewTotalsRequest - 19, // 130: rill.runtime.v1.QueryService.MetricsViewRows:input_type -> rill.runtime.v1.MetricsViewRowsRequest - 25, // 131: rill.runtime.v1.QueryService.MetricsViewTimeRange:input_type -> rill.runtime.v1.MetricsViewTimeRangeRequest - 27, // 132: rill.runtime.v1.QueryService.ColumnRollupInterval:input_type -> rill.runtime.v1.ColumnRollupIntervalRequest - 29, // 133: rill.runtime.v1.QueryService.ColumnTopK:input_type -> rill.runtime.v1.ColumnTopKRequest - 33, // 134: rill.runtime.v1.QueryService.ColumnNullCount:input_type -> rill.runtime.v1.ColumnNullCountRequest - 35, // 135: rill.runtime.v1.QueryService.ColumnDescriptiveStatistics:input_type -> rill.runtime.v1.ColumnDescriptiveStatisticsRequest - 41, // 136: rill.runtime.v1.QueryService.ColumnTimeGrain:input_type -> rill.runtime.v1.ColumnTimeGrainRequest - 43, // 137: rill.runtime.v1.QueryService.ColumnNumericHistogram:input_type -> rill.runtime.v1.ColumnNumericHistogramRequest - 45, // 138: rill.runtime.v1.QueryService.ColumnRugHistogram:input_type -> rill.runtime.v1.ColumnRugHistogramRequest - 47, // 139: rill.runtime.v1.QueryService.ColumnTimeRange:input_type -> rill.runtime.v1.ColumnTimeRangeRequest - 50, // 140: rill.runtime.v1.QueryService.ColumnCardinality:input_type -> rill.runtime.v1.ColumnCardinalityRequest - 52, // 141: rill.runtime.v1.QueryService.ColumnTimeSeries:input_type -> rill.runtime.v1.ColumnTimeSeriesRequest - 57, // 142: rill.runtime.v1.QueryService.TableCardinality:input_type -> rill.runtime.v1.TableCardinalityRequest - 59, // 143: rill.runtime.v1.QueryService.TableColumns:input_type -> rill.runtime.v1.TableColumnsRequest - 62, // 144: rill.runtime.v1.QueryService.TableRows:input_type -> rill.runtime.v1.TableRowsRequest - 65, // 145: rill.runtime.v1.QueryService.QueryBatch:input_type -> rill.runtime.v1.QueryBatchRequest - 4, // 146: rill.runtime.v1.QueryService.Query:output_type -> rill.runtime.v1.QueryResponse - 6, // 147: rill.runtime.v1.QueryService.Export:output_type -> rill.runtime.v1.ExportResponse - 8, // 148: rill.runtime.v1.QueryService.MetricsViewToplist:output_type -> rill.runtime.v1.MetricsViewToplistResponse - 10, // 149: rill.runtime.v1.QueryService.MetricsViewComparisonToplist:output_type -> rill.runtime.v1.MetricsViewComparisonToplistResponse - 16, // 150: rill.runtime.v1.QueryService.MetricsViewTimeSeries:output_type -> rill.runtime.v1.MetricsViewTimeSeriesResponse - 18, // 151: rill.runtime.v1.QueryService.MetricsViewTotals:output_type -> rill.runtime.v1.MetricsViewTotalsResponse - 20, // 152: rill.runtime.v1.QueryService.MetricsViewRows:output_type -> rill.runtime.v1.MetricsViewRowsResponse - 26, // 153: rill.runtime.v1.QueryService.MetricsViewTimeRange:output_type -> rill.runtime.v1.MetricsViewTimeRangeResponse - 28, // 154: rill.runtime.v1.QueryService.ColumnRollupInterval:output_type -> rill.runtime.v1.ColumnRollupIntervalResponse - 30, // 155: rill.runtime.v1.QueryService.ColumnTopK:output_type -> rill.runtime.v1.ColumnTopKResponse - 34, // 156: rill.runtime.v1.QueryService.ColumnNullCount:output_type -> rill.runtime.v1.ColumnNullCountResponse - 36, // 157: rill.runtime.v1.QueryService.ColumnDescriptiveStatistics:output_type -> rill.runtime.v1.ColumnDescriptiveStatisticsResponse - 42, // 158: rill.runtime.v1.QueryService.ColumnTimeGrain:output_type -> rill.runtime.v1.ColumnTimeGrainResponse - 44, // 159: rill.runtime.v1.QueryService.ColumnNumericHistogram:output_type -> rill.runtime.v1.ColumnNumericHistogramResponse - 46, // 160: rill.runtime.v1.QueryService.ColumnRugHistogram:output_type -> rill.runtime.v1.ColumnRugHistogramResponse - 48, // 161: rill.runtime.v1.QueryService.ColumnTimeRange:output_type -> rill.runtime.v1.ColumnTimeRangeResponse - 51, // 162: rill.runtime.v1.QueryService.ColumnCardinality:output_type -> rill.runtime.v1.ColumnCardinalityResponse - 53, // 163: rill.runtime.v1.QueryService.ColumnTimeSeries:output_type -> rill.runtime.v1.ColumnTimeSeriesResponse - 58, // 164: rill.runtime.v1.QueryService.TableCardinality:output_type -> rill.runtime.v1.TableCardinalityResponse - 60, // 165: rill.runtime.v1.QueryService.TableColumns:output_type -> rill.runtime.v1.TableColumnsResponse - 63, // 166: rill.runtime.v1.QueryService.TableRows:output_type -> rill.runtime.v1.TableRowsResponse - 66, // 167: rill.runtime.v1.QueryService.QueryBatch:output_type -> rill.runtime.v1.QueryBatchResponse - 146, // [146:168] is the sub-list for method output_type - 124, // [124:146] is the sub-list for method input_type - 124, // [124:124] is the sub-list for extension type_name - 124, // [124:124] is the sub-list for extension extendee - 0, // [0:124] is the sub-list for field type_name + 8, // 4: rill.runtime.v1.ExportRequest.metrics_view_aggregation_request:type_name -> rill.runtime.v1.MetricsViewAggregationRequest + 13, // 5: rill.runtime.v1.ExportRequest.metrics_view_toplist_request:type_name -> rill.runtime.v1.MetricsViewToplistRequest + 25, // 6: rill.runtime.v1.ExportRequest.metrics_view_rows_request:type_name -> rill.runtime.v1.MetricsViewRowsRequest + 21, // 7: rill.runtime.v1.ExportRequest.metrics_view_time_series_request:type_name -> rill.runtime.v1.MetricsViewTimeSeriesRequest + 10, // 8: rill.runtime.v1.MetricsViewAggregationRequest.dimensions:type_name -> rill.runtime.v1.MetricsViewAggregationDimension + 11, // 9: rill.runtime.v1.MetricsViewAggregationRequest.measures:type_name -> rill.runtime.v1.MetricsViewAggregationMeasure + 12, // 10: rill.runtime.v1.MetricsViewAggregationRequest.sort:type_name -> rill.runtime.v1.MetricsViewAggregationSort + 82, // 11: rill.runtime.v1.MetricsViewAggregationRequest.time_start:type_name -> google.protobuf.Timestamp + 82, // 12: rill.runtime.v1.MetricsViewAggregationRequest.time_end:type_name -> google.protobuf.Timestamp + 28, // 13: rill.runtime.v1.MetricsViewAggregationRequest.filter:type_name -> rill.runtime.v1.MetricsViewFilter + 80, // 14: rill.runtime.v1.MetricsViewAggregationResponse.schema:type_name -> rill.runtime.v1.StructType + 81, // 15: rill.runtime.v1.MetricsViewAggregationResponse.data:type_name -> google.protobuf.Struct + 83, // 16: rill.runtime.v1.MetricsViewAggregationDimension.time_grain:type_name -> rill.runtime.v1.TimeGrain + 1, // 17: rill.runtime.v1.MetricsViewAggregationMeasure.builtin_measure:type_name -> rill.runtime.v1.BuiltinMeasure + 79, // 18: rill.runtime.v1.MetricsViewAggregationMeasure.builtin_measure_args:type_name -> google.protobuf.Value + 30, // 19: rill.runtime.v1.MetricsViewToplistRequest.inline_measures:type_name -> rill.runtime.v1.InlineMeasure + 82, // 20: rill.runtime.v1.MetricsViewToplistRequest.time_start:type_name -> google.protobuf.Timestamp + 82, // 21: rill.runtime.v1.MetricsViewToplistRequest.time_end:type_name -> google.protobuf.Timestamp + 27, // 22: rill.runtime.v1.MetricsViewToplistRequest.sort:type_name -> rill.runtime.v1.MetricsViewSort + 28, // 23: rill.runtime.v1.MetricsViewToplistRequest.filter:type_name -> rill.runtime.v1.MetricsViewFilter + 29, // 24: rill.runtime.v1.MetricsViewToplistResponse.meta:type_name -> rill.runtime.v1.MetricsViewColumn + 81, // 25: rill.runtime.v1.MetricsViewToplistResponse.data:type_name -> google.protobuf.Struct + 30, // 26: rill.runtime.v1.MetricsViewComparisonToplistRequest.inline_measures:type_name -> rill.runtime.v1.InlineMeasure + 17, // 27: rill.runtime.v1.MetricsViewComparisonToplistRequest.base_time_range:type_name -> rill.runtime.v1.TimeRange + 17, // 28: rill.runtime.v1.MetricsViewComparisonToplistRequest.comparison_time_range:type_name -> rill.runtime.v1.TimeRange + 18, // 29: rill.runtime.v1.MetricsViewComparisonToplistRequest.sort:type_name -> rill.runtime.v1.MetricsViewComparisonSort + 28, // 30: rill.runtime.v1.MetricsViewComparisonToplistRequest.filter:type_name -> rill.runtime.v1.MetricsViewFilter + 19, // 31: rill.runtime.v1.MetricsViewComparisonToplistResponse.rows:type_name -> rill.runtime.v1.MetricsViewComparisonRow + 82, // 32: rill.runtime.v1.TimeRange.start:type_name -> google.protobuf.Timestamp + 82, // 33: rill.runtime.v1.TimeRange.end:type_name -> google.protobuf.Timestamp + 2, // 34: rill.runtime.v1.MetricsViewComparisonSort.type:type_name -> rill.runtime.v1.MetricsViewComparisonSortType + 79, // 35: rill.runtime.v1.MetricsViewComparisonRow.dimension_value:type_name -> google.protobuf.Value + 20, // 36: rill.runtime.v1.MetricsViewComparisonRow.measure_values:type_name -> rill.runtime.v1.MetricsViewComparisonValue + 79, // 37: rill.runtime.v1.MetricsViewComparisonValue.base_value:type_name -> google.protobuf.Value + 79, // 38: rill.runtime.v1.MetricsViewComparisonValue.comparison_value:type_name -> google.protobuf.Value + 79, // 39: rill.runtime.v1.MetricsViewComparisonValue.delta_abs:type_name -> google.protobuf.Value + 79, // 40: rill.runtime.v1.MetricsViewComparisonValue.delta_rel:type_name -> google.protobuf.Value + 30, // 41: rill.runtime.v1.MetricsViewTimeSeriesRequest.inline_measures:type_name -> rill.runtime.v1.InlineMeasure + 82, // 42: rill.runtime.v1.MetricsViewTimeSeriesRequest.time_start:type_name -> google.protobuf.Timestamp + 82, // 43: rill.runtime.v1.MetricsViewTimeSeriesRequest.time_end:type_name -> google.protobuf.Timestamp + 83, // 44: rill.runtime.v1.MetricsViewTimeSeriesRequest.time_granularity:type_name -> rill.runtime.v1.TimeGrain + 28, // 45: rill.runtime.v1.MetricsViewTimeSeriesRequest.filter:type_name -> rill.runtime.v1.MetricsViewFilter + 29, // 46: rill.runtime.v1.MetricsViewTimeSeriesResponse.meta:type_name -> rill.runtime.v1.MetricsViewColumn + 62, // 47: rill.runtime.v1.MetricsViewTimeSeriesResponse.data:type_name -> rill.runtime.v1.TimeSeriesValue + 30, // 48: rill.runtime.v1.MetricsViewTotalsRequest.inline_measures:type_name -> rill.runtime.v1.InlineMeasure + 82, // 49: rill.runtime.v1.MetricsViewTotalsRequest.time_start:type_name -> google.protobuf.Timestamp + 82, // 50: rill.runtime.v1.MetricsViewTotalsRequest.time_end:type_name -> google.protobuf.Timestamp + 28, // 51: rill.runtime.v1.MetricsViewTotalsRequest.filter:type_name -> rill.runtime.v1.MetricsViewFilter + 29, // 52: rill.runtime.v1.MetricsViewTotalsResponse.meta:type_name -> rill.runtime.v1.MetricsViewColumn + 81, // 53: rill.runtime.v1.MetricsViewTotalsResponse.data:type_name -> google.protobuf.Struct + 82, // 54: rill.runtime.v1.MetricsViewRowsRequest.time_start:type_name -> google.protobuf.Timestamp + 82, // 55: rill.runtime.v1.MetricsViewRowsRequest.time_end:type_name -> google.protobuf.Timestamp + 83, // 56: rill.runtime.v1.MetricsViewRowsRequest.time_granularity:type_name -> rill.runtime.v1.TimeGrain + 28, // 57: rill.runtime.v1.MetricsViewRowsRequest.filter:type_name -> rill.runtime.v1.MetricsViewFilter + 27, // 58: rill.runtime.v1.MetricsViewRowsRequest.sort:type_name -> rill.runtime.v1.MetricsViewSort + 29, // 59: rill.runtime.v1.MetricsViewRowsResponse.meta:type_name -> rill.runtime.v1.MetricsViewColumn + 81, // 60: rill.runtime.v1.MetricsViewRowsResponse.data:type_name -> google.protobuf.Struct + 73, // 61: rill.runtime.v1.MetricsViewFilter.include:type_name -> rill.runtime.v1.MetricsViewFilter.Cond + 73, // 62: rill.runtime.v1.MetricsViewFilter.exclude:type_name -> rill.runtime.v1.MetricsViewFilter.Cond + 55, // 63: rill.runtime.v1.MetricsViewTimeRangeResponse.time_range_summary:type_name -> rill.runtime.v1.TimeRangeSummary + 82, // 64: rill.runtime.v1.ColumnRollupIntervalResponse.start:type_name -> google.protobuf.Timestamp + 82, // 65: rill.runtime.v1.ColumnRollupIntervalResponse.end:type_name -> google.protobuf.Timestamp + 83, // 66: rill.runtime.v1.ColumnRollupIntervalResponse.interval:type_name -> rill.runtime.v1.TimeGrain + 37, // 67: rill.runtime.v1.ColumnTopKResponse.categorical_summary:type_name -> rill.runtime.v1.CategoricalSummary + 38, // 68: rill.runtime.v1.CategoricalSummary.top_k:type_name -> rill.runtime.v1.TopK + 74, // 69: rill.runtime.v1.TopK.entries:type_name -> rill.runtime.v1.TopK.Entry + 43, // 70: rill.runtime.v1.ColumnDescriptiveStatisticsResponse.numeric_summary:type_name -> rill.runtime.v1.NumericSummary + 44, // 71: rill.runtime.v1.NumericSummary.numeric_histogram_bins:type_name -> rill.runtime.v1.NumericHistogramBins + 45, // 72: rill.runtime.v1.NumericSummary.numeric_statistics:type_name -> rill.runtime.v1.NumericStatistics + 46, // 73: rill.runtime.v1.NumericSummary.numeric_outliers:type_name -> rill.runtime.v1.NumericOutliers + 75, // 74: rill.runtime.v1.NumericHistogramBins.bins:type_name -> rill.runtime.v1.NumericHistogramBins.Bin + 76, // 75: rill.runtime.v1.NumericOutliers.outliers:type_name -> rill.runtime.v1.NumericOutliers.Outlier + 83, // 76: rill.runtime.v1.ColumnTimeGrainResponse.time_grain:type_name -> rill.runtime.v1.TimeGrain + 3, // 77: rill.runtime.v1.ColumnNumericHistogramRequest.histogram_method:type_name -> rill.runtime.v1.HistogramMethod + 43, // 78: rill.runtime.v1.ColumnNumericHistogramResponse.numeric_summary:type_name -> rill.runtime.v1.NumericSummary + 43, // 79: rill.runtime.v1.ColumnRugHistogramResponse.numeric_summary:type_name -> rill.runtime.v1.NumericSummary + 55, // 80: rill.runtime.v1.ColumnTimeRangeResponse.time_range_summary:type_name -> rill.runtime.v1.TimeRangeSummary + 82, // 81: rill.runtime.v1.TimeRangeSummary.min:type_name -> google.protobuf.Timestamp + 82, // 82: rill.runtime.v1.TimeRangeSummary.max:type_name -> google.protobuf.Timestamp + 77, // 83: rill.runtime.v1.TimeRangeSummary.interval:type_name -> rill.runtime.v1.TimeRangeSummary.Interval + 37, // 84: rill.runtime.v1.ColumnCardinalityResponse.categorical_summary:type_name -> rill.runtime.v1.CategoricalSummary + 78, // 85: rill.runtime.v1.ColumnTimeSeriesRequest.measures:type_name -> rill.runtime.v1.ColumnTimeSeriesRequest.BasicMeasure + 60, // 86: rill.runtime.v1.ColumnTimeSeriesRequest.time_range:type_name -> rill.runtime.v1.TimeSeriesTimeRange + 61, // 87: rill.runtime.v1.ColumnTimeSeriesResponse.rollup:type_name -> rill.runtime.v1.TimeSeriesResponse + 82, // 88: rill.runtime.v1.TimeSeriesTimeRange.start:type_name -> google.protobuf.Timestamp + 82, // 89: rill.runtime.v1.TimeSeriesTimeRange.end:type_name -> google.protobuf.Timestamp + 83, // 90: rill.runtime.v1.TimeSeriesTimeRange.interval:type_name -> rill.runtime.v1.TimeGrain + 62, // 91: rill.runtime.v1.TimeSeriesResponse.results:type_name -> rill.runtime.v1.TimeSeriesValue + 62, // 92: rill.runtime.v1.TimeSeriesResponse.spark:type_name -> rill.runtime.v1.TimeSeriesValue + 82, // 93: rill.runtime.v1.TimeSeriesValue.ts:type_name -> google.protobuf.Timestamp + 81, // 94: rill.runtime.v1.TimeSeriesValue.records:type_name -> google.protobuf.Struct + 67, // 95: rill.runtime.v1.TableColumnsResponse.profile_columns:type_name -> rill.runtime.v1.ProfileColumn + 81, // 96: rill.runtime.v1.TableRowsResponse.data:type_name -> google.protobuf.Struct + 8, // 97: rill.runtime.v1.QueryBatchEntry.metrics_view_aggregation_request:type_name -> rill.runtime.v1.MetricsViewAggregationRequest + 13, // 98: rill.runtime.v1.QueryBatchEntry.metrics_view_toplist_request:type_name -> rill.runtime.v1.MetricsViewToplistRequest + 15, // 99: rill.runtime.v1.QueryBatchEntry.metrics_view_comparison_toplist_request:type_name -> rill.runtime.v1.MetricsViewComparisonToplistRequest + 21, // 100: rill.runtime.v1.QueryBatchEntry.metrics_view_time_series_request:type_name -> rill.runtime.v1.MetricsViewTimeSeriesRequest + 23, // 101: rill.runtime.v1.QueryBatchEntry.metrics_view_totals_request:type_name -> rill.runtime.v1.MetricsViewTotalsRequest + 25, // 102: rill.runtime.v1.QueryBatchEntry.metrics_view_rows_request:type_name -> rill.runtime.v1.MetricsViewRowsRequest + 33, // 103: rill.runtime.v1.QueryBatchEntry.column_rollup_interval_request:type_name -> rill.runtime.v1.ColumnRollupIntervalRequest + 35, // 104: rill.runtime.v1.QueryBatchEntry.column_top_k_request:type_name -> rill.runtime.v1.ColumnTopKRequest + 39, // 105: rill.runtime.v1.QueryBatchEntry.column_null_count_request:type_name -> rill.runtime.v1.ColumnNullCountRequest + 41, // 106: rill.runtime.v1.QueryBatchEntry.column_descriptive_statistics_request:type_name -> rill.runtime.v1.ColumnDescriptiveStatisticsRequest + 47, // 107: rill.runtime.v1.QueryBatchEntry.column_time_grain_request:type_name -> rill.runtime.v1.ColumnTimeGrainRequest + 49, // 108: rill.runtime.v1.QueryBatchEntry.column_numeric_histogram_request:type_name -> rill.runtime.v1.ColumnNumericHistogramRequest + 51, // 109: rill.runtime.v1.QueryBatchEntry.column_rug_histogram_request:type_name -> rill.runtime.v1.ColumnRugHistogramRequest + 53, // 110: rill.runtime.v1.QueryBatchEntry.column_time_range_request:type_name -> rill.runtime.v1.ColumnTimeRangeRequest + 56, // 111: rill.runtime.v1.QueryBatchEntry.column_cardinality_request:type_name -> rill.runtime.v1.ColumnCardinalityRequest + 58, // 112: rill.runtime.v1.QueryBatchEntry.column_time_series_request:type_name -> rill.runtime.v1.ColumnTimeSeriesRequest + 63, // 113: rill.runtime.v1.QueryBatchEntry.table_cardinality_request:type_name -> rill.runtime.v1.TableCardinalityRequest + 65, // 114: rill.runtime.v1.QueryBatchEntry.table_columns_request:type_name -> rill.runtime.v1.TableColumnsRequest + 68, // 115: rill.runtime.v1.QueryBatchEntry.table_rows_request:type_name -> rill.runtime.v1.TableRowsRequest + 70, // 116: rill.runtime.v1.QueryBatchRequest.queries:type_name -> rill.runtime.v1.QueryBatchEntry + 9, // 117: rill.runtime.v1.QueryBatchResponse.metrics_view_aggregation_response:type_name -> rill.runtime.v1.MetricsViewAggregationResponse + 14, // 118: rill.runtime.v1.QueryBatchResponse.metrics_view_toplist_response:type_name -> rill.runtime.v1.MetricsViewToplistResponse + 16, // 119: rill.runtime.v1.QueryBatchResponse.metrics_view_comparison_toplist_response:type_name -> rill.runtime.v1.MetricsViewComparisonToplistResponse + 22, // 120: rill.runtime.v1.QueryBatchResponse.metrics_view_time_series_response:type_name -> rill.runtime.v1.MetricsViewTimeSeriesResponse + 24, // 121: rill.runtime.v1.QueryBatchResponse.metrics_view_totals_response:type_name -> rill.runtime.v1.MetricsViewTotalsResponse + 26, // 122: rill.runtime.v1.QueryBatchResponse.metrics_view_rows_response:type_name -> rill.runtime.v1.MetricsViewRowsResponse + 34, // 123: rill.runtime.v1.QueryBatchResponse.column_rollup_interval_response:type_name -> rill.runtime.v1.ColumnRollupIntervalResponse + 36, // 124: rill.runtime.v1.QueryBatchResponse.column_top_k_response:type_name -> rill.runtime.v1.ColumnTopKResponse + 40, // 125: rill.runtime.v1.QueryBatchResponse.column_null_count_response:type_name -> rill.runtime.v1.ColumnNullCountResponse + 42, // 126: rill.runtime.v1.QueryBatchResponse.column_descriptive_statistics_response:type_name -> rill.runtime.v1.ColumnDescriptiveStatisticsResponse + 48, // 127: rill.runtime.v1.QueryBatchResponse.column_time_grain_response:type_name -> rill.runtime.v1.ColumnTimeGrainResponse + 50, // 128: rill.runtime.v1.QueryBatchResponse.column_numeric_histogram_response:type_name -> rill.runtime.v1.ColumnNumericHistogramResponse + 52, // 129: rill.runtime.v1.QueryBatchResponse.column_rug_histogram_response:type_name -> rill.runtime.v1.ColumnRugHistogramResponse + 54, // 130: rill.runtime.v1.QueryBatchResponse.column_time_range_response:type_name -> rill.runtime.v1.ColumnTimeRangeResponse + 57, // 131: rill.runtime.v1.QueryBatchResponse.column_cardinality_response:type_name -> rill.runtime.v1.ColumnCardinalityResponse + 59, // 132: rill.runtime.v1.QueryBatchResponse.column_time_series_response:type_name -> rill.runtime.v1.ColumnTimeSeriesResponse + 64, // 133: rill.runtime.v1.QueryBatchResponse.table_cardinality_response:type_name -> rill.runtime.v1.TableCardinalityResponse + 66, // 134: rill.runtime.v1.QueryBatchResponse.table_columns_response:type_name -> rill.runtime.v1.TableColumnsResponse + 69, // 135: rill.runtime.v1.QueryBatchResponse.table_rows_response:type_name -> rill.runtime.v1.TableRowsResponse + 79, // 136: rill.runtime.v1.MetricsViewFilter.Cond.in:type_name -> google.protobuf.Value + 79, // 137: rill.runtime.v1.TopK.Entry.value:type_name -> google.protobuf.Value + 4, // 138: rill.runtime.v1.QueryService.Query:input_type -> rill.runtime.v1.QueryRequest + 6, // 139: rill.runtime.v1.QueryService.Export:input_type -> rill.runtime.v1.ExportRequest + 8, // 140: rill.runtime.v1.QueryService.MetricsViewAggregation:input_type -> rill.runtime.v1.MetricsViewAggregationRequest + 13, // 141: rill.runtime.v1.QueryService.MetricsViewToplist:input_type -> rill.runtime.v1.MetricsViewToplistRequest + 15, // 142: rill.runtime.v1.QueryService.MetricsViewComparisonToplist:input_type -> rill.runtime.v1.MetricsViewComparisonToplistRequest + 21, // 143: rill.runtime.v1.QueryService.MetricsViewTimeSeries:input_type -> rill.runtime.v1.MetricsViewTimeSeriesRequest + 23, // 144: rill.runtime.v1.QueryService.MetricsViewTotals:input_type -> rill.runtime.v1.MetricsViewTotalsRequest + 25, // 145: rill.runtime.v1.QueryService.MetricsViewRows:input_type -> rill.runtime.v1.MetricsViewRowsRequest + 31, // 146: rill.runtime.v1.QueryService.MetricsViewTimeRange:input_type -> rill.runtime.v1.MetricsViewTimeRangeRequest + 33, // 147: rill.runtime.v1.QueryService.ColumnRollupInterval:input_type -> rill.runtime.v1.ColumnRollupIntervalRequest + 35, // 148: rill.runtime.v1.QueryService.ColumnTopK:input_type -> rill.runtime.v1.ColumnTopKRequest + 39, // 149: rill.runtime.v1.QueryService.ColumnNullCount:input_type -> rill.runtime.v1.ColumnNullCountRequest + 41, // 150: rill.runtime.v1.QueryService.ColumnDescriptiveStatistics:input_type -> rill.runtime.v1.ColumnDescriptiveStatisticsRequest + 47, // 151: rill.runtime.v1.QueryService.ColumnTimeGrain:input_type -> rill.runtime.v1.ColumnTimeGrainRequest + 49, // 152: rill.runtime.v1.QueryService.ColumnNumericHistogram:input_type -> rill.runtime.v1.ColumnNumericHistogramRequest + 51, // 153: rill.runtime.v1.QueryService.ColumnRugHistogram:input_type -> rill.runtime.v1.ColumnRugHistogramRequest + 53, // 154: rill.runtime.v1.QueryService.ColumnTimeRange:input_type -> rill.runtime.v1.ColumnTimeRangeRequest + 56, // 155: rill.runtime.v1.QueryService.ColumnCardinality:input_type -> rill.runtime.v1.ColumnCardinalityRequest + 58, // 156: rill.runtime.v1.QueryService.ColumnTimeSeries:input_type -> rill.runtime.v1.ColumnTimeSeriesRequest + 63, // 157: rill.runtime.v1.QueryService.TableCardinality:input_type -> rill.runtime.v1.TableCardinalityRequest + 65, // 158: rill.runtime.v1.QueryService.TableColumns:input_type -> rill.runtime.v1.TableColumnsRequest + 68, // 159: rill.runtime.v1.QueryService.TableRows:input_type -> rill.runtime.v1.TableRowsRequest + 71, // 160: rill.runtime.v1.QueryService.QueryBatch:input_type -> rill.runtime.v1.QueryBatchRequest + 5, // 161: rill.runtime.v1.QueryService.Query:output_type -> rill.runtime.v1.QueryResponse + 7, // 162: rill.runtime.v1.QueryService.Export:output_type -> rill.runtime.v1.ExportResponse + 9, // 163: rill.runtime.v1.QueryService.MetricsViewAggregation:output_type -> rill.runtime.v1.MetricsViewAggregationResponse + 14, // 164: rill.runtime.v1.QueryService.MetricsViewToplist:output_type -> rill.runtime.v1.MetricsViewToplistResponse + 16, // 165: rill.runtime.v1.QueryService.MetricsViewComparisonToplist:output_type -> rill.runtime.v1.MetricsViewComparisonToplistResponse + 22, // 166: rill.runtime.v1.QueryService.MetricsViewTimeSeries:output_type -> rill.runtime.v1.MetricsViewTimeSeriesResponse + 24, // 167: rill.runtime.v1.QueryService.MetricsViewTotals:output_type -> rill.runtime.v1.MetricsViewTotalsResponse + 26, // 168: rill.runtime.v1.QueryService.MetricsViewRows:output_type -> rill.runtime.v1.MetricsViewRowsResponse + 32, // 169: rill.runtime.v1.QueryService.MetricsViewTimeRange:output_type -> rill.runtime.v1.MetricsViewTimeRangeResponse + 34, // 170: rill.runtime.v1.QueryService.ColumnRollupInterval:output_type -> rill.runtime.v1.ColumnRollupIntervalResponse + 36, // 171: rill.runtime.v1.QueryService.ColumnTopK:output_type -> rill.runtime.v1.ColumnTopKResponse + 40, // 172: rill.runtime.v1.QueryService.ColumnNullCount:output_type -> rill.runtime.v1.ColumnNullCountResponse + 42, // 173: rill.runtime.v1.QueryService.ColumnDescriptiveStatistics:output_type -> rill.runtime.v1.ColumnDescriptiveStatisticsResponse + 48, // 174: rill.runtime.v1.QueryService.ColumnTimeGrain:output_type -> rill.runtime.v1.ColumnTimeGrainResponse + 50, // 175: rill.runtime.v1.QueryService.ColumnNumericHistogram:output_type -> rill.runtime.v1.ColumnNumericHistogramResponse + 52, // 176: rill.runtime.v1.QueryService.ColumnRugHistogram:output_type -> rill.runtime.v1.ColumnRugHistogramResponse + 54, // 177: rill.runtime.v1.QueryService.ColumnTimeRange:output_type -> rill.runtime.v1.ColumnTimeRangeResponse + 57, // 178: rill.runtime.v1.QueryService.ColumnCardinality:output_type -> rill.runtime.v1.ColumnCardinalityResponse + 59, // 179: rill.runtime.v1.QueryService.ColumnTimeSeries:output_type -> rill.runtime.v1.ColumnTimeSeriesResponse + 64, // 180: rill.runtime.v1.QueryService.TableCardinality:output_type -> rill.runtime.v1.TableCardinalityResponse + 66, // 181: rill.runtime.v1.QueryService.TableColumns:output_type -> rill.runtime.v1.TableColumnsResponse + 69, // 182: rill.runtime.v1.QueryService.TableRows:output_type -> rill.runtime.v1.TableRowsResponse + 72, // 183: rill.runtime.v1.QueryService.QueryBatch:output_type -> rill.runtime.v1.QueryBatchResponse + 161, // [161:184] is the sub-list for method output_type + 138, // [138:161] is the sub-list for method input_type + 138, // [138:138] is the sub-list for extension type_name + 138, // [138:138] is the sub-list for extension extendee + 0, // [0:138] is the sub-list for field type_name } func init() { file_rill_runtime_v1_queries_proto_init() } @@ -7065,7 +7656,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetricsViewToplistRequest); i { + switch v := v.(*MetricsViewAggregationRequest); i { case 0: return &v.state case 1: @@ -7077,7 +7668,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetricsViewToplistResponse); i { + switch v := v.(*MetricsViewAggregationResponse); i { case 0: return &v.state case 1: @@ -7089,7 +7680,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetricsViewComparisonToplistRequest); i { + switch v := v.(*MetricsViewAggregationDimension); i { case 0: return &v.state case 1: @@ -7101,7 +7692,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetricsViewComparisonToplistResponse); i { + switch v := v.(*MetricsViewAggregationMeasure); i { case 0: return &v.state case 1: @@ -7113,7 +7704,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TimeRange); i { + switch v := v.(*MetricsViewAggregationSort); i { case 0: return &v.state case 1: @@ -7125,7 +7716,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetricsViewComparisonSort); i { + switch v := v.(*MetricsViewToplistRequest); i { case 0: return &v.state case 1: @@ -7137,7 +7728,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetricsViewComparisonRow); i { + switch v := v.(*MetricsViewToplistResponse); i { case 0: return &v.state case 1: @@ -7149,7 +7740,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetricsViewComparisonValue); i { + switch v := v.(*MetricsViewComparisonToplistRequest); i { case 0: return &v.state case 1: @@ -7161,7 +7752,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetricsViewTimeSeriesRequest); i { + switch v := v.(*MetricsViewComparisonToplistResponse); i { case 0: return &v.state case 1: @@ -7173,7 +7764,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetricsViewTimeSeriesResponse); i { + switch v := v.(*TimeRange); i { case 0: return &v.state case 1: @@ -7185,7 +7776,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetricsViewTotalsRequest); i { + switch v := v.(*MetricsViewComparisonSort); i { case 0: return &v.state case 1: @@ -7197,7 +7788,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetricsViewTotalsResponse); i { + switch v := v.(*MetricsViewComparisonRow); i { case 0: return &v.state case 1: @@ -7209,7 +7800,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetricsViewRowsRequest); i { + switch v := v.(*MetricsViewComparisonValue); i { case 0: return &v.state case 1: @@ -7221,7 +7812,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetricsViewRowsResponse); i { + switch v := v.(*MetricsViewTimeSeriesRequest); i { case 0: return &v.state case 1: @@ -7233,7 +7824,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetricsViewSort); i { + switch v := v.(*MetricsViewTimeSeriesResponse); i { case 0: return &v.state case 1: @@ -7245,7 +7836,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetricsViewFilter); i { + switch v := v.(*MetricsViewTotalsRequest); i { case 0: return &v.state case 1: @@ -7257,7 +7848,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetricsViewColumn); i { + switch v := v.(*MetricsViewTotalsResponse); i { case 0: return &v.state case 1: @@ -7269,7 +7860,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InlineMeasure); i { + switch v := v.(*MetricsViewRowsRequest); i { case 0: return &v.state case 1: @@ -7281,7 +7872,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetricsViewTimeRangeRequest); i { + switch v := v.(*MetricsViewRowsResponse); i { case 0: return &v.state case 1: @@ -7293,7 +7884,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetricsViewTimeRangeResponse); i { + switch v := v.(*MetricsViewSort); i { case 0: return &v.state case 1: @@ -7305,7 +7896,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnRollupIntervalRequest); i { + switch v := v.(*MetricsViewFilter); i { case 0: return &v.state case 1: @@ -7317,7 +7908,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnRollupIntervalResponse); i { + switch v := v.(*MetricsViewColumn); i { case 0: return &v.state case 1: @@ -7329,7 +7920,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnTopKRequest); i { + switch v := v.(*InlineMeasure); i { case 0: return &v.state case 1: @@ -7341,7 +7932,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnTopKResponse); i { + switch v := v.(*MetricsViewTimeRangeRequest); i { case 0: return &v.state case 1: @@ -7353,7 +7944,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CategoricalSummary); i { + switch v := v.(*MetricsViewTimeRangeResponse); i { case 0: return &v.state case 1: @@ -7365,7 +7956,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TopK); i { + switch v := v.(*ColumnRollupIntervalRequest); i { case 0: return &v.state case 1: @@ -7377,7 +7968,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnNullCountRequest); i { + switch v := v.(*ColumnRollupIntervalResponse); i { case 0: return &v.state case 1: @@ -7389,7 +7980,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnNullCountResponse); i { + switch v := v.(*ColumnTopKRequest); i { case 0: return &v.state case 1: @@ -7401,7 +7992,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnDescriptiveStatisticsRequest); i { + switch v := v.(*ColumnTopKResponse); i { case 0: return &v.state case 1: @@ -7413,7 +8004,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnDescriptiveStatisticsResponse); i { + switch v := v.(*CategoricalSummary); i { case 0: return &v.state case 1: @@ -7425,7 +8016,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NumericSummary); i { + switch v := v.(*TopK); i { case 0: return &v.state case 1: @@ -7437,7 +8028,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NumericHistogramBins); i { + switch v := v.(*ColumnNullCountRequest); i { case 0: return &v.state case 1: @@ -7449,7 +8040,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NumericStatistics); i { + switch v := v.(*ColumnNullCountResponse); i { case 0: return &v.state case 1: @@ -7461,7 +8052,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NumericOutliers); i { + switch v := v.(*ColumnDescriptiveStatisticsRequest); i { case 0: return &v.state case 1: @@ -7473,7 +8064,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnTimeGrainRequest); i { + switch v := v.(*ColumnDescriptiveStatisticsResponse); i { case 0: return &v.state case 1: @@ -7485,7 +8076,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnTimeGrainResponse); i { + switch v := v.(*NumericSummary); i { case 0: return &v.state case 1: @@ -7497,7 +8088,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnNumericHistogramRequest); i { + switch v := v.(*NumericHistogramBins); i { case 0: return &v.state case 1: @@ -7509,7 +8100,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnNumericHistogramResponse); i { + switch v := v.(*NumericStatistics); i { case 0: return &v.state case 1: @@ -7521,7 +8112,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnRugHistogramRequest); i { + switch v := v.(*NumericOutliers); i { case 0: return &v.state case 1: @@ -7533,7 +8124,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnRugHistogramResponse); i { + switch v := v.(*ColumnTimeGrainRequest); i { case 0: return &v.state case 1: @@ -7545,7 +8136,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnTimeRangeRequest); i { + switch v := v.(*ColumnTimeGrainResponse); i { case 0: return &v.state case 1: @@ -7557,7 +8148,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnTimeRangeResponse); i { + switch v := v.(*ColumnNumericHistogramRequest); i { case 0: return &v.state case 1: @@ -7569,7 +8160,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TimeRangeSummary); i { + switch v := v.(*ColumnNumericHistogramResponse); i { case 0: return &v.state case 1: @@ -7581,7 +8172,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnCardinalityRequest); i { + switch v := v.(*ColumnRugHistogramRequest); i { case 0: return &v.state case 1: @@ -7593,7 +8184,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnCardinalityResponse); i { + switch v := v.(*ColumnRugHistogramResponse); i { case 0: return &v.state case 1: @@ -7605,7 +8196,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnTimeSeriesRequest); i { + switch v := v.(*ColumnTimeRangeRequest); i { case 0: return &v.state case 1: @@ -7617,7 +8208,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ColumnTimeSeriesResponse); i { + switch v := v.(*ColumnTimeRangeResponse); i { case 0: return &v.state case 1: @@ -7629,7 +8220,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TimeSeriesTimeRange); i { + switch v := v.(*TimeRangeSummary); i { case 0: return &v.state case 1: @@ -7641,7 +8232,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TimeSeriesResponse); i { + switch v := v.(*ColumnCardinalityRequest); i { case 0: return &v.state case 1: @@ -7653,7 +8244,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TimeSeriesValue); i { + switch v := v.(*ColumnCardinalityResponse); i { case 0: return &v.state case 1: @@ -7665,7 +8256,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TableCardinalityRequest); i { + switch v := v.(*ColumnTimeSeriesRequest); i { case 0: return &v.state case 1: @@ -7677,7 +8268,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TableCardinalityResponse); i { + switch v := v.(*ColumnTimeSeriesResponse); i { case 0: return &v.state case 1: @@ -7689,7 +8280,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TableColumnsRequest); i { + switch v := v.(*TimeSeriesTimeRange); i { case 0: return &v.state case 1: @@ -7701,7 +8292,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TableColumnsResponse); i { + switch v := v.(*TimeSeriesResponse); i { case 0: return &v.state case 1: @@ -7713,7 +8304,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProfileColumn); i { + switch v := v.(*TimeSeriesValue); i { case 0: return &v.state case 1: @@ -7725,7 +8316,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TableRowsRequest); i { + switch v := v.(*TableCardinalityRequest); i { case 0: return &v.state case 1: @@ -7737,7 +8328,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TableRowsResponse); i { + switch v := v.(*TableCardinalityResponse); i { case 0: return &v.state case 1: @@ -7749,7 +8340,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryBatchEntry); i { + switch v := v.(*TableColumnsRequest); i { case 0: return &v.state case 1: @@ -7761,7 +8352,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryBatchRequest); i { + switch v := v.(*TableColumnsResponse); i { case 0: return &v.state case 1: @@ -7773,7 +8364,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryBatchResponse); i { + switch v := v.(*ProfileColumn); i { case 0: return &v.state case 1: @@ -7785,7 +8376,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetricsViewFilter_Cond); i { + switch v := v.(*TableRowsRequest); i { case 0: return &v.state case 1: @@ -7797,7 +8388,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TopK_Entry); i { + switch v := v.(*TableRowsResponse); i { case 0: return &v.state case 1: @@ -7809,7 +8400,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NumericHistogramBins_Bin); i { + switch v := v.(*QueryBatchEntry); i { case 0: return &v.state case 1: @@ -7821,7 +8412,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NumericOutliers_Outlier); i { + switch v := v.(*QueryBatchRequest); i { case 0: return &v.state case 1: @@ -7833,7 +8424,7 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TimeRangeSummary_Interval); i { + switch v := v.(*QueryBatchResponse); i { case 0: return &v.state case 1: @@ -7845,6 +8436,66 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MetricsViewFilter_Cond); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rill_runtime_v1_queries_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TopK_Entry); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rill_runtime_v1_queries_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NumericHistogramBins_Bin); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rill_runtime_v1_queries_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NumericOutliers_Outlier); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rill_runtime_v1_queries_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TimeRangeSummary_Interval); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rill_runtime_v1_queries_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ColumnTimeSeriesRequest_BasicMeasure); i { case 0: return &v.state @@ -7858,20 +8509,22 @@ func file_rill_runtime_v1_queries_proto_init() { } } file_rill_runtime_v1_queries_proto_msgTypes[2].OneofWrappers = []interface{}{ + (*ExportRequest_MetricsViewAggregationRequest)(nil), (*ExportRequest_MetricsViewToplistRequest)(nil), (*ExportRequest_MetricsViewRowsRequest)(nil), (*ExportRequest_MetricsViewTimeSeriesRequest)(nil), } - file_rill_runtime_v1_queries_proto_msgTypes[28].OneofWrappers = []interface{}{ + file_rill_runtime_v1_queries_proto_msgTypes[33].OneofWrappers = []interface{}{ (*CategoricalSummary_TopK)(nil), (*CategoricalSummary_Cardinality)(nil), } - file_rill_runtime_v1_queries_proto_msgTypes[34].OneofWrappers = []interface{}{ + file_rill_runtime_v1_queries_proto_msgTypes[39].OneofWrappers = []interface{}{ (*NumericSummary_NumericHistogramBins)(nil), (*NumericSummary_NumericStatistics)(nil), (*NumericSummary_NumericOutliers)(nil), } - file_rill_runtime_v1_queries_proto_msgTypes[61].OneofWrappers = []interface{}{ + file_rill_runtime_v1_queries_proto_msgTypes[66].OneofWrappers = []interface{}{ + (*QueryBatchEntry_MetricsViewAggregationRequest)(nil), (*QueryBatchEntry_MetricsViewToplistRequest)(nil), (*QueryBatchEntry_MetricsViewComparisonToplistRequest)(nil), (*QueryBatchEntry_MetricsViewTimeSeriesRequest)(nil), @@ -7891,7 +8544,8 @@ func file_rill_runtime_v1_queries_proto_init() { (*QueryBatchEntry_TableColumnsRequest)(nil), (*QueryBatchEntry_TableRowsRequest)(nil), } - file_rill_runtime_v1_queries_proto_msgTypes[63].OneofWrappers = []interface{}{ + file_rill_runtime_v1_queries_proto_msgTypes[68].OneofWrappers = []interface{}{ + (*QueryBatchResponse_MetricsViewAggregationResponse)(nil), (*QueryBatchResponse_MetricsViewToplistResponse)(nil), (*QueryBatchResponse_MetricsViewComparisonToplistResponse)(nil), (*QueryBatchResponse_MetricsViewTimeSeriesResponse)(nil), @@ -7916,8 +8570,8 @@ func file_rill_runtime_v1_queries_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_rill_runtime_v1_queries_proto_rawDesc, - NumEnums: 3, - NumMessages: 70, + NumEnums: 4, + NumMessages: 75, NumExtensions: 0, NumServices: 1, }, diff --git a/proto/gen/rill/runtime/v1/queries.pb.gw.go b/proto/gen/rill/runtime/v1/queries.pb.gw.go index dab23527bce..e81c5a20910 100644 --- a/proto/gen/rill/runtime/v1/queries.pb.gw.go +++ b/proto/gen/rill/runtime/v1/queries.pb.gw.go @@ -167,6 +167,94 @@ func local_request_QueryService_Export_0(ctx context.Context, marshaler runtime. } +func request_QueryService_MetricsViewAggregation_0(ctx context.Context, marshaler runtime.Marshaler, client QueryServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq MetricsViewAggregationRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["instance_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "instance_id") + } + + protoReq.InstanceId, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "instance_id", err) + } + + val, ok = pathParams["metrics_view"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "metrics_view") + } + + protoReq.MetricsView, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "metrics_view", err) + } + + msg, err := client.MetricsViewAggregation(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_QueryService_MetricsViewAggregation_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq MetricsViewAggregationRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["instance_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "instance_id") + } + + protoReq.InstanceId, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "instance_id", err) + } + + val, ok = pathParams["metrics_view"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "metrics_view") + } + + protoReq.MetricsView, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "metrics_view", err) + } + + msg, err := server.MetricsViewAggregation(ctx, &protoReq) + return msg, metadata, err + +} + func request_QueryService_MetricsViewToplist_0(ctx context.Context, marshaler runtime.Marshaler, client QueryServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq MetricsViewToplistRequest var metadata runtime.ServerMetadata @@ -1957,6 +2045,31 @@ func RegisterQueryServiceHandlerServer(ctx context.Context, mux *runtime.ServeMu }) + mux.Handle("POST", pattern_QueryService_MetricsViewAggregation_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/rill.runtime.v1.QueryService/MetricsViewAggregation", runtime.WithHTTPPathPattern("/v1/instances/{instance_id}/queries/metrics-views/{metrics_view}/aggregation")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_QueryService_MetricsViewAggregation_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_QueryService_MetricsViewAggregation_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_QueryService_MetricsViewToplist_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -2524,6 +2637,28 @@ func RegisterQueryServiceHandlerClient(ctx context.Context, mux *runtime.ServeMu }) + mux.Handle("POST", pattern_QueryService_MetricsViewAggregation_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/rill.runtime.v1.QueryService/MetricsViewAggregation", runtime.WithHTTPPathPattern("/v1/instances/{instance_id}/queries/metrics-views/{metrics_view}/aggregation")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_QueryService_MetricsViewAggregation_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_QueryService_MetricsViewAggregation_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_QueryService_MetricsViewToplist_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -2972,6 +3107,8 @@ var ( pattern_QueryService_Export_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 2, 4}, []string{"v1", "instances", "instance_id", "queries", "export"}, "")) + pattern_QueryService_MetricsViewAggregation_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5, 2, 6}, []string{"v1", "instances", "instance_id", "queries", "metrics-views", "metrics_view", "aggregation"}, "")) + pattern_QueryService_MetricsViewToplist_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5, 2, 6}, []string{"v1", "instances", "instance_id", "queries", "metrics-views", "metrics_view_name", "toplist"}, "")) pattern_QueryService_MetricsViewComparisonToplist_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5, 2, 6}, []string{"v1", "instances", "instance_id", "queries", "metrics-views", "metrics_view_name", "compare-toplist"}, "")) @@ -3018,6 +3155,8 @@ var ( forward_QueryService_Export_0 = runtime.ForwardResponseMessage + forward_QueryService_MetricsViewAggregation_0 = runtime.ForwardResponseMessage + forward_QueryService_MetricsViewToplist_0 = runtime.ForwardResponseMessage forward_QueryService_MetricsViewComparisonToplist_0 = runtime.ForwardResponseMessage diff --git a/proto/gen/rill/runtime/v1/queries.pb.validate.go b/proto/gen/rill/runtime/v1/queries.pb.validate.go index 25068020ad3..e3b43a5f146 100644 --- a/proto/gen/rill/runtime/v1/queries.pb.validate.go +++ b/proto/gen/rill/runtime/v1/queries.pb.validate.go @@ -388,6 +388,47 @@ func (m *ExportRequest) validate(all bool) error { // no validation rules for Format switch v := m.Request.(type) { + case *ExportRequest_MetricsViewAggregationRequest: + if v == nil { + err := ExportRequestValidationError{ + field: "Request", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetMetricsViewAggregationRequest()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ExportRequestValidationError{ + field: "MetricsViewAggregationRequest", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ExportRequestValidationError{ + field: "MetricsViewAggregationRequest", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetMetricsViewAggregationRequest()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ExportRequestValidationError{ + field: "MetricsViewAggregationRequest", + reason: "embedded message failed validation", + cause: err, + } + } + } + case *ExportRequest_MetricsViewToplistRequest: if v == nil { err := ExportRequestValidationError{ @@ -400,139 +441,983 @@ func (m *ExportRequest) validate(all bool) error { errors = append(errors, err) } - if all { - switch v := interface{}(m.GetMetricsViewToplistRequest()).(type) { - case interface{ ValidateAll() error }: - if err := v.ValidateAll(); err != nil { - errors = append(errors, ExportRequestValidationError{ - field: "MetricsViewToplistRequest", - reason: "embedded message failed validation", - cause: err, - }) - } - case interface{ Validate() error }: - if err := v.Validate(); err != nil { - errors = append(errors, ExportRequestValidationError{ - field: "MetricsViewToplistRequest", - reason: "embedded message failed validation", - cause: err, - }) - } - } - } else if v, ok := interface{}(m.GetMetricsViewToplistRequest()).(interface{ Validate() error }); ok { - if err := v.Validate(); err != nil { - return ExportRequestValidationError{ - field: "MetricsViewToplistRequest", - reason: "embedded message failed validation", - cause: err, - } - } - } + if all { + switch v := interface{}(m.GetMetricsViewToplistRequest()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ExportRequestValidationError{ + field: "MetricsViewToplistRequest", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ExportRequestValidationError{ + field: "MetricsViewToplistRequest", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetMetricsViewToplistRequest()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ExportRequestValidationError{ + field: "MetricsViewToplistRequest", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case *ExportRequest_MetricsViewRowsRequest: + if v == nil { + err := ExportRequestValidationError{ + field: "Request", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetMetricsViewRowsRequest()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ExportRequestValidationError{ + field: "MetricsViewRowsRequest", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ExportRequestValidationError{ + field: "MetricsViewRowsRequest", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetMetricsViewRowsRequest()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ExportRequestValidationError{ + field: "MetricsViewRowsRequest", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case *ExportRequest_MetricsViewTimeSeriesRequest: + if v == nil { + err := ExportRequestValidationError{ + field: "Request", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetMetricsViewTimeSeriesRequest()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ExportRequestValidationError{ + field: "MetricsViewTimeSeriesRequest", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ExportRequestValidationError{ + field: "MetricsViewTimeSeriesRequest", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetMetricsViewTimeSeriesRequest()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ExportRequestValidationError{ + field: "MetricsViewTimeSeriesRequest", + reason: "embedded message failed validation", + cause: err, + } + } + } + + default: + _ = v // ensures v is used + } + + if m.Limit != nil { + // no validation rules for Limit + } + + if len(errors) > 0 { + return ExportRequestMultiError(errors) + } + + return nil +} + +// ExportRequestMultiError is an error wrapping multiple validation errors +// returned by ExportRequest.ValidateAll() if the designated constraints +// aren't met. +type ExportRequestMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m ExportRequestMultiError) 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 ExportRequestMultiError) AllErrors() []error { return m } + +// ExportRequestValidationError is the validation error returned by +// ExportRequest.Validate if the designated constraints aren't met. +type ExportRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e ExportRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e ExportRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e ExportRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e ExportRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e ExportRequestValidationError) ErrorName() string { return "ExportRequestValidationError" } + +// Error satisfies the builtin error interface +func (e ExportRequestValidationError) 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 %sExportRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = ExportRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = ExportRequestValidationError{} + +// Validate checks the field values on ExportResponse 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 *ExportResponse) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on ExportResponse 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 ExportResponseMultiError, +// or nil if none found. +func (m *ExportResponse) ValidateAll() error { + return m.validate(true) +} + +func (m *ExportResponse) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for DownloadUrlPath + + if len(errors) > 0 { + return ExportResponseMultiError(errors) + } + + return nil +} + +// ExportResponseMultiError is an error wrapping multiple validation errors +// returned by ExportResponse.ValidateAll() if the designated constraints +// aren't met. +type ExportResponseMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m ExportResponseMultiError) 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 ExportResponseMultiError) AllErrors() []error { return m } + +// ExportResponseValidationError is the validation error returned by +// ExportResponse.Validate if the designated constraints aren't met. +type ExportResponseValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e ExportResponseValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e ExportResponseValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e ExportResponseValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e ExportResponseValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e ExportResponseValidationError) ErrorName() string { return "ExportResponseValidationError" } + +// Error satisfies the builtin error interface +func (e ExportResponseValidationError) 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 %sExportResponse.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = ExportResponseValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = ExportResponseValidationError{} + +// Validate checks the field values on MetricsViewAggregationRequest 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 *MetricsViewAggregationRequest) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on MetricsViewAggregationRequest 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 +// MetricsViewAggregationRequestMultiError, or nil if none found. +func (m *MetricsViewAggregationRequest) ValidateAll() error { + return m.validate(true) +} + +func (m *MetricsViewAggregationRequest) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for InstanceId + + if utf8.RuneCountInString(m.GetMetricsView()) < 1 { + err := MetricsViewAggregationRequestValidationError{ + field: "MetricsView", + reason: "value length must be at least 1 runes", + } + if !all { + return err + } + errors = append(errors, err) + } + + for idx, item := range m.GetDimensions() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, MetricsViewAggregationRequestValidationError{ + field: fmt.Sprintf("Dimensions[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, MetricsViewAggregationRequestValidationError{ + field: fmt.Sprintf("Dimensions[%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 MetricsViewAggregationRequestValidationError{ + field: fmt.Sprintf("Dimensions[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + for idx, item := range m.GetMeasures() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, MetricsViewAggregationRequestValidationError{ + field: fmt.Sprintf("Measures[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, MetricsViewAggregationRequestValidationError{ + field: fmt.Sprintf("Measures[%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 MetricsViewAggregationRequestValidationError{ + field: fmt.Sprintf("Measures[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + for idx, item := range m.GetSort() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, MetricsViewAggregationRequestValidationError{ + field: fmt.Sprintf("Sort[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, MetricsViewAggregationRequestValidationError{ + field: fmt.Sprintf("Sort[%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 MetricsViewAggregationRequestValidationError{ + field: fmt.Sprintf("Sort[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + if all { + switch v := interface{}(m.GetTimeStart()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, MetricsViewAggregationRequestValidationError{ + field: "TimeStart", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, MetricsViewAggregationRequestValidationError{ + field: "TimeStart", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetTimeStart()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return MetricsViewAggregationRequestValidationError{ + field: "TimeStart", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if all { + switch v := interface{}(m.GetTimeEnd()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, MetricsViewAggregationRequestValidationError{ + field: "TimeEnd", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, MetricsViewAggregationRequestValidationError{ + field: "TimeEnd", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetTimeEnd()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return MetricsViewAggregationRequestValidationError{ + field: "TimeEnd", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if all { + switch v := interface{}(m.GetFilter()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, MetricsViewAggregationRequestValidationError{ + field: "Filter", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, MetricsViewAggregationRequestValidationError{ + field: "Filter", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetFilter()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return MetricsViewAggregationRequestValidationError{ + field: "Filter", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if m.GetLimit() < 0 { + err := MetricsViewAggregationRequestValidationError{ + field: "Limit", + reason: "value must be greater than or equal to 0", + } + if !all { + return err + } + errors = append(errors, err) + } + + if m.GetOffset() < 0 { + err := MetricsViewAggregationRequestValidationError{ + field: "Offset", + reason: "value must be greater than or equal to 0", + } + if !all { + return err + } + errors = append(errors, err) + } + + // no validation rules for Priority + + if len(errors) > 0 { + return MetricsViewAggregationRequestMultiError(errors) + } + + return nil +} + +// MetricsViewAggregationRequestMultiError is an error wrapping multiple +// validation errors returned by MetricsViewAggregationRequest.ValidateAll() +// if the designated constraints aren't met. +type MetricsViewAggregationRequestMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m MetricsViewAggregationRequestMultiError) 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 MetricsViewAggregationRequestMultiError) AllErrors() []error { return m } + +// MetricsViewAggregationRequestValidationError is the validation error +// returned by MetricsViewAggregationRequest.Validate if the designated +// constraints aren't met. +type MetricsViewAggregationRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e MetricsViewAggregationRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e MetricsViewAggregationRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e MetricsViewAggregationRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e MetricsViewAggregationRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e MetricsViewAggregationRequestValidationError) ErrorName() string { + return "MetricsViewAggregationRequestValidationError" +} + +// Error satisfies the builtin error interface +func (e MetricsViewAggregationRequestValidationError) 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 %sMetricsViewAggregationRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = MetricsViewAggregationRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = MetricsViewAggregationRequestValidationError{} + +// Validate checks the field values on MetricsViewAggregationResponse 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 *MetricsViewAggregationResponse) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on MetricsViewAggregationResponse 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 +// MetricsViewAggregationResponseMultiError, or nil if none found. +func (m *MetricsViewAggregationResponse) ValidateAll() error { + return m.validate(true) +} + +func (m *MetricsViewAggregationResponse) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if all { + switch v := interface{}(m.GetSchema()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, MetricsViewAggregationResponseValidationError{ + field: "Schema", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, MetricsViewAggregationResponseValidationError{ + field: "Schema", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetSchema()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return MetricsViewAggregationResponseValidationError{ + field: "Schema", + reason: "embedded message failed validation", + cause: err, + } + } + } + + for idx, item := range m.GetData() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, MetricsViewAggregationResponseValidationError{ + field: fmt.Sprintf("Data[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, MetricsViewAggregationResponseValidationError{ + field: fmt.Sprintf("Data[%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 MetricsViewAggregationResponseValidationError{ + field: fmt.Sprintf("Data[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + if len(errors) > 0 { + return MetricsViewAggregationResponseMultiError(errors) + } + + return nil +} + +// MetricsViewAggregationResponseMultiError is an error wrapping multiple +// validation errors returned by MetricsViewAggregationResponse.ValidateAll() +// if the designated constraints aren't met. +type MetricsViewAggregationResponseMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m MetricsViewAggregationResponseMultiError) 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 MetricsViewAggregationResponseMultiError) AllErrors() []error { return m } + +// MetricsViewAggregationResponseValidationError is the validation error +// returned by MetricsViewAggregationResponse.Validate if the designated +// constraints aren't met. +type MetricsViewAggregationResponseValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e MetricsViewAggregationResponseValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e MetricsViewAggregationResponseValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e MetricsViewAggregationResponseValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e MetricsViewAggregationResponseValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e MetricsViewAggregationResponseValidationError) ErrorName() string { + return "MetricsViewAggregationResponseValidationError" +} + +// Error satisfies the builtin error interface +func (e MetricsViewAggregationResponseValidationError) 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 %sMetricsViewAggregationResponse.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = MetricsViewAggregationResponseValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = MetricsViewAggregationResponseValidationError{} + +// Validate checks the field values on MetricsViewAggregationDimension 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 *MetricsViewAggregationDimension) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on MetricsViewAggregationDimension 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 +// MetricsViewAggregationDimensionMultiError, or nil if none found. +func (m *MetricsViewAggregationDimension) ValidateAll() error { + return m.validate(true) +} + +func (m *MetricsViewAggregationDimension) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Name + + // no validation rules for TimeGrain + + // no validation rules for TimeZone + + if len(errors) > 0 { + return MetricsViewAggregationDimensionMultiError(errors) + } + + return nil +} + +// MetricsViewAggregationDimensionMultiError is an error wrapping multiple +// validation errors returned by MetricsViewAggregationDimension.ValidateAll() +// if the designated constraints aren't met. +type MetricsViewAggregationDimensionMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m MetricsViewAggregationDimensionMultiError) 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 MetricsViewAggregationDimensionMultiError) AllErrors() []error { return m } + +// MetricsViewAggregationDimensionValidationError is the validation error +// returned by MetricsViewAggregationDimension.Validate if the designated +// constraints aren't met. +type MetricsViewAggregationDimensionValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e MetricsViewAggregationDimensionValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e MetricsViewAggregationDimensionValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e MetricsViewAggregationDimensionValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e MetricsViewAggregationDimensionValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e MetricsViewAggregationDimensionValidationError) ErrorName() string { + return "MetricsViewAggregationDimensionValidationError" +} + +// Error satisfies the builtin error interface +func (e MetricsViewAggregationDimensionValidationError) 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 %sMetricsViewAggregationDimension.%s: %s%s", + key, + e.field, + e.reason, + cause) +} - case *ExportRequest_MetricsViewRowsRequest: - if v == nil { - err := ExportRequestValidationError{ - field: "Request", - reason: "oneof value cannot be a typed-nil", - } - if !all { - return err - } - errors = append(errors, err) - } +var _ error = MetricsViewAggregationDimensionValidationError{} - if all { - switch v := interface{}(m.GetMetricsViewRowsRequest()).(type) { - case interface{ ValidateAll() error }: - if err := v.ValidateAll(); err != nil { - errors = append(errors, ExportRequestValidationError{ - field: "MetricsViewRowsRequest", - reason: "embedded message failed validation", - cause: err, - }) - } - case interface{ Validate() error }: - if err := v.Validate(); err != nil { - errors = append(errors, ExportRequestValidationError{ - field: "MetricsViewRowsRequest", - reason: "embedded message failed validation", - cause: err, - }) - } - } - } else if v, ok := interface{}(m.GetMetricsViewRowsRequest()).(interface{ Validate() error }); ok { - if err := v.Validate(); err != nil { - return ExportRequestValidationError{ - field: "MetricsViewRowsRequest", - reason: "embedded message failed validation", - cause: err, - } - } - } +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = MetricsViewAggregationDimensionValidationError{} - case *ExportRequest_MetricsViewTimeSeriesRequest: - if v == nil { - err := ExportRequestValidationError{ - field: "Request", - reason: "oneof value cannot be a typed-nil", - } - if !all { - return err - } - errors = append(errors, err) - } +// Validate checks the field values on MetricsViewAggregationMeasure 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 *MetricsViewAggregationMeasure) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on MetricsViewAggregationMeasure 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 +// MetricsViewAggregationMeasureMultiError, or nil if none found. +func (m *MetricsViewAggregationMeasure) ValidateAll() error { + return m.validate(true) +} + +func (m *MetricsViewAggregationMeasure) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Name + + // no validation rules for BuiltinMeasure + + for idx, item := range m.GetBuiltinMeasureArgs() { + _, _ = idx, item if all { - switch v := interface{}(m.GetMetricsViewTimeSeriesRequest()).(type) { + switch v := interface{}(item).(type) { case interface{ ValidateAll() error }: if err := v.ValidateAll(); err != nil { - errors = append(errors, ExportRequestValidationError{ - field: "MetricsViewTimeSeriesRequest", + errors = append(errors, MetricsViewAggregationMeasureValidationError{ + field: fmt.Sprintf("BuiltinMeasureArgs[%v]", idx), reason: "embedded message failed validation", cause: err, }) } case interface{ Validate() error }: if err := v.Validate(); err != nil { - errors = append(errors, ExportRequestValidationError{ - field: "MetricsViewTimeSeriesRequest", + errors = append(errors, MetricsViewAggregationMeasureValidationError{ + field: fmt.Sprintf("BuiltinMeasureArgs[%v]", idx), reason: "embedded message failed validation", cause: err, }) } } - } else if v, ok := interface{}(m.GetMetricsViewTimeSeriesRequest()).(interface{ Validate() error }); ok { + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { if err := v.Validate(); err != nil { - return ExportRequestValidationError{ - field: "MetricsViewTimeSeriesRequest", + return MetricsViewAggregationMeasureValidationError{ + field: fmt.Sprintf("BuiltinMeasureArgs[%v]", idx), reason: "embedded message failed validation", cause: err, } } } - default: - _ = v // ensures v is used - } - - if m.Limit != nil { - // no validation rules for Limit } if len(errors) > 0 { - return ExportRequestMultiError(errors) + return MetricsViewAggregationMeasureMultiError(errors) } return nil } -// ExportRequestMultiError is an error wrapping multiple validation errors -// returned by ExportRequest.ValidateAll() if the designated constraints -// aren't met. -type ExportRequestMultiError []error +// MetricsViewAggregationMeasureMultiError is an error wrapping multiple +// validation errors returned by MetricsViewAggregationMeasure.ValidateAll() +// if the designated constraints aren't met. +type MetricsViewAggregationMeasureMultiError []error // Error returns a concatenation of all the error messages it wraps. -func (m ExportRequestMultiError) Error() string { +func (m MetricsViewAggregationMeasureMultiError) Error() string { var msgs []string for _, err := range m { msgs = append(msgs, err.Error()) @@ -541,11 +1426,12 @@ func (m ExportRequestMultiError) Error() string { } // AllErrors returns a list of validation violation errors. -func (m ExportRequestMultiError) AllErrors() []error { return m } +func (m MetricsViewAggregationMeasureMultiError) AllErrors() []error { return m } -// ExportRequestValidationError is the validation error returned by -// ExportRequest.Validate if the designated constraints aren't met. -type ExportRequestValidationError struct { +// MetricsViewAggregationMeasureValidationError is the validation error +// returned by MetricsViewAggregationMeasure.Validate if the designated +// constraints aren't met. +type MetricsViewAggregationMeasureValidationError struct { field string reason string cause error @@ -553,22 +1439,24 @@ type ExportRequestValidationError struct { } // Field function returns field value. -func (e ExportRequestValidationError) Field() string { return e.field } +func (e MetricsViewAggregationMeasureValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e ExportRequestValidationError) Reason() string { return e.reason } +func (e MetricsViewAggregationMeasureValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e ExportRequestValidationError) Cause() error { return e.cause } +func (e MetricsViewAggregationMeasureValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e ExportRequestValidationError) Key() bool { return e.key } +func (e MetricsViewAggregationMeasureValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e ExportRequestValidationError) ErrorName() string { return "ExportRequestValidationError" } +func (e MetricsViewAggregationMeasureValidationError) ErrorName() string { + return "MetricsViewAggregationMeasureValidationError" +} // Error satisfies the builtin error interface -func (e ExportRequestValidationError) Error() string { +func (e MetricsViewAggregationMeasureValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -580,14 +1468,14 @@ func (e ExportRequestValidationError) Error() string { } return fmt.Sprintf( - "invalid %sExportRequest.%s: %s%s", + "invalid %sMetricsViewAggregationMeasure.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = ExportRequestValidationError{} +var _ error = MetricsViewAggregationMeasureValidationError{} var _ interface { Field() string @@ -595,46 +1483,48 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = ExportRequestValidationError{} +} = MetricsViewAggregationMeasureValidationError{} -// Validate checks the field values on ExportResponse 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 *ExportResponse) Validate() error { +// Validate checks the field values on MetricsViewAggregationSort 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 *MetricsViewAggregationSort) Validate() error { return m.validate(false) } -// ValidateAll checks the field values on ExportResponse 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 ExportResponseMultiError, -// or nil if none found. -func (m *ExportResponse) ValidateAll() error { +// ValidateAll checks the field values on MetricsViewAggregationSort 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 +// MetricsViewAggregationSortMultiError, or nil if none found. +func (m *MetricsViewAggregationSort) ValidateAll() error { return m.validate(true) } -func (m *ExportResponse) validate(all bool) error { +func (m *MetricsViewAggregationSort) validate(all bool) error { if m == nil { return nil } var errors []error - // no validation rules for DownloadUrlPath + // no validation rules for Name + + // no validation rules for Desc if len(errors) > 0 { - return ExportResponseMultiError(errors) + return MetricsViewAggregationSortMultiError(errors) } return nil } -// ExportResponseMultiError is an error wrapping multiple validation errors -// returned by ExportResponse.ValidateAll() if the designated constraints -// aren't met. -type ExportResponseMultiError []error +// MetricsViewAggregationSortMultiError is an error wrapping multiple +// validation errors returned by MetricsViewAggregationSort.ValidateAll() if +// the designated constraints aren't met. +type MetricsViewAggregationSortMultiError []error // Error returns a concatenation of all the error messages it wraps. -func (m ExportResponseMultiError) Error() string { +func (m MetricsViewAggregationSortMultiError) Error() string { var msgs []string for _, err := range m { msgs = append(msgs, err.Error()) @@ -643,11 +1533,11 @@ func (m ExportResponseMultiError) Error() string { } // AllErrors returns a list of validation violation errors. -func (m ExportResponseMultiError) AllErrors() []error { return m } +func (m MetricsViewAggregationSortMultiError) AllErrors() []error { return m } -// ExportResponseValidationError is the validation error returned by -// ExportResponse.Validate if the designated constraints aren't met. -type ExportResponseValidationError struct { +// MetricsViewAggregationSortValidationError is the validation error returned +// by MetricsViewAggregationSort.Validate if the designated constraints aren't met. +type MetricsViewAggregationSortValidationError struct { field string reason string cause error @@ -655,22 +1545,24 @@ type ExportResponseValidationError struct { } // Field function returns field value. -func (e ExportResponseValidationError) Field() string { return e.field } +func (e MetricsViewAggregationSortValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e ExportResponseValidationError) Reason() string { return e.reason } +func (e MetricsViewAggregationSortValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e ExportResponseValidationError) Cause() error { return e.cause } +func (e MetricsViewAggregationSortValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e ExportResponseValidationError) Key() bool { return e.key } +func (e MetricsViewAggregationSortValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e ExportResponseValidationError) ErrorName() string { return "ExportResponseValidationError" } +func (e MetricsViewAggregationSortValidationError) ErrorName() string { + return "MetricsViewAggregationSortValidationError" +} // Error satisfies the builtin error interface -func (e ExportResponseValidationError) Error() string { +func (e MetricsViewAggregationSortValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -682,14 +1574,14 @@ func (e ExportResponseValidationError) Error() string { } return fmt.Sprintf( - "invalid %sExportResponse.%s: %s%s", + "invalid %sMetricsViewAggregationSort.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = ExportResponseValidationError{} +var _ error = MetricsViewAggregationSortValidationError{} var _ interface { Field() string @@ -697,7 +1589,7 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = ExportResponseValidationError{} +} = MetricsViewAggregationSortValidationError{} // Validate checks the field values on MetricsViewToplistRequest with the rules // defined in the proto definition for this message. If any rules are @@ -9460,6 +10352,47 @@ func (m *QueryBatchEntry) validate(all bool) error { // no validation rules for Key switch v := m.Query.(type) { + case *QueryBatchEntry_MetricsViewAggregationRequest: + if v == nil { + err := QueryBatchEntryValidationError{ + field: "Query", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetMetricsViewAggregationRequest()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, QueryBatchEntryValidationError{ + field: "MetricsViewAggregationRequest", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, QueryBatchEntryValidationError{ + field: "MetricsViewAggregationRequest", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetMetricsViewAggregationRequest()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return QueryBatchEntryValidationError{ + field: "MetricsViewAggregationRequest", + reason: "embedded message failed validation", + cause: err, + } + } + } + case *QueryBatchEntry_MetricsViewToplistRequest: if v == nil { err := QueryBatchEntryValidationError{ @@ -10445,6 +11378,47 @@ func (m *QueryBatchResponse) validate(all bool) error { // no validation rules for Error switch v := m.Result.(type) { + case *QueryBatchResponse_MetricsViewAggregationResponse: + if v == nil { + err := QueryBatchResponseValidationError{ + field: "Result", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetMetricsViewAggregationResponse()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, QueryBatchResponseValidationError{ + field: "MetricsViewAggregationResponse", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, QueryBatchResponseValidationError{ + field: "MetricsViewAggregationResponse", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetMetricsViewAggregationResponse()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return QueryBatchResponseValidationError{ + field: "MetricsViewAggregationResponse", + reason: "embedded message failed validation", + cause: err, + } + } + } + case *QueryBatchResponse_MetricsViewToplistResponse: if v == nil { err := QueryBatchResponseValidationError{ diff --git a/proto/gen/rill/runtime/v1/queries_grpc.pb.go b/proto/gen/rill/runtime/v1/queries_grpc.pb.go index 3a3f1f8c63e..c5523eb2899 100644 --- a/proto/gen/rill/runtime/v1/queries_grpc.pb.go +++ b/proto/gen/rill/runtime/v1/queries_grpc.pb.go @@ -21,6 +21,7 @@ const _ = grpc.SupportPackageIsVersion7 const ( QueryService_Query_FullMethodName = "/rill.runtime.v1.QueryService/Query" QueryService_Export_FullMethodName = "/rill.runtime.v1.QueryService/Export" + QueryService_MetricsViewAggregation_FullMethodName = "/rill.runtime.v1.QueryService/MetricsViewAggregation" QueryService_MetricsViewToplist_FullMethodName = "/rill.runtime.v1.QueryService/MetricsViewToplist" QueryService_MetricsViewComparisonToplist_FullMethodName = "/rill.runtime.v1.QueryService/MetricsViewComparisonToplist" QueryService_MetricsViewTimeSeries_FullMethodName = "/rill.runtime.v1.QueryService/MetricsViewTimeSeries" @@ -51,6 +52,8 @@ type QueryServiceClient interface { Query(ctx context.Context, in *QueryRequest, opts ...grpc.CallOption) (*QueryResponse, error) // Export builds a URL to download the results of a query as a file. Export(ctx context.Context, in *ExportRequest, opts ...grpc.CallOption) (*ExportResponse, error) + // MetricsViewAggregation is a generic API for running group-by queries against a metrics view. + MetricsViewAggregation(ctx context.Context, in *MetricsViewAggregationRequest, opts ...grpc.CallOption) (*MetricsViewAggregationResponse, error) // MetricsViewToplist returns the top dimension values of a metrics view sorted by one or more measures. // It's a convenience API for querying a metrics view. MetricsViewToplist(ctx context.Context, in *MetricsViewToplistRequest, opts ...grpc.CallOption) (*MetricsViewToplistResponse, error) @@ -122,6 +125,15 @@ func (c *queryServiceClient) Export(ctx context.Context, in *ExportRequest, opts return out, nil } +func (c *queryServiceClient) MetricsViewAggregation(ctx context.Context, in *MetricsViewAggregationRequest, opts ...grpc.CallOption) (*MetricsViewAggregationResponse, error) { + out := new(MetricsViewAggregationResponse) + err := c.cc.Invoke(ctx, QueryService_MetricsViewAggregation_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *queryServiceClient) MetricsViewToplist(ctx context.Context, in *MetricsViewToplistRequest, opts ...grpc.CallOption) (*MetricsViewToplistResponse, error) { out := new(MetricsViewToplistResponse) err := c.cc.Invoke(ctx, QueryService_MetricsViewToplist_FullMethodName, in, out, opts...) @@ -333,6 +345,8 @@ type QueryServiceServer interface { Query(context.Context, *QueryRequest) (*QueryResponse, error) // Export builds a URL to download the results of a query as a file. Export(context.Context, *ExportRequest) (*ExportResponse, error) + // MetricsViewAggregation is a generic API for running group-by queries against a metrics view. + MetricsViewAggregation(context.Context, *MetricsViewAggregationRequest) (*MetricsViewAggregationResponse, error) // MetricsViewToplist returns the top dimension values of a metrics view sorted by one or more measures. // It's a convenience API for querying a metrics view. MetricsViewToplist(context.Context, *MetricsViewToplistRequest) (*MetricsViewToplistResponse, error) @@ -389,6 +403,9 @@ func (UnimplementedQueryServiceServer) Query(context.Context, *QueryRequest) (*Q func (UnimplementedQueryServiceServer) Export(context.Context, *ExportRequest) (*ExportResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Export not implemented") } +func (UnimplementedQueryServiceServer) MetricsViewAggregation(context.Context, *MetricsViewAggregationRequest) (*MetricsViewAggregationResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method MetricsViewAggregation not implemented") +} func (UnimplementedQueryServiceServer) MetricsViewToplist(context.Context, *MetricsViewToplistRequest) (*MetricsViewToplistResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method MetricsViewToplist not implemented") } @@ -498,6 +515,24 @@ func _QueryService_Export_Handler(srv interface{}, ctx context.Context, dec func return interceptor(ctx, in, info, handler) } +func _QueryService_MetricsViewAggregation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MetricsViewAggregationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServiceServer).MetricsViewAggregation(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: QueryService_MetricsViewAggregation_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServiceServer).MetricsViewAggregation(ctx, req.(*MetricsViewAggregationRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _QueryService_MetricsViewToplist_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(MetricsViewToplistRequest) if err := dec(in); err != nil { @@ -876,6 +911,10 @@ var QueryService_ServiceDesc = grpc.ServiceDesc{ MethodName: "Export", Handler: _QueryService_Export_Handler, }, + { + MethodName: "MetricsViewAggregation", + Handler: _QueryService_MetricsViewAggregation_Handler, + }, { MethodName: "MetricsViewToplist", Handler: _QueryService_MetricsViewToplist_Handler, diff --git a/proto/gen/rill/runtime/v1/runtime.swagger.yaml b/proto/gen/rill/runtime/v1/runtime.swagger.yaml index 836bf227453..f517b26e096 100644 --- a/proto/gen/rill/runtime/v1/runtime.swagger.yaml +++ b/proto/gen/rill/runtime/v1/runtime.swagger.yaml @@ -98,6 +98,29 @@ paths: $ref: '#/definitions/rpcStatus' tags: - RuntimeService + /v1/connectors/scan: + get: + summary: |- + ScanConnectors scans the artifacts for connectors and returns information about + the connectors referenced in the artifacts. The information includes name,type and + credentials for the connector. + operationId: ConnectorService_ScanConnectors + responses: + "200": + description: A successful response. + schema: + $ref: '#/definitions/v1ScanConnectorsResponse' + default: + description: An unexpected error response. + schema: + $ref: '#/definitions/rpcStatus' + parameters: + - name: instanceId + in: query + required: false + type: string + tags: + - ConnectorService /v1/delete-and-reconcile: post: summary: DeleteFileAndReconcile combines RenameFile and Reconcile in a single endpoint to reduce latency. @@ -980,6 +1003,8 @@ paths: format: int64 format: $ref: '#/definitions/v1ExportFormat' + metricsViewAggregationRequest: + $ref: '#/definitions/v1MetricsViewAggregationRequest' metricsViewToplistRequest: $ref: '#/definitions/v1MetricsViewToplistRequest' metricsViewRowsRequest: @@ -989,6 +1014,68 @@ paths: title: Request message for QueryService.Export tags: - QueryService + /v1/instances/{instanceId}/queries/metrics-views/{metricsView}/aggregation: + post: + summary: MetricsViewAggregation is a generic API for running group-by queries against a metrics view. + operationId: QueryService_MetricsViewAggregation + responses: + "200": + description: A successful response. + schema: + $ref: '#/definitions/v1MetricsViewAggregationResponse' + default: + description: An unexpected error response. + schema: + $ref: '#/definitions/rpcStatus' + parameters: + - name: instanceId + in: path + required: true + type: string + - name: metricsView + in: path + required: true + type: string + - name: body + in: body + required: true + schema: + type: object + properties: + dimensions: + type: array + items: + type: object + $ref: '#/definitions/v1MetricsViewAggregationDimension' + measures: + type: array + items: + type: object + $ref: '#/definitions/v1MetricsViewAggregationMeasure' + sort: + type: array + items: + type: object + $ref: '#/definitions/v1MetricsViewAggregationSort' + timeStart: + type: string + format: date-time + timeEnd: + type: string + format: date-time + filter: + $ref: '#/definitions/v1MetricsViewFilter' + limit: + type: string + format: int64 + offset: + type: string + format: int64 + priority: + type: integer + format: int32 + tags: + - QueryService /v1/instances/{instanceId}/queries/metrics-views/{metricsViewName}/compare-toplist: post: operationId: QueryService_MetricsViewComparisonToplist @@ -2202,6 +2289,13 @@ paths: tags: - ConnectorService definitions: + BucketExtractPolicyStrategy: + type: string + enum: + - STRATEGY_UNSPECIFIED + - STRATEGY_HEAD + - STRATEGY_TAIL + default: STRATEGY_UNSPECIFIED ColumnTimeSeriesRequestBasicMeasure: type: object properties: @@ -2423,33 +2517,6 @@ definitions: items: type: string title: Dimension/measure level access condition - SourceExtractPolicy: - type: object - properties: - rowsStrategy: - $ref: '#/definitions/SourceExtractPolicyStrategy' - title: strategy for selecting rows in a file - rowsLimitBytes: - type: string - format: uint64 - title: |- - could in future add: uint64 rows_limit = n; - limit on data fetched in bytes - filesStrategy: - $ref: '#/definitions/SourceExtractPolicyStrategy' - title: strategy for selecting files - filesLimit: - type: string - format: uint64 - title: limit on number of files - title: Extract policy for glob connectors - SourceExtractPolicyStrategy: - type: string - enum: - - STRATEGY_UNSPECIFIED - - STRATEGY_HEAD - - STRATEGY_TAIL - default: STRATEGY_UNSPECIFIED StructTypeField: type: object properties: @@ -2554,22 +2621,15 @@ definitions: type: object properties: rowsStrategy: - $ref: '#/definitions/v1BucketExtractPolicyStrategy' + $ref: '#/definitions/BucketExtractPolicyStrategy' rowsLimitBytes: type: string format: uint64 filesStrategy: - $ref: '#/definitions/v1BucketExtractPolicyStrategy' + $ref: '#/definitions/BucketExtractPolicyStrategy' filesLimit: type: string format: uint64 - v1BucketExtractPolicyStrategy: - type: string - enum: - - STRATEGY_UNSPECIFIED - - STRATEGY_HEAD - - STRATEGY_TAIL - default: STRATEGY_UNSPECIFIED v1BucketPlanner: type: object properties: @@ -2587,6 +2647,13 @@ definitions: properties: region: type: string + v1BuiltinMeasure: + type: string + enum: + - BUILTIN_MEASURE_UNSPECIFIED + - BUILTIN_MEASURE_COUNT + - BUILTIN_MEASURE_COUNT_DISTINCT + default: BUILTIN_MEASURE_UNSPECIFIED v1CatalogEntry: type: object properties: @@ -3279,6 +3346,80 @@ definitions: $ref: '#/definitions/MetricsViewSecurity' title: Security for the dashboard title: Metrics view is the internal representation of a metrics view definition + v1MetricsViewAggregationDimension: + type: object + properties: + name: + type: string + timeGrain: + $ref: '#/definitions/v1TimeGrain' + timeZone: + type: string + v1MetricsViewAggregationMeasure: + type: object + properties: + name: + type: string + builtinMeasure: + $ref: '#/definitions/v1BuiltinMeasure' + builtinMeasureArgs: + type: array + items: {} + v1MetricsViewAggregationRequest: + type: object + properties: + instanceId: + type: string + metricsView: + type: string + dimensions: + type: array + items: + type: object + $ref: '#/definitions/v1MetricsViewAggregationDimension' + measures: + type: array + items: + type: object + $ref: '#/definitions/v1MetricsViewAggregationMeasure' + sort: + type: array + items: + type: object + $ref: '#/definitions/v1MetricsViewAggregationSort' + timeStart: + type: string + format: date-time + timeEnd: + type: string + format: date-time + filter: + $ref: '#/definitions/v1MetricsViewFilter' + limit: + type: string + format: int64 + offset: + type: string + format: int64 + priority: + type: integer + format: int32 + v1MetricsViewAggregationResponse: + type: object + properties: + schema: + $ref: '#/definitions/v1StructType' + data: + type: array + items: + type: object + v1MetricsViewAggregationSort: + type: object + properties: + name: + type: string + desc: + type: boolean v1MetricsViewColumn: type: object properties: @@ -3949,6 +4090,8 @@ definitions: type: integer format: int32 description: Since response could out of order `key` is used to co-relate a specific response to request. + metricsViewAggregationRequest: + $ref: '#/definitions/v1MetricsViewAggregationRequest' metricsViewToplistRequest: $ref: '#/definitions/v1MetricsViewToplistRequest' metricsViewComparisonToplistRequest: @@ -3993,6 +4136,8 @@ definitions: format: int32 error: type: string + metricsViewAggregationResponse: + $ref: '#/definitions/v1MetricsViewAggregationResponse' metricsViewToplistResponse: $ref: '#/definitions/v1MetricsViewToplistResponse' metricsViewComparisonToplistResponse: @@ -4354,6 +4499,24 @@ definitions: format: int64 isDir: type: boolean + v1ScanConnectorsResponse: + type: object + properties: + connectors: + type: array + items: + type: object + $ref: '#/definitions/v1ScannedConnector' + v1ScannedConnector: + type: object + properties: + name: + type: string + type: + type: string + hasAnonymousAccess: + type: boolean + title: reports whether access is present without any credentials v1Schedule: type: object properties: @@ -4377,9 +4540,6 @@ definitions: schema: $ref: '#/definitions/v1StructType' title: Detected schema of the source - policy: - $ref: '#/definitions/SourceExtractPolicy' - title: extraction policy for the source timeoutSeconds: type: integer format: int32 diff --git a/proto/rill/admin/v1/api.proto b/proto/rill/admin/v1/api.proto index 597b55afc73..6aa4b934161 100644 --- a/proto/rill/admin/v1/api.proto +++ b/proto/rill/admin/v1/api.proto @@ -3,6 +3,7 @@ package rill.admin.v1; import "google/api/annotations.proto"; import "google/protobuf/timestamp.proto"; +import "google/protobuf/struct.proto"; import "validate/validate.proto"; service AdminService { @@ -240,11 +241,24 @@ service AdminService { option (google.api.http) = {get: "/v1/users/search"}; } + // SearchProjectUsers returns users who has access to to a project (including org members that have access through a usergroup) + rpc SearchProjectUsers(SearchProjectUsersRequest) returns (SearchProjectUsersResponse) { + option (google.api.http) = {get: "/v1/organizations/{organization}/projects/{project}/users/search"}; + } + // ListSuperusers lists all the superusers rpc ListSuperusers(ListSuperusersRequest) returns (ListSuperusersResponse) { option (google.api.http) = {get: "/v1/superuser/members"}; } + // GetDeploymentCredentials returns runtime info and JWT on behalf of a specific user, or alternatively for a raw set of JWT attributes + rpc GetDeploymentCredentials(GetDeploymentCredentialsRequest) returns (GetDeploymentCredentialsResponse) { + option (google.api.http) = { + post: "/v1/organizations/{organization}/projects/{project}/credentials", + body: "*" + }; + } + // SetSuperuser adds/remove a superuser rpc SetSuperuser(SetSuperuserRequest) returns (SetSuperuserResponse) { option (google.api.http) = { @@ -443,6 +457,34 @@ message GetProjectVariablesResponse { map variables = 1; } +message SearchProjectUsersRequest { + string organization = 1; + string project = 2; + string email_query = 3; + uint32 page_size = 4 [(validate.rules).uint32 = {ignore_empty: true, lte: 1000}]; + string page_token = 5; +} + +message SearchProjectUsersResponse { + repeated User users = 1; + string next_page_token = 2; +} + +message GetDeploymentCredentialsRequest { + string organization = 1; + string project = 2; + string branch = 3; + oneof for { + string user_id = 4; + google.protobuf.Struct attrs = 5; + } +} + +message GetDeploymentCredentialsResponse { + string runtime_host = 1; + string runtime_instance_id = 2; + string jwt = 3; +} message ListServicesRequest { string organization_name = 1 [(validate.rules).string.min_len = 1]; diff --git a/proto/rill/runtime/v1/catalog.proto b/proto/rill/runtime/v1/catalog.proto index edc71d64944..963240dd067 100644 --- a/proto/rill/runtime/v1/catalog.proto +++ b/proto/rill/runtime/v1/catalog.proto @@ -37,25 +37,6 @@ message Source { google.protobuf.Struct properties = 3; // Detected schema of the source StructType schema = 5; - // Extract policy for glob connectors - message ExtractPolicy { - enum Strategy { - STRATEGY_UNSPECIFIED = 0; - STRATEGY_HEAD = 1; - STRATEGY_TAIL = 2; - } - // strategy for selecting rows in a file - Strategy rows_strategy = 1; - // could in future add: uint64 rows_limit = n; - // limit on data fetched in bytes - uint64 rows_limit_bytes = 2; - // strategy for selecting files - Strategy files_strategy = 3; - // limit on number of files - uint64 files_limit = 4; - } - // extraction policy for the source - ExtractPolicy policy = 6; // timeout for source ingestion in seconds int32 timeout_seconds = 7; } diff --git a/proto/rill/runtime/v1/connectors.proto b/proto/rill/runtime/v1/connectors.proto index 2526875890f..b778776868b 100644 --- a/proto/rill/runtime/v1/connectors.proto +++ b/proto/rill/runtime/v1/connectors.proto @@ -6,6 +6,13 @@ import "google/protobuf/timestamp.proto"; import "validate/validate.proto"; service ConnectorService { + // ScanConnectors scans the artifacts for connectors and returns information about + // the connectors referenced in the artifacts. The information includes name,type and + // credentials for the connector. + rpc ScanConnectors(ScanConnectorsRequest) returns (ScanConnectorsResponse) { + option (google.api.http) = {get: "/v1/connectors/scan"}; + } + // S3ListBuckets lists buckets accessible with the configured credentials. rpc S3ListBuckets(S3ListBucketsRequest) returns (S3ListBucketsResponse) { option (google.api.http) = {get: "/v1/s3/buckets"}; @@ -197,3 +204,17 @@ message BigQueryListTablesResponse { string next_page_token = 1; repeated string names = 2; } + +message ScanConnectorsRequest { + string instance_id = 1; +} + +message ScanConnectorsResponse { + repeated ScannedConnector connectors = 1; +} + +message ScannedConnector { + string name = 1; + string type = 2; + bool has_anonymous_access = 3; // reports whether access is present without any credentials +} \ No newline at end of file diff --git a/proto/rill/runtime/v1/queries.proto b/proto/rill/runtime/v1/queries.proto index 8bb00236d29..2c78729cc04 100644 --- a/proto/rill/runtime/v1/queries.proto +++ b/proto/rill/runtime/v1/queries.proto @@ -27,6 +27,14 @@ service QueryService { // Explore APIs + // MetricsViewAggregation is a generic API for running group-by queries against a metrics view. + rpc MetricsViewAggregation(MetricsViewAggregationRequest) returns (MetricsViewAggregationResponse) { + option (google.api.http) = { + post: "/v1/instances/{instance_id}/queries/metrics-views/{metrics_view}/aggregation", + body: "*" + }; + } + // MetricsViewToplist returns the top dimension values of a metrics view sorted by one or more measures. // It's a convenience API for querying a metrics view. rpc MetricsViewToplist(MetricsViewToplistRequest) returns (MetricsViewToplistResponse) { @@ -197,6 +205,7 @@ message ExportRequest { optional int64 limit = 2; ExportFormat format = 3; oneof request { + MetricsViewAggregationRequest metrics_view_aggregation_request = 7; MetricsViewToplistRequest metrics_view_toplist_request = 4; MetricsViewRowsRequest metrics_view_rows_request = 5; MetricsViewTimeSeriesRequest metrics_view_time_series_request = 6; @@ -220,6 +229,48 @@ enum ExportFormat { // Explore APIs // ********** +message MetricsViewAggregationRequest { + string instance_id = 1; + string metrics_view = 2 [(validate.rules).string.min_len = 1]; + repeated MetricsViewAggregationDimension dimensions = 3; + repeated MetricsViewAggregationMeasure measures = 4; + repeated MetricsViewAggregationSort sort = 5; + google.protobuf.Timestamp time_start = 6; + google.protobuf.Timestamp time_end = 7; + MetricsViewFilter filter = 8; + int64 limit = 9 [(validate.rules).int64.gte = 0]; + int64 offset = 10 [(validate.rules).int64.gte = 0]; + int32 priority = 11; +} + +message MetricsViewAggregationResponse { + StructType schema = 1; + repeated google.protobuf.Struct data = 2; +} + +message MetricsViewAggregationDimension { + string name = 1; + TimeGrain time_grain = 2; + string time_zone = 3; +} + +message MetricsViewAggregationMeasure { + string name = 1; + BuiltinMeasure builtin_measure = 2; + repeated google.protobuf.Value builtin_measure_args = 3; +} + +enum BuiltinMeasure { + BUILTIN_MEASURE_UNSPECIFIED = 0; + BUILTIN_MEASURE_COUNT = 1; + BUILTIN_MEASURE_COUNT_DISTINCT = 2; +} + +message MetricsViewAggregationSort { + string name = 1; + bool desc = 2; +} + // Request message for QueryService.MetricsViewToplist message MetricsViewToplistRequest { string instance_id = 1; @@ -675,6 +726,7 @@ message QueryBatchEntry { // Since response could out of order `key` is used to co-relate a specific response to request. int32 key = 1; oneof query { + MetricsViewAggregationRequest metrics_view_aggregation_request = 20; MetricsViewToplistRequest metrics_view_toplist_request = 2; MetricsViewComparisonToplistRequest metrics_view_comparison_toplist_request = 3; MetricsViewTimeSeriesRequest metrics_view_time_series_request = 4; @@ -705,6 +757,7 @@ message QueryBatchResponse { int32 key = 1; string error = 2; oneof result { + MetricsViewAggregationResponse metrics_view_aggregation_response = 21; MetricsViewToplistResponse metrics_view_toplist_response = 3; MetricsViewComparisonToplistResponse metrics_view_comparison_toplist_response = 4; MetricsViewTimeSeriesResponse metrics_view_time_series_response = 5; diff --git a/runtime/catalog.go b/runtime/catalog.go index 5ab4dccf079..b649b75ccd3 100644 --- a/runtime/catalog.go +++ b/runtime/catalog.go @@ -30,9 +30,6 @@ func (r *Runtime) GetCatalogEntry(ctx context.Context, instanceID, name string) e, err := cat.FindEntry(ctx, name) if err != nil { - if errors.Is(err, drivers.ErrNotFound) { - return nil, fmt.Errorf("entry not found") - } return nil, err } diff --git a/runtime/catalog_cache.go b/runtime/catalog_cache.go index 6e22cf5d16e..da296b17891 100644 --- a/runtime/catalog_cache.go +++ b/runtime/catalog_cache.go @@ -91,7 +91,7 @@ func (c *catalogCache) close(ctx context.Context) error { // Unlike other catalog functions, it is safe to call flush concurrently with calls to get and list (i.e. under a read lock). func (c *catalogCache) flush(ctx context.Context) error { for s, n := range c.dirty { - r, err := c.get(n, true) + r, err := c.get(n, true, false) if err != nil { if !errors.Is(err, drivers.ErrResourceNotFound) { return fmt.Errorf("flush: unexpected error from get: %w", err) @@ -135,19 +135,45 @@ func (c *catalogCache) checkLeader(ctx context.Context) error { return nil } +// get returns a resource from the catalog. +// Unlike other catalog functions, it is safe to call get concurrently with calls to list and flush (i.e. under a read lock). +func (c *catalogCache) get(n *runtimev1.ResourceName, withDeleted, clone bool) (*runtimev1.Resource, error) { + rs := c.resources[n.Kind] + if rs == nil { + return nil, drivers.ErrResourceNotFound + } + r, ok := rs[strings.ToLower(n.Name)] + if !ok { + return nil, drivers.ErrResourceNotFound + } + if r.Meta.DeletedOn != nil && !withDeleted { + return nil, drivers.ErrResourceNotFound + } + if clone { + return c.clone(r), nil + } + return r, nil +} + // list returns a list of resources in the catalog. // Unlike other catalog functions, it is safe to call list concurrently with calls to get and flush (i.e. under a read lock). -func (c *catalogCache) list(kind string, withDeleted bool) ([]*runtimev1.Resource, error) { +func (c *catalogCache) list(kind string, withDeleted, clone bool) ([]*runtimev1.Resource, error) { if kind != "" { n := len(c.resources[kind]) res := make([]*runtimev1.Resource, 0, n) if withDeleted { for _, r := range c.resources[kind] { + if clone { + r = c.clone(r) + } res = append(res, r) } } else { for _, r := range c.resources[kind] { if r.Meta.DeletedOn == nil { + if clone { + r = c.clone(r) + } res = append(res, r) } } @@ -165,6 +191,9 @@ func (c *catalogCache) list(kind string, withDeleted bool) ([]*runtimev1.Resourc if withDeleted { for _, rs := range c.resources { for _, r := range rs { + if clone { + r = c.clone(r) + } res = append(res, r) } } @@ -172,6 +201,9 @@ func (c *catalogCache) list(kind string, withDeleted bool) ([]*runtimev1.Resourc for _, rs := range c.resources { for _, r := range rs { if r.Meta.DeletedOn == nil { + if clone { + r = c.clone(r) + } res = append(res, r) } } @@ -181,28 +213,12 @@ func (c *catalogCache) list(kind string, withDeleted bool) ([]*runtimev1.Resourc return res, nil } -// get returns a resource from the catalog. -// Unlike other catalog functions, it is safe to call get concurrently with calls to list and flush (i.e. under a read lock). -func (c *catalogCache) get(n *runtimev1.ResourceName, withDeleted bool) (*runtimev1.Resource, error) { - rs := c.resources[n.Kind] - if rs == nil { - return nil, drivers.ErrResourceNotFound - } - r, ok := rs[strings.ToLower(n.Name)] - if !ok { - return nil, drivers.ErrResourceNotFound - } - if r.Meta.DeletedOn != nil && !withDeleted { - return nil, drivers.ErrResourceNotFound - } - return r, nil -} - // create creates a resource in the catalog. // It will error if a resource with the same name already exists. // If a soft-deleted resource exists with the same name, it will be overwritten (no longer deleted). +// The passed resource should only have its spec populated. The meta and state fields will be populated by this function. func (c *catalogCache) create(name *runtimev1.ResourceName, refs []*runtimev1.ResourceName, owner *runtimev1.ResourceName, paths []string, r *runtimev1.Resource) error { - existing, _ := c.get(name, true) + existing, _ := c.get(name, true, false) if existing != nil { if existing.Meta.DeletedOn == nil { return drivers.ErrResourceAlreadyExists @@ -222,6 +238,10 @@ func (c *catalogCache) create(name *runtimev1.ResourceName, refs []*runtimev1.Re r.Meta.Version = existing.Meta.Version + 1 r.Meta.SpecVersion = existing.Meta.SpecVersion + 1 } + err := c.ctrl.reconciler(name.Kind).ResetState(r) + if err != nil { + return err + } c.link(r) c.dirty[nameStr(r.Meta.Name)] = r.Meta.Name c.addEvent(name, r, runtimev1.ResourceEvent_RESOURCE_EVENT_WRITE) @@ -230,7 +250,7 @@ func (c *catalogCache) create(name *runtimev1.ResourceName, refs []*runtimev1.Re // rename renames a resource in the catalog and sets the r.Meta.RenamedFrom field. func (c *catalogCache) rename(name, newName *runtimev1.ResourceName) error { - r, err := c.get(name, false) + r, err := c.get(name, false, false) if err != nil { return err } @@ -250,7 +270,7 @@ func (c *catalogCache) rename(name, newName *runtimev1.ResourceName) error { // clearRenamedFrom clears the r.Meta.RenamedFrom field without bumping version numbers. func (c *catalogCache) clearRenamedFrom(name *runtimev1.ResourceName) error { - r, err := c.get(name, false) + r, err := c.get(name, false, false) if err != nil { return err } @@ -267,7 +287,7 @@ func (c *catalogCache) clearRenamedFrom(name *runtimev1.ResourceName) error { // updateMeta updates the meta fields of a resource. func (c *catalogCache) updateMeta(name *runtimev1.ResourceName, refs []*runtimev1.ResourceName, owner *runtimev1.ResourceName, paths []string) error { - r, err := c.get(name, false) + r, err := c.get(name, false, false) if err != nil { return err } @@ -285,13 +305,13 @@ func (c *catalogCache) updateMeta(name *runtimev1.ResourceName, refs []*runtimev } // updateSpec updates the spec field of a resource. +// It uses the spec from the passed resource and disregards its other fields. func (c *catalogCache) updateSpec(name *runtimev1.ResourceName, from *runtimev1.Resource) error { - r, err := c.get(name, false) + r, err := c.get(name, false, false) if err != nil { return err } // NOTE: No need to unlink/link because no indexed fields are edited. - err = c.ctrl.reconciler(name.Kind).AssignSpec(from, r) if err != nil { return err @@ -305,8 +325,9 @@ func (c *catalogCache) updateSpec(name *runtimev1.ResourceName, from *runtimev1. } // updateState updates the state field of a resource. +// It uses the state from the passed resource and disregards its other fields. func (c *catalogCache) updateState(name *runtimev1.ResourceName, from *runtimev1.Resource) error { - r, err := c.get(name, false) + r, err := c.get(name, false, false) if err != nil { return err } @@ -325,7 +346,7 @@ func (c *catalogCache) updateState(name *runtimev1.ResourceName, from *runtimev1 // updateError updates the reconcile_error field of a resource. func (c *catalogCache) updateError(name *runtimev1.ResourceName, reconcileErr error) error { - r, err := c.get(name, false) + r, err := c.get(name, false, false) if err != nil { return err } @@ -342,7 +363,7 @@ func (c *catalogCache) updateError(name *runtimev1.ResourceName, reconcileErr er // updateDeleted sets the deleted_on field of a resource (a soft delete). // Afterwards, the resource can still be accessed by passing withDeleted to the getters. func (c *catalogCache) updateDeleted(name *runtimev1.ResourceName) error { - r, err := c.get(name, false) + r, err := c.get(name, false, false) if err != nil { return err } @@ -360,7 +381,7 @@ func (c *catalogCache) updateDeleted(name *runtimev1.ResourceName) error { // updateStatus updates the ephemeral status fields on a resource. // The values of these fields are reset next time a catalog cache is created. func (c *catalogCache) updateStatus(name *runtimev1.ResourceName, status runtimev1.ReconcileStatus, reconcileOn time.Time) error { - r, err := c.get(name, true) + r, err := c.get(name, true, false) if err != nil { return err } @@ -377,7 +398,7 @@ func (c *catalogCache) updateStatus(name *runtimev1.ResourceName, status runtime // delete permanently deletes a resource from the catalog (a hard delete). // Afterwards, the resource can no longer be accessed. func (c *catalogCache) delete(name *runtimev1.ResourceName) error { - r, err := c.get(name, true) + r, err := c.get(name, true, false) if err != nil { return err } @@ -424,12 +445,17 @@ func (c *catalogCache) unlink(r *runtimev1.Resource) { delete(c.renamed, s) } +// clone clones a resource such that it is safe to mutate without affecting a cached resource. +func (c *catalogCache) clone(r *runtimev1.Resource) *runtimev1.Resource { + return proto.Clone(r).(*runtimev1.Resource) +} + // retryCyclicRefs attempts to re-link resources into the DAG that were previously rejected due to cyclic references. // It returns a list of resource names that were successfully linked into the DAG. func (c *catalogCache) retryCyclicRefs() []*runtimev1.ResourceName { var res []*runtimev1.ResourceName for s, n := range c.cyclic { - r, err := c.get(n, false) + r, err := c.get(n, false, false) if err != nil { panic(err) } diff --git a/runtime/compilers/rillv1/connectors.go b/runtime/compilers/rillv1/connectors.go index f72cbb514bd..9229022003b 100644 --- a/runtime/compilers/rillv1/connectors.go +++ b/runtime/compilers/rillv1/connectors.go @@ -4,7 +4,6 @@ import ( "context" "fmt" - runtimev1 "github.com/rilldata/rill/proto/gen/rill/runtime/v1" "github.com/rilldata/rill/runtime/drivers" "go.uber.org/zap" "golang.org/x/exp/slices" @@ -64,7 +63,7 @@ func (p *Parser) AnalyzeConnectors(ctx context.Context) ([]*Connector, error) { break } // Poll for anon access - res, _ := connector.HasAnonymousSourceAccess(ctx, driverSourceForAnonAccessCheck(driver, r.SourceSpec), zap.NewNop()) + res, _ := connector.HasAnonymousSourceAccess(ctx, r.SourceSpec.Properties.AsMap(), zap.NewNop()) if !res { anonAccess = false break @@ -106,29 +105,3 @@ func (p *Parser) connectorForName(name string) (string, drivers.Driver, error) { } return driver, connector, nil } - -func driverSourceForAnonAccessCheck(connector string, src *runtimev1.SourceSpec) drivers.Source { - props := src.Properties.AsMap() - switch connector { - case "s3": - return &drivers.BucketSource{ - Properties: props, - } - case "gcs": - return &drivers.BucketSource{ - Properties: props, - } - case "https": - return &drivers.FileSource{ - Properties: props, - } - case "local_file": - return &drivers.FileSource{ - Properties: props, - } - case "motherduck": - return &drivers.DatabaseSource{} - default: - return nil - } -} diff --git a/runtime/compilers/rillv1/parse_dotenv.go b/runtime/compilers/rillv1/parse_dotenv.go new file mode 100644 index 00000000000..92a5befde02 --- /dev/null +++ b/runtime/compilers/rillv1/parse_dotenv.go @@ -0,0 +1,26 @@ +package rillv1 + +import ( + "context" + "os" + + "github.com/joho/godotenv" +) + +// parseDotEnv parses the env file present at repo root +func (p *Parser) parseDotEnv(ctx context.Context, path string) error { + data, err := p.Repo.Get(ctx, path) + if err != nil { + if os.IsNotExist(err) { + return nil + } + return err + } + envMap, err := godotenv.Unmarshal(data) + if err != nil { + return err + } + + p.DotEnv = envMap + return nil +} diff --git a/runtime/compilers/rillv1/parser.go b/runtime/compilers/rillv1/parser.go index 5d87f9a58fc..f68c631933a 100644 --- a/runtime/compilers/rillv1/parser.go +++ b/runtime/compilers/rillv1/parser.go @@ -108,6 +108,7 @@ type Diff struct { Added []ResourceName Modified []ResourceName ModifiedRillYAML bool + ModifiedDotEnv bool Deleted []ResourceName } @@ -122,6 +123,7 @@ type Parser struct { // Output RillYAML *RillYAML + DotEnv map[string]string Resources map[ResourceName]*Resource Errors []*runtimev1.ParseError @@ -208,6 +210,8 @@ func (p *Parser) Reparse(ctx context.Context, paths []string) (*Diff, error) { var deletedResources []*Resource // Resources deleted in Phase 1 (some may be added back in Phase 2) checkPaths := slices.Clone(paths) // Paths we should visit in the loop seenPaths := make(map[string]bool) // Paths already visited by the loop + modifiedRillYAML := false // whether rill.yaml file was modified + modifiedDotEnv := false // whether .env file was modified for i := 0; i < len(checkPaths); i++ { // Don't check the same path twice path := normalizePath(checkPaths[i]) @@ -216,10 +220,11 @@ func (p *Parser) Reparse(ctx context.Context, paths []string) (*Diff, error) { } seenPaths[path] = true - // Skip files that aren't SQL or YAML + // Skip files that aren't SQL or YAML or .env file isSQL := strings.HasSuffix(path, ".sql") isYAML := strings.HasSuffix(path, ".yaml") || strings.HasSuffix(path, ".yml") - if !isSQL && !isYAML { + isDotEnv := strings.EqualFold(path, "/.env") + if !isSQL && !isYAML && !isDotEnv { continue } @@ -231,9 +236,13 @@ func (p *Parser) Reparse(ctx context.Context, paths []string) (*Diff, error) { return nil, fmt.Errorf("unexpected file stat error: %w", err) } - // Check if path is rill.yaml and clear it (so we can re-parse it) + // Check if path is rill.yaml or .env and clear it (so we can re-parse it) if path == "/rill.yaml" || path == "/rill.yml" { + modifiedRillYAML = true p.RillYAML = nil + } else if path == "/.env" { + modifiedDotEnv = true + p.DotEnv = nil } // Since .sql and .yaml files provide context for each other, if one was modified, we need to reparse both. @@ -273,9 +282,6 @@ func (p *Parser) Reparse(ctx context.Context, paths []string) (*Diff, error) { } } - // Capture if rill.yaml will be updated - modifiedRillYAML := p.RillYAML == nil - // Phase 2: Parse (or reparse) the related paths, adding back resources err := p.parsePaths(ctx, parsePaths) if err != nil { @@ -318,7 +324,10 @@ func (p *Parser) Reparse(ctx context.Context, paths []string) (*Diff, error) { } // Phase 3: Build the diff using p.insertedResources, p.updatedResources and deletedResources - diff := &Diff{ModifiedRillYAML: modifiedRillYAML} + diff := &Diff{ + ModifiedRillYAML: modifiedRillYAML, + ModifiedDotEnv: modifiedDotEnv, + } for _, resource := range p.insertedResources { addedBack := false for _, deleted := range deletedResources { @@ -360,7 +369,7 @@ func (p *Parser) parsePaths(ctx context.Context, paths []string) error { // Then iterate over the sorted paths, processing all paths with the same stem at once (stem = path without extension). slices.Sort(paths) for i := 0; i < len(paths); { - // Handle rill.yaml separately (if parsing of rill.yaml fails, we exit early instead of adding a ParseError) + // Handle rill.yaml and .env separately (if parsing of rill.yaml fails, we exit early instead of adding a ParseError) path := paths[i] if path == "/rill.yaml" || path == "/rill.yml" { err := p.parseRillYAML(ctx, path) @@ -369,6 +378,13 @@ func (p *Parser) parsePaths(ctx context.Context, paths []string) error { } i++ continue + } else if path == "/.env" { + err := p.parseDotEnv(ctx, path) + if err != nil { + p.addParseError(path, err) + } + i++ + continue } // Identify the range of paths with the same stem as paths[i] diff --git a/runtime/compilers/rillv1beta/connector.go b/runtime/compilers/rillv1beta/connector.go index 9be6f3f873b..32b9d1b1dad 100644 --- a/runtime/compilers/rillv1beta/connector.go +++ b/runtime/compilers/rillv1beta/connector.go @@ -71,7 +71,7 @@ func ExtractConnectors(ctx context.Context, projectPath string) ([]*Connector, e } // ignoring error since failure to resolve this should not break the deployment flow // this can fail under cases such as full or host/bucket of URI is a variable - access, _ := connector.HasAnonymousSourceAccess(ctx, source(src.Connector, src), zap.NewNop()) + access, _ := connector.HasAnonymousSourceAccess(ctx, src.Properties.AsMap(), zap.NewNop()) c := key{Name: src.Connector, Type: src.Connector, AnonymousAccess: access} srcs, ok := connectorMap[c] if !ok { @@ -158,37 +158,3 @@ type key struct { Type string AnonymousAccess bool } - -func source(connector string, src *runtimev1.Source) drivers.Source { - props := src.Properties.AsMap() - switch connector { - case "s3": - return &drivers.BucketSource{ - Properties: props, - } - case "gcs": - return &drivers.BucketSource{ - Properties: props, - } - case "https": - return &drivers.FileSource{ - Properties: props, - } - case "local_file": - return &drivers.FileSource{ - Properties: props, - } - case "motherduck": - return &drivers.DatabaseSource{} - case "bigquery": - return &drivers.DatabaseSource{ - Props: props, - } - case "athena": - return &drivers.BucketSource{ - Properties: props, - } - default: - return nil - } -} diff --git a/runtime/connection_cache_test.go b/runtime/connection_cache_test.go index e25e4be8fcf..c3e3a3f4867 100644 --- a/runtime/connection_cache_test.go +++ b/runtime/connection_cache_test.go @@ -126,10 +126,10 @@ func TestConnectionCacheParallel(t *testing.T) { defer c.Close() var wg sync.WaitGroup + wg.Add(30) // open 10 connections and do not release go func() { for i := 0; i < 10; i++ { - wg.Add(1) j := i go func() { defer wg.Done() @@ -145,7 +145,6 @@ func TestConnectionCacheParallel(t *testing.T) { // open 20 connections and release for i := 0; i < 20; i++ { - wg.Add(1) j := i go func() { defer wg.Done() @@ -277,7 +276,7 @@ func (*mockDriver) Drop(config map[string]any, logger *zap.Logger) error { } // HasAnonymousSourceAccess implements drivers.Driver. -func (*mockDriver) HasAnonymousSourceAccess(ctx context.Context, src drivers.Source, logger *zap.Logger) (bool, error) { +func (*mockDriver) HasAnonymousSourceAccess(ctx context.Context, src map[string]any, logger *zap.Logger) (bool, error) { panic("unimplemented") } diff --git a/runtime/controller.go b/runtime/controller.go index 4d5af6a078c..0ccbd66586a 100644 --- a/runtime/controller.go +++ b/runtime/controller.go @@ -39,6 +39,7 @@ type Reconciler interface { Close(ctx context.Context) error AssignSpec(from, to *runtimev1.Resource) error AssignState(from, to *runtimev1.Resource) error + ResetState(r *runtimev1.Resource) error Reconcile(ctx context.Context, n *runtimev1.ResourceName) ReconcileResult } @@ -283,21 +284,21 @@ func (c *Controller) Run(ctx context.Context) error { // Get returns a resource by name. // Soft-deleted resources (i.e. resources where DeletedOn != nil) are not returned. -func (c *Controller) Get(ctx context.Context, name *runtimev1.ResourceName) (*runtimev1.Resource, error) { +func (c *Controller) Get(ctx context.Context, name *runtimev1.ResourceName, clone bool) (*runtimev1.Resource, error) { c.checkRunning() c.lock(ctx, true) defer c.unlock(ctx, true) - return c.catalog.get(name, false) + return c.catalog.get(name, false, clone) } // List returns a list of resources of the specified kind. // If kind is empty, all resources are returned. // Soft-deleted resources (i.e. resources where DeletedOn != nil) are not returned. -func (c *Controller) List(ctx context.Context, kind string) ([]*runtimev1.Resource, error) { +func (c *Controller) List(ctx context.Context, kind string, clone bool) ([]*runtimev1.Resource, error) { c.checkRunning() c.lock(ctx, true) defer c.unlock(ctx, true) - return c.catalog.list(kind, false) + return c.catalog.list(kind, false, clone) } // SubscribeCallback is the callback type passed to Subscribe. @@ -343,7 +344,7 @@ func (c *Controller) Create(ctx context.Context, name *runtimev1.ResourceName, r // A deleted resource with the same name may exist and be running. If so, we first cancel it. requeued := false if inv, ok := c.invocations[nameStr(name)]; ok { - r, err := c.catalog.get(name, true) + r, err := c.catalog.get(name, true, false) if err != nil { return fmt.Errorf("internal: got catalog error for reconciling resource: %w", err) } @@ -409,7 +410,7 @@ func (c *Controller) UpdateName(ctx context.Context, name, newName, owner *runti c.enqueue(name) } - r, err := c.catalog.get(name, true) + r, err := c.catalog.get(name, true, false) if err != nil { return err } @@ -660,7 +661,7 @@ func (c *Controller) isReconcilerForResource(ctx context.Context, n *runtimev1.R // It does nothing if the resource is not currently being renamed (RenamedFrom == nil). // It must be called while c.mu is held. func (c *Controller) safeMutateRenamed(n *runtimev1.ResourceName) error { - r, err := c.catalog.get(n, true) + r, err := c.catalog.get(n, true, false) if err != nil { if errors.Is(err, drivers.ErrResourceNotFound) { return nil @@ -678,7 +679,7 @@ func (c *Controller) safeMutateRenamed(n *runtimev1.ResourceName) error { return err } - _, err = c.catalog.get(renamedFrom, true) + _, err = c.catalog.get(renamedFrom, true, false) if err == nil { // A new resource with the name of the old one has been created in the mean time, so no delete is necessary (reconciler will bring to desired state). return nil @@ -712,7 +713,7 @@ func (c *Controller) safeRename(from, to *runtimev1.ResourceName) error { // There's a collision if to matches RenamedFrom of another resource. collision := false for _, n := range c.catalog.renamed { - r, err := c.catalog.get(n, true) + r, err := c.catalog.get(n, true, false) if err != nil { return fmt.Errorf("internal: failed to get renamed resource %v: %w", n, err) } @@ -729,7 +730,7 @@ func (c *Controller) safeRename(from, to *runtimev1.ResourceName) error { // Collision, do a create+delete instead of a rename // (since creation might fail if the name is taken, whereas the delete is almost certain to succeed) - r, err := c.catalog.get(from, true) + r, err := c.catalog.get(from, true, false) if err != nil { return err } @@ -803,6 +804,7 @@ func (c *Controller) processQueue() error { } // markPending marks a resource and its descendents as pending. +// It also clears errors on every resource marked pending - it would be confusing to show an old error after a change has been made that may fix it. // It returns true if it already now knows that the resource can't be scheduled and will be re-triggered later (e.g. by being added to a waitlist). // It must be called while c.mu is held. func (c *Controller) markPending(n *runtimev1.ResourceName) (bool, error) { @@ -810,7 +812,7 @@ func (c *Controller) markPending(n *runtimev1.ResourceName) (bool, error) { c.timeline.Remove(n) // Get resource - r, err := c.catalog.get(n, true) + r, err := c.catalog.get(n, true, false) if err != nil { if errors.Is(err, drivers.ErrResourceNotFound) { return true, nil @@ -826,7 +828,11 @@ func (c *Controller) markPending(n *runtimev1.ResourceName) (bool, error) { return true, nil } - // Not running - mark pending + // Not running - clear error and mark pending + err = c.catalog.updateError(n, nil) + if err != nil { + return false, err + } err = c.catalog.updateStatus(n, runtimev1.ReconcileStatus_RECONCILE_STATUS_PENDING, time.Time{}) if err != nil { return false, err @@ -849,13 +855,17 @@ func (c *Controller) markPending(n *runtimev1.ResourceName) (bool, error) { // Ensure all descendents get marked pending and cancel any running descendents. descendentRunning := false err = c.catalog.dag.Visit(n, func(ds string, dn *runtimev1.ResourceName) error { - dr, err := c.catalog.get(dn, true) + dr, err := c.catalog.get(dn, true, false) if err != nil { return fmt.Errorf("error getting dag node %q: %w", ds, err) } switch dr.Meta.ReconcileStatus { case runtimev1.ReconcileStatus_RECONCILE_STATUS_IDLE: - // Mark it pending + // Clear error and mark it pending + err = c.catalog.updateError(n, nil) + if err != nil { + return fmt.Errorf("error updating dag node %q: %w", ds, err) + } err = c.catalog.updateStatus(dn, runtimev1.ReconcileStatus_RECONCILE_STATUS_PENDING, time.Time{}) if err != nil { return fmt.Errorf("error updating dag node %q: %w", ds, err) @@ -904,7 +914,7 @@ func (c *Controller) markPending(n *runtimev1.ResourceName) (bool, error) { // The implementation relies on the key invariant that all resources awaiting to be reconciled have status=pending, *including descendents of a resource with status=pending*. // This is ensured through the assignment of status=pending in markPending. func (c *Controller) trySchedule(n *runtimev1.ResourceName) (bool, error) { - r, err := c.catalog.get(n, true) + r, err := c.catalog.get(n, true, false) if err != nil { if errors.Is(err, drivers.ErrResourceNotFound) { return true, nil @@ -915,7 +925,7 @@ func (c *Controller) trySchedule(n *runtimev1.ResourceName) (bool, error) { // Return true if any parents are pending or running parents := c.catalog.dag.Parents(n, true) for _, pn := range parents { - p, err := c.catalog.get(pn, true) + p, err := c.catalog.get(pn, true, false) if err != nil { return false, fmt.Errorf("internal: error getting present parent %q: %w", nameStr(pn), err) } @@ -999,7 +1009,7 @@ func (c *Controller) invoke(r *runtimev1.Resource) error { // - and, for itself if inv.reschedule is true // - and, for its children in the DAG if inv.reschedule is false func (c *Controller) processCompletedInvocation(inv *invocation) error { - r, err := c.catalog.get(inv.name, true) + r, err := c.catalog.get(inv.name, true, false) if err != nil { return err } @@ -1070,7 +1080,7 @@ func (c *Controller) processCompletedInvocation(inv *invocation) error { // Enqueue items from waitlist that haven't been updated (and hence re-triggered in the meantime). for _, e := range inv.waitlist { - r, err := c.catalog.get(e.name, true) + r, err := c.catalog.get(e.name, true, false) if err != nil { if errors.Is(err, drivers.ErrResourceNotFound) { continue diff --git a/runtime/drivers/bigquery/api.go b/runtime/drivers/bigquery/api.go index 59fdce53ede..7f7c0879847 100644 --- a/runtime/drivers/bigquery/api.go +++ b/runtime/drivers/bigquery/api.go @@ -11,7 +11,12 @@ import ( const defaultPageSize = 20 func (c *Connection) ListDatasets(ctx context.Context, req *runtimev1.BigQueryListDatasetsRequest) ([]string, string, error) { - client, err := c.createClient(ctx, &sourceProperties{ProjectID: bigquery.DetectProjectID}) + opts, err := c.clientOption(ctx) + if err != nil { + return nil, "", err + } + + client, err := bigquery.NewClient(ctx, bigquery.DetectProjectID, opts...) if err != nil { return nil, "", err } @@ -36,7 +41,12 @@ func (c *Connection) ListDatasets(ctx context.Context, req *runtimev1.BigQueryLi } func (c *Connection) ListTables(ctx context.Context, req *runtimev1.BigQueryListTablesRequest) ([]string, string, error) { - client, err := c.createClient(ctx, &sourceProperties{ProjectID: bigquery.DetectProjectID}) + opts, err := c.clientOption(ctx) + if err != nil { + return nil, "", err + } + + client, err := bigquery.NewClient(ctx, bigquery.DetectProjectID, opts...) if err != nil { return nil, "", err } diff --git a/runtime/drivers/bigquery/bigquery.go b/runtime/drivers/bigquery/bigquery.go index b2a274249b5..68bd9ef3119 100644 --- a/runtime/drivers/bigquery/bigquery.go +++ b/runtime/drivers/bigquery/bigquery.go @@ -2,7 +2,6 @@ package bigquery import ( "context" - "errors" "fmt" "os" "strings" @@ -123,7 +122,7 @@ func (d driver) Spec() drivers.Spec { return spec } -func (d driver) HasAnonymousSourceAccess(ctx context.Context, src drivers.Source, logger *zap.Logger) (bool, error) { +func (d driver) HasAnonymousSourceAccess(ctx context.Context, src map[string]any, logger *zap.Logger) (bool, error) { // gcp provides public access to the data via a project return false, nil } @@ -205,6 +204,7 @@ func (c *Connection) AsFileStore() (drivers.FileStore, bool) { type sourceProperties struct { ProjectID string `mapstructure:"project_id"` + SQL string `mapstructure:"sql"` } func parseSourceProperties(props map[string]any) (*sourceProperties, error) { @@ -213,19 +213,19 @@ func parseSourceProperties(props map[string]any) (*sourceProperties, error) { if err != nil { return nil, err } + if conf.SQL == "" { + return nil, fmt.Errorf("property 'sql' is mandatory for connector \"bigquery\"") + } if conf.ProjectID == "" { conf.ProjectID = bigquery.DetectProjectID } return conf, err } -func (c *Connection) createClient(ctx context.Context, props *sourceProperties) (*bigquery.Client, error) { +func (c *Connection) clientOption(ctx context.Context) ([]option.ClientOption, error) { creds, err := gcputil.Credentials(ctx, c.config.SecretJSON, c.config.AllowHostAccess) if err != nil { - if !errors.Is(err, gcputil.ErrNoCredentials) { - return nil, err - } - return bigquery.NewClient(ctx, props.ProjectID) + return nil, err } - return bigquery.NewClient(ctx, props.ProjectID, option.WithCredentials(creds)) + return []option.ClientOption{option.WithCredentials(creds)}, nil } diff --git a/runtime/drivers/bigquery/sql_store.go b/runtime/drivers/bigquery/sql_store.go index cd25ac9cc45..e5b507e3ab1 100644 --- a/runtime/drivers/bigquery/sql_store.go +++ b/runtime/drivers/bigquery/sql_store.go @@ -20,19 +20,29 @@ import ( "google.golang.org/api/iterator" ) +// recommended size is 512MB - 1GB, entire data is buffered in memory before its written to disk +const rowGroupBufferSize = int64(datasize.MB) * 512 + +const _jsonDownloadLimitBytes = 100 * int64(datasize.MB) + // Query implements drivers.SQLStore -func (c *Connection) Query(ctx context.Context, props map[string]any, sql string) (drivers.RowIterator, error) { +func (c *Connection) Query(ctx context.Context, props map[string]any) (drivers.RowIterator, error) { return nil, fmt.Errorf("not implemented") } // QueryAsFiles implements drivers.SQLStore -func (c *Connection) QueryAsFiles(ctx context.Context, props map[string]any, sql string, opt *drivers.QueryOption, p drivers.Progress) (drivers.FileIterator, error) { +func (c *Connection) QueryAsFiles(ctx context.Context, props map[string]any, opt *drivers.QueryOption, p drivers.Progress) (drivers.FileIterator, error) { srcProps, err := parseSourceProperties(props) if err != nil { return nil, err } - client, err := c.createClient(ctx, srcProps) + opts, err := c.clientOption(ctx) + if err != nil { + return nil, err + } + + client, err := bigquery.NewClient(ctx, srcProps.ProjectID, opts...) if err != nil { if strings.Contains(err.Error(), "unable to detect projectID") { return nil, fmt.Errorf("projectID not detected in credentials. Please set `project_id` in source yaml") @@ -40,13 +50,13 @@ func (c *Connection) QueryAsFiles(ctx context.Context, props map[string]any, sql return nil, fmt.Errorf("failed to create bigquery client: %w", err) } - if err := client.EnableStorageReadClient(ctx); err != nil { + if err := client.EnableStorageReadClient(ctx, opts...); err != nil { client.Close() return nil, err } now := time.Now() - q := client.Query(sql) + q := client.Query(srcProps.SQL) it, err := q.Read(ctx) if err != nil && !strings.Contains(err.Error(), "Syntax error") { // close the read storage API client @@ -55,19 +65,19 @@ func (c *Connection) QueryAsFiles(ctx context.Context, props map[string]any, sql // the query results are always cached in a temporary table that storage api can use // there are some exceptions when results aren't cached // so we also try without storage api - client, err = c.createClient(ctx, srcProps) + client, err = bigquery.NewClient(ctx, srcProps.ProjectID, opts...) if err != nil { return nil, fmt.Errorf("failed to create bigquery client: %w", err) } - q := client.Query(sql) + q := client.Query(srcProps.SQL) it, err = q.Read(ctx) } if err != nil { client.Close() return nil, err } - c.logger.Info("query took", zap.Duration("duration", time.Since(now))) + c.logger.Info("query took", zap.Duration("duration", time.Since(now)), observability.ZapCtx(ctx)) p.Target(int64(it.TotalRows), drivers.ProgressUnitRecord) return &fileIterator{ @@ -109,16 +119,22 @@ func (f *fileIterator) HasNext() bool { func (f *fileIterator) KeepFilesUntilClose(keepFilesUntilClose bool) { } +func (f *fileIterator) NextBatchSize(sizeInBytes int64) ([]string, error) { + return f.NextBatch(1) +} + // NextBatch implements drivers.FileIterator. // TODO :: currently it downloads all records in a single file. Need to check if it is efficient to ingest a single file with size in tens of GBs or more. func (f *fileIterator) NextBatch(limit int) ([]string, error) { // storage API not available so can't read as arrow records. Read results row by row and dump in a json file. if !f.bqIter.IsAccelerated() { + f.logger.Info("downloading results in json file", observability.ZapCtx(f.ctx)) if err := f.downloadAsJSONFile(); err != nil { return nil, err } return []string{f.tempFilePath}, nil } + f.logger.Info("downloading results in parquet file", observability.ZapCtx(f.ctx)) // create a temp file fw, err := os.CreateTemp("", "temp*.parquet") @@ -174,6 +190,9 @@ func (f *fileIterator) NextBatch(limit int) ([]string, error) { default: rec := rdr.Record() f.progress.Observe(rec.NumRows(), drivers.ProgressUnitRecord) + if writer.RowGroupTotalBytesWritten() >= rowGroupBufferSize { + writer.NewBufferedRowGroup() + } if err := writer.WriteBuffered(rec); err != nil { return nil, err } @@ -221,7 +240,9 @@ func (f *fileIterator) downloadAsJSONFile() error { f.downloaded = true init := false - // not implementing size check since this flow is expected to be run for less data size only + rows := 0 + enc := json.NewEncoder(fw) + enc.SetEscapeHTML(false) for { row := make(map[string]bigquery.Value) err := f.bqIter.Next(&row) @@ -244,15 +265,22 @@ func (f *fileIterator) downloadAsJSONFile() error { } } - bytes, err := json.Marshal(row) + err = enc.Encode(row) if err != nil { return fmt.Errorf("conversion of row to json failed with error: %w", err) } - if _, err = fw.Write(bytes); err != nil { - return err - } - if _, err = fw.WriteString("\n"); err != nil { - return err + + // If we don't have storage API access, BigQuery may return massive JSON results. (But even with storage API access, it may return JSON for small results.) + // We want to avoid JSON for massive results. Currently, the only way to do so is to error at a limit. + rows++ + if rows != 0 && rows%10000 == 0 { // Check file size every 10k rows + fileInfo, err := os.Stat(fw.Name()) + if err != nil { + return fmt.Errorf("bigquery: failed to poll json file size: %w", err) + } + if fileInfo.Size() >= _jsonDownloadLimitBytes { + return fmt.Errorf("bigquery: json download exceeded limit of %d bytes (enable and provide access to the BigQuery Storage Read API to read larger results)", _jsonDownloadLimitBytes) + } } } } diff --git a/runtime/drivers/blob/blobdownloader.go b/runtime/drivers/blob/blobdownloader.go index 1997aacf9ff..5ac24bbafa0 100644 --- a/runtime/drivers/blob/blobdownloader.go +++ b/runtime/drivers/blob/blobdownloader.go @@ -10,7 +10,6 @@ import ( "cloud.google.com/go/storage" "github.com/bmatcuk/doublestar/v4" - runtimev1 "github.com/rilldata/rill/proto/gen/rill/runtime/v1" "github.com/rilldata/rill/runtime/drivers" "github.com/rilldata/rill/runtime/pkg/fileutil" "github.com/rilldata/rill/runtime/pkg/observability" @@ -19,9 +18,8 @@ import ( "golang.org/x/sync/errgroup" ) -// increasing this limit can increase speed ingestion -// but may increase bottleneck at duckdb or network/db IO -// set without any benchamarks +// Number of concurrent file downloads. +// 23-11-13: Experimented with increasing the value to 16. It caused network saturation errors on macOS. const _concurrentBlobDownloadLimit = 8 // map of supoprted extensions for partial downloads vs readers @@ -59,7 +57,7 @@ type Options struct { GlobMaxObjectsMatched int GlobMaxObjectsListed int64 GlobPageSize int - ExtractPolicy *runtimev1.Source_ExtractPolicy + ExtractPolicy *ExtractPolicy GlobPattern string // Although at this point GlobMaxTotalSize and StorageLimitInBytes have same impl but // this is total size the source should consume on disk and is calculated upstream basis how much data one instance has already consumed @@ -153,6 +151,104 @@ func (it *blobIterator) HasNext() bool { return it.index < len(it.objects) } +// NextBatchSize downloads next n files and copies to local directory +func (it *blobIterator) NextBatchSize(sizeInBytes int64) ([]string, error) { + if !it.HasNext() { + return nil, io.EOF + } + if len(it.nextPaths) != 0 { + paths := it.nextPaths + it.index += len(paths) + it.nextPaths = nil + return paths, nil + } + + if !it.opts.KeepFilesUntilClose { + // delete files created in last iteration + fileutil.ForceRemoveFiles(it.localFiles) + } + + // new slice creation is not necessary on every iteration + // but there may be cases where n in first batch is different from n in next batch + // to keep things easy creating a new slice every time + it.localFiles = make([]string, 0) + g, grpCtx := errgroup.WithContext(it.ctx) + g.SetLimit(_concurrentBlobDownloadLimit) + + var totalSizeInBytes int64 + start := it.index + for ; it.index < len(it.objects) && totalSizeInBytes < sizeInBytes; it.index++ { + obj := it.objects[it.index] + totalSizeInBytes += obj.obj.Size + g.Go(func() error { + // need to create file by maintaining same dir path as in glob for hivepartition support + filename := filepath.Join(it.tempDir, obj.obj.Key) + if err := os.MkdirAll(filepath.Dir(filename), os.ModePerm); err != nil { + return err + } + + file, err := os.OpenFile(filename, os.O_RDWR|os.O_CREATE, os.ModePerm) + if err != nil { + return err + } + defer file.Close() + + it.localFiles = append(it.localFiles, file.Name()) + ext := filepath.Ext(obj.obj.Key) + partialReader, isPartialDownloadSupported := _partialDownloadReaders[ext] + downloadFull := obj.full || !isPartialDownloadSupported + + // Collect metrics of download size and time + startTime := time.Now() + defer func() { + size := obj.obj.Size + st, err := file.Stat() + if err == nil { + size = st.Size() + } + + duration := time.Since(startTime) + it.logger.Info("download complete", zap.String("object", obj.obj.Key), zap.Duration("duration", duration), observability.ZapCtx(it.ctx)) + drivers.RecordDownloadMetrics(grpCtx, &drivers.DownloadMetrics{ + Connector: "blob", + Ext: ext, + Partial: !downloadFull, + Duration: duration, + Size: size, + }) + }() + + // download full file + if downloadFull { + return downloadObject(grpCtx, it.bucket, obj.obj.Key, file) + } + // download partial file + // check if, for smaller size we can download entire file + switch partialReader { + case "parquet": + return downloadParquet(grpCtx, it.bucket, obj.obj, obj.extractOption, file) + case "csv": + return downloadText(grpCtx, it.bucket, obj.obj, &textExtractOption{extractOption: obj.extractOption, hasCSVHeader: true}, file) + case "json": + return downloadText(grpCtx, it.bucket, obj.obj, &textExtractOption{extractOption: obj.extractOption, hasCSVHeader: false}, file) + default: + // should not reach here + panic(fmt.Errorf("partial download not supported for extension %q", ext)) + } + }) + } + + if err := g.Wait(); err != nil { + return nil, err + } + + // clients can make changes to slice if passing the same slice that iterator holds + // creating a copy since we want to delete all these files on next batch/close + result := make([]string, it.index-start) + copy(result, it.localFiles) + return result, nil +} + // NextBatch downloads next n files and copies to local directory func (it *blobIterator) NextBatch(n int) ([]string, error) { if !it.HasNext() { diff --git a/runtime/drivers/blob/blobdownloader_test.go b/runtime/drivers/blob/blobdownloader_test.go index fa2b88a81c6..1cfed5d0a95 100644 --- a/runtime/drivers/blob/blobdownloader_test.go +++ b/runtime/drivers/blob/blobdownloader_test.go @@ -5,7 +5,6 @@ import ( "os" "testing" - runtimev1 "github.com/rilldata/rill/proto/gen/rill/runtime/v1" "github.com/rilldata/rill/runtime/pkg/fileutil" "github.com/stretchr/testify/require" "go.uber.org/zap" @@ -127,7 +126,7 @@ func TestFetchFileNamesWithParitionLimits(t *testing.T) { name: "listing head limits", args: args{context.Background(), prepareBucket(t), - Options{ExtractPolicy: &runtimev1.Source_ExtractPolicy{FilesStrategy: runtimev1.Source_ExtractPolicy_STRATEGY_HEAD, FilesLimit: 2}, GlobPattern: "2020/**", StorageLimitInBytes: TenGB}, + Options{ExtractPolicy: &ExtractPolicy{FilesStrategy: ExtractPolicyStrategyHead, FilesLimit: 2}, GlobPattern: "2020/**", StorageLimitInBytes: TenGB}, }, want: map[string]struct{}{"hello": {}, "world": {}}, wantErr: false, @@ -137,7 +136,7 @@ func TestFetchFileNamesWithParitionLimits(t *testing.T) { args: args{ context.Background(), prepareBucket(t), - Options{ExtractPolicy: &runtimev1.Source_ExtractPolicy{FilesStrategy: runtimev1.Source_ExtractPolicy_STRATEGY_TAIL, FilesLimit: 2}, GlobPattern: "2020/**", StorageLimitInBytes: TenGB}, + Options{ExtractPolicy: &ExtractPolicy{FilesStrategy: ExtractPolicyStrategyTail, FilesLimit: 2}, GlobPattern: "2020/**", StorageLimitInBytes: TenGB}, }, want: map[string]struct{}{"test": {}, "writing": {}}, wantErr: false, diff --git a/runtime/drivers/blob/extract_policy.go b/runtime/drivers/blob/extract_policy.go new file mode 100644 index 00000000000..9e9944eb8da --- /dev/null +++ b/runtime/drivers/blob/extract_policy.go @@ -0,0 +1,119 @@ +package blob + +import ( + "fmt" + "strconv" + "strings" + + "github.com/c2h5oh/datasize" + "github.com/mitchellh/mapstructure" +) + +type ExtractPolicy struct { + RowsStrategy ExtractPolicyStrategy + RowsLimitBytes uint64 + FilesStrategy ExtractPolicyStrategy + FilesLimit uint64 +} + +type ExtractPolicyStrategy int + +const ( + ExtractPolicyStrategyUnspecified ExtractPolicyStrategy = 0 + ExtractPolicyStrategyHead ExtractPolicyStrategy = 1 + ExtractPolicyStrategyTail ExtractPolicyStrategy = 2 +) + +func (s ExtractPolicyStrategy) String() string { + switch s { + case ExtractPolicyStrategyHead: + return "head" + case ExtractPolicyStrategyTail: + return "tail" + default: + return "unspecified" + } +} + +type rawExtractPolicy struct { + Rows *struct { + Strategy string `mapstructure:"strategy"` + Size string `mapstructure:"size"` + } `mapstructure:"rows"` + Files *struct { + Strategy string `mapstructure:"strategy"` + Size string `mapstructure:"size"` + } `mapstructure:"files"` +} + +func ParseExtractPolicy(cfg map[string]any) (*ExtractPolicy, error) { + if len(cfg) == 0 { + return nil, nil + } + + raw := &rawExtractPolicy{} + if err := mapstructure.WeakDecode(cfg, raw); err != nil { + return nil, err + } + + res := &ExtractPolicy{} + + // Parse files + if raw.Files != nil { + strategy, err := parseStrategy(raw.Files.Strategy) + if err != nil { + return nil, err + } + res.FilesStrategy = strategy + + size, err := strconv.ParseUint(raw.Files.Size, 10, 64) + if err != nil { + return nil, fmt.Errorf("invalid size, parse failed with error %w", err) + } + if size <= 0 { + return nil, fmt.Errorf("invalid size %q", size) + } + res.FilesLimit = size + } + + // Parse rows + if raw.Rows != nil { + strategy, err := parseStrategy(raw.Rows.Strategy) + if err != nil { + return nil, err + } + res.RowsStrategy = strategy + + // TODO: Add support for number of rows + size, err := parseBytes(raw.Rows.Size) + if err != nil { + return nil, fmt.Errorf("invalid size, parse failed with error %w", err) + } + if size <= 0 { + return nil, fmt.Errorf("invalid size %q", size) + } + res.RowsLimitBytes = size + } + + return res, nil +} + +func parseStrategy(s string) (ExtractPolicyStrategy, error) { + switch strings.ToLower(s) { + case "head": + return ExtractPolicyStrategyHead, nil + case "tail": + return ExtractPolicyStrategyTail, nil + default: + return ExtractPolicyStrategyUnspecified, fmt.Errorf("invalid extract strategy %q", s) + } +} + +func parseBytes(str string) (uint64, error) { + var s datasize.ByteSize + if err := s.UnmarshalText([]byte(str)); err != nil { + return 0, err + } + + return s.Bytes(), nil +} diff --git a/runtime/drivers/blob/extract_policy_test.go b/runtime/drivers/blob/extract_policy_test.go new file mode 100644 index 00000000000..1e98e33f963 --- /dev/null +++ b/runtime/drivers/blob/extract_policy_test.go @@ -0,0 +1,80 @@ +package blob + +import ( + "reflect" + "testing" +) + +func Test_fromExtractArtifact(t *testing.T) { + tests := []struct { + name string + input map[string]any + want *ExtractPolicy + wantErr bool + }{ + { + name: "nil input", + input: nil, + want: nil, + wantErr: false, + }, + { + name: "parse row", + input: map[string]any{"rows": map[string]any{"strategy": "tail", "size": "23 KB"}}, + want: &ExtractPolicy{ + RowsStrategy: ExtractPolicyStrategyTail, + RowsLimitBytes: 23552, + }, + wantErr: false, + }, + { + name: "parse files", + input: map[string]any{"files": map[string]any{"strategy": "head", "size": "23"}}, + want: &ExtractPolicy{ + FilesStrategy: ExtractPolicyStrategyHead, + FilesLimit: 23, + }, + wantErr: false, + }, + { + name: "parse both", + input: map[string]any{"files": map[string]any{"strategy": "tail", "size": "23"}, "rows": map[string]any{"strategy": "tail", "size": "512 B"}}, + want: &ExtractPolicy{ + FilesStrategy: ExtractPolicyStrategyTail, + FilesLimit: 23, + RowsStrategy: ExtractPolicyStrategyTail, + RowsLimitBytes: 512, + }, + wantErr: false, + }, + { + name: "more examples", + input: map[string]any{"files": map[string]any{"strategy": "tail", "size": "23"}, "rows": map[string]any{"strategy": "tail", "size": "23 gb"}}, + want: &ExtractPolicy{ + FilesStrategy: ExtractPolicyStrategyTail, + FilesLimit: 23, + RowsStrategy: ExtractPolicyStrategyTail, + RowsLimitBytes: 23 * 1024 * 1024 * 1024, + }, + wantErr: false, + }, + { + name: "invalid", + input: map[string]any{"files": map[string]any{"strategy": "tail", "size": "23"}, "rows": map[string]any{"strategy": "tail", "size": "23%"}}, + want: nil, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := ParseExtractPolicy(tt.input) + if (err != nil) != tt.wantErr { + t.Errorf("fromExtractArtifact() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("fromExtractArtifact() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/runtime/drivers/blob/parquetreader.go b/runtime/drivers/blob/parquetreader.go index 60f7a39a1e7..7efc6fed627 100644 --- a/runtime/drivers/blob/parquetreader.go +++ b/runtime/drivers/blob/parquetreader.go @@ -12,7 +12,6 @@ import ( "github.com/apache/arrow/go/v13/parquet/compress" "github.com/apache/arrow/go/v13/parquet/file" "github.com/apache/arrow/go/v13/parquet/pqarrow" - runtimev1 "github.com/rilldata/rill/proto/gen/rill/runtime/v1" "github.com/rilldata/rill/runtime/pkg/arrayutil" "github.com/rilldata/rill/runtime/pkg/container" "gocloud.dev/blob" @@ -82,7 +81,7 @@ func downloadParquet(ctx context.Context, bucket *blob.Bucket, obj *blob.ListObj // estimateRecords estimates the number of rows to fetch based on extract policy // each arrow.Record will hold batchSize number of rows func estimateRecords(ctx context.Context, reader *file.Reader, pqToArrowReader *pqarrow.FileReader, config *extractOption) ([]arrow.Record, error) { - rowIndexes := arrayutil.RangeInt(0, reader.NumRowGroups(), config.strategy == runtimev1.Source_ExtractPolicy_STRATEGY_TAIL) + rowIndexes := arrayutil.RangeInt(0, reader.NumRowGroups(), config.strategy == ExtractPolicyStrategyTail) var ( // row group indices that we need @@ -133,12 +132,12 @@ func estimateRecords(ctx context.Context, reader *file.Reader, pqToArrowReader * return c.Items(), nil } -func containerForRecordLimiting(strategy runtimev1.Source_ExtractPolicy_Strategy, limit int) (container.Container[arrow.Record], error) { +func containerForRecordLimiting(strategy ExtractPolicyStrategy, limit int) (container.Container[arrow.Record], error) { switch strategy { - case runtimev1.Source_ExtractPolicy_STRATEGY_TAIL: - return container.NewFIFO(limit, func(rec arrow.Record) { rec.Release() }) - case runtimev1.Source_ExtractPolicy_STRATEGY_HEAD: + case ExtractPolicyStrategyHead: return container.NewBounded[arrow.Record](limit) + case ExtractPolicyStrategyTail: + return container.NewFIFO(limit, func(rec arrow.Record) { rec.Release() }) default: // No option selected - this should not be used for partial downloads though // in case of no extract policy we should be directly downloading the entire file diff --git a/runtime/drivers/blob/parquetreader_test.go b/runtime/drivers/blob/parquetreader_test.go index e8f76490483..ec263fb0e17 100644 --- a/runtime/drivers/blob/parquetreader_test.go +++ b/runtime/drivers/blob/parquetreader_test.go @@ -10,7 +10,6 @@ import ( "github.com/apache/arrow/go/v13/arrow/memory" "github.com/apache/arrow/go/v13/parquet/file" "github.com/apache/arrow/go/v13/parquet/pqarrow" - runtimev1 "github.com/rilldata/rill/proto/gen/rill/runtime/v1" "github.com/rilldata/rill/runtime/pkg/fileutil" "github.com/stretchr/testify/require" "gocloud.dev/blob" @@ -34,13 +33,13 @@ func TestDownload(t *testing.T) { }{ { name: "download partial head", - args: args{ctx: context.Background(), bucket: bucket, obj: object, option: &extractOption{strategy: runtimev1.Source_ExtractPolicy_STRATEGY_HEAD, limitInBytes: 1}}, + args: args{ctx: context.Background(), bucket: bucket, obj: object, option: &extractOption{strategy: ExtractPolicyStrategyHead, limitInBytes: 1}}, wantErr: false, want: getInt32Array(1024, false), }, { name: "download partial tail", - args: args{ctx: context.Background(), bucket: bucket, obj: object, option: &extractOption{strategy: runtimev1.Source_ExtractPolicy_STRATEGY_TAIL, limitInBytes: 1}}, + args: args{ctx: context.Background(), bucket: bucket, obj: object, option: &extractOption{strategy: ExtractPolicyStrategyTail, limitInBytes: 1}}, wantErr: false, want: getInt32Array(2000, false)[1024:], }, diff --git a/runtime/drivers/blob/planner.go b/runtime/drivers/blob/planner.go index 8ba9f6c44d5..2b3727604d5 100644 --- a/runtime/drivers/blob/planner.go +++ b/runtime/drivers/blob/planner.go @@ -1,7 +1,6 @@ package blob import ( - runtimev1 "github.com/rilldata/rill/proto/gen/rill/runtime/v1" "github.com/rilldata/rill/runtime/pkg/container" "gocloud.dev/blob" ) @@ -10,7 +9,7 @@ import ( // it adds objects in the container which stops consuming files once it reaches file extract policy limits // every objects has details about what is the download strategy for that object type planner struct { - policy *runtimev1.Source_ExtractPolicy + policy *ExtractPolicy // rowPlanner adds support for row extract policy rowPlanner rowPlanner // keeps collection of objects to be downloaded @@ -18,7 +17,7 @@ type planner struct { container container.Container[*objectWithPlan] } -func newPlanner(policy *runtimev1.Source_ExtractPolicy) (*planner, error) { +func newPlanner(policy *ExtractPolicy) (*planner, error) { c, err := containerForFileStrategy(policy) if err != nil { return nil, err @@ -49,8 +48,8 @@ func (p *planner) items() []*objectWithPlan { return p.container.Items() } -func containerForFileStrategy(policy *runtimev1.Source_ExtractPolicy) (container.Container[*objectWithPlan], error) { - strategy := runtimev1.Source_ExtractPolicy_STRATEGY_UNSPECIFIED +func containerForFileStrategy(policy *ExtractPolicy) (container.Container[*objectWithPlan], error) { + strategy := ExtractPolicyStrategyUnspecified limit := 0 if policy != nil { strategy = policy.FilesStrategy @@ -58,23 +57,23 @@ func containerForFileStrategy(policy *runtimev1.Source_ExtractPolicy) (container } switch strategy { - case runtimev1.Source_ExtractPolicy_STRATEGY_TAIL: - return container.NewFIFO[*objectWithPlan](limit, nil) - case runtimev1.Source_ExtractPolicy_STRATEGY_HEAD: + case ExtractPolicyStrategyHead: return container.NewBounded[*objectWithPlan](limit) + case ExtractPolicyStrategyTail: + return container.NewFIFO[*objectWithPlan](limit, nil) default: // No option selected return container.NewUnbounded[*objectWithPlan]() } } -func rowPlannerForRowStrategy(policy *runtimev1.Source_ExtractPolicy) rowPlanner { +func rowPlannerForRowStrategy(policy *ExtractPolicy) rowPlanner { if policy == nil { return &plannerWithoutLimits{} } - if policy.RowsStrategy != runtimev1.Source_ExtractPolicy_STRATEGY_UNSPECIFIED { - if policy.FilesStrategy != runtimev1.Source_ExtractPolicy_STRATEGY_UNSPECIFIED { + if policy.RowsStrategy != ExtractPolicyStrategyUnspecified { + if policy.FilesStrategy != ExtractPolicyStrategyUnspecified { // file strategy specified row limits are per file return &plannerWithPerFileLimits{strategy: policy.RowsStrategy, limitInBytes: policy.RowsLimitBytes} } diff --git a/runtime/drivers/blob/rowplanner.go b/runtime/drivers/blob/rowplanner.go index f18d4cb2550..5dc98a2947c 100644 --- a/runtime/drivers/blob/rowplanner.go +++ b/runtime/drivers/blob/rowplanner.go @@ -1,7 +1,6 @@ package blob import ( - runtimev1 "github.com/rilldata/rill/proto/gen/rill/runtime/v1" "gocloud.dev/blob" ) @@ -19,7 +18,7 @@ type objectWithPlan struct { type extractOption struct { limitInBytes uint64 - strategy runtimev1.Source_ExtractPolicy_Strategy + strategy ExtractPolicyStrategy } // rowPlanner is an interface that creates download plan of a cloud object @@ -34,7 +33,7 @@ type rowPlanner interface { // the limitInBytes is a combined limit on all files type plannerWithGlobalLimits struct { cumsizeInBytes uint64 - strategy runtimev1.Source_ExtractPolicy_Strategy + strategy ExtractPolicyStrategy limitInBytes uint64 full bool } @@ -58,7 +57,7 @@ func (r *plannerWithGlobalLimits) done() bool { // plannerWithPerFileLimits implements rowPlanner interface // limitInBytes is on individual file type plannerWithPerFileLimits struct { - strategy runtimev1.Source_ExtractPolicy_Strategy + strategy ExtractPolicyStrategy limitInBytes uint64 } diff --git a/runtime/drivers/blob/textreader.go b/runtime/drivers/blob/textreader.go index b50263782fc..959a0ab7602 100644 --- a/runtime/drivers/blob/textreader.go +++ b/runtime/drivers/blob/textreader.go @@ -8,7 +8,6 @@ import ( "io" "os" - runtimev1 "github.com/rilldata/rill/proto/gen/rill/runtime/v1" "gocloud.dev/blob" ) @@ -35,12 +34,12 @@ func downloadText(ctx context.Context, bucket *blob.Bucket, obj *blob.ListObject func rows(reader *ObjectReader, option *textExtractOption) ([]byte, error) { switch option.extractOption.strategy { - case runtimev1.Source_ExtractPolicy_STRATEGY_HEAD: + case ExtractPolicyStrategyHead: return rowsHead(reader, option.extractOption) - case runtimev1.Source_ExtractPolicy_STRATEGY_TAIL: + case ExtractPolicyStrategyTail: return rowsTail(reader, option) default: - panic(fmt.Sprintf("unsupported strategy %s", option.extractOption.strategy)) + panic(fmt.Sprintf("unsupported strategy %s", option.extractOption.strategy.String())) } } diff --git a/runtime/drivers/blob/textreader_test.go b/runtime/drivers/blob/textreader_test.go index 33fdc5ab3b7..7a788d9dae7 100644 --- a/runtime/drivers/blob/textreader_test.go +++ b/runtime/drivers/blob/textreader_test.go @@ -7,7 +7,6 @@ import ( "os" "testing" - runtimev1 "github.com/rilldata/rill/proto/gen/rill/runtime/v1" "github.com/rilldata/rill/runtime/pkg/fileutil" "github.com/stretchr/testify/require" "gocloud.dev/blob" @@ -38,7 +37,7 @@ func TestDownloadCSV(t *testing.T) { ctx: context.Background(), bucket: bucket, obj: object, - option: &textExtractOption{extractOption: &extractOption{strategy: runtimev1.Source_ExtractPolicy_STRATEGY_HEAD, limitInBytes: uint64(object.Size - 5)}, hasCSVHeader: true}, + option: &textExtractOption{extractOption: &extractOption{strategy: ExtractPolicyStrategyHead, limitInBytes: uint64(object.Size - 5)}, hasCSVHeader: true}, fw: getTempFile(t, object.Key), }, want: testData[:len(testData)-1], @@ -49,7 +48,7 @@ func TestDownloadCSV(t *testing.T) { ctx: context.Background(), bucket: bucket, obj: object, - option: &textExtractOption{extractOption: &extractOption{strategy: runtimev1.Source_ExtractPolicy_STRATEGY_TAIL, limitInBytes: uint64(object.Size - 5)}, hasCSVHeader: true}, + option: &textExtractOption{extractOption: &extractOption{strategy: ExtractPolicyStrategyTail, limitInBytes: uint64(object.Size - 5)}, hasCSVHeader: true}, fw: getTempFile(t, object.Key), }, want: resultTail, @@ -88,7 +87,7 @@ func TestDownloadCSVSingleLineHead(t *testing.T) { object, err := bucket.List(&blob.ListOptions{Prefix: file}).Next(ctx) require.NoError(t, err) - extractOption := &extractOption{strategy: runtimev1.Source_ExtractPolicy_STRATEGY_HEAD, limitInBytes: uint64(object.Size)} + extractOption := &extractOption{strategy: ExtractPolicyStrategyHead, limitInBytes: uint64(object.Size)} fw := getTempFile(t, "temp.csv") err = downloadText(ctx, bucket, object, &textExtractOption{extractOption: extractOption, hasCSVHeader: true}, fw) require.NoError(t, err) diff --git a/runtime/drivers/drivers.go b/runtime/drivers/drivers.go index 8d23cc2abe1..150b7f5337e 100644 --- a/runtime/drivers/drivers.go +++ b/runtime/drivers/drivers.go @@ -5,11 +5,15 @@ import ( "errors" "fmt" + "github.com/c2h5oh/datasize" "github.com/rilldata/rill/runtime/pkg/activity" "go.uber.org/zap" ) -const _iteratorBatch = 8 +const ( + _iteratorBatch = 32 + _iteratorBatchSizeInBytes = int64(5 * datasize.GB) +) var ErrIngestionLimitExceeded = fmt.Errorf("connectors: source ingestion exceeds limit") @@ -78,7 +82,7 @@ type Driver interface { Drop(config map[string]any, logger *zap.Logger) error // HasAnonymousSourceAccess returns true if external system can be accessed without credentials - HasAnonymousSourceAccess(ctx context.Context, src Source, logger *zap.Logger) (bool, error) + HasAnonymousSourceAccess(ctx context.Context, src map[string]any, logger *zap.Logger) (bool, error) } // Handle represents a connection to an underlying DB. diff --git a/runtime/drivers/drivers_test.go b/runtime/drivers/drivers_test.go index befb425381c..e83a940ba40 100644 --- a/runtime/drivers/drivers_test.go +++ b/runtime/drivers/drivers_test.go @@ -20,7 +20,7 @@ import ( // This should be the only "real" test in the package. Other tests should be added // as subtests of TestAll. func TestAll(t *testing.T) { - var matrix = []func(t *testing.T, fn func(driver string, shared bool, dsn string)) error{ + var matrix = []func(t *testing.T, fn func(driver string, shared bool, cfg map[string]any)) error{ withDuckDB, withFile, withPostgres, @@ -29,9 +29,9 @@ func TestAll(t *testing.T) { } for _, withDriver := range matrix { - err := withDriver(t, func(driver string, shared bool, dsn string) { + err := withDriver(t, func(driver string, shared bool, cfg map[string]any) { // Open - conn, err := drivers.Open(driver, map[string]any{"dsn": dsn}, shared, activity.NewNoopClient(), zap.NewNop()) + conn, err := drivers.Open(driver, cfg, shared, activity.NewNoopClient(), zap.NewNop()) require.NoError(t, err) require.NotNil(t, conn) @@ -63,26 +63,26 @@ func TestAll(t *testing.T) { } } -func withDuckDB(t *testing.T, fn func(driver string, shared bool, dsn string)) error { - fn("duckdb", false, "?access_mode=read_write&rill_pool_size=4") +func withDuckDB(t *testing.T, fn func(driver string, shared bool, cfg map[string]any)) error { + fn("duckdb", false, map[string]any{"dsn": "?access_mode=read_write", "pool_size": 4}) return nil } -func withFile(t *testing.T, fn func(driver string, shared bool, dsn string)) error { +func withFile(t *testing.T, fn func(driver string, shared bool, cfg map[string]any)) error { dsn := t.TempDir() - fn("file", false, dsn) + fn("file", false, map[string]any{"dsn": dsn}) return nil } -func withPostgres(t *testing.T, fn func(driver string, shared bool, dsn string)) error { +func withPostgres(t *testing.T, fn func(driver string, shared bool, cfg map[string]any)) error { pg := pgtestcontainer.New(t) defer pg.Terminate(t) - fn("postgres", true, pg.DatabaseURL) + fn("postgres", true, map[string]any{"dsn": pg.DatabaseURL}) return nil } -func withSQLite(t *testing.T, fn func(driver string, shared bool, dsn string)) error { - fn("sqlite", true, ":memory:") +func withSQLite(t *testing.T, fn func(driver string, shared bool, cfg map[string]any)) error { + fn("sqlite", true, map[string]any{"dsn": ":memory:"}) return nil } diff --git a/runtime/drivers/druid/druid.go b/runtime/drivers/druid/druid.go index 9939bf77625..35970d38aef 100644 --- a/runtime/drivers/druid/druid.go +++ b/runtime/drivers/druid/druid.go @@ -52,7 +52,7 @@ func (d driver) Spec() drivers.Spec { return drivers.Spec{} } -func (d driver) HasAnonymousSourceAccess(ctx context.Context, src drivers.Source, logger *zap.Logger) (bool, error) { +func (d driver) HasAnonymousSourceAccess(ctx context.Context, src map[string]any, logger *zap.Logger) (bool, error) { return false, fmt.Errorf("not implemented") } @@ -130,3 +130,7 @@ func (c *connection) AsSQLStore() (drivers.SQLStore, bool) { func (c *connection) EstimateSize() (int64, bool) { return 0, false } + +func (c *connection) AcquireLongRunning(ctx context.Context) (func(), error) { + return func() {}, nil +} diff --git a/runtime/drivers/druid/olap.go b/runtime/drivers/druid/olap.go index 79fb2605015..5fe38f18374 100644 --- a/runtime/drivers/druid/olap.go +++ b/runtime/drivers/druid/olap.go @@ -13,7 +13,7 @@ func (c *connection) Dialect() drivers.Dialect { return drivers.DialectDruid } -func (c *connection) WithConnection(ctx context.Context, priority int, fn drivers.WithConnectionFunc) error { +func (c *connection) WithConnection(ctx context.Context, priority int, longRunning, tx bool, fn drivers.WithConnectionFunc) error { panic("not implemented") } diff --git a/runtime/drivers/duckdb/config.go b/runtime/drivers/duckdb/config.go index 89fd2c72004..eb207442f2d 100644 --- a/runtime/drivers/duckdb/config.go +++ b/runtime/drivers/duckdb/config.go @@ -5,27 +5,32 @@ import ( "net/url" "strconv" - "github.com/rilldata/rill/runtime/pkg/activity" + "github.com/mitchellh/mapstructure" ) -const poolSizeKey = "rill_pool_size" - -// config represents the Driver config, extracted from the DSN +// config represents the DuckDB driver config type config struct { - // DSN for DuckDB - DSN string + // DSN is the connection string + DSN string `mapstructure:"dsn"` // PoolSize is the number of concurrent connections and queries allowed - PoolSize int - // DBFilePath is the path where database is stored - DBFilePath string - // Activity client - Activity activity.Client + PoolSize int `mapstructure:"pool_size"` + // AllowHostAccess denotes whether to limit access to the local environment and file system + AllowHostAccess bool `mapstructure:"allow_host_access"` + // DBFilePath is the path where the database is stored. It is inferred from the DSN (can't be provided by user). + DBFilePath string `mapstructure:"-"` } -// activityDims and client are allowed to be nil, in this case DuckDB stats are not emitted -func newConfig(dsn string, client activity.Client) (*config, error) { +func newConfig(cfgMap map[string]any) (*config, error) { + cfg := &config{ + PoolSize: 1, // Default value + } + err := mapstructure.WeakDecode(cfgMap, cfg) + if err != nil { + return nil, fmt.Errorf("could not decode config: %w", err) + } + // Parse DSN as URL - uri, err := url.Parse(dsn) + uri, err := url.Parse(cfg.DSN) if err != nil { return nil, fmt.Errorf("could not parse dsn: %w", err) } @@ -34,31 +39,29 @@ func newConfig(dsn string, client activity.Client) (*config, error) { return nil, fmt.Errorf("could not parse dsn: %w", err) } - // If poolSizeKey is in the DSN, parse and remove it - poolSize := 1 - if qry.Has(poolSizeKey) { + // Infer DBFilePath + cfg.DBFilePath = uri.Path + + // We also support overriding the pool size via the DSN by setting "rill_pool_size" as a query argument. + if qry.Has("rill_pool_size") { // Parse as integer - poolSize, err = strconv.Atoi(qry.Get(poolSizeKey)) + cfg.PoolSize, err = strconv.Atoi(qry.Get("rill_pool_size")) if err != nil { - return nil, fmt.Errorf("duckdb Driver: %s is not an integer", poolSizeKey) + return nil, fmt.Errorf("could not parse dsn: 'rill_pool_size' is not an integer") } + // Remove from query string (so not passed into DuckDB config) - qry.Del(poolSizeKey) - } - if poolSize < 1 { - return nil, fmt.Errorf("%s must be >= 1", poolSizeKey) - } + qry.Del("rill_pool_size") - // Rebuild DuckDB DSN (which should be "path?key=val&...") - uri.RawQuery = qry.Encode() - dsn = uri.String() + // Rebuild DuckDB DSN (which should be "path?key=val&...") + uri.RawQuery = qry.Encode() + cfg.DSN = uri.String() + } - // Return config - cfg := &config{ - DSN: dsn, - PoolSize: poolSize, - DBFilePath: uri.Path, - Activity: client, + // Check pool size + if cfg.PoolSize < 1 { + return nil, fmt.Errorf("duckdb pool size must be >= 1") } + return cfg, nil } diff --git a/runtime/drivers/duckdb/config_test.go b/runtime/drivers/duckdb/config_test.go index 25810a4029d..633cd39154a 100644 --- a/runtime/drivers/duckdb/config_test.go +++ b/runtime/drivers/duckdb/config_test.go @@ -3,50 +3,58 @@ package duckdb import ( "testing" - "github.com/rilldata/rill/runtime/pkg/activity" "github.com/stretchr/testify/require" ) func TestConfig(t *testing.T) { - cfg, err := newConfig("", nil) + cfg, err := newConfig(map[string]any{}) require.NoError(t, err) require.Equal(t, "", cfg.DSN) require.Equal(t, 1, cfg.PoolSize) - cfg, err = newConfig("path/to/duck.db", nil) + cfg, err = newConfig(map[string]any{"dsn": "path/to/duck.db"}) require.NoError(t, err) require.Equal(t, "path/to/duck.db", cfg.DSN) require.Equal(t, "path/to/duck.db", cfg.DBFilePath) require.Equal(t, 1, cfg.PoolSize) - cfg, err = newConfig("path/to/duck.db?rill_pool_size=10", nil) + cfg, err = newConfig(map[string]any{"dsn": "path/to/duck.db", "pool_size": 10}) require.NoError(t, err) require.Equal(t, "path/to/duck.db", cfg.DSN) require.Equal(t, "path/to/duck.db", cfg.DBFilePath) require.Equal(t, 10, cfg.PoolSize) - cfg, err = newConfig("path/to/duck.db?rill_pool_size=10&hello=world", nil) + cfg, err = newConfig(map[string]any{"dsn": "path/to/duck.db", "pool_size": "10"}) require.NoError(t, err) - require.Equal(t, "path/to/duck.db?hello=world", cfg.DSN) + require.Equal(t, 10, cfg.PoolSize) + + cfg, err = newConfig(map[string]any{"dsn": "path/to/duck.db?rill_pool_size=4", "pool_size": "10"}) + require.NoError(t, err) + require.Equal(t, 4, cfg.PoolSize) + + cfg, err = newConfig(map[string]any{"dsn": "path/to/duck.db?rill_pool_size=10"}) + require.NoError(t, err) + require.Equal(t, "path/to/duck.db", cfg.DSN) + require.Equal(t, "path/to/duck.db", cfg.DBFilePath) + require.Equal(t, 10, cfg.PoolSize) + + cfg, err = newConfig(map[string]any{"dsn": "path/to/duck.db?max_memory=4GB&rill_pool_size=10"}) + require.NoError(t, err) + require.Equal(t, "path/to/duck.db?max_memory=4GB", cfg.DSN) require.Equal(t, 10, cfg.PoolSize) require.Equal(t, "path/to/duck.db", cfg.DBFilePath) - _, err = newConfig("path/to/duck.db?rill_pool_size=abc&hello=world", nil) + _, err = newConfig(map[string]any{"dsn": "path/to/duck.db?max_memory=4GB", "pool_size": "abc"}) require.Error(t, err) - _, err = newConfig("path/to/duck.db?rill_pool_size=0&hello=world", nil) + _, err = newConfig(map[string]any{"dsn": "path/to/duck.db?max_memory=4GB", "pool_size": 0}) require.Error(t, err) - cfg, err = newConfig("duck.db", nil) + cfg, err = newConfig(map[string]any{"dsn": "duck.db"}) require.NoError(t, err) require.Equal(t, "duck.db", cfg.DBFilePath) - cfg, err = newConfig("duck.db?rill_pool_size=10", nil) + cfg, err = newConfig(map[string]any{"dsn": "duck.db?rill_pool_size=10"}) require.NoError(t, err) require.Equal(t, "duck.db", cfg.DBFilePath) - - client := activity.NewNoopClient() - cfg, err = newConfig("path/to/duck.db", client) - require.NoError(t, err) - require.Equal(t, client, cfg.Activity) } diff --git a/runtime/drivers/duckdb/duckdb.go b/runtime/drivers/duckdb/duckdb.go index e8b7bebbb25..0b9e104718d 100644 --- a/runtime/drivers/duckdb/duckdb.go +++ b/runtime/drivers/duckdb/duckdb.go @@ -55,16 +55,12 @@ type Driver struct { name string } -func (d Driver) Open(config map[string]any, shared bool, client activity.Client, logger *zap.Logger) (drivers.Handle, error) { +func (d Driver) Open(cfgMap map[string]any, shared bool, ac activity.Client, logger *zap.Logger) (drivers.Handle, error) { if shared { return nil, fmt.Errorf("duckdb driver can't be shared") } - dsn, ok := config["dsn"].(string) - if !ok { - return nil, fmt.Errorf("require dsn to open duckdb connection") - } - cfg, err := newConfig(dsn, client) + cfg, err := newConfig(cfgMap) if err != nil { return nil, err } @@ -77,16 +73,18 @@ func (d Driver) Open(config map[string]any, shared bool, client activity.Client, ctx, cancel := context.WithCancel(context.Background()) c := &connection{ - config: cfg, - logger: logger, - metaSem: semaphore.NewWeighted(1), - olapSem: priorityqueue.NewSemaphore(olapSemSize), - dbCond: sync.NewCond(&sync.Mutex{}), - driverConfig: config, - driverName: d.name, - shared: shared, - ctx: ctx, - cancel: cancel, + config: cfg, + logger: logger, + activity: ac, + metaSem: semaphore.NewWeighted(1), + olapSem: priorityqueue.NewSemaphore(olapSemSize), + longRunningSem: semaphore.NewWeighted(1), // Currently hard-coded to 1 + dbCond: sync.NewCond(&sync.Mutex{}), + driverConfig: cfgMap, + driverName: d.name, + shared: shared, + ctx: ctx, + cancel: cancel, } // Open the DB @@ -111,13 +109,8 @@ func (d Driver) Open(config map[string]any, shared bool, client activity.Client, return c, nil } -func (d Driver) Drop(config map[string]any, logger *zap.Logger) error { - dsn, ok := config["dsn"].(string) - if !ok { - return fmt.Errorf("require dsn to drop duckdb connection") - } - - cfg, err := newConfig(dsn, nil) +func (d Driver) Drop(cfgMap map[string]any, logger *zap.Logger) error { + cfg, err := newConfig(cfgMap) if err != nil { return err } @@ -138,7 +131,7 @@ func (d Driver) Spec() drivers.Spec { return spec } -func (d Driver) HasAnonymousSourceAccess(ctx context.Context, src drivers.Source, logger *zap.Logger) (bool, error) { +func (d Driver) HasAnonymousSourceAccess(ctx context.Context, src map[string]any, logger *zap.Logger) (bool, error) { return false, nil } @@ -148,8 +141,9 @@ type connection struct { driverConfig map[string]any driverName string // config is parsed configs - config *config - logger *zap.Logger + config *config + logger *zap.Logger + activity activity.Client // This driver may issue both OLAP and "meta" queries (like catalog info) against DuckDB. // Meta queries are usually fast, but OLAP queries may take a long time. To enable predictable parallel performance, // we gate queries with semaphores that limits the number of concurrent queries of each type. @@ -158,6 +152,12 @@ type connection struct { // This creates contention for the same connection in database/sql's pool, but its locks will handle that. metaSem *semaphore.Weighted olapSem *priorityqueue.Semaphore + // The OLAP interface additionally provides an option to limit the number of long-running queries, as designated by the caller. + // longRunningSem enforces this limitation. + longRunningSem *semaphore.Weighted + // The OLAP interface also provides an option to acquire a connection "transactionally". + // We've run into issues with DuckDB freezing up on transactions, so we just use a lock for now to serialize them (inconsistency in case of crashes is acceptable). + txMu sync.RWMutex // If DuckDB encounters a fatal error, all queries will fail until the DB has been reopened. // When dbReopen is set to true, dbCond will be used to stop acquisition of new connections, // and then when dbConnCount becomes 0, the DB will be reopened and dbReopen set to false again. @@ -279,6 +279,12 @@ func (c *connection) reopenDB() error { "SET timezone='UTC'", } + // We want to set preserve_insertion_order=false in hosted environments only (where source data is never viewed directly). Setting it reduces batch data ingestion time by ~40%. + // Hack: Using AllowHostAccess as a proxy indicator for a hosted environment. + if !c.config.AllowHostAccess { + bootQueries = append(bootQueries, "SET preserve_insertion_order TO false") + } + // DuckDB extensions need to be loaded separately on each connection, but the built-in connection pool in database/sql doesn't enable that. // So we use go-duckdb's custom connector to pass a callback that it invokes for each new connection. connector, err := duckdb.NewConnector(c.config.DSN, func(execer driver.ExecerContext) error { @@ -347,30 +353,64 @@ func (c *connection) acquireMetaConn(ctx context.Context) (*sqlx.Conn, func() er // acquireOLAPConn gets a connection from the pool for OLAP queries (i.e. slow queries). // It returns a function that puts the connection back in the pool (if applicable). -func (c *connection) acquireOLAPConn(ctx context.Context, priority int) (*sqlx.Conn, func() error, error) { +func (c *connection) acquireOLAPConn(ctx context.Context, priority int, longRunning, tx bool) (*sqlx.Conn, func() error, error) { // Try to get conn from context (means the call is wrapped in WithConnection) conn := connFromContext(ctx) if conn != nil { return conn, func() error { return nil }, nil } + // Acquire long-running semaphore if applicable + if longRunning { + err := c.longRunningSem.Acquire(ctx, 1) + if err != nil { + return nil, nil, err + } + } + // Acquire semaphore err := c.olapSem.Acquire(ctx, priority) if err != nil { + if longRunning { + c.longRunningSem.Release(1) + } return nil, nil, err } + // Poor man's transaction support – see struct docstring for details + if tx { + c.txMu.Lock() + } else { + c.txMu.RLock() + } + // Get new conn conn, releaseConn, err := c.acquireConn(ctx) if err != nil { + if tx { + c.txMu.Unlock() + } else { + c.txMu.RUnlock() + } c.olapSem.Release() + if longRunning { + c.longRunningSem.Release(1) + } return nil, nil, err } // Build release func release := func() error { err := releaseConn() + if tx { + c.txMu.Unlock() + } else { + c.txMu.RUnlock() + } c.olapSem.Release() + if longRunning { + c.longRunningSem.Release(1) + } return err } @@ -439,7 +479,7 @@ func (c *connection) checkErr(err error) error { // Periodically collects stats using pragma_database_size() and emits as activity events func (c *connection) periodicallyEmitStats(d time.Duration) { - if c.config.Activity == nil { + if c.activity == nil { // Activity client isn't set, there is no need to report stats return } @@ -473,37 +513,37 @@ func (c *connection) periodicallyEmitStats(d time.Duration) { if err != nil { c.logger.Error("couldn't convert duckdb size to bytes", zap.Error(err)) } else { - c.config.Activity.Emit(c.ctx, "duckdb_size_bytes", dbSize, commonDims...) + c.activity.Emit(c.ctx, "duckdb_size_bytes", dbSize, commonDims...) } walSize, err := humanReadableSizeToBytes(stat.WalSize) if err != nil { c.logger.Error("couldn't convert duckdb wal size to bytes", zap.Error(err)) } else { - c.config.Activity.Emit(c.ctx, "duckdb_wal_size_bytes", walSize, commonDims...) + c.activity.Emit(c.ctx, "duckdb_wal_size_bytes", walSize, commonDims...) } memoryUsage, err := humanReadableSizeToBytes(stat.MemoryUsage) if err != nil { c.logger.Error("couldn't convert duckdb memory usage to bytes", zap.Error(err)) } else { - c.config.Activity.Emit(c.ctx, "duckdb_memory_usage_bytes", memoryUsage, commonDims...) + c.activity.Emit(c.ctx, "duckdb_memory_usage_bytes", memoryUsage, commonDims...) } memoryLimit, err := humanReadableSizeToBytes(stat.MemoryLimit) if err != nil { c.logger.Error("couldn't convert duckdb memory limit to bytes", zap.Error(err)) } else { - c.config.Activity.Emit(c.ctx, "duckdb_memory_limit_bytes", memoryLimit, commonDims...) + c.activity.Emit(c.ctx, "duckdb_memory_limit_bytes", memoryLimit, commonDims...) } - c.config.Activity.Emit(c.ctx, "duckdb_block_size_bytes", float64(stat.BlockSize), commonDims...) - c.config.Activity.Emit(c.ctx, "duckdb_total_blocks", float64(stat.TotalBlocks), commonDims...) - c.config.Activity.Emit(c.ctx, "duckdb_free_blocks", float64(stat.FreeBlocks), commonDims...) - c.config.Activity.Emit(c.ctx, "duckdb_used_blocks", float64(stat.UsedBlocks), commonDims...) + c.activity.Emit(c.ctx, "duckdb_block_size_bytes", float64(stat.BlockSize), commonDims...) + c.activity.Emit(c.ctx, "duckdb_total_blocks", float64(stat.TotalBlocks), commonDims...) + c.activity.Emit(c.ctx, "duckdb_free_blocks", float64(stat.FreeBlocks), commonDims...) + c.activity.Emit(c.ctx, "duckdb_used_blocks", float64(stat.UsedBlocks), commonDims...) estimatedDBSize, _ := c.EstimateSize() - c.config.Activity.Emit(c.ctx, "duckdb_estimated_size_bytes", float64(estimatedDBSize)) + c.activity.Emit(c.ctx, "duckdb_estimated_size_bytes", float64(estimatedDBSize)) case <-c.ctx.Done(): statTicker.Stop() diff --git a/runtime/drivers/duckdb/duckdb_test.go b/runtime/drivers/duckdb/duckdb_test.go index f2512d6e5f6..322329d980f 100644 --- a/runtime/drivers/duckdb/duckdb_test.go +++ b/runtime/drivers/duckdb/duckdb_test.go @@ -17,9 +17,9 @@ import ( func TestOpenDrop(t *testing.T) { path := filepath.Join(t.TempDir(), "tmp.db") walpath := path + ".wal" - dsn := path + "?rill_pool_size=2" + dsn := path - handle, err := Driver{}.Open(map[string]any{"dsn": dsn}, false, activity.NewNoopClient(), zap.NewNop()) + handle, err := Driver{}.Open(map[string]any{"dsn": dsn, "pool_size": 2}, false, activity.NewNoopClient(), zap.NewNop()) require.NoError(t, err) olap, ok := handle.AsOLAP("") @@ -42,10 +42,9 @@ func TestOpenDrop(t *testing.T) { func TestFatalErr(t *testing.T) { // NOTE: Using this issue to create a fatal error: https://github.com/duckdb/duckdb/issues/7905 - path := filepath.Join(t.TempDir(), "tmp.db") - dsn := path + "?rill_pool_size=2" + dsn := filepath.Join(t.TempDir(), "tmp.db") - handle, err := Driver{}.Open(map[string]any{"dsn": dsn}, false, activity.NewNoopClient(), zap.NewNop()) + handle, err := Driver{}.Open(map[string]any{"dsn": dsn, "pool_size": 2}, false, activity.NewNoopClient(), zap.NewNop()) require.NoError(t, err) olap, ok := handle.AsOLAP("") @@ -105,10 +104,9 @@ func TestFatalErr(t *testing.T) { func TestFatalErrConcurrent(t *testing.T) { // NOTE: Using this issue to create a fatal error: https://github.com/duckdb/duckdb/issues/7905 - path := filepath.Join(t.TempDir(), "tmp.db") - dsn := path + "?rill_pool_size=3" + dsn := filepath.Join(t.TempDir(), "tmp.db") - handle, err := Driver{}.Open(map[string]any{"dsn": dsn}, false, activity.NewNoopClient(), zap.NewNop()) + handle, err := Driver{}.Open(map[string]any{"dsn": dsn, "pool_size": 3}, false, activity.NewNoopClient(), zap.NewNop()) require.NoError(t, err) olap, ok := handle.AsOLAP("") @@ -165,7 +163,7 @@ func TestFatalErrConcurrent(t *testing.T) { LEFT JOIN d ON b.b12 = d.d1 WHERE d.d2 IN (''); ` - err1 = olap.WithConnection(context.Background(), 0, func(ctx, ensuredCtx context.Context, _ *sql.Conn) error { + err1 = olap.WithConnection(context.Background(), 0, false, false, func(ctx, ensuredCtx context.Context, _ *sql.Conn) error { time.Sleep(500 * time.Millisecond) return olap.Exec(ctx, &drivers.Statement{Query: qry}) }) @@ -178,21 +176,21 @@ func TestFatalErrConcurrent(t *testing.T) { var err2 error go func() { qry := `SELECT * FROM a;` - err2 = olap.WithConnection(context.Background(), 0, func(ctx, ensuredCtx context.Context, _ *sql.Conn) error { + err2 = olap.WithConnection(context.Background(), 0, false, false, func(ctx, ensuredCtx context.Context, _ *sql.Conn) error { time.Sleep(1000 * time.Millisecond) return olap.Exec(ctx, &drivers.Statement{Query: qry}) }) wg.Done() }() - // Func 3 acquires conn after 250ms and runs query immediately. It will be enqueued (because the OLAP conns limit is rill_pool_size-1 = 2). + // Func 3 acquires conn after 250ms and runs query immediately. It will be enqueued (because the OLAP conns limit is pool_size-1 = 2). // By the time it's dequeued, the DB will have been invalidated, and it will wait for the reopen before returning a conn. So the query should succeed. wg.Add(1) var err3 error go func() { time.Sleep(250 * time.Millisecond) qry := `SELECT * FROM a;` - err3 = olap.WithConnection(context.Background(), 0, func(ctx, ensuredCtx context.Context, _ *sql.Conn) error { + err3 = olap.WithConnection(context.Background(), 0, false, false, func(ctx, ensuredCtx context.Context, _ *sql.Conn) error { return olap.Exec(ctx, &drivers.Statement{Query: qry}) }) wg.Done() diff --git a/runtime/drivers/duckdb/olap.go b/runtime/drivers/duckdb/olap.go index f90e69609d4..5ea3ae40dcf 100644 --- a/runtime/drivers/duckdb/olap.go +++ b/runtime/drivers/duckdb/olap.go @@ -30,14 +30,14 @@ func (c *connection) Dialect() drivers.Dialect { return drivers.DialectDuckDB } -func (c *connection) WithConnection(ctx context.Context, priority int, fn drivers.WithConnectionFunc) error { +func (c *connection) WithConnection(ctx context.Context, priority int, longRunning, tx bool, fn drivers.WithConnectionFunc) error { // Check not nested if connFromContext(ctx) != nil { panic("nested WithConnection") } // Acquire connection - conn, release, err := c.acquireOLAPConn(ctx, priority) + conn, release, err := c.acquireOLAPConn(ctx, priority, longRunning, tx) if err != nil { return err } @@ -90,23 +90,33 @@ func (c *connection) Execute(ctx context.Context, stmt *drivers.Statement) (res totalLatency := time.Since(start).Milliseconds() queueLatency := acquiredTime.Sub(start).Milliseconds() - attrs := attribute.NewSet( + attrs := []attribute.KeyValue{ attribute.String("db", c.config.DBFilePath), attribute.Bool("cancelled", errors.Is(outErr, context.Canceled)), attribute.Bool("failed", outErr != nil), - ) + } + + attrSet := attribute.NewSet(attrs...) - queriesCounter.Add(ctx, 1, metric.WithAttributeSet(attrs)) - queueLatencyHistogram.Record(ctx, queueLatency, metric.WithAttributeSet(attrs)) - totalLatencyHistogram.Record(ctx, totalLatency, metric.WithAttributeSet(attrs)) + queriesCounter.Add(ctx, 1, metric.WithAttributeSet(attrSet)) + queueLatencyHistogram.Record(ctx, queueLatency, metric.WithAttributeSet(attrSet)) + totalLatencyHistogram.Record(ctx, totalLatency, metric.WithAttributeSet(attrSet)) if acquired { // Only track query latency when not cancelled in queue - queryLatencyHistogram.Record(ctx, totalLatency-queueLatency, metric.WithAttributeSet(attrs)) + queryLatencyHistogram.Record(ctx, totalLatency-queueLatency, metric.WithAttributeSet(attrSet)) + } + + if c.activity != nil { + c.activity.Emit(ctx, "duckdb_queue_latency_ms", float64(queueLatency), attrs...) + c.activity.Emit(ctx, "duckdb_total_latency_ms", float64(totalLatency), attrs...) + if acquired { + c.activity.Emit(ctx, "duckdb_query_latency_ms", float64(totalLatency-queueLatency), attrs...) + } } }() // Acquire connection - conn, release, err := c.acquireOLAPConn(ctx, stmt.Priority) + conn, release, err := c.acquireOLAPConn(ctx, stmt.Priority, stmt.LongRunning, false) acquiredTime = time.Now() if err != nil { return nil, err diff --git a/runtime/drivers/duckdb/olap_test.go b/runtime/drivers/duckdb/olap_test.go index 12be8a3f824..485efb7cb73 100644 --- a/runtime/drivers/duckdb/olap_test.go +++ b/runtime/drivers/duckdb/olap_test.go @@ -204,7 +204,7 @@ func TestClose(t *testing.T) { } func prepareConn(t *testing.T) drivers.Handle { - conn, err := Driver{}.Open(map[string]any{"dsn": "?access_mode=read_write&rill_pool_size=4"}, false, activity.NewNoopClient(), zap.NewNop()) + conn, err := Driver{}.Open(map[string]any{"dsn": "?access_mode=read_write", "pool_size": 4}, false, activity.NewNoopClient(), zap.NewNop()) require.NoError(t, err) olap, ok := conn.AsOLAP("") diff --git a/runtime/drivers/duckdb/transporter/duckDB_to_duckDB.go b/runtime/drivers/duckdb/transporter/duckDB_to_duckDB.go index 8720f2bc179..39e9a59a87a 100644 --- a/runtime/drivers/duckdb/transporter/duckDB_to_duckDB.go +++ b/runtime/drivers/duckdb/transporter/duckDB_to_duckDB.go @@ -22,16 +22,17 @@ func NewDuckDBToDuckDB(to drivers.OLAPStore, logger *zap.Logger) drivers.Transpo var _ drivers.Transporter = &duckDBToDuckDB{} -func (t *duckDBToDuckDB) Transfer(ctx context.Context, source drivers.Source, sink drivers.Sink, opts *drivers.TransferOpts, p drivers.Progress) error { - src, ok := source.DatabaseSource() - if !ok { - return fmt.Errorf("type of source should `drivers.DatabaseSource`") +func (t *duckDBToDuckDB) Transfer(ctx context.Context, srcProps, sinkProps map[string]any, opts *drivers.TransferOpts, p drivers.Progress) error { + srcCfg, err := parseSourceProperties(srcProps) + if err != nil { + return err } - fSink, ok := sink.DatabaseSink() - if !ok { - return fmt.Errorf("type of source should `drivers.DatabaseSink`") + + sinkCfg, err := parseSinkProperties(sinkProps) + if err != nil { + return err } - qry := fmt.Sprintf("CREATE OR REPLACE TABLE %s AS (%s)", safeName(fSink.Table), src.SQL) - return t.to.Exec(ctx, &drivers.Statement{Query: qry, Priority: 1}) + qry := fmt.Sprintf("CREATE OR REPLACE TABLE %s AS (%s)", safeName(sinkCfg.Table), srcCfg.SQL) + return t.to.Exec(ctx, &drivers.Statement{Query: qry, Priority: 1, LongRunning: true}) } diff --git a/runtime/drivers/duckdb/transporter/filestore_to_duckDB.go b/runtime/drivers/duckdb/transporter/filestore_to_duckDB.go index 6bd7f98305b..344b4276a64 100644 --- a/runtime/drivers/duckdb/transporter/filestore_to_duckDB.go +++ b/runtime/drivers/duckdb/transporter/filestore_to_duckDB.go @@ -25,17 +25,13 @@ func NewFileStoreToDuckDB(from drivers.FileStore, to drivers.OLAPStore, logger * var _ drivers.Transporter = &fileStoreToDuckDB{} -func (t *fileStoreToDuckDB) Transfer(ctx context.Context, source drivers.Source, sink drivers.Sink, opts *drivers.TransferOpts, p drivers.Progress) error { - src, ok := source.FileSource() - if !ok { - return fmt.Errorf("type of source should be `drivers.FilesSource`") - } - fSink, ok := sink.DatabaseSink() - if !ok { - return fmt.Errorf("type of source should be `drivers.DatabaseSink`") +func (t *fileStoreToDuckDB) Transfer(ctx context.Context, srcProps, sinkProps map[string]any, opts *drivers.TransferOpts, p drivers.Progress) error { + sinkCfg, err := parseSinkProperties(sinkProps) + if err != nil { + return err } - localPaths, err := t.from.FilePaths(ctx, src) + localPaths, err := t.from.FilePaths(ctx, srcProps) if err != nil { return err } @@ -51,14 +47,14 @@ func (t *fileStoreToDuckDB) Transfer(ctx context.Context, source drivers.Source, p.Target(size, drivers.ProgressUnitByte) var format string - if val, ok := src.Properties["format"].(string); ok { + if val, ok := srcProps["format"].(string); ok { format = fmt.Sprintf(".%s", val) } else { format = fileutil.FullExt(localPaths[0]) } var ingestionProps map[string]any - if duckDBProps, ok := src.Properties["duckdb"].(map[string]any); ok { + if duckDBProps, ok := srcProps["duckdb"].(map[string]any); ok { ingestionProps = duckDBProps } else { ingestionProps = map[string]any{} @@ -70,8 +66,8 @@ func (t *fileStoreToDuckDB) Transfer(ctx context.Context, source drivers.Source, return err } - qry := fmt.Sprintf("CREATE OR REPLACE TABLE %s AS (SELECT * FROM %s)", safeName(fSink.Table), from) - err = t.to.Exec(ctx, &drivers.Statement{Query: qry, Priority: 1}) + qry := fmt.Sprintf("CREATE OR REPLACE TABLE %s AS (SELECT * FROM %s)", safeName(sinkCfg.Table), from) + err = t.to.Exec(ctx, &drivers.Statement{Query: qry, Priority: 1, LongRunning: true}) if err != nil { return err } diff --git a/runtime/drivers/duckdb/transporter/motherduck_to_duckDB.go b/runtime/drivers/duckdb/transporter/motherduck_to_duckDB.go index ff9317da8d0..c3dc282fdbd 100644 --- a/runtime/drivers/duckdb/transporter/motherduck_to_duckDB.go +++ b/runtime/drivers/duckdb/transporter/motherduck_to_duckDB.go @@ -27,19 +27,20 @@ func NewMotherduckToDuckDB(from drivers.Handle, to drivers.OLAPStore, logger *za } } -// TODO :: should it run count from user_query to set target in progress ? -func (t *motherduckToDuckDB) Transfer(ctx context.Context, source drivers.Source, sink drivers.Sink, opts *drivers.TransferOpts, p drivers.Progress) error { - src, ok := source.DatabaseSource() - if !ok { - return fmt.Errorf("type of source should `drivers.DatabaseSource`") +// TODO: should it run count from user_query to set target in progress ? +func (t *motherduckToDuckDB) Transfer(ctx context.Context, srcProps, sinkProps map[string]any, opts *drivers.TransferOpts, p drivers.Progress) error { + srcCfg, err := parseSourceProperties(srcProps) + if err != nil { + return err } - fSink, ok := sink.DatabaseSink() - if !ok { - return fmt.Errorf("type of source should `drivers.DatabaseSink`") + + sinkCfg, err := parseSinkProperties(sinkProps) + if err != nil { + return err } config := t.from.Config() - err := t.to.WithConnection(ctx, 1, func(ctx, ensuredCtx context.Context, _ *sql.Conn) error { + err = t.to.WithConnection(ctx, 1, true, false, func(ctx, ensuredCtx context.Context, _ *sql.Conn) error { res, err := t.to.Execute(ctx, &drivers.Statement{Query: "SELECT current_database();"}) if err != nil { return err @@ -76,7 +77,7 @@ func (t *motherduckToDuckDB) Transfer(ctx context.Context, source drivers.Source var names []string - db := src.Database + db := srcCfg.Database if db == "" { // get list of all motherduck databases res, err = t.to.Execute(ctx, &drivers.Statement{Query: "SELECT name FROM md_databases();"}) @@ -112,13 +113,13 @@ func (t *motherduckToDuckDB) Transfer(ctx context.Context, source drivers.Source }(ensuredCtx) } - if src.SQL == "" { - return fmt.Errorf("property \"query\" is mandatory for connector \"motherduck\"") + if srcCfg.SQL == "" { + return fmt.Errorf("property \"sql\" is mandatory for connector \"motherduck\"") } - userQuery := strings.TrimSpace(src.SQL) + userQuery := strings.TrimSpace(srcCfg.SQL) userQuery, _ = strings.CutSuffix(userQuery, ";") // trim trailing semi colon - query := fmt.Sprintf("CREATE OR REPLACE TABLE %s.%s AS (%s);", safeName(localDB), safeName(fSink.Table), userQuery) + query := fmt.Sprintf("CREATE OR REPLACE TABLE %s.%s AS (%s);", safeName(localDB), safeName(sinkCfg.Table), userQuery) return t.to.Exec(ctx, &drivers.Statement{Query: query}) }) return err diff --git a/runtime/drivers/duckdb/transporter/objectStore_to_duckDB.go b/runtime/drivers/duckdb/transporter/objectStore_to_duckDB.go index ecacec43f61..cf28daac58e 100644 --- a/runtime/drivers/duckdb/transporter/objectStore_to_duckDB.go +++ b/runtime/drivers/duckdb/transporter/objectStore_to_duckDB.go @@ -8,6 +8,7 @@ import ( "strings" "time" + "github.com/c2h5oh/datasize" "github.com/rilldata/rill/runtime/drivers" "github.com/rilldata/rill/runtime/drivers/athena" "github.com/rilldata/rill/runtime/pkg/duckdbsql" @@ -32,17 +33,13 @@ func NewObjectStoreToDuckDB(from drivers.ObjectStore, to drivers.OLAPStore, logg } } -func (t *objectStoreToDuckDB) Transfer(ctx context.Context, source drivers.Source, sink drivers.Sink, opts *drivers.TransferOpts, p drivers.Progress) error { - src, ok := source.BucketSource() - if !ok { - return fmt.Errorf("type of source should be `drivers.BucketSource`") - } - dbSink, ok := sink.DatabaseSink() - if !ok { - return fmt.Errorf("type of source should be `drivers.DatabaseSink`") +func (t *objectStoreToDuckDB) Transfer(ctx context.Context, srcProps, sinkProps map[string]any, opts *drivers.TransferOpts, p drivers.Progress) error { + sinkCfg, err := parseSinkProperties(sinkProps) + if err != nil { + return err } - iterator, err := t.from.DownloadFiles(ctx, src) + iterator, err := t.from.DownloadFiles(ctx, srcProps) if err != nil { return err } @@ -63,7 +60,7 @@ func (t *objectStoreToDuckDB) Transfer(ctx context.Context, source drivers.Sourc p.Target(size, drivers.ProgressUnitByte) appendToTable := false var format string - val, formatDefined := src.Properties["format"].(string) + val, formatDefined := srcProps["format"].(string) if formatDefined { format = fmt.Sprintf(".%s", val) } else if fromAthena { @@ -71,13 +68,13 @@ func (t *objectStoreToDuckDB) Transfer(ctx context.Context, source drivers.Sourc formatDefined = true } - allowSchemaRelaxation, err := schemaRelaxationProperty(src.Properties) + allowSchemaRelaxation, err := schemaRelaxationProperty(srcProps) if err != nil { return err } var ingestionProps map[string]any - if duckDBProps, ok := src.Properties["duckdb"].(map[string]any); ok { + if duckDBProps, ok := srcProps["duckdb"].(map[string]any); ok { ingestionProps = duckDBProps } else { ingestionProps = map[string]any{} @@ -87,10 +84,18 @@ func (t *objectStoreToDuckDB) Transfer(ctx context.Context, source drivers.Sourc ingestionProps["union_by_name"] = true } - a := newAppender(t.to, dbSink, ingestionProps, allowSchemaRelaxation, t.logger) + a := newAppender(t.to, sinkCfg, ingestionProps, allowSchemaRelaxation, t.logger) + batchSize := opts.IteratorBatchSizeInBytes + if val, ok := srcProps["batch_size"].(string); ok { + b, err := datasize.ParseString(val) + if err != nil { + return err + } + batchSize = int64(b.Bytes()) + } for iterator.HasNext() { - files, err := iterator.NextBatch(opts.IteratorBatch) + files, err := iterator.NextBatchSize(batchSize) if err != nil { return err } @@ -114,8 +119,8 @@ func (t *objectStoreToDuckDB) Transfer(ctx context.Context, source drivers.Sourc return err } - query := fmt.Sprintf("CREATE OR REPLACE TABLE %s AS (SELECT * FROM %s);", safeName(dbSink.Table), from) - if err := t.to.Exec(ctx, &drivers.Statement{Query: query, Priority: 1}); err != nil { + query := fmt.Sprintf("CREATE OR REPLACE TABLE %s AS (SELECT * FROM %s);", safeName(sinkCfg.Table), from) + if err := t.to.Exec(ctx, &drivers.Statement{Query: query, Priority: 1, LongRunning: true}); err != nil { return err } } @@ -130,14 +135,14 @@ func (t *objectStoreToDuckDB) Transfer(ctx context.Context, source drivers.Sourc type appender struct { to drivers.OLAPStore - sink *drivers.DatabaseSink + sink *sinkProperties ingestionProps map[string]any allowSchemaRelaxation bool tableSchema map[string]string logger *zap.Logger } -func newAppender(to drivers.OLAPStore, sink *drivers.DatabaseSink, ingestionProps map[string]any, +func newAppender(to drivers.OLAPStore, sink *sinkProperties, ingestionProps map[string]any, allowSchemaRelaxation bool, logger *zap.Logger, ) *appender { return &appender{ @@ -163,7 +168,7 @@ func (a *appender) appendData(ctx context.Context, files []string, format string query = fmt.Sprintf("INSERT INTO %s (SELECT * FROM %s);", safeName(a.sink.Table), from) } a.logger.Debug("generated query", zap.String("query", query), observability.ZapCtx(ctx)) - err = a.to.Exec(ctx, &drivers.Statement{Query: query, Priority: 1}) + err = a.to.Exec(ctx, &drivers.Statement{Query: query, Priority: 1, LongRunning: true}) if err == nil || !a.allowSchemaRelaxation || !containsAny(err.Error(), []string{"binder error", "conversion error"}) { return err } @@ -177,7 +182,7 @@ func (a *appender) appendData(ctx context.Context, files []string, format string query = fmt.Sprintf("INSERT INTO %s BY NAME (SELECT * FROM %s);", safeName(a.sink.Table), from) a.logger.Debug("generated query", zap.String("query", query), observability.ZapCtx(ctx)) - return a.to.Exec(ctx, &drivers.Statement{Query: query, Priority: 1}) + return a.to.Exec(ctx, &drivers.Statement{Query: query, Priority: 1, LongRunning: true}) } // updateSchema updates the schema of the table in case new file adds a new column or @@ -238,7 +243,7 @@ func (a *appender) updateSchema(ctx context.Context, from string, fileNames []st for colName, colType := range newCols { a.tableSchema[colName] = colType qry := fmt.Sprintf("ALTER TABLE %s ADD COLUMN %s %s", safeName(a.sink.Table), safeName(colName), colType) - if err := a.to.Exec(ctx, &drivers.Statement{Query: qry}); err != nil { + if err := a.to.Exec(ctx, &drivers.Statement{Query: qry, LongRunning: true}); err != nil { return err } } @@ -246,7 +251,7 @@ func (a *appender) updateSchema(ctx context.Context, from string, fileNames []st for colName, colType := range colTypeChanged { a.tableSchema[colName] = colType qry := fmt.Sprintf("ALTER TABLE %s ALTER COLUMN %s SET DATA TYPE %s", safeName(a.sink.Table), safeName(colName), colType) - if err := a.to.Exec(ctx, &drivers.Statement{Query: qry}); err != nil { + if err := a.to.Exec(ctx, &drivers.Statement{Query: qry, LongRunning: true}); err != nil { return err } } @@ -255,7 +260,7 @@ func (a *appender) updateSchema(ctx context.Context, from string, fileNames []st } func (a *appender) scanSchemaFromQuery(ctx context.Context, qry string) (map[string]string, error) { - result, err := a.to.Execute(ctx, &drivers.Statement{Query: qry, Priority: 1}) + result, err := a.to.Execute(ctx, &drivers.Statement{Query: qry, Priority: 1, LongRunning: true}) if err != nil { return nil, err } @@ -281,7 +286,7 @@ func (t *objectStoreToDuckDB) ingestDuckDBSQL( ctx context.Context, originalSQL string, iterator drivers.FileIterator, - dbSink *drivers.DatabaseSink, + dbSink *sinkProperties, opts *drivers.TransferOpts, p drivers.Progress, ) error { @@ -332,7 +337,7 @@ func (t *objectStoreToDuckDB) ingestDuckDBSQL( st := time.Now() query := fmt.Sprintf("CREATE OR REPLACE TABLE %s AS (%s);", dbSink.Table, sql) - err = t.to.Exec(ctx, &drivers.Statement{Query: query, Priority: 1}) + err = t.to.Exec(ctx, &drivers.Statement{Query: query, Priority: 1, LongRunning: true}) if err != nil { return err } diff --git a/runtime/drivers/duckdb/transporter/sqlstore_to_duckDB.go b/runtime/drivers/duckdb/transporter/sqlstore_to_duckDB.go index 5d0de761bf6..4b5fc99356d 100644 --- a/runtime/drivers/duckdb/transporter/sqlstore_to_duckDB.go +++ b/runtime/drivers/duckdb/transporter/sqlstore_to_duckDB.go @@ -27,24 +27,20 @@ func NewSQLStoreToDuckDB(from drivers.SQLStore, to drivers.OLAPStore, logger *za } } -func (s *sqlStoreToDuckDB) Transfer(ctx context.Context, source drivers.Source, sink drivers.Sink, opts *drivers.TransferOpts, p drivers.Progress) (transferErr error) { - src, ok := source.DatabaseSource() - if !ok { - return fmt.Errorf("type of source should `drivers.DatabaseSource`") - } - dbSink, ok := sink.DatabaseSink() - if !ok { - return fmt.Errorf("type of source should `drivers.DatabaseSink`") +func (s *sqlStoreToDuckDB) Transfer(ctx context.Context, srcProps, sinkProps map[string]any, opts *drivers.TransferOpts, p drivers.Progress) (transferErr error) { + sinkCfg, err := parseSinkProperties(sinkProps) + if err != nil { + return err } - iter, err := s.from.QueryAsFiles(ctx, src.Props, src.SQL, &drivers.QueryOption{TotalLimitInBytes: opts.LimitInBytes}, p) + iter, err := s.from.QueryAsFiles(ctx, srcProps, &drivers.QueryOption{TotalLimitInBytes: opts.LimitInBytes}, p) if err != nil { return err } defer iter.Close() start := time.Now() - s.logger.Info("started transfer from local file to duckdb", zap.String("sink_table", dbSink.Table), observability.ZapCtx(ctx)) + s.logger.Info("started transfer from local file to duckdb", zap.String("sink_table", sinkCfg.Table), observability.ZapCtx(ctx)) defer func() { s.logger.Info("transfer finished", zap.Duration("duration", time.Since(start)), @@ -69,13 +65,13 @@ func (s *sqlStoreToDuckDB) Transfer(ctx context.Context, source drivers.Source, var query string if create { - query = fmt.Sprintf("CREATE OR REPLACE TABLE %s AS (SELECT * FROM %s);", safeName(dbSink.Table), from) + query = fmt.Sprintf("CREATE OR REPLACE TABLE %s AS (SELECT * FROM %s);", safeName(sinkCfg.Table), from) create = false } else { - query = fmt.Sprintf("INSERT INTO %s (SELECT * FROM %s);", safeName(dbSink.Table), from) + query = fmt.Sprintf("INSERT INTO %s (SELECT * FROM %s);", safeName(sinkCfg.Table), from) } - if err := s.to.Exec(ctx, &drivers.Statement{Query: query, Priority: 1}); err != nil { + if err := s.to.Exec(ctx, &drivers.Statement{Query: query, Priority: 1, LongRunning: true}); err != nil { return err } } diff --git a/runtime/drivers/duckdb/transporter/transporter_test.go b/runtime/drivers/duckdb/transporter/transporter_test.go index fa6930e37d0..e36e49a70a4 100644 --- a/runtime/drivers/duckdb/transporter/transporter_test.go +++ b/runtime/drivers/duckdb/transporter/transporter_test.go @@ -19,7 +19,7 @@ type mockObjectStore struct { mockIterator drivers.FileIterator } -func (m *mockObjectStore) DownloadFiles(ctx context.Context, src *drivers.BucketSource) (drivers.FileIterator, error) { +func (m *mockObjectStore) DownloadFiles(ctx context.Context, srcProps map[string]any) (drivers.FileIterator, error) { return m.mockIterator, nil } @@ -37,6 +37,11 @@ func (m *mockIterator) NextBatch(limit int) ([]string, error) { return m.batches[m.index-1], nil } +func (m *mockIterator) NextBatchSize(sizeInBytes int64) ([]string, error) { + m.index += 1 + return m.batches[m.index-1], nil +} + func (m *mockIterator) HasNext() bool { return m.index < len(m.batches) } @@ -159,18 +164,14 @@ mum,8.2`) ctx := context.Background() tr := transporter.NewObjectStoreToDuckDB(mockConnector, olap, zap.NewNop()) - var src *drivers.BucketSource + var src map[string]any if test.query { - src = &drivers.BucketSource{ - Properties: map[string]any{"sql": "select * from read_csv_auto('path',union_by_name=true,sample_size=200000)"}, - } + src = map[string]any{"sql": "select * from read_csv_auto('path',union_by_name=true,sample_size=200000)"} } else { - src = &drivers.BucketSource{ - Properties: map[string]any{"allow_schema_relaxation": true}, - } + src = map[string]any{"allow_schema_relaxation": true} } - err = tr.Transfer(ctx, src, &drivers.DatabaseSink{Table: test.name}, drivers.NewTransferOpts(), + err = tr.Transfer(ctx, src, map[string]any{"table": test.name}, drivers.NewTransferOpts(), drivers.NoOpProgress{}) require.NoError(t, err, "no err expected test %s", test.name) @@ -309,16 +310,14 @@ mum,8.2`) ctx := context.Background() tr := transporter.NewObjectStoreToDuckDB(mockConnector, olap, zap.NewNop()) - var src *drivers.BucketSource + var src map[string]any if test.query { - src = &drivers.BucketSource{ - Properties: map[string]any{"sql": "select * from read_csv_auto('path')"}, - } + src = map[string]any{"sql": "select * from read_csv_auto('path')"} } else { - src = &drivers.BucketSource{} + src = map[string]any{} } - err = tr.Transfer(ctx, src, &drivers.DatabaseSink{Table: test.name}, + err = tr.Transfer(ctx, src, map[string]any{"table": test.name}, drivers.NewTransferOpts(), drivers.NoOpProgress{}) if test.hasError { require.Error(t, err, fmt.Errorf("error expected for %s got nil", test.name)) @@ -411,18 +410,14 @@ func TestIterativeParquetIngestionWithVariableSchema(t *testing.T) { ctx := context.Background() tr := transporter.NewObjectStoreToDuckDB(mockConnector, olap, zap.NewNop()) - var src *drivers.BucketSource + var src map[string]any if test.query { - src = &drivers.BucketSource{ - Properties: map[string]any{"sql": "select * from read_parquet('path',union_by_name=true,hive_partitioning=true)"}, - } + src = map[string]any{"sql": "select * from read_parquet('path',union_by_name=true,hive_partitioning=true)"} } else { - src = &drivers.BucketSource{ - Properties: map[string]any{"allow_schema_relaxation": true}, - } + src = map[string]any{"allow_schema_relaxation": true} } - err := tr.Transfer(ctx, src, &drivers.DatabaseSink{Table: test.name}, + err := tr.Transfer(ctx, src, map[string]any{"table": test.name}, drivers.NewTransferOpts(), drivers.NoOpProgress{}) require.NoError(t, err) @@ -557,18 +552,14 @@ func TestIterativeJSONIngestionWithVariableSchema(t *testing.T) { ctx := context.Background() tr := transporter.NewObjectStoreToDuckDB(mockConnector, olap, zap.NewNop()) - var src *drivers.BucketSource + var src map[string]any if test.query { - src = &drivers.BucketSource{ - Properties: map[string]any{"sql": "select * from read_json('path',format='auto',union_by_name=true,auto_detect=true,sample_size=200000)"}, - } + src = map[string]any{"sql": "select * from read_json('path',format='auto',union_by_name=true,auto_detect=true,sample_size=200000)"} } else { - src = &drivers.BucketSource{ - Properties: map[string]any{"allow_schema_relaxation": true}, - } + src = map[string]any{"allow_schema_relaxation": true} } - err := tr.Transfer(ctx, src, &drivers.DatabaseSink{Table: test.name}, + err := tr.Transfer(ctx, src, map[string]any{"table": test.name}, drivers.NewTransferOpts(), drivers.NoOpProgress{}) require.NoError(t, err, "no err expected test %s", test.name) diff --git a/runtime/drivers/file/file.go b/runtime/drivers/file/file.go index e8575fd554b..8346c01e2d6 100644 --- a/runtime/drivers/file/file.go +++ b/runtime/drivers/file/file.go @@ -86,7 +86,7 @@ func (d driver) Spec() drivers.Spec { return spec } -func (d driver) HasAnonymousSourceAccess(ctx context.Context, src drivers.Source, logger *zap.Logger) (bool, error) { +func (d driver) HasAnonymousSourceAccess(ctx context.Context, src map[string]any, logger *zap.Logger) (bool, error) { return true, nil } diff --git a/runtime/drivers/file/file_store.go b/runtime/drivers/file/file_store.go index a41e8a232b2..cd937d8facb 100644 --- a/runtime/drivers/file/file_store.go +++ b/runtime/drivers/file/file_store.go @@ -5,13 +5,12 @@ import ( "fmt" "github.com/bmatcuk/doublestar/v4" - "github.com/rilldata/rill/runtime/drivers" "github.com/rilldata/rill/runtime/pkg/fileutil" ) // FilePaths implements drivers.FileStore -func (c *connection) FilePaths(ctx context.Context, src *drivers.FileSource) ([]string, error) { - conf, err := parseSourceProperties(src.Properties) +func (c *connection) FilePaths(ctx context.Context, src map[string]any) ([]string, error) { + conf, err := parseSourceProperties(src) if err != nil { return nil, err } diff --git a/runtime/drivers/file_store.go b/runtime/drivers/file_store.go index 0143f3e8d56..b1b346e191c 100644 --- a/runtime/drivers/file_store.go +++ b/runtime/drivers/file_store.go @@ -4,5 +4,5 @@ import "context" type FileStore interface { // FilePaths returns local absolute paths where files are stored - FilePaths(ctx context.Context, src *FileSource) ([]string, error) + FilePaths(ctx context.Context, src map[string]any) ([]string, error) } diff --git a/runtime/drivers/gcs/gcs.go b/runtime/drivers/gcs/gcs.go index 5c8a1207071..c3029e1dae1 100644 --- a/runtime/drivers/gcs/gcs.go +++ b/runtime/drivers/gcs/gcs.go @@ -122,13 +122,8 @@ func (d driver) Spec() drivers.Spec { return spec } -func (d driver) HasAnonymousSourceAccess(ctx context.Context, src drivers.Source, logger *zap.Logger) (bool, error) { - b, ok := src.BucketSource() - if !ok { - return false, fmt.Errorf("require bucket source") - } - - conf, err := parseSourceProperties(b.Properties) +func (d driver) HasAnonymousSourceAccess(ctx context.Context, src map[string]any, logger *zap.Logger) (bool, error) { + conf, err := parseSourceProperties(src) if err != nil { return false, fmt.Errorf("failed to parse config: %w", err) } @@ -143,35 +138,44 @@ func (d driver) HasAnonymousSourceAccess(ctx context.Context, src drivers.Source } type sourceProperties struct { - Path string `key:"path"` - GlobMaxTotalSize int64 `mapstructure:"glob.max_total_size"` - GlobMaxObjectsMatched int `mapstructure:"glob.max_objects_matched"` - GlobMaxObjectsListed int64 `mapstructure:"glob.max_objects_listed"` - GlobPageSize int `mapstructure:"glob.page_size"` + Path string `key:"path"` + Extract map[string]any `mapstructure:"extract"` + GlobMaxTotalSize int64 `mapstructure:"glob.max_total_size"` + GlobMaxObjectsMatched int `mapstructure:"glob.max_objects_matched"` + GlobMaxObjectsListed int64 `mapstructure:"glob.max_objects_listed"` + GlobPageSize int `mapstructure:"glob.page_size"` url *globutil.URL + extractPolicy *rillblob.ExtractPolicy } func parseSourceProperties(props map[string]any) (*sourceProperties, error) { conf := &sourceProperties{} - err := mapstructure.Decode(props, conf) + err := mapstructure.WeakDecode(props, conf) if err != nil { return nil, err } + if !doublestar.ValidatePattern(conf.Path) { // ideally this should be validated at much earlier stage // keeping it here to have gcs specific validations return nil, fmt.Errorf("glob pattern %s is invalid", conf.Path) } + url, err := globutil.ParseBucketURL(conf.Path) if err != nil { return nil, fmt.Errorf("failed to parse path %q, %w", conf.Path, err) } + conf.url = url if url.Scheme != "gs" { return nil, fmt.Errorf("invalid gcs path %q, should start with gs://", conf.Path) } - conf.url = url + conf.extractPolicy, err = rillblob.ParseExtractPolicy(conf.Extract) + if err != nil { + return nil, fmt.Errorf("failed to parse extract config: %w", err) + } + return conf, nil } @@ -251,8 +255,8 @@ func (c *Connection) AsSQLStore() (drivers.SQLStore, bool) { // DownloadFiles returns a file iterator over objects stored in gcs. // The credential json is read from config google_application_credentials. // Additionally in case `allow_host_credentials` is true it looks for "Application Default Credentials" as well -func (c *Connection) DownloadFiles(ctx context.Context, source *drivers.BucketSource) (drivers.FileIterator, error) { - conf, err := parseSourceProperties(source.Properties) +func (c *Connection) DownloadFiles(ctx context.Context, props map[string]any) (drivers.FileIterator, error) { + conf, err := parseSourceProperties(props) if err != nil { return nil, fmt.Errorf("failed to parse config: %w", err) } @@ -274,7 +278,7 @@ func (c *Connection) DownloadFiles(ctx context.Context, source *drivers.BucketSo GlobMaxObjectsListed: conf.GlobMaxObjectsListed, GlobPageSize: conf.GlobPageSize, GlobPattern: conf.url.Path, - ExtractPolicy: source.ExtractPolicy, + ExtractPolicy: conf.extractPolicy, } iter, err := rillblob.NewIterator(ctx, bucketObj, opts, c.logger) diff --git a/runtime/drivers/github/github.go b/runtime/drivers/github/github.go index f79968f442e..a02c9f73464 100644 --- a/runtime/drivers/github/github.go +++ b/runtime/drivers/github/github.go @@ -96,7 +96,7 @@ func (d driver) Spec() drivers.Spec { return drivers.Spec{} } -func (d driver) HasAnonymousSourceAccess(ctx context.Context, src drivers.Source, logger *zap.Logger) (bool, error) { +func (d driver) HasAnonymousSourceAccess(ctx context.Context, src map[string]any, logger *zap.Logger) (bool, error) { return false, fmt.Errorf("not implemented") } diff --git a/runtime/drivers/https/https.go b/runtime/drivers/https/https.go index c56a5b3f1eb..d03a470337e 100644 --- a/runtime/drivers/https/https.go +++ b/runtime/drivers/https/https.go @@ -55,7 +55,7 @@ func (d driver) Spec() drivers.Spec { return spec } -func (d driver) HasAnonymousSourceAccess(ctx context.Context, src drivers.Source, logger *zap.Logger) (bool, error) { +func (d driver) HasAnonymousSourceAccess(ctx context.Context, src map[string]any, logger *zap.Logger) (bool, error) { return true, nil } @@ -145,8 +145,8 @@ func (c *connection) AsSQLStore() (drivers.SQLStore, bool) { } // FilePaths implements drivers.FileStore -func (c *connection) FilePaths(ctx context.Context, src *drivers.FileSource) ([]string, error) { - conf, err := parseSourceProperties(src.Properties) +func (c *connection) FilePaths(ctx context.Context, src map[string]any) ([]string, error) { + conf, err := parseSourceProperties(src) if err != nil { return nil, fmt.Errorf("failed to parse config: %w", err) } @@ -176,8 +176,7 @@ func (c *connection) FilePaths(ctx context.Context, src *drivers.FileSource) ([] return nil, fmt.Errorf("failed to fetch url %s: %s", conf.Path, resp.Status) } - // TODO :: I don't like src.Name - file, size, err := fileutil.CopyToTempFile(resp.Body, src.Name, extension) + file, size, err := fileutil.CopyToTempFile(resp.Body, "", extension) if err != nil { return nil, err } diff --git a/runtime/drivers/object_store.go b/runtime/drivers/object_store.go index 3a19262173e..48714fb8573 100644 --- a/runtime/drivers/object_store.go +++ b/runtime/drivers/object_store.go @@ -4,7 +4,7 @@ import "context" type ObjectStore interface { // DownloadFiles provides an iterator for downloading and consuming files - DownloadFiles(ctx context.Context, src *BucketSource) (FileIterator, error) + DownloadFiles(ctx context.Context, src map[string]any) (FileIterator, error) } // FileIterator provides ways to iteratively download files from external sources @@ -15,6 +15,10 @@ type FileIterator interface { // NextBatch returns a list of file downloaded from external sources // and cleanups file created in previous batch NextBatch(limit int) ([]string, error) + // NextBatchSize returns a list of file downloaded from external sources + // such that the size of all files is less than equal to sizeInBytes + // and cleanups file created in previous batch + NextBatchSize(sizeInBytes int64) ([]string, error) // HasNext can be utlisied to check if iterator has more elements left HasNext() bool // Size returns size of data downloaded in unit. diff --git a/runtime/drivers/olap.go b/runtime/drivers/olap.go index 7f72b84f6bb..de23c8b8d2b 100644 --- a/runtime/drivers/olap.go +++ b/runtime/drivers/olap.go @@ -22,7 +22,7 @@ type WithConnectionFunc func(wrappedCtx context.Context, ensuredCtx context.Cont // OLAPStore is implemented by drivers that are capable of storing, transforming and serving analytical queries. type OLAPStore interface { Dialect() Dialect - WithConnection(ctx context.Context, priority int, fn WithConnectionFunc) error + WithConnection(ctx context.Context, priority int, longRunning, tx bool, fn WithConnectionFunc) error Exec(ctx context.Context, stmt *Statement) error Execute(ctx context.Context, stmt *Statement) (*Result, error) InformationSchema() InformationSchema @@ -35,6 +35,7 @@ type Statement struct { Args []any DryRun bool Priority int + LongRunning bool ExecutionTimeout time.Duration } diff --git a/runtime/drivers/postgres/postgres.go b/runtime/drivers/postgres/postgres.go index 6320555b82d..883b9cb4a80 100644 --- a/runtime/drivers/postgres/postgres.go +++ b/runtime/drivers/postgres/postgres.go @@ -43,8 +43,8 @@ func (d driver) Spec() drivers.Spec { return drivers.Spec{} } -func (d driver) HasAnonymousSourceAccess(ctx context.Context, src drivers.Source, logger *zap.Logger) (bool, error) { - return false, fmt.Errorf("not implemented") +func (d driver) HasAnonymousSourceAccess(ctx context.Context, src map[string]any, logger *zap.Logger) (bool, error) { + return false, nil } type connection struct { diff --git a/runtime/drivers/s3/s3.go b/runtime/drivers/s3/s3.go index 909edfd7dc4..075495b0b1d 100644 --- a/runtime/drivers/s3/s3.go +++ b/runtime/drivers/s3/s3.go @@ -86,18 +86,19 @@ type configProperties struct { } // Open implements drivers.Driver -func (d driver) Open(config map[string]any, shared bool, client activity.Client, logger *zap.Logger) (drivers.Handle, error) { +func (d driver) Open(cfgMap map[string]any, shared bool, client activity.Client, logger *zap.Logger) (drivers.Handle, error) { if shared { return nil, fmt.Errorf("s3 driver can't be shared") } - conf := &configProperties{} - err := mapstructure.Decode(config, conf) + + cfg := &configProperties{} + err := mapstructure.Decode(cfgMap, cfg) if err != nil { return nil, err } conn := &Connection{ - config: conf, + config: cfg, logger: logger, } return conn, nil @@ -112,12 +113,8 @@ func (d driver) Spec() drivers.Spec { return spec } -func (d driver) HasAnonymousSourceAccess(ctx context.Context, src drivers.Source, logger *zap.Logger) (bool, error) { - b, ok := src.BucketSource() - if !ok { - return false, fmt.Errorf("require bucket source") - } - conf, err := parseSourceProperties(b.Properties) +func (d driver) HasAnonymousSourceAccess(ctx context.Context, props map[string]any, logger *zap.Logger) (bool, error) { + conf, err := parseSourceProperties(props) if err != nil { return false, fmt.Errorf("failed to parse config: %w", err) } @@ -213,19 +210,21 @@ func (c *Connection) AsSQLStore() (drivers.SQLStore, bool) { } type sourceProperties struct { - Path string `mapstructure:"path"` - AWSRegion string `mapstructure:"region"` - GlobMaxTotalSize int64 `mapstructure:"glob.max_total_size"` - GlobMaxObjectsMatched int `mapstructure:"glob.max_objects_matched"` - GlobMaxObjectsListed int64 `mapstructure:"glob.max_objects_listed"` - GlobPageSize int `mapstructure:"glob.page_size"` - S3Endpoint string `mapstructure:"endpoint"` + Path string `mapstructure:"path"` + AWSRegion string `mapstructure:"region"` + GlobMaxTotalSize int64 `mapstructure:"glob.max_total_size"` + GlobMaxObjectsMatched int `mapstructure:"glob.max_objects_matched"` + GlobMaxObjectsListed int64 `mapstructure:"glob.max_objects_listed"` + GlobPageSize int `mapstructure:"glob.page_size"` + S3Endpoint string `mapstructure:"endpoint"` + Extract map[string]any `mapstructure:"extract"` url *globutil.URL + extractPolicy *rillblob.ExtractPolicy } func parseSourceProperties(props map[string]any) (*sourceProperties, error) { conf := &sourceProperties{} - err := mapstructure.Decode(props, conf) + err := mapstructure.WeakDecode(props, conf) if err != nil { return nil, err } @@ -238,11 +237,17 @@ func parseSourceProperties(props map[string]any) (*sourceProperties, error) { if err != nil { return nil, fmt.Errorf("failed to parse path %q, %w", conf.Path, err) } + conf.url = url if url.Scheme != "s3" { return nil, fmt.Errorf("invalid s3 path %q, should start with s3://", conf.Path) } - conf.url = url + + conf.extractPolicy, err = rillblob.ParseExtractPolicy(conf.Extract) + if err != nil { + return nil, fmt.Errorf("failed to parse extract config: %w", err) + } + return conf, nil } @@ -254,8 +259,8 @@ func parseSourceProperties(props map[string]any) (*sourceProperties, error) { // - aws_session_token // // Additionally in case allow_host_credentials is true it looks for credentials stored on host machine as well -func (c *Connection) DownloadFiles(ctx context.Context, src *drivers.BucketSource) (drivers.FileIterator, error) { - conf, err := parseSourceProperties(src.Properties) +func (c *Connection) DownloadFiles(ctx context.Context, src map[string]any) (drivers.FileIterator, error) { + conf, err := parseSourceProperties(src) if err != nil { return nil, fmt.Errorf("failed to parse config: %w", err) } @@ -277,7 +282,7 @@ func (c *Connection) DownloadFiles(ctx context.Context, src *drivers.BucketSourc GlobMaxObjectsListed: conf.GlobMaxObjectsListed, GlobPageSize: conf.GlobPageSize, GlobPattern: conf.url.Path, - ExtractPolicy: src.ExtractPolicy, + ExtractPolicy: conf.extractPolicy, } it, err := rillblob.NewIterator(ctx, bucketObj, opts, c.logger) diff --git a/runtime/drivers/sql_store.go b/runtime/drivers/sql_store.go index 1b06c5a1c32..2ecd9739f17 100644 --- a/runtime/drivers/sql_store.go +++ b/runtime/drivers/sql_store.go @@ -14,9 +14,9 @@ var ErrIteratorDone = errors.New("empty iterator") // May be call it DataWarehouse to differentiate from OLAP or postgres? type SQLStore interface { // Query returns driver.RowIterator to iterate over results row by row - Query(ctx context.Context, props map[string]any, sql string) (RowIterator, error) + Query(ctx context.Context, props map[string]any) (RowIterator, error) // QueryAsFiles downloads results into files and returns an iterator to iterate over them - QueryAsFiles(ctx context.Context, props map[string]any, sql string, opt *QueryOption, p Progress) (FileIterator, error) + QueryAsFiles(ctx context.Context, props map[string]any, opt *QueryOption, p Progress) (FileIterator, error) } type QueryOption struct { diff --git a/runtime/drivers/sqlite/sqlite.go b/runtime/drivers/sqlite/sqlite.go index c1961b4f91f..b34b94e6554 100644 --- a/runtime/drivers/sqlite/sqlite.go +++ b/runtime/drivers/sqlite/sqlite.go @@ -58,8 +58,8 @@ func (d driver) Spec() drivers.Spec { return drivers.Spec{} } -func (d driver) HasAnonymousSourceAccess(ctx context.Context, src drivers.Source, logger *zap.Logger) (bool, error) { - return false, fmt.Errorf("not implemented") +func (d driver) HasAnonymousSourceAccess(ctx context.Context, src map[string]any, logger *zap.Logger) (bool, error) { + return false, nil } type connection struct { diff --git a/runtime/drivers/transporter.go b/runtime/drivers/transporter.go index 3c68843ddc6..f76e2b22fff 100644 --- a/runtime/drivers/transporter.go +++ b/runtime/drivers/transporter.go @@ -3,25 +3,25 @@ package drivers import ( "context" "math" - - runtimev1 "github.com/rilldata/rill/proto/gen/rill/runtime/v1" ) // Transporter implements logic for moving data between two connectors // (the actual connector objects are provided in AsTransporter) type Transporter interface { - Transfer(ctx context.Context, source Source, sink Sink, t *TransferOpts, p Progress) error + Transfer(ctx context.Context, source map[string]any, sink map[string]any, t *TransferOpts, p Progress) error } type TransferOpts struct { - IteratorBatch int - LimitInBytes int64 + IteratorBatch int + IteratorBatchSizeInBytes int64 + LimitInBytes int64 } func NewTransferOpts(opts ...TransferOption) *TransferOpts { t := &TransferOpts{ - IteratorBatch: _iteratorBatch, - LimitInBytes: math.MaxInt64, + IteratorBatch: _iteratorBatch, + LimitInBytes: math.MaxInt64, + IteratorBatchSizeInBytes: _iteratorBatchSizeInBytes, } for _, opt := range opts { @@ -38,117 +38,16 @@ func WithIteratorBatch(b int) TransferOption { } } -func WithLimitInBytes(limit int64) TransferOption { +func WithIteratorBatchSizeInBytes(b int64) TransferOption { return func(t *TransferOpts) { - t.LimitInBytes = limit + t.IteratorBatchSizeInBytes = b } } -// A Source is expected to only return ok=true for one of the source types. -// The caller will know which type based on the connector type. -type Source interface { - BucketSource() (*BucketSource, bool) - DatabaseSource() (*DatabaseSource, bool) - FileSource() (*FileSource, bool) -} - -// A Sink is expected to only return ok=true for one of the sink types. -// The caller will know which type based on the connector type. -type Sink interface { - BucketSink() (*BucketSink, bool) - DatabaseSink() (*DatabaseSink, bool) -} - -type BucketSource struct { - ExtractPolicy *runtimev1.Source_ExtractPolicy - Properties map[string]any -} - -var _ Source = &BucketSource{} - -func (b *BucketSource) BucketSource() (*BucketSource, bool) { - return b, true -} - -func (b *BucketSource) DatabaseSource() (*DatabaseSource, bool) { - return nil, false -} - -func (b *BucketSource) FileSource() (*FileSource, bool) { - return nil, false -} - -type BucketSink struct { - Path string - // Format FileFormat - // NOTE: In future, may add file name and output partitioning config here -} - -var _ Sink = &BucketSink{} - -func (b *BucketSink) BucketSink() (*BucketSink, bool) { - return b, true -} - -func (b *BucketSink) DatabaseSink() (*DatabaseSink, bool) { - return nil, false -} - -type DatabaseSource struct { - // Pass only SQL OR Table - SQL string - Table string - Database string - Limit int - Props map[string]any -} - -var _ Source = &DatabaseSource{} - -func (d *DatabaseSource) BucketSource() (*BucketSource, bool) { - return nil, false -} - -func (d *DatabaseSource) DatabaseSource() (*DatabaseSource, bool) { - return d, true -} - -func (d *DatabaseSource) FileSource() (*FileSource, bool) { - return nil, false -} - -type DatabaseSink struct { - Table string - Append bool -} - -var _ Sink = &DatabaseSink{} - -func (d *DatabaseSink) BucketSink() (*BucketSink, bool) { - return nil, false -} - -func (d *DatabaseSink) DatabaseSink() (*DatabaseSink, bool) { - return d, true -} - -type FileSource struct { - Name string - Properties map[string]any -} - -var _ Source = &FileSource{} - -func (f *FileSource) BucketSource() (*BucketSource, bool) { - return nil, false -} - -func (f *FileSource) DatabaseSource() (*DatabaseSource, bool) { - return nil, false -} - -func (f *FileSource) FileSource() (*FileSource, bool) { - return f, true +func WithLimitInBytes(limit int64) TransferOption { + return func(t *TransferOpts) { + t.LimitInBytes = limit + } } // Progress is an interface for communicating progress info diff --git a/runtime/queries/column_timeseries.go b/runtime/queries/column_timeseries.go index 34165468183..6f01a07d105 100644 --- a/runtime/queries/column_timeseries.go +++ b/runtime/queries/column_timeseries.go @@ -99,7 +99,7 @@ func (q *ColumnTimeseries) Resolve(ctx context.Context, rt *runtime.Runtime, ins return nil } - return olap.WithConnection(ctx, priority, func(ctx context.Context, ensuredCtx context.Context, _ *sql.Conn) error { + return olap.WithConnection(ctx, priority, false, false, func(ctx context.Context, ensuredCtx context.Context, _ *sql.Conn) error { filter, args, err := buildFilterClauseForMetricsViewFilter(q.MetricsView, q.MetricsViewFilter, olap.Dialect(), q.MetricsViewPolicy) if err != nil { return err diff --git a/runtime/queries/metricsview.go b/runtime/queries/metricsview.go index 96febc8c7c6..94ecd999f50 100644 --- a/runtime/queries/metricsview.go +++ b/runtime/queries/metricsview.go @@ -81,6 +81,26 @@ func metricsQuery(ctx context.Context, olap drivers.OLAPStore, priority int, sql return structTypeToMetricsViewColumn(rows.Schema), data, nil } +func olapQuery(ctx context.Context, olap drivers.OLAPStore, priority int, sql string, args []any) (*runtimev1.StructType, []*structpb.Struct, error) { + rows, err := olap.Execute(ctx, &drivers.Statement{ + Query: sql, + Args: args, + Priority: priority, + ExecutionTimeout: defaultExecutionTimeout, + }) + if err != nil { + return nil, nil, status.Error(codes.InvalidArgument, err.Error()) + } + defer rows.Close() + + data, err := rowsToData(rows) + if err != nil { + return nil, nil, status.Error(codes.Internal, err.Error()) + } + + return rows.Schema, data, nil +} + func rowsToData(rows *drivers.Result) ([]*structpb.Struct, error) { var data []*structpb.Struct for rows.Next() { @@ -315,6 +335,15 @@ func metricsViewDimensionToSafeColumn(mv *runtimev1.MetricsView, dimName string) return "", fmt.Errorf("dimension %s not found", dimName) } +func metricsViewMeasureExpression(mv *runtimev1.MetricsView, measureName string) (string, error) { + for _, measure := range mv.Measures { + if strings.EqualFold(measure.Name, measureName) { + return measure.Expression, nil + } + } + return "", fmt.Errorf("measure %s not found", measureName) +} + func writeCSV(meta []*runtimev1.MetricsViewColumn, data []*structpb.Struct, writer io.Writer) error { w := csv.NewWriter(writer) diff --git a/runtime/queries/metricsview_aggregation.go b/runtime/queries/metricsview_aggregation.go new file mode 100644 index 00000000000..aa67204efdc --- /dev/null +++ b/runtime/queries/metricsview_aggregation.go @@ -0,0 +1,280 @@ +package queries + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "io" + "strings" + + runtimev1 "github.com/rilldata/rill/proto/gen/rill/runtime/v1" + "github.com/rilldata/rill/runtime" + "github.com/rilldata/rill/runtime/drivers" + "google.golang.org/protobuf/types/known/timestamppb" +) + +type MetricsViewAggregation struct { + MetricsViewName string `json:"metrics_view,omitempty"` + Dimensions []*runtimev1.MetricsViewAggregationDimension `json:"dimensions,omitempty"` + Measures []*runtimev1.MetricsViewAggregationMeasure `json:"measures,omitempty"` + Sort []*runtimev1.MetricsViewAggregationSort `json:"sort,omitempty"` + TimeStart *timestamppb.Timestamp `json:"time_start,omitempty"` + TimeEnd *timestamppb.Timestamp `json:"time_end,omitempty"` + Filter *runtimev1.MetricsViewFilter `json:"filter,omitempty"` + Priority int32 `json:"priority,omitempty"` + Limit *int64 `json:"limit,omitempty"` + Offset int64 `json:"offset,omitempty"` + MetricsView *runtimev1.MetricsView `json:"-"` + ResolvedMVSecurity *runtime.ResolvedMetricsViewSecurity `json:"security"` + + Result *runtimev1.MetricsViewAggregationResponse `json:"-"` +} + +var _ runtime.Query = &MetricsViewAggregation{} + +func (q *MetricsViewAggregation) Key() string { + r, err := json.Marshal(q) + if err != nil { + panic(err) + } + return fmt.Sprintf("MetricsViewAggregation:%s", string(r)) +} + +func (q *MetricsViewAggregation) Deps() []string { + return []string{q.MetricsViewName} +} + +func (q *MetricsViewAggregation) MarshalResult() *runtime.QueryResult { + return &runtime.QueryResult{ + Value: q.Result, + Bytes: sizeProtoMessage(q.Result), + } +} + +func (q *MetricsViewAggregation) UnmarshalResult(v any) error { + res, ok := v.(*runtimev1.MetricsViewAggregationResponse) + if !ok { + return fmt.Errorf("MetricsViewAggregation: mismatched unmarshal input") + } + q.Result = res + return nil +} + +func (q *MetricsViewAggregation) Resolve(ctx context.Context, rt *runtime.Runtime, instanceID string, priority int) error { + olap, release, err := rt.OLAP(ctx, instanceID) + if err != nil { + return err + } + defer release() + + if olap.Dialect() != drivers.DialectDuckDB && olap.Dialect() != drivers.DialectDruid { + return fmt.Errorf("not available for dialect '%s'", olap.Dialect()) + } + + if q.MetricsView.TimeDimension == "" && (q.TimeStart != nil || q.TimeEnd != nil) { + return fmt.Errorf("metrics view '%s' does not have a time dimension", q.MetricsView) + } + + // Build query + sql, args, err := q.buildMetricsAggregationSQL(q.MetricsView, olap.Dialect(), q.ResolvedMVSecurity) + if err != nil { + return fmt.Errorf("error building query: %w", err) + } + + // Execute + schema, data, err := olapQuery(ctx, olap, priority, sql, args) + if err != nil { + return err + } + + q.Result = &runtimev1.MetricsViewAggregationResponse{ + Schema: schema, + Data: data, + } + + return nil +} + +func (q *MetricsViewAggregation) Export(ctx context.Context, rt *runtime.Runtime, instanceID string, w io.Writer, opts *runtime.ExportOptions) error { + err := q.Resolve(ctx, rt, instanceID, opts.Priority) + if err != nil { + return err + } + + filename := strings.ReplaceAll(q.MetricsView.Model, `"`, `_`) + if q.TimeStart != nil || q.TimeEnd != nil || q.Filter != nil && (len(q.Filter.Include) > 0 || len(q.Filter.Exclude) > 0) { + filename += "_filtered" + } + + meta := structTypeToMetricsViewColumn(q.Result.Schema) + + if opts.PreWriteHook != nil { + err = opts.PreWriteHook(filename) + if err != nil { + return err + } + } + + switch opts.Format { + case runtimev1.ExportFormat_EXPORT_FORMAT_UNSPECIFIED: + return fmt.Errorf("unspecified format") + case runtimev1.ExportFormat_EXPORT_FORMAT_CSV: + return writeCSV(meta, q.Result.Data, w) + case runtimev1.ExportFormat_EXPORT_FORMAT_XLSX: + return writeXLSX(meta, q.Result.Data, w) + case runtimev1.ExportFormat_EXPORT_FORMAT_PARQUET: + return writeParquet(meta, q.Result.Data, w) + } + + return nil +} + +func (q *MetricsViewAggregation) buildMetricsAggregationSQL(mv *runtimev1.MetricsView, dialect drivers.Dialect, policy *runtime.ResolvedMetricsViewSecurity) (string, []any, error) { + if len(q.Dimensions) == 0 && len(q.Measures) == 0 { + return "", nil, errors.New("no dimensions or measures specified") + } + + selectCols := make([]string, 0, len(q.Dimensions)+len(q.Measures)) + groupCols := make([]string, 0, len(q.Dimensions)) + args := []any{} + + for _, d := range q.Dimensions { + // Handle regular dimensions + if d.TimeGrain == runtimev1.TimeGrain_TIME_GRAIN_UNSPECIFIED { + col, err := metricsViewDimensionToSafeColumn(mv, d.Name) + if err != nil { + return "", nil, err + } + + selectCols = append(selectCols, fmt.Sprintf("%s as %s", col, safeName(d.Name))) + groupCols = append(groupCols, col) + continue + } + + // Handle time dimension + expr, exprArgs, err := q.buildTimestampExpr(d, dialect) + if err != nil { + return "", nil, err + } + selectCols = append(selectCols, fmt.Sprintf("%s as %s", expr, safeName(d.Name))) + groupCols = append(groupCols, expr) + args = append(args, exprArgs...) + } + + for _, m := range q.Measures { + switch m.BuiltinMeasure { + case runtimev1.BuiltinMeasure_BUILTIN_MEASURE_UNSPECIFIED: + expr, err := metricsViewMeasureExpression(mv, m.Name) + if err != nil { + return "", nil, err + } + selectCols = append(selectCols, fmt.Sprintf("%s as %s", expr, safeName(m.Name))) + case runtimev1.BuiltinMeasure_BUILTIN_MEASURE_COUNT: + selectCols = append(selectCols, fmt.Sprintf("COUNT(*) as %s", safeName(m.Name))) + case runtimev1.BuiltinMeasure_BUILTIN_MEASURE_COUNT_DISTINCT: + if len(m.BuiltinMeasureArgs) != 1 { + return "", nil, fmt.Errorf("builtin measure '%s' expects 1 argument", m.BuiltinMeasure.String()) + } + arg := m.BuiltinMeasureArgs[0].GetStringValue() + if arg == "" { + return "", nil, fmt.Errorf("builtin measure '%s' expects non-empty string argument, got '%v'", m.BuiltinMeasure.String(), m.BuiltinMeasureArgs[0]) + } + selectCols = append(selectCols, fmt.Sprintf("COUNT(DISTINCT %s) as %s", safeName(arg), safeName(m.Name))) + default: + return "", nil, fmt.Errorf("unknown builtin measure '%d'", m.BuiltinMeasure) + } + } + + groupClause := "" + if len(groupCols) > 0 { + groupClause = "GROUP BY " + strings.Join(groupCols, ", ") + } + + whereClause := "" + if mv.TimeDimension != "" { + if q.TimeStart != nil { + whereClause += fmt.Sprintf(" AND %s >= ?", safeName(mv.TimeDimension)) + args = append(args, q.TimeStart.AsTime()) + } + if q.TimeEnd != nil { + whereClause += fmt.Sprintf(" AND %s < ?", safeName(mv.TimeDimension)) + args = append(args, q.TimeEnd.AsTime()) + } + } + if q.Filter != nil { + clause, clauseArgs, err := buildFilterClauseForMetricsViewFilter(mv, q.Filter, dialect, policy) + if err != nil { + return "", nil, err + } + whereClause += " " + clause + args = append(args, clauseArgs...) + } + if len(whereClause) > 0 { + whereClause = "WHERE 1=1" + whereClause + } + + sortingCriteria := make([]string, 0, len(q.Sort)) + for _, s := range q.Sort { + sortCriterion := safeName(s.Name) + if s.Desc { + sortCriterion += " DESC" + } + if dialect == drivers.DialectDuckDB { + sortCriterion += " NULLS LAST" + } + sortingCriteria = append(sortingCriteria, sortCriterion) + } + orderClause := "" + if len(sortingCriteria) > 0 { + orderClause = "ORDER BY " + strings.Join(sortingCriteria, ", ") + } + + var limitClause string + if q.Limit != nil { + if *q.Limit == 0 { + *q.Limit = 100 + } + limitClause = fmt.Sprintf("LIMIT %d", *q.Limit) + } + + sql := fmt.Sprintf("SELECT %s FROM %s %s %s %s %s OFFSET %d", + strings.Join(selectCols, ", "), + safeName(mv.Model), + whereClause, + groupClause, + orderClause, + limitClause, + q.Offset, + ) + + return sql, args, nil +} + +func (q *MetricsViewAggregation) buildTimestampExpr(dim *runtimev1.MetricsViewAggregationDimension, dialect drivers.Dialect) (string, []any, error) { + var colName string + if dim.Name == q.MetricsView.TimeDimension { + colName = dim.Name + } else { + col, err := metricsViewDimensionToSafeColumn(q.MetricsView, dim.Name) + if err != nil { + return "", nil, err + } + colName = col + } + + switch dialect { + case drivers.DialectDuckDB: + if dim.TimeZone == "" || dim.TimeZone == "UTC" { + return fmt.Sprintf("date_trunc('%s', %s)", convertToDateTruncSpecifier(dim.TimeGrain), safeName(colName)), nil, nil + } + return fmt.Sprintf("timezone(?, date_trunc('%s', timezone(?, %s::TIMESTAMPTZ)))", convertToDateTruncSpecifier(dim.TimeGrain), safeName(colName)), []any{dim.TimeZone, dim.TimeZone}, nil + case drivers.DialectDruid: + if dim.TimeZone == "" || dim.TimeZone == "UTC" { + return fmt.Sprintf("date_trunc('%s', %s)", convertToDateTruncSpecifier(dim.TimeGrain), safeName(colName)), nil, nil + } + return fmt.Sprintf("time_floor(%s, '%s', null, CAST(? AS VARCHAR)))", safeName(colName), convertToDruidTimeFloorSpecifier(dim.TimeGrain)), []any{dim.TimeZone}, nil + default: + return "", nil, fmt.Errorf("unsupported dialect %q", dialect) + } +} diff --git a/runtime/queries/metricsview_comparison_toplist.go b/runtime/queries/metricsview_comparison_toplist.go index 6b03e469ab9..10da6b291b5 100644 --- a/runtime/queries/metricsview_comparison_toplist.go +++ b/runtime/queries/metricsview_comparison_toplist.go @@ -71,11 +71,11 @@ func (q *MetricsViewComparisonToplist) Resolve(ctx context.Context, rt *runtime. return fmt.Errorf("not available for dialect '%s'", olap.Dialect()) } - if q.MetricsView.TimeDimension == "" && (q.BaseTimeRange != nil || q.ComparisonTimeRange != nil) { + if q.MetricsView.TimeDimension == "" && (!isTimeRangeNil(q.BaseTimeRange) || !isTimeRangeNil(q.ComparisonTimeRange)) { return fmt.Errorf("metrics view '%s' does not have a time dimension", q.MetricsViewName) } - if q.ComparisonTimeRange != nil { + if !isTimeRangeNil(q.ComparisonTimeRange) { return q.executeComparisonToplist(ctx, olap, q.MetricsView, priority, q.ResolvedMVSecurity) } @@ -416,7 +416,7 @@ func (q *MetricsViewComparisonToplist) buildMetricsComparisonTopListSQL(mv *runt SELECT %[1]s FROM %[3]q WHERE %[5]s GROUP BY %[2]s ) comparison ON - base.%[2]s = comparison.%[2]s + base.%[2]s = comparison.%[2]s OR (base.%[2]s is null and comparison.%[2]s is null) ORDER BY %[6]s LIMIT @@ -487,7 +487,7 @@ func (q *MetricsViewComparisonToplist) buildMetricsComparisonTopListSQL(mv *runt SELECT %[1]s FROM %[3]q WHERE %[5]s GROUP BY %[2]s ) %[12]s ON - base.%[2]s = comparison.%[2]s + base.%[2]s = comparison.%[2]s OR (base.%[2]s is null and comparison.%[2]s is null) ORDER BY %[6]s LIMIT @@ -520,7 +520,7 @@ func (q *MetricsViewComparisonToplist) buildMetricsComparisonTopListSQL(mv *runt SELECT %[1]s FROM %[3]q WHERE %[5]s GROUP BY %[2]s ) comparison ON - base.%[2]s = comparison.%[2]s + base.%[2]s = comparison.%[2]s OR (base.%[2]s is null and comparison.%[2]s is null) ORDER BY %[6]s LIMIT @@ -561,3 +561,7 @@ func validateSort(sorts []*runtimev1.MetricsViewComparisonSort) error { } return nil } + +func isTimeRangeNil(tr *runtimev1.TimeRange) bool { + return tr == nil || (tr.Start == nil && tr.End == nil) +} diff --git a/runtime/queries/table_columns.go b/runtime/queries/table_columns.go index 73783fbc336..1b6dd175215 100644 --- a/runtime/queries/table_columns.go +++ b/runtime/queries/table_columns.go @@ -58,7 +58,7 @@ func (q *TableColumns) Resolve(ctx context.Context, rt *runtime.Runtime, instanc return fmt.Errorf("not available for dialect '%s'", olap.Dialect()) } - return olap.WithConnection(ctx, priority, func(ctx context.Context, ensuredCtx context.Context, _ *sql.Conn) error { + return olap.WithConnection(ctx, priority, false, false, func(ctx context.Context, ensuredCtx context.Context, _ *sql.Conn) error { // views return duplicate column names, so we need to create a temporary table temporaryTableName := tempName("profile_columns_") err = olap.Exec(ctx, &drivers.Statement{ diff --git a/runtime/reconcilers/README.md b/runtime/reconcilers/README.md index 1962e75305c..20cbab9b0e1 100644 --- a/runtime/reconcilers/README.md +++ b/runtime/reconcilers/README.md @@ -37,4 +37,4 @@ - Calls to `Reconcile` can run for a long time (as long as they respond quickly to a cancelled `ctx`). - `Reconcile` should strive to keep a resource's `.State` correct at all times because it may be accessed while `Reconcile` is running to resolve API requests (such as dashboard queries). - The `Reconciler` struct is shared for all resources of the registered kind for a given instance ID. This enables it to cache (ephemeral) state in-between invocations for optimization. - +- The resource's meta and spec (but not state) may be updated concurrently. Calls to `Get` return a clone of the resource, but if the reconciler update's the resource's meta or spec, it must use a lock to read and update it. diff --git a/runtime/reconcilers/metrics_view.go b/runtime/reconcilers/metrics_view.go index db6c0b46464..e5107b8508f 100644 --- a/runtime/reconcilers/metrics_view.go +++ b/runtime/reconcilers/metrics_view.go @@ -47,12 +47,23 @@ func (r *MetricsViewReconciler) AssignState(from, to *runtimev1.Resource) error return nil } +func (r *MetricsViewReconciler) ResetState(res *runtimev1.Resource) error { + res.GetMetricsView().State = &runtimev1.MetricsViewState{} + return nil +} + func (r *MetricsViewReconciler) Reconcile(ctx context.Context, n *runtimev1.ResourceName) runtime.ReconcileResult { - self, err := r.C.Get(ctx, n) + self, err := r.C.Get(ctx, n, true) if err != nil { return runtime.ReconcileResult{Err: err} } mv := self.GetMetricsView() + if mv == nil { + return runtime.ReconcileResult{Err: errors.New("not a metrics view")} + } + + // NOTE: Not checking refs here since refs may still be valid even if they have errors (in case of staged changes). + // Instead, we just validate against the table name. validateErr := r.validate(ctx, mv.Spec) diff --git a/runtime/reconcilers/migration.go b/runtime/reconcilers/migration.go index ec5610e6ff6..fd48d541049 100644 --- a/runtime/reconcilers/migration.go +++ b/runtime/reconcilers/migration.go @@ -2,6 +2,7 @@ package reconcilers import ( "context" + "errors" "fmt" runtimev1 "github.com/rilldata/rill/proto/gen/rill/runtime/v1" @@ -46,12 +47,26 @@ func (r *MigrationReconciler) AssignState(from, to *runtimev1.Resource) error { return nil } +func (r *MigrationReconciler) ResetState(res *runtimev1.Resource) error { + res.GetMigration().State = &runtimev1.MigrationState{} + return nil +} + func (r *MigrationReconciler) Reconcile(ctx context.Context, n *runtimev1.ResourceName) runtime.ReconcileResult { - self, err := r.C.Get(ctx, n) + self, err := r.C.Get(ctx, n, true) if err != nil { return runtime.ReconcileResult{Err: err} } mig := self.GetMigration() + if mig == nil { + return runtime.ReconcileResult{Err: errors.New("not a migration")} + } + + // Check refs - stop if any of them are invalid + err = checkRefs(ctx, r.C, self.Meta.Refs) + if err != nil { + return runtime.ReconcileResult{Err: err} + } from := mig.State.Version to := mig.Spec.Version @@ -106,7 +121,7 @@ func (r *MigrationReconciler) executeMigration(ctx context.Context, self *runtim if name.Kind == compilerv1.ResourceKindUnspecified { return compilerv1.TemplateResource{}, fmt.Errorf("can't resolve name %q without kind specified", name.Name) } - res, err := r.C.Get(ctx, resourceNameFromCompiler(name)) + res, err := r.C.Get(ctx, resourceNameFromCompiler(name), false) if err != nil { return compilerv1.TemplateResource{}, err } @@ -128,7 +143,8 @@ func (r *MigrationReconciler) executeMigration(ctx context.Context, self *runtim defer release() return olap.Exec(ctx, &drivers.Statement{ - Query: sql, - Priority: 100, + Query: sql, + Priority: 100, + LongRunning: true, }) } diff --git a/runtime/reconcilers/model.go b/runtime/reconcilers/model.go index 56bc0e2efb0..07c1e03fb2c 100644 --- a/runtime/reconcilers/model.go +++ b/runtime/reconcilers/model.go @@ -5,6 +5,7 @@ import ( "crypto/md5" "encoding/binary" "encoding/hex" + "errors" "fmt" "time" @@ -12,6 +13,7 @@ import ( "github.com/rilldata/rill/runtime" compilerv1 "github.com/rilldata/rill/runtime/compilers/rillv1" "github.com/rilldata/rill/runtime/drivers" + "golang.org/x/exp/slog" "google.golang.org/protobuf/types/known/timestamppb" ) @@ -53,12 +55,20 @@ func (r *ModelReconciler) AssignState(from, to *runtimev1.Resource) error { return nil } +func (r *ModelReconciler) ResetState(res *runtimev1.Resource) error { + res.GetModel().State = &runtimev1.ModelState{} + return nil +} + func (r *ModelReconciler) Reconcile(ctx context.Context, n *runtimev1.ResourceName) runtime.ReconcileResult { - self, err := r.C.Get(ctx, n) + self, err := r.C.Get(ctx, n, true) if err != nil { return runtime.ReconcileResult{Err: err} } model := self.GetModel() + if model == nil { + return runtime.ReconcileResult{Err: errors.New("not a model")} + } // The view/table name is derived from the resource name. // We only set src.State.Table after it has been created, @@ -78,13 +88,8 @@ func (r *ModelReconciler) Reconcile(ctx context.Context, n *runtimev1.ResourceNa // Handle renames if self.Meta.RenamedFrom != nil { if t, ok := olapTableInfo(ctx, r.C, model.State.Connector, model.State.Table); ok { - // Clear any existing table with the new name - if t2, ok := olapTableInfo(ctx, r.C, model.State.Connector, tableName); ok { - olapDropTableIfExists(ctx, r.C, model.State.Connector, t2.Name, t2.View) - } - // Rename and update state - err = olapRenameTable(ctx, r.C, model.State.Connector, model.State.Table, tableName, t.View) + err = olapForceRenameTable(ctx, r.C, model.State.Connector, model.State.Table, t.View, tableName) if err != nil { return runtime.ReconcileResult{Err: fmt.Errorf("failed to rename model: %w", err)} } @@ -97,12 +102,28 @@ func (r *ModelReconciler) Reconcile(ctx context.Context, n *runtimev1.ResourceNa // Note: Not exiting early. It might need to be created/materialized., and we need to set the correct retrigger time based on the refresh schedule. } - // TODO: Exit if refs have errors - - // TODO: Incorporate changes to refs in hash – track if refs have changed (deleted, added, or state updated) + // Check refs - stop if any of them are invalid + err = checkRefs(ctx, r.C, self.Meta.Refs) + if err != nil { + if !model.Spec.StageChanges && model.State.Table != "" { + // Remove previously ingested table + if t, ok := olapTableInfo(ctx, r.C, model.State.Connector, model.State.Table); ok { + olapDropTableIfExists(ctx, r.C, model.State.Connector, model.State.Table, t.View) + } + model.State.Connector = "" + model.State.Table = "" + model.State.SpecHash = "" + model.State.RefreshedOn = nil + err = r.C.UpdateState(ctx, self.Meta.Name, self) + if err != nil { + r.C.Logger.Error("refs check: failed to update state", slog.Any("err", err)) + } + } + return runtime.ReconcileResult{Err: err} + } // Use a hash of execution-related fields from the spec to determine if something has changed - hash, err := r.executionSpecHash(model.Spec) + hash, err := r.executionSpecHash(ctx, self.Meta.Refs, model.Spec) if err != nil { return runtime.ReconcileResult{Err: fmt.Errorf("failed to compute hash: %w", err)} } @@ -128,6 +149,7 @@ func (r *ModelReconciler) Reconcile(ctx context.Context, n *runtimev1.ResourceNa // Decide if we should trigger an update trigger := model.Spec.Trigger trigger = trigger || model.State.Table == "" + trigger = trigger || model.State.Table != tableName trigger = trigger || model.State.RefreshedOn == nil trigger = trigger || model.State.SpecHash != hash trigger = trigger || !exists @@ -191,12 +213,8 @@ func (r *ModelReconciler) Reconcile(ctx context.Context, n *runtimev1.ResourceNa createErr = fmt.Errorf("failed to create model: %w", createErr) } if createErr == nil && stage { - // Drop the main view/table - if t, ok := olapTableInfo(ctx, r.C, connector, tableName); ok { - olapDropTableIfExists(ctx, r.C, connector, t.Name, t.View) - } // Rename the staging table to main view/table - err = olapRenameTable(ctx, r.C, connector, stagingTableName, tableName, !materialize) + err = olapForceRenameTable(ctx, r.C, connector, stagingTableName, !materialize, tableName) if err != nil { return runtime.ReconcileResult{Err: fmt.Errorf("failed to rename staged model: %w", err)} } @@ -251,8 +269,7 @@ func (r *ModelReconciler) Reconcile(ctx context.Context, n *runtimev1.ResourceNa // Reset spec.Trigger if model.Spec.Trigger { - model.Spec.Trigger = false - err = r.C.UpdateSpec(ctx, self.Meta.Name, self) + err := r.setTriggerFalse(ctx, n) if err != nil { return runtime.ReconcileResult{Err: err} } @@ -289,10 +306,35 @@ func (r *ModelReconciler) delayedMaterializeTime(spec *runtimev1.ModelSpec, sinc return since.Add(time.Duration(spec.MaterializeDelaySeconds) * time.Second), true } -// executionSpecHash computes a hash of only those model spec properties that impact execution. -func (r *ModelReconciler) executionSpecHash(spec *runtimev1.ModelSpec) (string, error) { +// executionSpecHash computes a hash of only those model properties that impact execution. +func (r *ModelReconciler) executionSpecHash(ctx context.Context, refs []*runtimev1.ResourceName, spec *runtimev1.ModelSpec) (string, error) { hash := md5.New() + for _, ref := range refs { // Refs are always sorted + // Write name + _, err := hash.Write([]byte(ref.Kind)) + if err != nil { + return "", err + } + _, err = hash.Write([]byte(ref.Name)) + if err != nil { + return "", err + } + + // Write state version (doesn't matter how the spec or meta has changed, only if/when state changes) + r, err := r.C.Get(ctx, ref, false) + var stateVersion int64 + if err == nil { + stateVersion = r.Meta.StateVersion + } else { + stateVersion = -1 + } + err = binary.Write(hash, binary.BigEndian, stateVersion) + if err != nil { + return "", err + } + } + _, err := hash.Write([]byte(spec.Connector)) if err != nil { return "", err @@ -321,6 +363,26 @@ func (r *ModelReconciler) executionSpecHash(spec *runtimev1.ModelSpec) (string, return hex.EncodeToString(hash.Sum(nil)), nil } +// setTriggerFalse sets the model's spec.Trigger to false. +// Unlike the State, the Spec may be edited concurrently with a Reconcile call, so we need to read and edit it under a lock. +func (r *ModelReconciler) setTriggerFalse(ctx context.Context, n *runtimev1.ResourceName) error { + r.C.Lock(ctx) + defer r.C.Unlock(ctx) + + self, err := r.C.Get(ctx, n, false) + if err != nil { + return err + } + + model := self.GetModel() + if model == nil { + return fmt.Errorf("not a model") + } + + model.Spec.Trigger = false + return r.C.UpdateSpec(ctx, self.Meta.Name, self) +} + // createModel creates or updates the model in the OLAP connector. func (r *ModelReconciler) createModel(ctx context.Context, self *runtimev1.Resource, tableName string, view bool) error { inst, err := r.C.Runtime.FindInstance(ctx, r.C.InstanceID) @@ -348,7 +410,7 @@ func (r *ModelReconciler) createModel(ctx context.Context, self *runtimev1.Resou if name.Kind == compilerv1.ResourceKindUnspecified { return compilerv1.TemplateResource{}, fmt.Errorf("can't resolve name %q without kind specified", name.Name) } - res, err := r.C.Get(ctx, resourceNameFromCompiler(name)) + res, err := r.C.Get(ctx, resourceNameFromCompiler(name), false) if err != nil { return compilerv1.TemplateResource{}, err } @@ -391,7 +453,8 @@ func (r *ModelReconciler) createModel(ctx context.Context, self *runtimev1.Resou } return olap.Exec(ctx, &drivers.Statement{ - Query: fmt.Sprintf("CREATE OR REPLACE %s %s AS (%s)", typ, safeSQLName(tableName), sql), - Priority: 100, + Query: fmt.Sprintf("CREATE OR REPLACE %s %s AS (%s)", typ, safeSQLName(tableName), sql), + Priority: 100, + LongRunning: true, }) } diff --git a/runtime/reconcilers/project_parser.go b/runtime/reconcilers/project_parser.go index 0fbf8a818f2..fdd167b9ec1 100644 --- a/runtime/reconcilers/project_parser.go +++ b/runtime/reconcilers/project_parser.go @@ -53,13 +53,21 @@ func (r *ProjectParserReconciler) AssignState(from, to *runtimev1.Resource) erro return nil } +func (r *ProjectParserReconciler) ResetState(res *runtimev1.Resource) error { + res.GetProjectParser().State = &runtimev1.ProjectParserState{} + return nil +} + func (r *ProjectParserReconciler) Reconcile(ctx context.Context, n *runtimev1.ResourceName) runtime.ReconcileResult { // Get ProjectParser resource - self, err := r.C.Get(ctx, n) + self, err := r.C.Get(ctx, n, true) if err != nil { return runtime.ReconcileResult{Err: err} } pp := self.GetProjectParser() + if pp == nil { + return runtime.ReconcileResult{Err: errors.New("not a project parser")} + } // Does not support renames if self.Meta.RenamedFrom != nil { @@ -71,7 +79,7 @@ func (r *ProjectParserReconciler) Reconcile(ctx context.Context, n *runtimev1.Re r.C.Lock(ctx) defer r.C.Unlock(ctx) - resources, err := r.C.List(ctx, "") + resources, err := r.C.List(ctx, "", false) if err != nil { return runtime.ReconcileResult{Err: err} } @@ -112,7 +120,7 @@ func (r *ProjectParserReconciler) Reconcile(ctx context.Context, n *runtimev1.Re } if pp.State.CurrentCommitSha != hash { pp.State.CurrentCommitSha = hash - err = r.C.UpdateState(ctx, n, self) // TODO: Pointer relationship between self and pp makes this hard to follow + err = r.C.UpdateState(ctx, n, self) if err != nil { return runtime.ReconcileResult{Err: err} } @@ -179,9 +187,9 @@ func (r *ProjectParserReconciler) Reconcile(ctx context.Context, n *runtimev1.Re // reconcileParser reconciles a parser's output with the current resources in the catalog. func (r *ProjectParserReconciler) reconcileParser(ctx context.Context, self *runtimev1.Resource, parser *compilerv1.Parser, diff *compilerv1.Diff) error { - // Update state from rill.yaml - if diff == nil || diff.ModifiedRillYAML { - err := r.reconcileRillYAML(ctx, parser) + // Update state from rill.yaml and .env + if diff == nil || diff.ModifiedRillYAML || diff.ModifiedDotEnv { + err := r.reconcileProjectConfig(ctx, parser) if err != nil { return err } @@ -215,8 +223,8 @@ func (r *ProjectParserReconciler) reconcileParser(ctx context.Context, self *run return r.reconcileResources(ctx, self, parser) } -// reconcileRillYAML updates instance config derived from rill.yaml -func (r *ProjectParserReconciler) reconcileRillYAML(ctx context.Context, parser *compilerv1.Parser) error { +// reconcileProjectConfig updates instance config derived from rill.yaml and .env +func (r *ProjectParserReconciler) reconcileProjectConfig(ctx context.Context, parser *compilerv1.Parser) error { inst, err := r.C.Runtime.FindInstance(ctx, r.C.InstanceID) if err != nil { return err @@ -226,6 +234,9 @@ func (r *ProjectParserReconciler) reconcileRillYAML(ctx context.Context, parser for _, v := range parser.RillYAML.Variables { vars[v.Name] = v.Default } + for k, v := range parser.DotEnv { + vars[k] = v + } inst.ProjectVariables = vars err = r.C.Runtime.EditInstance(ctx, inst) @@ -242,7 +253,7 @@ func (r *ProjectParserReconciler) reconcileResources(ctx context.Context, self * var deleteResources []*runtimev1.Resource // Pass over all existing resources in the catalog. - resources, err := r.C.List(ctx, "") + resources, err := r.C.List(ctx, "", false) if err != nil { return err } @@ -317,7 +328,7 @@ func (r *ProjectParserReconciler) reconcileResourcesDiff(ctx context.Context, se // Gather resource to delete so we can check for renames. deleteResources := make([]*runtimev1.Resource, 0, len(diff.Deleted)) for _, n := range diff.Deleted { - r, err := r.C.Get(ctx, resourceNameFromCompiler(n)) + r, err := r.C.Get(ctx, resourceNameFromCompiler(n), false) if err != nil { return err } @@ -326,7 +337,7 @@ func (r *ProjectParserReconciler) reconcileResourcesDiff(ctx context.Context, se // Updates for _, n := range diff.Modified { - existing, err := r.C.Get(ctx, resourceNameFromCompiler(n)) + existing, err := r.C.Get(ctx, resourceNameFromCompiler(n), false) if err != nil { return err } @@ -434,7 +445,7 @@ func (r *ProjectParserReconciler) putParserResourceDef(ctx context.Context, self } // Update meta if refs or file paths changed - if !slices.Equal(existing.Meta.FilePaths, def.Paths) || !slices.Equal(existing.Meta.Refs, refs) { // TODO: Don't use slices.Equal for protos + if !slices.Equal(existing.Meta.FilePaths, def.Paths) || !equalResourceNames(existing.Meta.Refs, refs) { err := r.C.UpdateMeta(ctx, n, refs, self.Meta.Name, def.Paths) if err != nil { return err @@ -544,6 +555,18 @@ func equalResourceName(a, b *runtimev1.ResourceName) bool { return a.Kind == b.Kind && strings.EqualFold(a.Name, b.Name) } +func equalResourceNames(a, b []*runtimev1.ResourceName) bool { + if len(a) != len(b) { + return false + } + for i, v := range a { + if !equalResourceName(v, b[i]) { + return false + } + } + return true +} + func equalSourceSpec(a, b *runtimev1.SourceSpec) bool { return proto.Equal(a, b) } diff --git a/runtime/reconcilers/pull_trigger.go b/runtime/reconcilers/pull_trigger.go index d33b80c6019..98dc4f027fa 100644 --- a/runtime/reconcilers/pull_trigger.go +++ b/runtime/reconcilers/pull_trigger.go @@ -47,8 +47,13 @@ func (r *PullTriggerReconciler) AssignState(from, to *runtimev1.Resource) error return nil } +func (r *PullTriggerReconciler) ResetState(res *runtimev1.Resource) error { + res.GetPullTrigger().State = &runtimev1.PullTriggerState{} + return nil +} + func (r *PullTriggerReconciler) Reconcile(ctx context.Context, n *runtimev1.ResourceName) runtime.ReconcileResult { - self, err := r.C.Get(ctx, n) + self, err := r.C.Get(ctx, n, true) if err != nil { return runtime.ReconcileResult{Err: err} } diff --git a/runtime/reconcilers/refresh_trigger.go b/runtime/reconcilers/refresh_trigger.go index 3c3f4c20741..8b55895b895 100644 --- a/runtime/reconcilers/refresh_trigger.go +++ b/runtime/reconcilers/refresh_trigger.go @@ -2,6 +2,7 @@ package reconcilers import ( "context" + "errors" "fmt" runtimev1 "github.com/rilldata/rill/proto/gen/rill/runtime/v1" @@ -48,18 +49,29 @@ func (r *RefreshTriggerReconciler) AssignState(from, to *runtimev1.Resource) err return nil } +func (r *RefreshTriggerReconciler) ResetState(res *runtimev1.Resource) error { + res.GetRefreshTrigger().State = &runtimev1.RefreshTriggerState{} + return nil +} + func (r *RefreshTriggerReconciler) Reconcile(ctx context.Context, n *runtimev1.ResourceName) runtime.ReconcileResult { - self, err := r.C.Get(ctx, n) + self, err := r.C.Get(ctx, n, true) if err != nil { return runtime.ReconcileResult{Err: err} } trigger := self.GetRefreshTrigger() + if trigger == nil { + return runtime.ReconcileResult{Err: errors.New("not a refresh trigger")} + } if self.Meta.DeletedOn != nil { return runtime.ReconcileResult{} } - resources, err := r.C.List(ctx, "") + r.C.Lock(ctx) + defer r.C.Unlock(ctx) + + resources, err := r.C.List(ctx, "", false) if err != nil { return runtime.ReconcileResult{Err: err} } diff --git a/runtime/reconcilers/source.go b/runtime/reconcilers/source.go index 8a62c82a0ee..a9ddf88c97e 100644 --- a/runtime/reconcilers/source.go +++ b/runtime/reconcilers/source.go @@ -5,6 +5,7 @@ import ( "crypto/md5" "encoding/binary" "encoding/hex" + "errors" "fmt" "time" @@ -12,6 +13,7 @@ import ( "github.com/rilldata/rill/runtime" "github.com/rilldata/rill/runtime/drivers" "github.com/rilldata/rill/runtime/pkg/pbutil" + "golang.org/x/exp/slog" "google.golang.org/protobuf/types/known/structpb" "google.golang.org/protobuf/types/known/timestamppb" ) @@ -54,12 +56,20 @@ func (r *SourceReconciler) AssignState(from, to *runtimev1.Resource) error { return nil } +func (r *SourceReconciler) ResetState(res *runtimev1.Resource) error { + res.GetSource().State = &runtimev1.SourceState{} + return nil +} + func (r *SourceReconciler) Reconcile(ctx context.Context, n *runtimev1.ResourceName) runtime.ReconcileResult { - self, err := r.C.Get(ctx, n) + self, err := r.C.Get(ctx, n, true) if err != nil { return runtime.ReconcileResult{Err: err} } src := self.GetSource() + if src == nil { + return runtime.ReconcileResult{Err: errors.New("not a source")} + } // The table name to ingest into is derived from the resource name. // We only set src.State.Table after ingestion is complete. @@ -78,13 +88,8 @@ func (r *SourceReconciler) Reconcile(ctx context.Context, n *runtimev1.ResourceN // Check if the table exists (it should, but might somehow have been corrupted) t, ok := olapTableInfo(ctx, r.C, src.State.Connector, src.State.Table) if ok && !t.View { // Checking View only out of caution (would indicate very corrupted DB) - // Clear any existing table with the new name - if t2, ok := olapTableInfo(ctx, r.C, src.State.Connector, tableName); ok { - olapDropTableIfExists(ctx, r.C, src.State.Connector, tableName, t2.View) - } - // Rename and update state - err = olapRenameTable(ctx, r.C, src.State.Connector, src.State.Table, tableName, false) + err = olapForceRenameTable(ctx, r.C, src.State.Connector, src.State.Table, false, tableName) if err != nil { return runtime.ReconcileResult{Err: fmt.Errorf("failed to rename table: %w", err)} } @@ -97,7 +102,23 @@ func (r *SourceReconciler) Reconcile(ctx context.Context, n *runtimev1.ResourceN // Note: Not exiting early. It might need to be (re-)ingested, and we need to set the correct retrigger time based on the refresh schedule. } - // TODO: Exit if refs have errors + // Check refs - stop if any of them are invalid + err = checkRefs(ctx, r.C, self.Meta.Refs) + if err != nil { + if !src.Spec.StageChanges && src.State.Table != "" { + // Remove previously ingested table + olapDropTableIfExists(ctx, r.C, src.State.Connector, src.State.Table, false) + src.State.Connector = "" + src.State.Table = "" + src.State.SpecHash = "" + src.State.RefreshedOn = nil + err = r.C.UpdateState(ctx, self.Meta.Name, self) + if err != nil { + r.C.Logger.Error("refs check: failed to update state", slog.Any("err", err)) + } + } + return runtime.ReconcileResult{Err: err} + } // Use a hash of ingestion-related fields from the spec to determine if we need to re-ingest hash, err := r.ingestionSpecHash(src.Spec) @@ -158,12 +179,8 @@ func (r *SourceReconciler) Reconcile(ctx context.Context, n *runtimev1.ResourceN ingestErr = fmt.Errorf("failed to ingest source: %w", ingestErr) } if ingestErr == nil && src.Spec.StageChanges { - // Drop the main table name - if t, ok := olapTableInfo(ctx, r.C, connector, tableName); ok { - olapDropTableIfExists(ctx, r.C, connector, tableName, t.View) - } // Rename staging table to main table - err = olapRenameTable(ctx, r.C, connector, stagingTableName, tableName, false) + err = olapForceRenameTable(ctx, r.C, connector, stagingTableName, false, tableName) if err != nil { return runtime.ReconcileResult{Err: fmt.Errorf("failed to rename staging table: %w", err)} } @@ -218,8 +235,7 @@ func (r *SourceReconciler) Reconcile(ctx context.Context, n *runtimev1.ResourceN // Reset spec.Trigger if src.Spec.Trigger { - src.Spec.Trigger = false - err = r.C.UpdateSpec(ctx, self.Meta.Name, self) + err := r.setTriggerFalse(ctx, n) if err != nil { return runtime.ReconcileResult{Err: err} } @@ -267,6 +283,26 @@ func (r *SourceReconciler) stagingTableName(table string) string { return "__rill_tmp_src_" + table } +// setTriggerFalse sets the source's spec.Trigger to false. +// Unlike the State, the Spec may be edited concurrently with a Reconcile call, so we need to read and edit it under a lock. +func (r *SourceReconciler) setTriggerFalse(ctx context.Context, n *runtimev1.ResourceName) error { + r.C.Lock(ctx) + defer r.C.Unlock(ctx) + + self, err := r.C.Get(ctx, n, false) + if err != nil { + return err + } + + source := self.GetSource() + if source == nil { + return fmt.Errorf("not a source") + } + + source.Spec.Trigger = false + return r.C.UpdateSpec(ctx, self.Meta.Name, self) +} + // ingestSource ingests the source into a table with tableName. // It does NOT drop the table if ingestion fails after the table has been created. // It will return an error if the sink connector is not an OLAP. @@ -363,74 +399,11 @@ func (r *SourceReconciler) ingestSource(ctx context.Context, src *runtimev1.Sour return err } -func driversSource(conn drivers.Handle, propsPB *structpb.Struct) (drivers.Source, error) { +func driversSource(conn drivers.Handle, propsPB *structpb.Struct) (map[string]any, error) { props := propsPB.AsMap() - switch conn.Driver() { - case "s3": - return &drivers.BucketSource{ - // ExtractPolicy: src.Policy, // TODO: Add - Properties: props, - }, nil - case "gcs": - return &drivers.BucketSource{ - // ExtractPolicy: src.Policy, // TODO: Add - Properties: props, - }, nil - case "https": - return &drivers.FileSource{ - Properties: props, - }, nil - case "local_file": - return &drivers.FileSource{ - Properties: props, - }, nil - case "motherduck": - query, ok := props["sql"].(string) - if !ok { - return nil, fmt.Errorf("property \"sql\" is mandatory for connector \"motherduck\"") - } - var db string - if val, ok := props["db"].(string); ok { - db = val - } - - return &drivers.DatabaseSource{ - SQL: query, - Database: db, - }, nil - case "duckdb": - query, ok := props["sql"].(string) - if !ok { - return nil, fmt.Errorf("property \"sql\" is mandatory for connector \"duckdb\"") - } - return &drivers.DatabaseSource{ - SQL: query, - }, nil - case "bigquery": - query, ok := props["sql"].(string) - if !ok { - return nil, fmt.Errorf("property \"sql\" is mandatory for connector \"bigquery\"") - } - return &drivers.DatabaseSource{ - SQL: query, - Props: props, - }, nil - case "athena": - return &drivers.BucketSource{ - Properties: props, - }, nil - default: - return nil, fmt.Errorf("source connector %q not supported", conn.Driver()) - } + return props, nil } -func driversSink(conn drivers.Handle, tableName string) (drivers.Sink, error) { - switch conn.Driver() { - case "duckdb": - return &drivers.DatabaseSink{ - Table: tableName, - }, nil - default: - return nil, fmt.Errorf("sink connector %q not supported", conn.Driver()) - } +func driversSink(conn drivers.Handle, tableName string) (map[string]any, error) { + return map[string]any{"table": tableName}, nil } diff --git a/runtime/reconcilers/util.go b/runtime/reconcilers/util.go index 04e5b7f864a..56ef7a982f6 100644 --- a/runtime/reconcilers/util.go +++ b/runtime/reconcilers/util.go @@ -3,6 +3,7 @@ package reconcilers import ( "context" "database/sql" + "errors" "fmt" "strings" "time" @@ -13,6 +14,26 @@ import ( "github.com/robfig/cron/v3" ) +// checkRefs checks that all refs exist, are idle, and have no errors. +func checkRefs(ctx context.Context, c *runtime.Controller, refs []*runtimev1.ResourceName) error { + for _, ref := range refs { + res, err := c.Get(ctx, ref, false) + if err != nil { + if errors.Is(err, drivers.ErrResourceNotFound) { + return fmt.Errorf("dependency error: resource %q (%s) not found", ref.Name, ref.Kind) + } + return fmt.Errorf("dependency error: failed to get resource %q (%s): %w", ref.Name, ref.Kind, err) + } + if res.Meta.ReconcileStatus != runtimev1.ReconcileStatus_RECONCILE_STATUS_IDLE { + return fmt.Errorf("dependency error: resource %q (%s) is not idle", ref.Name, ref.Kind) + } + if res.Meta.ReconcileError != "" { + return fmt.Errorf("dependency error: resource %q (%s) has an error", ref.Name, ref.Kind) + } + } + return nil +} + // nextRefreshTime returns the earliest time AFTER t that the schedule should trigger. func nextRefreshTime(t time.Time, schedule *runtimev1.Schedule) (time.Time, error) { if schedule == nil { @@ -86,19 +107,20 @@ func olapDropTableIfExists(ctx context.Context, c *runtime.Controller, connector } _ = olap.Exec(ctx, &drivers.Statement{ - Query: fmt.Sprintf("DROP %s IF EXISTS %s", typ, safeSQLName(table)), - Priority: 100, + Query: fmt.Sprintf("DROP %s IF EXISTS %s", typ, safeSQLName(table)), + Priority: 100, + LongRunning: true, }) } -// olapRenameTable renames the table from oldName to newName in the OLAP connector. -// oldName must exist and newName must not exist. -func olapRenameTable(ctx context.Context, c *runtime.Controller, connector, oldName, newName string, view bool) error { - if oldName == "" || newName == "" { - return fmt.Errorf("cannot rename empty table name: oldName=%q, newName=%q", oldName, newName) +// olapForceRenameTable renames a table or view from fromName to toName in the OLAP connector. +// If a view or table already exists with toName, it is overwritten. +func olapForceRenameTable(ctx context.Context, c *runtime.Controller, connector, fromName string, fromIsView bool, toName string) error { + if fromName == "" || toName == "" { + return fmt.Errorf("cannot rename empty table name: fromName=%q, toName=%q", fromName, toName) } - if oldName == newName { + if fromName == toName { return nil } @@ -108,37 +130,60 @@ func olapRenameTable(ctx context.Context, c *runtime.Controller, connector, oldN } defer release() - var typ string - if view { - typ = "VIEW" - } else { - typ = "TABLE" - } + existingTo, _ := olap.InformationSchema().Lookup(ctx, toName) + + return olap.WithConnection(ctx, 100, true, true, func(ctx context.Context, ensuredCtx context.Context, conn *sql.Conn) error { + // Drop the existing table at toName + if existingTo != nil { + var typ string + if existingTo.View { + typ = "VIEW" + } else { + typ = "TABLE" + } + + err := olap.Exec(ctx, &drivers.Statement{ + Query: fmt.Sprintf("DROP %s IF EXISTS %s", typ, safeSQLName(existingTo.Name)), + }) + if err != nil { + return err + } + } + + // Infer SQL keyword for the table type + var typ string + if fromIsView { + typ = "VIEW" + } else { + typ = "TABLE" + } - // TODO: Use a transaction? - return olap.WithConnection(ctx, 100, func(ctx context.Context, ensuredCtx context.Context, conn *sql.Conn) error { // Renaming a table to the same name with different casing is not supported. Workaround by renaming to a temporary name first. - if strings.EqualFold(oldName, newName) { - tmp := "__rill_tmp_rename_%s_" + typ + newName - err = olap.Exec(ctx, &drivers.Statement{Query: fmt.Sprintf("DROP %s IF EXISTS %s", typ, safeSQLName(tmp))}) + if strings.EqualFold(fromName, toName) { + tmpName := "__rill_tmp_rename_%s_" + typ + toName + err = olap.Exec(ctx, &drivers.Statement{Query: fmt.Sprintf("DROP %s IF EXISTS %s", typ, safeSQLName(tmpName))}) if err != nil { return err } err := olap.Exec(ctx, &drivers.Statement{ - Query: fmt.Sprintf("ALTER %s %s RENAME TO %s", typ, safeSQLName(oldName), safeSQLName(tmp)), - Priority: 100, + Query: fmt.Sprintf("ALTER %s %s RENAME TO %s", typ, safeSQLName(fromName), safeSQLName(tmpName)), }) if err != nil { return err } - oldName = tmp + fromName = tmpName } - return olap.Exec(ctx, &drivers.Statement{ - Query: fmt.Sprintf("ALTER TABLE %s RENAME TO %s", safeSQLName(oldName), safeSQLName(newName)), - Priority: 100, + // Do the rename + err = olap.Exec(ctx, &drivers.Statement{ + Query: fmt.Sprintf("ALTER %s %s RENAME TO %s", typ, safeSQLName(fromName), safeSQLName(toName)), }) + if err != nil { + return err + } + + return nil }) } diff --git a/runtime/server/batch_query.go b/runtime/server/batch_query.go index 95064f3cd8d..22cec419970 100644 --- a/runtime/server/batch_query.go +++ b/runtime/server/batch_query.go @@ -33,6 +33,14 @@ func (s *Server) forwardQuery(ctx context.Context, query *runtimev1.QueryBatchRe var err error switch q := queryEntry.Query.(type) { + case *runtimev1.QueryBatchEntry_MetricsViewAggregationRequest: + var r *runtimev1.MetricsViewAggregationResponse + q.MetricsViewAggregationRequest.InstanceId = query.InstanceId + r, err = s.MetricsViewAggregation(ctx, q.MetricsViewAggregationRequest) + if err == nil { + resp.Result = &runtimev1.QueryBatchResponse_MetricsViewAggregationResponse{MetricsViewAggregationResponse: r} + } + case *runtimev1.QueryBatchEntry_MetricsViewToplistRequest: var r *runtimev1.MetricsViewToplistResponse q.MetricsViewToplistRequest.InstanceId = query.InstanceId diff --git a/runtime/server/catalog.go b/runtime/server/catalog.go index 2ad5924b676..59fa747f150 100644 --- a/runtime/server/catalog.go +++ b/runtime/server/catalog.go @@ -2,6 +2,7 @@ package server import ( "context" + "errors" "fmt" "strings" @@ -80,6 +81,9 @@ func (s *Server) GetCatalogEntry(ctx context.Context, req *runtimev1.GetCatalogE entry, err := s.runtime.GetCatalogEntry(ctx, req.InstanceId, req.Name) if err != nil { + if errors.Is(err, drivers.ErrNotFound) { + return nil, status.Error(codes.NotFound, "not found") + } return nil, status.Error(codes.Unknown, err.Error()) } @@ -92,8 +96,9 @@ func (s *Server) GetCatalogEntry(ctx context.Context, req *runtimev1.GetCatalogE } if security != nil && !security.Access { - return nil, ErrForbidden + return nil, status.Error(codes.NotFound, "not found") } + newMv := filterDimensionsAndMeasures(security, mv) pb, err = mvCatalogObjectToPB(entry, newMv) if err != nil { diff --git a/runtime/server/connectors.go b/runtime/server/connectors.go index 2e6c2cb009f..4fb45d6e78a 100644 --- a/runtime/server/connectors.go +++ b/runtime/server/connectors.go @@ -5,10 +5,12 @@ import ( "fmt" runtimev1 "github.com/rilldata/rill/proto/gen/rill/runtime/v1" + "github.com/rilldata/rill/runtime/compilers/rillv1" "github.com/rilldata/rill/runtime/drivers" "github.com/rilldata/rill/runtime/drivers/bigquery" "github.com/rilldata/rill/runtime/drivers/gcs" "github.com/rilldata/rill/runtime/drivers/s3" + "golang.org/x/exp/maps" ) // ListConnectors implements RuntimeService. @@ -60,6 +62,36 @@ func (s *Server) ListConnectors(ctx context.Context, req *runtimev1.ListConnecto return &runtimev1.ListConnectorsResponse{Connectors: pbs}, nil } +func (s *Server) ScanConnectors(ctx context.Context, req *runtimev1.ScanConnectorsRequest) (*runtimev1.ScanConnectorsResponse, error) { + repo, release, err := s.runtime.Repo(ctx, req.InstanceId) + if err != nil { + return nil, err + } + defer release() + + p, err := rillv1.Parse(ctx, repo, req.InstanceId, nil) + if err != nil { + return nil, err + } + + connectors, err := p.AnalyzeConnectors(ctx) + if err != nil { + return nil, err + } + + cMap := make(map[string]*runtimev1.ScannedConnector, len(connectors)) + for _, connector := range connectors { + cMap[connector.Name] = &runtimev1.ScannedConnector{ + Name: connector.Name, + Type: connector.Driver, + HasAnonymousAccess: connector.AnonymousAccess, + } + } + return &runtimev1.ScanConnectorsResponse{ + Connectors: maps.Values(cMap), + }, nil +} + func (s *Server) S3ListBuckets(ctx context.Context, req *runtimev1.S3ListBucketsRequest) (*runtimev1.S3ListBucketsResponse, error) { s3Conn, release, err := s.getS3Conn(ctx, req.Connector, req.InstanceId) if err != nil { diff --git a/runtime/server/controller.go b/runtime/server/controller.go index 56e2818f9bf..a8f02ca3309 100644 --- a/runtime/server/controller.go +++ b/runtime/server/controller.go @@ -39,7 +39,7 @@ func (s *Server) ListResources(ctx context.Context, req *runtimev1.ListResources return nil, status.Error(codes.InvalidArgument, err.Error()) } - rs, err := ctrl.List(ctx, req.Kind) + rs, err := ctrl.List(ctx, req.Kind, false) if err != nil { return nil, status.Error(codes.InvalidArgument, err.Error()) } @@ -66,7 +66,7 @@ func (s *Server) WatchResources(req *runtimev1.WatchResourcesRequest, ss runtime } if req.Replay { - rs, err := ctrl.List(ss.Context(), req.Kind) + rs, err := ctrl.List(ss.Context(), req.Kind, false) if err != nil { return status.Error(codes.InvalidArgument, err.Error()) } @@ -116,7 +116,7 @@ func (s *Server) GetResource(ctx context.Context, req *runtimev1.GetResourceRequ return nil, status.Error(codes.InvalidArgument, err.Error()) } - r, err := ctrl.Get(ctx, req.Name) + r, err := ctrl.Get(ctx, req.Name, false) if err != nil { return nil, status.Error(codes.InvalidArgument, err.Error()) } diff --git a/runtime/server/downloads.go b/runtime/server/downloads.go index b5d584814e9..e2071bc78f8 100644 --- a/runtime/server/downloads.go +++ b/runtime/server/downloads.go @@ -70,6 +70,48 @@ func (s *Server) downloadHandler(w http.ResponseWriter, req *http.Request) { var q runtime.Query switch v := request.Request.(type) { + case *runtimev1.ExportRequest_MetricsViewAggregationRequest: + r := v.MetricsViewAggregationRequest + mv, security, err := resolveMVAndSecurity(req.Context(), s.runtime, request.InstanceId, r.MetricsView) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + for _, dim := range r.Dimensions { + if dim.Name == mv.TimeDimension { + // checkFieldAccess doesn't currently check the time dimension + continue + } + if !checkFieldAccess(dim.Name, security) { + http.Error(w, "action not allowed", http.StatusUnauthorized) + return + } + } + + for _, m := range r.Measures { + if m.BuiltinMeasure != runtimev1.BuiltinMeasure_BUILTIN_MEASURE_UNSPECIFIED { + continue + } + if !checkFieldAccess(m.Name, security) { + http.Error(w, "action not allowed", http.StatusUnauthorized) + return + } + } + + q = &queries.MetricsViewAggregation{ + MetricsViewName: r.MetricsView, + Dimensions: r.Dimensions, + Measures: r.Measures, + Sort: r.Sort, + TimeStart: r.TimeStart, + TimeEnd: r.TimeEnd, + Filter: r.Filter, + Limit: &r.Limit, + Offset: r.Offset, + MetricsView: mv, + ResolvedMVSecurity: security, + } case *runtimev1.ExportRequest_MetricsViewToplistRequest: r := v.MetricsViewToplistRequest diff --git a/runtime/server/instances.go b/runtime/server/instances.go index 3d07b21657b..8f1884a7ed3 100644 --- a/runtime/server/instances.go +++ b/runtime/server/instances.go @@ -206,6 +206,7 @@ func (s *Server) EditInstanceAnnotations(ctx context.Context, req *runtimev1.Edi EmbedCatalog: oldInst.EmbedCatalog, IngestionLimitBytes: oldInst.IngestionLimitBytes, Variables: oldInst.Variables, + Connectors: oldInst.Connectors, Annotations: req.Annotations, } diff --git a/runtime/server/observability_utils.go b/runtime/server/observability_utils.go index d33abbb7f27..3662e4b8b1e 100644 --- a/runtime/server/observability_utils.go +++ b/runtime/server/observability_utils.go @@ -31,6 +31,42 @@ func marshalInlineMeasure(ms []*runtimev1.InlineMeasure) []string { return nil } +func marshalMetricsViewAggregationDimension(ms []*runtimev1.MetricsViewAggregationDimension) []string { + if len(ms) == 0 { + return make([]string, 0) + } + + names := make([]string, len(ms)) + for i := 0; i < len(ms); i++ { + names[i] = ms[i].Name + } + return nil +} + +func marshalMetricsViewAggregationMeasures(ms []*runtimev1.MetricsViewAggregationMeasure) []string { + if len(ms) == 0 { + return make([]string, 0) + } + + names := make([]string, len(ms)) + for i := 0; i < len(ms); i++ { + names[i] = ms[i].Name + } + return nil +} + +func marshalMetricsViewAggregationSort(ms []*runtimev1.MetricsViewAggregationSort) []string { + if len(ms) == 0 { + return make([]string, 0) + } + + names := make([]string, len(ms)) + for i := 0; i < len(ms); i++ { + names[i] = ms[i].Name + } + return nil +} + func marshalMetricsViewComparisonSort(ms []*runtimev1.MetricsViewComparisonSort) []string { if len(ms) == 0 { return make([]string, 0) diff --git a/runtime/server/queries_metrics.go b/runtime/server/queries_metrics.go index 6f76ae09ac2..1bcf5e13fbc 100644 --- a/runtime/server/queries_metrics.go +++ b/runtime/server/queries_metrics.go @@ -3,7 +3,7 @@ package server import ( "context" "fmt" - "strings" + "regexp" "time" runtimev1 "github.com/rilldata/rill/proto/gen/rill/runtime/v1" @@ -16,6 +16,72 @@ import ( "google.golang.org/grpc/status" ) +// MetricsViewAggregation implements QueryService. +func (s *Server) MetricsViewAggregation(ctx context.Context, req *runtimev1.MetricsViewAggregationRequest) (*runtimev1.MetricsViewAggregationResponse, error) { + observability.AddRequestAttributes(ctx, + attribute.String("args.instance_id", req.InstanceId), + attribute.String("args.metric_view", req.MetricsView), + attribute.StringSlice("args.dimensions.names", marshalMetricsViewAggregationDimension(req.Dimensions)), + attribute.StringSlice("args.measures.names", marshalMetricsViewAggregationMeasures(req.Measures)), + attribute.StringSlice("args.sort.names", marshalMetricsViewAggregationSort(req.Sort)), + attribute.String("args.time_start", safeTimeStr(req.TimeStart)), + attribute.String("args.time_end", safeTimeStr(req.TimeEnd)), + attribute.Int("args.filter_count", filterCount(req.Filter)), + attribute.Int64("args.limit", req.Limit), + attribute.Int64("args.offset", req.Offset), + attribute.Int("args.priority", int(req.Priority)), + ) + s.addInstanceRequestAttributes(ctx, req.InstanceId) + + if !auth.GetClaims(ctx).CanInstance(req.InstanceId, auth.ReadMetrics) { + return nil, ErrForbidden + } + + mv, security, err := resolveMVAndSecurity(ctx, s.runtime, req.InstanceId, req.MetricsView) + if err != nil { + return nil, err + } + + for _, dim := range req.Dimensions { + if dim.Name == mv.TimeDimension { + // checkFieldAccess doesn't currently check the time dimension + continue + } + if !checkFieldAccess(dim.Name, security) { + return nil, ErrForbidden + } + } + + for _, m := range req.Measures { + if m.BuiltinMeasure != runtimev1.BuiltinMeasure_BUILTIN_MEASURE_UNSPECIFIED { + continue + } + if !checkFieldAccess(m.Name, security) { + return nil, ErrForbidden + } + } + + q := &queries.MetricsViewAggregation{ + MetricsViewName: req.MetricsView, + Dimensions: req.Dimensions, + Measures: req.Measures, + Sort: req.Sort, + TimeStart: req.TimeStart, + TimeEnd: req.TimeEnd, + Filter: req.Filter, + Limit: &req.Limit, + Offset: req.Offset, + MetricsView: mv, + ResolvedMVSecurity: security, + } + err = s.runtime.Query(ctx, req.InstanceId, q, int(req.Priority)) + if err != nil { + return nil, err + } + + return q.Result, nil +} + // MetricsViewToplist implements QueryService. func (s *Server) MetricsViewToplist(ctx context.Context, req *runtimev1.MetricsViewToplistRequest) (*runtimev1.MetricsViewToplistResponse, error) { observability.AddRequestAttributes(ctx, @@ -345,13 +411,16 @@ func (s *Server) MetricsViewTimeRange(ctx context.Context, req *runtimev1.Metric return q.Result, nil } +// inlineMeasureRegexp is used by validateInlineMeasures. +var inlineMeasureRegexp = regexp.MustCompile(`(?i)^COUNT\((DISTINCT)? *.+\)$`) + // validateInlineMeasures checks that the inline measures are allowed. // This is to prevent injection of arbitrary SQL from clients with only ReadMetrics access. // In the future, we should consider allowing arbitrary expressions from people with wider access. -// Currently, only COUNT(*) is allowed. +// Currently, only COUNT(*) and COUNT(DISTINCT name) is allowed. func validateInlineMeasures(ms []*runtimev1.InlineMeasure) error { for _, im := range ms { - if !strings.EqualFold(im.Expression, "COUNT(*)") { + if !inlineMeasureRegexp.MatchString(im.Expression) { return fmt.Errorf("illegal inline measure expression: %q", im.Expression) } } diff --git a/runtime/server/queries_metrics_aggregation_test.go b/runtime/server/queries_metrics_aggregation_test.go new file mode 100644 index 00000000000..58d8f68ccf7 --- /dev/null +++ b/runtime/server/queries_metrics_aggregation_test.go @@ -0,0 +1,109 @@ +package server + +import ( + "testing" + + runtimev1 "github.com/rilldata/rill/proto/gen/rill/runtime/v1" + "github.com/stretchr/testify/require" +) + +func TestMetricsViewAggregation_Toplist(t *testing.T) { + t.Parallel() + server, instanceId := getMetricsTestServer(t, "ad_bids_2rows") + + tr, err := server.MetricsViewAggregation(testCtx(), &runtimev1.MetricsViewAggregationRequest{ + InstanceId: instanceId, + MetricsView: "ad_bids_metrics", + Dimensions: []*runtimev1.MetricsViewAggregationDimension{ + {Name: "domain"}, + }, + Measures: []*runtimev1.MetricsViewAggregationMeasure{ + {Name: "measure_2"}, + {Name: "__count", BuiltinMeasure: runtimev1.BuiltinMeasure_BUILTIN_MEASURE_COUNT}, + }, + Sort: []*runtimev1.MetricsViewAggregationSort{ + {Name: "measure_2", Desc: true}, + }, + }) + require.NoError(t, err) + require.Equal(t, 2, len(tr.Data)) + + require.Equal(t, 3, len(tr.Data[0].Fields)) + require.Equal(t, 3, len(tr.Data[1].Fields)) + + require.Equal(t, "msn.com", tr.Data[0].Fields["domain"].GetStringValue()) + require.Equal(t, 2.0, tr.Data[0].Fields["measure_2"].GetNumberValue()) + require.Equal(t, 1.0, tr.Data[0].Fields["__count"].GetNumberValue()) + + require.Equal(t, "yahoo.com", tr.Data[1].Fields["domain"].GetStringValue()) + require.Equal(t, 1.0, tr.Data[1].Fields["measure_2"].GetNumberValue()) + require.Equal(t, 1.0, tr.Data[0].Fields["__count"].GetNumberValue()) +} + +func TestMetricsViewAggregation_Totals(t *testing.T) { + t.Parallel() + server, instanceId := getMetricsTestServer(t, "ad_bids_2rows") + + tr, err := server.MetricsViewAggregation(testCtx(), &runtimev1.MetricsViewAggregationRequest{ + InstanceId: instanceId, + MetricsView: "ad_bids_metrics", + Measures: []*runtimev1.MetricsViewAggregationMeasure{ + {Name: "measure_0"}, + }, + }) + require.NoError(t, err) + require.Equal(t, 1, len(tr.Data)) + require.Equal(t, 2.0, tr.Data[0].Fields["measure_0"].GetNumberValue()) +} + +func TestMetricsViewAggregation_Distinct(t *testing.T) { + t.Parallel() + server, instanceId := getMetricsTestServer(t, "ad_bids_2rows") + + tr, err := server.MetricsViewAggregation(testCtx(), &runtimev1.MetricsViewAggregationRequest{ + InstanceId: instanceId, + MetricsView: "ad_bids_metrics", + Dimensions: []*runtimev1.MetricsViewAggregationDimension{ + {Name: "domain"}, + }, + Sort: []*runtimev1.MetricsViewAggregationSort{ + {Name: "domain", Desc: true}, + }, + }) + require.NoError(t, err) + require.Equal(t, 2, len(tr.Data)) + require.Equal(t, 1, len(tr.Data[0].Fields)) + require.Equal(t, "yahoo.com", tr.Data[0].Fields["domain"].GetStringValue()) + require.Equal(t, "msn.com", tr.Data[1].Fields["domain"].GetStringValue()) +} + +func TestMetricsViewAggregation_Timeseries(t *testing.T) { + t.Parallel() + server, instanceId := getMetricsTestServer(t, "ad_bids_2rows") + + tr, err := server.MetricsViewAggregation(testCtx(), &runtimev1.MetricsViewAggregationRequest{ + InstanceId: instanceId, + MetricsView: "ad_bids_metrics", + Dimensions: []*runtimev1.MetricsViewAggregationDimension{ + {Name: "timestamp", TimeGrain: runtimev1.TimeGrain_TIME_GRAIN_HOUR}, + }, + Measures: []*runtimev1.MetricsViewAggregationMeasure{ + {Name: "measure_0"}, + {Name: "measure_2"}, + }, + Sort: []*runtimev1.MetricsViewAggregationSort{ + {Name: "timestamp"}, + }, + }) + require.NoError(t, err) + require.Equal(t, 2, len(tr.Data)) + require.Equal(t, 3, len(tr.Data[0].Fields)) + + require.Equal(t, "2022-01-01T14:00:00Z", tr.Data[0].Fields["timestamp"].GetStringValue()) + require.Equal(t, 1.0, tr.Data[0].Fields["measure_0"].GetNumberValue()) + require.Equal(t, 2.0, tr.Data[0].Fields["measure_2"].GetNumberValue()) + + require.Equal(t, "2022-01-02T11:00:00Z", tr.Data[1].Fields["timestamp"].GetStringValue()) + require.Equal(t, 1.0, tr.Data[1].Fields["measure_0"].GetNumberValue()) + require.Equal(t, 1.0, tr.Data[1].Fields["measure_2"].GetNumberValue()) +} diff --git a/runtime/server/queries_metrics_test.go b/runtime/server/queries_metrics_test.go new file mode 100644 index 00000000000..920ff7d6f2c --- /dev/null +++ b/runtime/server/queries_metrics_test.go @@ -0,0 +1,16 @@ +package server + +import ( + "testing" + + runtimev1 "github.com/rilldata/rill/proto/gen/rill/runtime/v1" + "github.com/stretchr/testify/require" +) + +func TestInlineMeasureValidation(t *testing.T) { + require.NoError(t, validateInlineMeasures([]*runtimev1.InlineMeasure{{Expression: "COUNT(*)"}})) + require.NoError(t, validateInlineMeasures([]*runtimev1.InlineMeasure{{Expression: "COUNT(my_dim)"}})) + require.NoError(t, validateInlineMeasures([]*runtimev1.InlineMeasure{{Expression: "COUNT(DISTINCT my_dim)"}})) + require.NoError(t, validateInlineMeasures([]*runtimev1.InlineMeasure{{Expression: "count(distinct my_dim)"}})) + require.Error(t, validateInlineMeasures([]*runtimev1.InlineMeasure{{Expression: "SUM(my_dim)"}})) +} diff --git a/runtime/server/queries_test.go b/runtime/server/queries_test.go index 2e62e75026c..edc41bb40b4 100644 --- a/runtime/server/queries_test.go +++ b/runtime/server/queries_test.go @@ -134,7 +134,7 @@ func TestServer_UpdateLimit_UNION(t *testing.T) { } func prepareOLAPStore(t *testing.T) drivers.OLAPStore { - conn, err := drivers.Open("duckdb", map[string]any{"dsn": "?access_mode=read_write&rill_pool_size=4"}, false, activity.NewNoopClient(), zap.NewNop()) + conn, err := drivers.Open("duckdb", map[string]any{"dsn": "?access_mode=read_write", "pool_size": 4}, false, activity.NewNoopClient(), zap.NewNop()) require.NoError(t, err) olap, ok := conn.AsOLAP("") require.True(t, ok) diff --git a/runtime/server/server.go b/runtime/server/server.go index 7ba728948fc..6f6e0808903 100644 --- a/runtime/server/server.go +++ b/runtime/server/server.go @@ -250,7 +250,7 @@ func HTTPErrorHandler(ctx context.Context, mux *gateway.ServeMux, marshaler gate func timeoutSelector(fullMethodName string) time.Duration { if strings.HasPrefix(fullMethodName, "/rill.runtime.v1.RuntimeService") && (strings.Contains(fullMethodName, "/Trigger") || strings.HasSuffix(fullMethodName, "Reconcile")) { - return time.Minute * 30 + return time.Minute * 59 // Not 60 to avoid forced timeout on ingress } if strings.HasPrefix(fullMethodName, "/rill.runtime.v1.QueryService") { diff --git a/runtime/services/catalog/artifacts/yaml/objects.go b/runtime/services/catalog/artifacts/yaml/objects.go index d74fbfc79c2..1e67d10eb50 100644 --- a/runtime/services/catalog/artifacts/yaml/objects.go +++ b/runtime/services/catalog/artifacts/yaml/objects.go @@ -3,11 +3,9 @@ package yaml import ( "errors" "fmt" - "strconv" "strings" "time" - "github.com/c2h5oh/datasize" "github.com/jinzhu/copier" "github.com/mitchellh/mapstructure" runtimev1 "github.com/rilldata/rill/proto/gen/rill/runtime/v1" @@ -35,10 +33,11 @@ type Source struct { GlobMaxObjectsMatched int `yaml:"glob.max_objects_matched,omitempty" mapstructure:"glob.max_objects_matched,omitempty"` GlobMaxObjectsListed int64 `yaml:"glob.max_objects_listed,omitempty" mapstructure:"glob.max_objects_listed,omitempty"` GlobPageSize int `yaml:"glob.page_size,omitempty" mapstructure:"glob.page_size,omitempty"` + BatchSize string `yaml:"batch_size,omitempty" mapstructure:"batch_size,omitempty"` HivePartition *bool `yaml:"hive_partitioning,omitempty" mapstructure:"hive_partitioning,omitempty"` Timeout int32 `yaml:"timeout,omitempty"` - ExtractPolicy *ExtractPolicy `yaml:"extract,omitempty"` Format string `yaml:"format,omitempty" mapstructure:"format,omitempty"` + Extract map[string]any `yaml:"extract,omitempty" mapstructure:"extract,omitempty"` DuckDBProps map[string]any `yaml:"duckdb,omitempty" mapstructure:"duckdb,omitempty"` Headers map[string]any `yaml:"headers,omitempty" mapstructure:"headers,omitempty"` AllowSchemaRelaxation *bool `yaml:"ingest.allow_schema_relaxation,omitempty" mapstructure:"allow_schema_relaxation,omitempty"` @@ -49,16 +48,6 @@ type Source struct { AthenaWorkgroup string `yaml:"athena_workgroup,omitempty" mapstructure:"athena_workgroup,omitempty"` } -type ExtractPolicy struct { - Row *ExtractConfig `yaml:"rows,omitempty" mapstructure:"rows,omitempty"` - File *ExtractConfig `yaml:"files,omitempty" mapstructure:"files,omitempty"` -} - -type ExtractConfig struct { - Strategy string `yaml:"strategy,omitempty" mapstructure:"strategy,omitempty"` - Size string `yaml:"size,omitempty" mapstructure:"size,omitempty"` -} - type MetricsView struct { Label string `yaml:"title"` DisplayName string `yaml:"display_name,omitempty"` // for backwards compatibility @@ -121,39 +110,9 @@ func toSourceArtifact(catalog *drivers.CatalogEntry) (*Source, error) { source.Path = "" } - extract, err := toExtractArtifact(catalog.GetSource().GetPolicy()) - if err != nil { - return nil, err - } - - source.ExtractPolicy = extract return source, nil } -func toExtractArtifact(extract *runtimev1.Source_ExtractPolicy) (*ExtractPolicy, error) { - if extract == nil { - return nil, nil - } - - sourceExtract := &ExtractPolicy{} - // set file - if extract.FilesStrategy != runtimev1.Source_ExtractPolicy_STRATEGY_UNSPECIFIED { - sourceExtract.File = &ExtractConfig{} - sourceExtract.File.Strategy = extract.FilesStrategy.String() - sourceExtract.File.Size = fmt.Sprintf("%v", extract.FilesLimit) - } - - // set row - if extract.RowsStrategy != runtimev1.Source_ExtractPolicy_STRATEGY_UNSPECIFIED { - sourceExtract.Row = &ExtractConfig{} - sourceExtract.Row.Strategy = extract.RowsStrategy.String() - bytes := datasize.ByteSize(extract.RowsLimitBytes) - sourceExtract.Row.Size = bytes.HumanReadable() - } - - return sourceExtract, nil -} - func toMetricsViewArtifact(catalog *drivers.CatalogEntry) (*MetricsView, error) { metricsArtifact := &MetricsView{} err := copier.Copy(metricsArtifact, catalog.Object) @@ -177,6 +136,10 @@ func fromSourceArtifact(source *Source, path string) (*drivers.CatalogEntry, err props["region"] = source.Region } + if source.Extract != nil { + props["extract"] = source.Extract + } + if source.DuckDBProps != nil { props["duckdb"] = source.DuckDBProps } @@ -213,6 +176,10 @@ func fromSourceArtifact(source *Source, path string) (*drivers.CatalogEntry, err props["glob.page_size"] = source.GlobPageSize } + if source.BatchSize != "" { + props["batch_size"] = source.BatchSize + } + if source.S3Endpoint != "" { props["endpoint"] = source.S3Endpoint } @@ -254,11 +221,6 @@ func fromSourceArtifact(source *Source, path string) (*drivers.CatalogEntry, err return nil, err } - extract, err := fromExtractArtifact(source.ExtractPolicy) - if err != nil { - return nil, err - } - name := fileutil.Stem(path) return &drivers.CatalogEntry{ Name: name, @@ -268,86 +230,11 @@ func fromSourceArtifact(source *Source, path string) (*drivers.CatalogEntry, err Name: name, Connector: source.Type, Properties: propsPB, - Policy: extract, TimeoutSeconds: source.Timeout, }, }, nil } -func fromExtractArtifact(policy *ExtractPolicy) (*runtimev1.Source_ExtractPolicy, error) { - if policy == nil { - return nil, nil - } - - extractPolicy := &runtimev1.Source_ExtractPolicy{} - - // parse file - if policy.File != nil { - // parse strategy - strategy, err := parseStrategy(policy.File.Strategy) - if err != nil { - return nil, err - } - - extractPolicy.FilesStrategy = strategy - - // parse size - size, err := strconv.ParseUint(policy.File.Size, 10, 64) - if err != nil { - return nil, fmt.Errorf("invalid size, parse failed with error %w", err) - } - if size <= 0 { - return nil, fmt.Errorf("invalid size %q", size) - } - - extractPolicy.FilesLimit = size - } - - // parse rows - if policy.Row != nil { - // parse strategy - strategy, err := parseStrategy(policy.Row.Strategy) - if err != nil { - return nil, err - } - - extractPolicy.RowsStrategy = strategy - - // parse size - // todo :: add support for number of rows - size, err := getBytes(policy.Row.Size) - if err != nil { - return nil, fmt.Errorf("invalid size, parse failed with error %w", err) - } - if size <= 0 { - return nil, fmt.Errorf("invalid size %q", size) - } - - extractPolicy.RowsLimitBytes = size - } - return extractPolicy, nil -} - -func parseStrategy(s string) (runtimev1.Source_ExtractPolicy_Strategy, error) { - switch strings.ToLower(s) { - case "tail": - return runtimev1.Source_ExtractPolicy_STRATEGY_TAIL, nil - case "head": - return runtimev1.Source_ExtractPolicy_STRATEGY_HEAD, nil - default: - return runtimev1.Source_ExtractPolicy_STRATEGY_UNSPECIFIED, fmt.Errorf("invalid extract strategy %q", s) - } -} - -func getBytes(size string) (uint64, error) { - var s datasize.ByteSize - if err := s.UnmarshalText([]byte(size)); err != nil { - return 0, err - } - - return s.Bytes(), nil -} - func fromMetricsViewArtifact(metrics *MetricsView, path string) (*drivers.CatalogEntry, error) { if metrics.DisplayName != "" && metrics.Label == "" { // backwards compatibility diff --git a/runtime/services/catalog/artifacts/yaml/objects_test.go b/runtime/services/catalog/artifacts/yaml/objects_test.go deleted file mode 100644 index 96003b422a3..00000000000 --- a/runtime/services/catalog/artifacts/yaml/objects_test.go +++ /dev/null @@ -1,82 +0,0 @@ -package yaml - -import ( - "reflect" - "testing" - - runtimev1 "github.com/rilldata/rill/proto/gen/rill/runtime/v1" -) - -func Test_fromExtractArtifact(t *testing.T) { - tests := []struct { - name string - input *ExtractPolicy - want *runtimev1.Source_ExtractPolicy - wantErr bool - }{ - { - name: "nil input", - input: nil, - want: nil, - wantErr: false, - }, - { - name: "parse row", - input: &ExtractPolicy{Row: &ExtractConfig{Strategy: "tail", Size: "23 KB"}}, - want: &runtimev1.Source_ExtractPolicy{ - RowsStrategy: runtimev1.Source_ExtractPolicy_STRATEGY_TAIL, - RowsLimitBytes: 23552, - }, - wantErr: false, - }, - { - name: "parse files", - input: &ExtractPolicy{File: &ExtractConfig{Strategy: "head", Size: "23"}}, - want: &runtimev1.Source_ExtractPolicy{ - FilesStrategy: runtimev1.Source_ExtractPolicy_STRATEGY_HEAD, - FilesLimit: 23, - }, - wantErr: false, - }, - { - name: "parse both", - input: &ExtractPolicy{File: &ExtractConfig{Strategy: "tail", Size: "23"}, Row: &ExtractConfig{Strategy: "tail", Size: "512 B"}}, - want: &runtimev1.Source_ExtractPolicy{ - FilesStrategy: runtimev1.Source_ExtractPolicy_STRATEGY_TAIL, - FilesLimit: 23, - RowsStrategy: runtimev1.Source_ExtractPolicy_STRATEGY_TAIL, - RowsLimitBytes: 512, - }, - wantErr: false, - }, - { - name: "more examples", - input: &ExtractPolicy{File: &ExtractConfig{Strategy: "tail", Size: "23"}, Row: &ExtractConfig{Strategy: "tail", Size: "23 gb"}}, - want: &runtimev1.Source_ExtractPolicy{ - FilesStrategy: runtimev1.Source_ExtractPolicy_STRATEGY_TAIL, - FilesLimit: 23, - RowsStrategy: runtimev1.Source_ExtractPolicy_STRATEGY_TAIL, - RowsLimitBytes: 23 * 1024 * 1024 * 1024, - }, - wantErr: false, - }, - { - name: "invalid", - input: &ExtractPolicy{File: &ExtractConfig{Strategy: "tail", Size: "23"}, Row: &ExtractConfig{Strategy: "tail", Size: "23%"}}, - want: nil, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := fromExtractArtifact(tt.input) - if (err != nil) != tt.wantErr { - t.Errorf("fromExtractArtifact() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("fromExtractArtifact() = %v, want %v", got, tt.want) - } - }) - } -} diff --git a/runtime/services/catalog/migrator/sources/sources.go b/runtime/services/catalog/migrator/sources/sources.go index b196dff8f8b..22b6a439793 100644 --- a/runtime/services/catalog/migrator/sources/sources.go +++ b/runtime/services/catalog/migrator/sources/sources.go @@ -60,24 +60,18 @@ func (m *sourceMigrator) Update(ctx context.Context, return err } - return olap.WithConnection(ctx, 100, func(ctx, ensuredCtx context.Context, conn *sql.Conn) error { - tx, err := conn.BeginTx(ctx, nil) + return olap.WithConnection(ctx, 100, true, true, func(ctx, ensuredCtx context.Context, conn *sql.Conn) error { + _, err = conn.ExecContext(ctx, fmt.Sprintf("DROP TABLE IF EXISTS %s", apiSource.Name)) if err != nil { return err } - defer func() { _ = tx.Rollback() }() - _, err = tx.ExecContext(ctx, fmt.Sprintf("DROP TABLE IF EXISTS %s", apiSource.Name)) + _, err = conn.ExecContext(ctx, fmt.Sprintf("ALTER TABLE %s RENAME TO %s", tempName, apiSource.Name)) if err != nil { return err } - _, err = tx.ExecContext(ctx, fmt.Sprintf("ALTER TABLE %s RENAME TO %s", tempName, apiSource.Name)) - if err != nil { - return err - } - - return tx.Commit() + return nil }) } @@ -123,9 +117,6 @@ func (m *sourceMigrator) IsEqual(ctx context.Context, cat1, cat2 *drivers.Catalo if !isSQLSource && cat1.GetSource().Connector != cat2.GetSource().Connector { return false } - if !comparePolicy(cat1.GetSource().GetPolicy(), cat2.GetSource().GetPolicy()) { - return false - } map2 := cat2.GetSource().Properties.AsMap() if isSQLSource { @@ -136,21 +127,6 @@ func (m *sourceMigrator) IsEqual(ctx context.Context, cat1, cat2 *drivers.Catalo return equal(cat1.GetSource().Properties.AsMap(), map2) } -func comparePolicy(p1, p2 *runtimev1.Source_ExtractPolicy) bool { - if (p1 != nil) == (p2 != nil) { - if p1 != nil { - // both non nil - return p1.FilesStrategy == p2.FilesStrategy && - p1.FilesLimit == p2.FilesLimit && - p1.RowsStrategy == p2.RowsStrategy && - p1.RowsLimitBytes == p2.RowsLimitBytes - } - // both nil - return true - } - return false -} - func (m *sourceMigrator) ExistsInOlap(ctx context.Context, olap drivers.OLAPStore, catalog *drivers.CatalogEntry) (bool, error) { _, err := olap.InformationSchema().Lookup(ctx, catalog.Name) if errors.Is(err, drivers.ErrNotFound) { @@ -351,76 +327,13 @@ func (p *progress) Observe(val int64, unit drivers.ProgressUnit) { } } -func source(connector string, src *runtimev1.Source) (drivers.Source, error) { +func source(connector string, src *runtimev1.Source) (map[string]any, error) { props := src.Properties.AsMap() - switch connector { - case "s3": - return &drivers.BucketSource{ - ExtractPolicy: src.Policy, - Properties: props, - }, nil - case "gcs": - return &drivers.BucketSource{ - ExtractPolicy: src.Policy, - Properties: props, - }, nil - case "https": - return &drivers.FileSource{ - Properties: props, - }, nil - case "local_file": - return &drivers.FileSource{ - Properties: props, - }, nil - case "motherduck": - query, ok := props["sql"].(string) - if !ok { - return nil, fmt.Errorf("property \"sql\" is mandatory for connector \"motherduck\"") - } - var db string - if val, ok := props["db"].(string); ok { - db = val - } - - return &drivers.DatabaseSource{ - SQL: query, - Database: db, - }, nil - case "duckdb": - query, ok := props["sql"].(string) - if !ok { - return nil, fmt.Errorf("property \"sql\" is mandatory for connector \"duckdb\"") - } - return &drivers.DatabaseSource{ - SQL: query, - }, nil - case "bigquery": - query, ok := props["sql"].(string) - if !ok { - return nil, fmt.Errorf("property \"sql\" is mandatory for connector \"bigquery\"") - } - return &drivers.DatabaseSource{ - SQL: query, - Props: props, - }, nil - case "athena": - return &drivers.BucketSource{ - Properties: props, - }, nil - default: - return nil, fmt.Errorf("connector %v not supported", connector) - } + return props, nil } -func sink(connector, tableName string) drivers.Sink { - switch connector { - case "duckdb": - return &drivers.DatabaseSink{ - Table: tableName, - } - default: - return nil - } +func sink(connector, tableName string) map[string]any { + return map[string]any{"table": tableName} } func connectorVariables(src *runtimev1.Source, env map[string]string, repoRoot string) map[string]any { diff --git a/web-admin/orval.config.ts b/web-admin/orval.config.ts index 0090b695ba0..5d1220ef5bc 100644 --- a/web-admin/orval.config.ts +++ b/web-admin/orval.config.ts @@ -15,6 +15,14 @@ export default defineConfig({ path: "http-client.ts", // Relative to workspace path set above name: "httpClient", }, + // Override queries and mutations here + operations: { + AdminService_GetDeploymentCredentials: { + query: { + useQuery: true, + }, + }, + }, }, }, }, diff --git a/web-admin/src/client/gen/admin-service/admin-service.ts b/web-admin/src/client/gen/admin-service/admin-service.ts index 782537b27d9..e7f0dcaf06e 100644 --- a/web-admin/src/client/gen/admin-service/admin-service.ts +++ b/web-admin/src/client/gen/admin-service/admin-service.ts @@ -40,6 +40,8 @@ import type { V1SetOrganizationMemberRoleResponse, AdminServiceSetOrganizationMemberRoleBodyBody, V1LeaveOrganizationResponse, + V1GetDeploymentCredentialsResponse, + AdminServiceGetDeploymentCredentialsBody, V1GetGitCredentialsResponse, V1ListProjectInvitesResponse, AdminServiceListProjectInvitesParams, @@ -48,6 +50,8 @@ import type { V1AddProjectMemberResponse, V1RemoveProjectMemberResponse, V1SetProjectMemberRoleResponse, + V1SearchProjectUsersResponse, + AdminServiceSearchProjectUsersParams, V1ListWhitelistedDomainsResponse, V1CreateWhitelistedDomainResponse, AdminServiceCreateWhitelistedDomainBody, @@ -1206,6 +1210,118 @@ export const createAdminServiceLeaveOrganization = < return createMutation(mutationOptions); }; +/** + * @summary GetDeploymentCredentials returns runtime info and JWT on behalf of a specific user, or alternatively for a raw set of JWT attributes + */ +export const adminServiceGetDeploymentCredentials = ( + organization: string, + project: string, + adminServiceGetDeploymentCredentialsBody: AdminServiceGetDeploymentCredentialsBody +) => { + return httpClient({ + url: `/v1/organizations/${organization}/projects/${project}/credentials`, + method: "post", + headers: { "Content-Type": "application/json" }, + data: adminServiceGetDeploymentCredentialsBody, + }); +}; + +export const getAdminServiceGetDeploymentCredentialsQueryKey = ( + organization: string, + project: string, + adminServiceGetDeploymentCredentialsBody: AdminServiceGetDeploymentCredentialsBody +) => + [ + `/v1/organizations/${organization}/projects/${project}/credentials`, + adminServiceGetDeploymentCredentialsBody, + ] as const; + +export const getAdminServiceGetDeploymentCredentialsQueryOptions = < + TData = Awaited>, + TError = RpcStatus +>( + organization: string, + project: string, + adminServiceGetDeploymentCredentialsBody: AdminServiceGetDeploymentCredentialsBody, + options?: { + query?: CreateQueryOptions< + Awaited>, + TError, + TData + >; + } +): CreateQueryOptions< + Awaited>, + TError, + TData +> & { queryKey: QueryKey } => { + const { query: queryOptions } = options ?? {}; + + const queryKey = + queryOptions?.queryKey ?? + getAdminServiceGetDeploymentCredentialsQueryKey( + organization, + project, + adminServiceGetDeploymentCredentialsBody + ); + + const queryFn: QueryFunction< + Awaited> + > = () => + adminServiceGetDeploymentCredentials( + organization, + project, + adminServiceGetDeploymentCredentialsBody + ); + + return { + queryKey, + queryFn, + enabled: !!(organization && project), + ...queryOptions, + }; +}; + +export type AdminServiceGetDeploymentCredentialsQueryResult = NonNullable< + Awaited> +>; +export type AdminServiceGetDeploymentCredentialsQueryError = RpcStatus; + +/** + * @summary GetDeploymentCredentials returns runtime info and JWT on behalf of a specific user, or alternatively for a raw set of JWT attributes + */ +export const createAdminServiceGetDeploymentCredentials = < + TData = Awaited>, + TError = RpcStatus +>( + organization: string, + project: string, + adminServiceGetDeploymentCredentialsBody: AdminServiceGetDeploymentCredentialsBody, + options?: { + query?: CreateQueryOptions< + Awaited>, + TError, + TData + >; + } +): CreateQueryResult & { queryKey: QueryKey } => { + const queryOptions = getAdminServiceGetDeploymentCredentialsQueryOptions( + organization, + project, + adminServiceGetDeploymentCredentialsBody, + options + ); + + const query = createQuery(queryOptions) as CreateQueryResult< + TData, + TError + > & { queryKey: QueryKey }; + + query.queryKey = queryOptions.queryKey; + + return query; +}; + /** * @summary GetGitCredentials returns credentials and other details for a project's Git repository. */ @@ -1764,6 +1880,111 @@ export const createAdminServiceSetProjectMemberRole = < return createMutation(mutationOptions); }; +/** + * @summary SearchProjectUsers returns users who has access to to a project (including org members that have access through a usergroup) + */ +export const adminServiceSearchProjectUsers = ( + organization: string, + project: string, + params?: AdminServiceSearchProjectUsersParams, + signal?: AbortSignal +) => { + return httpClient({ + url: `/v1/organizations/${organization}/projects/${project}/users/search`, + method: "get", + params, + signal, + }); +}; + +export const getAdminServiceSearchProjectUsersQueryKey = ( + organization: string, + project: string, + params?: AdminServiceSearchProjectUsersParams +) => + [ + `/v1/organizations/${organization}/projects/${project}/users/search`, + ...(params ? [params] : []), + ] as const; + +export const getAdminServiceSearchProjectUsersQueryOptions = < + TData = Awaited>, + TError = RpcStatus +>( + organization: string, + project: string, + params?: AdminServiceSearchProjectUsersParams, + options?: { + query?: CreateQueryOptions< + Awaited>, + TError, + TData + >; + } +): CreateQueryOptions< + Awaited>, + TError, + TData +> & { queryKey: QueryKey } => { + const { query: queryOptions } = options ?? {}; + + const queryKey = + queryOptions?.queryKey ?? + getAdminServiceSearchProjectUsersQueryKey(organization, project, params); + + const queryFn: QueryFunction< + Awaited> + > = ({ signal }) => + adminServiceSearchProjectUsers(organization, project, params, signal); + + return { + queryKey, + queryFn, + enabled: !!(organization && project), + ...queryOptions, + }; +}; + +export type AdminServiceSearchProjectUsersQueryResult = NonNullable< + Awaited> +>; +export type AdminServiceSearchProjectUsersQueryError = RpcStatus; + +/** + * @summary SearchProjectUsers returns users who has access to to a project (including org members that have access through a usergroup) + */ +export const createAdminServiceSearchProjectUsers = < + TData = Awaited>, + TError = RpcStatus +>( + organization: string, + project: string, + params?: AdminServiceSearchProjectUsersParams, + options?: { + query?: CreateQueryOptions< + Awaited>, + TError, + TData + >; + } +): CreateQueryResult & { queryKey: QueryKey } => { + const queryOptions = getAdminServiceSearchProjectUsersQueryOptions( + organization, + project, + params, + options + ); + + const query = createQuery(queryOptions) as CreateQueryResult< + TData, + TError + > & { queryKey: QueryKey }; + + query.queryKey = queryOptions.queryKey; + + return query; +}; + /** * @summary ListWhitelistedDomains lists all the whitelisted domains for the organization */ diff --git a/web-admin/src/client/gen/index.schemas.ts b/web-admin/src/client/gen/index.schemas.ts index 536b00262b0..cb6f36fbe46 100644 --- a/web-admin/src/client/gen/index.schemas.ts +++ b/web-admin/src/client/gen/index.schemas.ts @@ -85,6 +85,12 @@ export type AdminServiceCreateWhitelistedDomainBody = { role?: string; }; +export type AdminServiceSearchProjectUsersParams = { + emailQuery?: string; + pageSize?: number; + pageToken?: string; +}; + export type AdminServiceListProjectMembersParams = { pageSize?: number; pageToken?: string; @@ -95,6 +101,16 @@ export type AdminServiceListProjectInvitesParams = { pageToken?: string; }; +export type AdminServiceGetDeploymentCredentialsBodyAttrs = { + [key: string]: any; +}; + +export type AdminServiceGetDeploymentCredentialsBody = { + branch?: string; + userId?: string; + attrs?: AdminServiceGetDeploymentCredentialsBodyAttrs; +}; + export type AdminServiceRemoveOrganizationMemberParams = { keepProjectRoles?: boolean; }; @@ -280,6 +296,11 @@ export interface V1SearchUsersResponse { nextPageToken?: string; } +export interface V1SearchProjectUsersResponse { + users?: V1User[]; + nextPageToken?: string; +} + export interface V1SearchProjectNamesResponse { names?: string[]; nextPageToken?: string; @@ -487,6 +508,12 @@ export interface V1GetGitCredentialsResponse { prodBranch?: string; } +export interface V1GetDeploymentCredentialsResponse { + runtimeHost?: string; + runtimeInstanceId?: string; + jwt?: string; +} + export interface V1GetCurrentUserResponse { user?: V1User; preferences?: V1UserPreferences; @@ -554,6 +581,10 @@ export interface V1CreateOrganizationRequest { description?: string; } +export interface V1CreateBookmarkResponse { + bookmark?: V1Bookmark; +} + export interface V1CreateBookmarkRequest { displayName?: string; data?: string; @@ -572,10 +603,6 @@ export interface V1Bookmark { updatedOn?: string; } -export interface V1CreateBookmarkResponse { - bookmark?: V1Bookmark; -} - export interface V1AddProjectMemberResponse { pendingSignup?: boolean; } @@ -584,13 +611,29 @@ export interface V1AddOrganizationMemberResponse { pendingSignup?: boolean; } -export interface ProtobufAny { - "@type"?: string; - [key: string]: unknown; -} - export interface RpcStatus { code?: number; message?: string; details?: ProtobufAny[]; } + +/** + * `NullValue` is a singleton enumeration to represent the null value for the +`Value` type union. + + The JSON representation for `NullValue` is JSON `null`. + + - NULL_VALUE: Null value. + */ +export type ProtobufNullValue = + (typeof ProtobufNullValue)[keyof typeof ProtobufNullValue]; + +// eslint-disable-next-line @typescript-eslint/no-redeclare +export const ProtobufNullValue = { + NULL_VALUE: "NULL_VALUE", +} as const; + +export interface ProtobufAny { + "@type"?: string; + [key: string]: unknown; +} diff --git a/web-admin/src/components/projects/DashboardList.svelte b/web-admin/src/components/projects/DashboardList.svelte index 67264bad7c9..a2aa69daa0e 100644 --- a/web-admin/src/components/projects/DashboardList.svelte +++ b/web-admin/src/components/projects/DashboardList.svelte @@ -44,7 +44,7 @@ href={dashboardListItem.isValid ? `/${organization}/${project}/${dashboardListItem.name}` : undefined} - class="w-full h-full p-3 flex items-center gap-x-6 {dashboardListItem.isValid + class="w-full h-full overflow-x-auto p-3 flex items-center gap-x-6 {dashboardListItem.isValid ? 'text-gray-700 hover:text-blue-600 hover:bg-slate-50' : 'text-gray-400'}" > @@ -55,10 +55,10 @@ -
+
{dashboardListItem?.title || dashboardListItem.name} diff --git a/web-common/orval.config.ts b/web-common/orval.config.ts index d1e6d7c904e..95d52c2bfa8 100644 --- a/web-common/orval.config.ts +++ b/web-common/orval.config.ts @@ -43,6 +43,11 @@ export default defineConfig({ useQuery: true, }, }, + QueryService_MetricsViewAggregation: { + query: { + useQuery: true, + }, + }, QueryService_MetricsViewTotals: { query: { useQuery: true, diff --git a/web-common/src/components/menu/core/MenuItem.svelte b/web-common/src/components/menu/core/MenuItem.svelte index 17b3f8a2a7e..3a354a5baa8 100644 --- a/web-common/src/components/menu/core/MenuItem.svelte +++ b/web-common/src/components/menu/core/MenuItem.svelte @@ -71,6 +71,12 @@ } let hovered = false; + function onMouseOver() { + if (!disabled) { + hovered = true; + } + } + function onFocus() { if (!disabled) { $currentItem = itemID; @@ -124,6 +130,7 @@ ? 'rgb(75, 85, 99)' : 'rgb(235, 235, 235)'}" class=" + w-full text-left py-1 {icon ? 'px-2' : 'px-3'} @@ -146,7 +153,7 @@ class:selected class:cursor-not-allowed={disabled} aria-disabled={disabled} - on:mouseover={onFocus} + on:mouseover={onMouseOver} on:mouseleave={onBlur} on:focus={onFocus} on:blur={() => { @@ -154,7 +161,7 @@ hovered = false; } }} - on:click|stopPropagation={handleClick} + on:click={handleClick} > {#if icon}
{#if $$slots["right"]} -
+
{/if} diff --git a/web-common/src/components/virtualized-table/core/Cell.svelte b/web-common/src/components/virtualized-table/core/Cell.svelte index c1c1f58e1a4..20cb6740e9a 100644 --- a/web-common/src/components/virtualized-table/core/Cell.svelte +++ b/web-common/src/components/virtualized-table/core/Cell.svelte @@ -134,13 +134,13 @@ > - {#if iconShown} + {#if contextColumn !== LeaderboardContextColumn.HIDDEN}
- {#if iconShown === "delta"} + {#if contextColumn === LeaderboardContextColumn.DELTA_PERCENT} % - {:else if iconShown === "pie"} + {:else if contextColumn === LeaderboardContextColumn.DELTA_ABSOLUTE} + + {:else if contextColumn === LeaderboardContextColumn.PERCENT} % {/if}
diff --git a/web-common/src/features/dashboards/leaderboard/LeaderboardListItem.svelte b/web-common/src/features/dashboards/leaderboard/LeaderboardListItem.svelte index f79bed8610f..055aae9a40b 100644 --- a/web-common/src/features/dashboards/leaderboard/LeaderboardListItem.svelte +++ b/web-common/src/features/dashboards/leaderboard/LeaderboardListItem.svelte @@ -17,15 +17,14 @@ import LeaderboardTooltipContent from "./LeaderboardTooltipContent.svelte"; - import PercentageChange from "../../../components/data-types/PercentageChange.svelte"; import LeaderboardItemFilterIcon from "./LeaderboardItemFilterIcon.svelte"; import { humanizeDataType } from "../humanize-numbers"; import LongBarZigZag from "./LongBarZigZag.svelte"; import { - CONTEXT_COLUMN_WIDTH, LeaderboardItemData, - getFormatterValueForPercDiff, + formatContextColumnValue, } from "./leaderboard-utils"; + import ContextColumnValue from "./ContextColumnValue.svelte"; export let itemData: LeaderboardItemData; $: label = itemData.label; @@ -52,17 +51,12 @@ $: formattedValue = humanizeDataType(measureValue, formatPreset); - $: percentChangeFormatted = - showContext === LeaderboardContextColumn.DELTA_PERCENT - ? getFormatterValueForPercDiff( - measureValue && comparisonValue - ? measureValue - comparisonValue - : null, - comparisonValue - ) - : showContext === LeaderboardContextColumn.PERCENT - ? getFormatterValueForPercDiff(measureValue, unfilteredTotal) - : undefined; + $: contextColumnFormattedValue = formatContextColumnValue( + itemData, + unfilteredTotal, + showContext, + formatPreset + ); $: previousValueString = comparisonValue !== undefined && comparisonValue !== null @@ -120,7 +114,8 @@
- {#if percentChangeFormatted !== undefined} -
- -
- {/if} +
diff --git a/web-common/src/features/dashboards/leaderboard/leaderboard-utils.ts b/web-common/src/features/dashboards/leaderboard/leaderboard-utils.ts index f7c89d5e012..0f847cf408c 100644 --- a/web-common/src/features/dashboards/leaderboard/leaderboard-utils.ts +++ b/web-common/src/features/dashboards/leaderboard/leaderboard-utils.ts @@ -1,5 +1,10 @@ import { PERC_DIFF } from "../../../components/data-types/type-utils"; -import { formatMeasurePercentageDifference } from "../humanize-numbers"; +import { + FormatPreset, + formatMeasurePercentageDifference, + humanizeDataType, +} from "../humanize-numbers"; +import { LeaderboardContextColumn } from "../leaderboard-context-column"; export function getFormatterValueForPercDiff(numerator, denominator) { if (denominator === 0) return PERC_DIFF.PREV_VALUE_ZERO; @@ -13,7 +18,11 @@ export function getFormatterValueForPercDiff(numerator, denominator) { export type LeaderboardItemData = { label: string | number; + // main value to be shown in the leaderboard value: number; + // the comparison value, which may be either the previous value + // (used to calculate the absolute or percentage change) or + // the measure total (used to calculate the percentage of total) comparisonValue: number; // selection is not enough to determine if the item is included // or excluded; for that we need to know the leaderboard's @@ -39,4 +48,38 @@ export function prepareLeaderboardItemData( }); } -export const CONTEXT_COLUMN_WIDTH = 44; +/** + * Returns the formatted value for the context column + * given the + * accounting for the context column type. + */ +export function formatContextColumnValue( + itemData: LeaderboardItemData, + unfilteredTotal: number, + contextType: LeaderboardContextColumn, + formatPreset: FormatPreset +): string { + const { value, comparisonValue } = itemData; + + switch (contextType) { + case LeaderboardContextColumn.DELTA_ABSOLUTE: { + const delta = value && comparisonValue ? value - comparisonValue : null; + let formattedValue = humanizeDataType(delta, formatPreset); + if (delta && delta > 0) { + formattedValue = "+" + formattedValue; + } + return formattedValue; + } + case LeaderboardContextColumn.DELTA_PERCENT: + return getFormatterValueForPercDiff( + value && comparisonValue ? value - comparisonValue : null, + comparisonValue + ); + case LeaderboardContextColumn.PERCENT: + return getFormatterValueForPercDiff(value, unfilteredTotal); + case LeaderboardContextColumn.HIDDEN: + return ""; + default: + throw new Error("Invalid context column, all cases must be handled"); + } +} diff --git a/web-common/src/features/dashboards/proto-state/dashboard-url-state.ts b/web-common/src/features/dashboards/proto-state/dashboard-url-state.ts index b6c20699f40..10852bfc117 100644 --- a/web-common/src/features/dashboards/proto-state/dashboard-url-state.ts +++ b/web-common/src/features/dashboards/proto-state/dashboard-url-state.ts @@ -104,9 +104,7 @@ function gotoNewDashboardUrl(url: URL, newState: string, defaultState: string) { const currentStateInUrl = url.searchParams.get("state") ?? ""; if (newStateInUrl === currentStateInUrl) return; - setTimeout(() => { - goto(newUrl.toString()); - }); + goto(newUrl.toString()); } // TODO: if these are necessary anywhere else move them to a separate file diff --git a/web-common/src/features/dashboards/proto-state/fromProto.ts b/web-common/src/features/dashboards/proto-state/fromProto.ts index 010df400ed6..a0f03a87127 100644 --- a/web-common/src/features/dashboards/proto-state/fromProto.ts +++ b/web-common/src/features/dashboards/proto-state/fromProto.ts @@ -63,7 +63,7 @@ export function getDashboardStateFromProto( dashboard.compareTimeRange ); } - entity.showComparison = dashboard.showComparison ?? true; + entity.showComparison = Boolean(dashboard.showComparison); entity.selectedTimeRange = dashboard.timeRange ? fromTimeRangeProto(dashboard.timeRange) diff --git a/web-common/src/features/dashboards/rows-viewer/ExportModelDataButton.svelte b/web-common/src/features/dashboards/rows-viewer/ExportModelDataButton.svelte index 2e8869e1296..58ff040caf1 100644 --- a/web-common/src/features/dashboards/rows-viewer/ExportModelDataButton.svelte +++ b/web-common/src/features/dashboards/rows-viewer/ExportModelDataButton.svelte @@ -3,6 +3,8 @@ import { WithTogglableFloatingElement } from "@rilldata/web-common/components/floating-element"; import { Menu, MenuItem } from "@rilldata/web-common/components/menu"; import Export from "@rilldata/web-common/components/icons/Export.svelte"; + import { getStateManagers } from "@rilldata/web-common/features/dashboards/state-managers/state-managers"; + import { useTimeControlStore } from "@rilldata/web-common/features/dashboards/time-controls/time-control-store"; import { V1ExportFormat, createQueryServiceExport, @@ -12,12 +14,15 @@ export let metricViewName; let exportMenuOpen = false; + const timeControlStore = useTimeControlStore(getStateManagers()); + const exportDash = createQueryServiceExport(); const handleExportMetrics = async (format: V1ExportFormat) => { exportMetrics({ metricViewName, query: exportDash, format, + timeControlStore, }); }; @@ -27,16 +32,16 @@ distance={8} let:toggleFloatingElement location="top" - on:open={() => (exportMenuOpen = true)} on:close={() => (exportMenuOpen = false)} + on:open={() => (exportMenuOpen = true)} > { evt.stopPropagation(); toggleFloatingElement(); }} - disableTooltip={exportMenuOpen} > diff --git a/web-common/src/features/dashboards/rows-viewer/RowsViewer.svelte b/web-common/src/features/dashboards/rows-viewer/RowsViewer.svelte index 7040ea8a69e..93e78d3cac8 100644 --- a/web-common/src/features/dashboards/rows-viewer/RowsViewer.svelte +++ b/web-common/src/features/dashboards/rows-viewer/RowsViewer.svelte @@ -1,11 +1,13 @@ {label} - + Select a time range to compare to the selected time range onClickOutside(toggleFloatingElement)} label="Time comparison selector" + on:click-outside={() => onClickOutside(toggleFloatingElement)} + on:escape={toggleFloatingElement} + slot="floating-element" > { intermediateSelection = NO_COMPARISON_LABEL; }} @@ -153,6 +152,7 @@ This component needs to do the following: dispatch("disable-comparison"); toggleFloatingElement(); }} + selected={!showComparison} > {NO_COMPARISON_LABEL} diff --git a/web-common/src/features/dashboards/time-controls/TimeControls.svelte b/web-common/src/features/dashboards/time-controls/TimeControls.svelte index cdcaf1bf881..cc4570fc4da 100644 --- a/web-common/src/features/dashboards/time-controls/TimeControls.svelte +++ b/web-common/src/features/dashboards/time-controls/TimeControls.svelte @@ -1,38 +1,24 @@ + +
+ {$timeControlsStore.timeStart} +
diff --git a/web-common/src/features/dashboards/time-controls/TimeGrainSelector.svelte b/web-common/src/features/dashboards/time-controls/TimeGrainSelector.svelte index 81e03ce88ef..400368d5b8c 100644 --- a/web-common/src/features/dashboards/time-controls/TimeGrainSelector.svelte +++ b/web-common/src/features/dashboards/time-controls/TimeGrainSelector.svelte @@ -2,6 +2,8 @@ import IconSpaceFixer from "@rilldata/web-common/components/button/IconSpaceFixer.svelte"; import CaretDownIcon from "@rilldata/web-common/components/icons/CaretDownIcon.svelte"; import WithSelectMenu from "@rilldata/web-common/components/menu/wrappers/WithSelectMenu.svelte"; + import { getStateManagers } from "@rilldata/web-common/features/dashboards/state-managers/state-managers"; + import { useTimeControlStore } from "@rilldata/web-common/features/dashboards/time-controls/time-control-store"; import { TIME_GRAIN } from "@rilldata/web-common/lib/time/config"; import { isGrainBigger } from "@rilldata/web-common/lib/time/grains"; import type { TimeGrain } from "@rilldata/web-common/lib/time/types"; @@ -15,8 +17,10 @@ const dispatch = createEventDispatcher(); + const timeControlsStore = useTimeControlStore(getStateManagers()); + $: dashboardStore = useDashboardStore(metricViewName); - $: activeTimeGrain = $dashboardStore?.selectedTimeRange?.interval; + $: activeTimeGrain = $timeControlsStore.selectedTimeRange?.interval; $: activeTimeGrainLabel = TIME_GRAIN[activeTimeGrain]?.label; $: timeGrains = timeGrainOptions diff --git a/web-common/src/features/dashboards/time-controls/TimeRangeSelector.svelte b/web-common/src/features/dashboards/time-controls/TimeRangeSelector.svelte index 956722c9bae..f375f599bda 100644 --- a/web-common/src/features/dashboards/time-controls/TimeRangeSelector.svelte +++ b/web-common/src/features/dashboards/time-controls/TimeRangeSelector.svelte @@ -3,6 +3,8 @@ import { WithTogglableFloatingElement } from "@rilldata/web-common/components/floating-element"; import Calendar from "@rilldata/web-common/components/icons/Calendar.svelte"; import CaretDownIcon from "@rilldata/web-common/components/icons/CaretDownIcon.svelte"; + import { getStateManagers } from "@rilldata/web-common/features/dashboards/state-managers/state-managers"; + import { useTimeControlStore } from "@rilldata/web-common/features/dashboards/time-controls/time-control-store"; import { ALL_TIME, DEFAULT_TIME_RANGES, @@ -41,6 +43,8 @@ $: dashboardStore = useDashboardStore(metricViewName); + const timeControlsStore = useTimeControlStore(getStateManagers()); + let isCustomRangeOpen = false; let isCalendarRecentlyClosed = false; @@ -136,7 +140,7 @@ }, 300); } - $: currentSelection = $dashboardStore?.selectedTimeRange?.name; + $: currentSelection = $timeControlsStore?.selectedTimeRange?.name; $: intermediateSelection = currentSelection; const handleMenuOpen = () => { @@ -179,7 +183,7 @@ {#if intermediateSelection === TimeRangePreset.CUSTOM} Custom range {:else if currentSelection in DEFAULT_TIME_RANGES} - {DEFAULT_TIME_RANGES[$dashboardStore?.selectedTimeRange?.name] + {DEFAULT_TIME_RANGES[$timeControlsStore?.selectedTimeRange?.name] .label} {:else} Select a time range @@ -188,9 +192,9 @@ {prettyFormatTimeRange( - $dashboardStore?.selectedTimeRange?.start, - $dashboardStore?.selectedTimeRange?.end, - $dashboardStore?.selectedTimeRange?.name, + $timeControlsStore?.selectedTimeRange?.start, + $timeControlsStore?.selectedTimeRange?.end, + $timeControlsStore?.selectedTimeRange?.name, $dashboardStore?.selectedTimezone )} @@ -203,11 +207,11 @@ {/if} onClickOutside(toggleFloatingElement)} on:escape={toggleFloatingElement} slot="floating-element" - label="Time range selector" - maxWidth="300px" > {@const allTime = { name: TimeRangePreset.ALL_TIME, diff --git a/web-common/src/features/dashboards/time-controls/time-control-store.spec.ts b/web-common/src/features/dashboards/time-controls/time-control-store.spec.ts new file mode 100644 index 00000000000..bf4baafdcb2 --- /dev/null +++ b/web-common/src/features/dashboards/time-controls/time-control-store.spec.ts @@ -0,0 +1,421 @@ +import { DashboardFetchMocks } from "@rilldata/web-common/features/dashboards/dashboard-fetch-mocks"; +import { metricsExplorerStore } from "@rilldata/web-common/features/dashboards/dashboard-stores"; +import { + AD_BIDS_INIT, + AD_BIDS_INIT_WITH_TIME, + AD_BIDS_NAME, + AD_BIDS_SOURCE_NAME, + AD_BIDS_TIMESTAMP_DIMENSION, + initAdBidsInStore, +} from "@rilldata/web-common/features/dashboards/dashboard-stores-test-data"; +import { createStateManagers } from "@rilldata/web-common/features/dashboards/state-managers/state-managers"; +import { + createTimeControlStore, + TimeControlState, + TimeControlStore, +} from "@rilldata/web-common/features/dashboards/time-controls/time-control-store"; +import TimeControlsStoreTest from "@rilldata/web-common/features/dashboards/time-controls/TimeControlsStoreTest.svelte"; +import { + getLocalUserPreferences, + initLocalUserPreferenceStore, +} from "@rilldata/web-common/features/dashboards/user-preferences"; +import { TimeRangePreset } from "@rilldata/web-common/lib/time/types"; +import { V1TimeGrain } from "@rilldata/web-common/runtime-client"; +import type { V1MetricsView } from "@rilldata/web-common/runtime-client"; +import { runtime } from "@rilldata/web-common/runtime-client/runtime-store"; +import { waitUntil } from "@rilldata/web-common/lib/waitUtils"; +import { QueryClient } from "@tanstack/svelte-query"; +import { get } from "svelte/store"; +import { describe, it, expect, beforeAll, beforeEach } from "vitest"; +import { render } from "@testing-library/svelte"; + +describe("time-control-store", () => { + runtime.set({ + host: "http://localhost", + instanceId: "default", + }); + const dashboardFetchMocks = DashboardFetchMocks.useDashboardFetchMocks(); + + beforeAll(() => { + initLocalUserPreferenceStore(AD_BIDS_NAME); + }); + + beforeEach(() => { + metricsExplorerStore.remove(AD_BIDS_NAME); + getLocalUserPreferences().set({ + timeZone: "UTC", + }); + }); + + it("Switching from no timestamp column to having one", async () => { + const { unmount, queryClient, timeControlsStore } = + initTimeControlStoreTest(AD_BIDS_INIT); + await waitUntil(() => !get(timeControlsStore).isFetching); + + const state = get(timeControlsStore); + expect(state.isFetching).toBeFalsy(); + expect(state.ready).toBeTruthy(); + assertStartAndEnd(state, undefined, undefined, undefined, undefined); + + dashboardFetchMocks.mockMetricsView(AD_BIDS_NAME, AD_BIDS_INIT_WITH_TIME); + dashboardFetchMocks.mockTimeRangeSummary( + AD_BIDS_SOURCE_NAME, + AD_BIDS_TIMESTAMP_DIMENSION, + { + min: "2022-01-01", + max: "2022-03-31", + } + ); + await queryClient.refetchQueries({ + type: "active", + }); + + await waitForUpdate(timeControlsStore, "2022-01-01T00:00:00.000Z"); + assertStartAndEnd( + get(timeControlsStore), + "2022-01-01T00:00:00.000Z", + "2022-03-31T00:00:00.001Z", + "2021-12-31T00:00:00.000Z", + "2022-04-01T00:00:00.000Z" + ); + + dashboardFetchMocks.mockTimeRangeSummary( + AD_BIDS_SOURCE_NAME, + AD_BIDS_TIMESTAMP_DIMENSION, + { + min: "2023-01-01", + max: "2023-03-31", + } + ); + await queryClient.refetchQueries({ + type: "active", + }); + + await waitForUpdate(timeControlsStore, "2023-01-01T00:00:00.000Z"); + // Updating time range updates the start and end + assertStartAndEnd( + get(timeControlsStore), + "2023-01-01T00:00:00.000Z", + "2023-03-31T00:00:00.001Z", + "2022-12-31T00:00:00.000Z", + "2023-04-01T00:00:00.000Z" + ); + + unmount(); + }); + + it("Switching selected time range", async () => { + dashboardFetchMocks.mockTimeRangeSummary( + AD_BIDS_SOURCE_NAME, + AD_BIDS_TIMESTAMP_DIMENSION, + { + min: "2022-01-01", + max: "2022-03-31", + } + ); + const { unmount, timeControlsStore } = initTimeControlStoreTest( + AD_BIDS_INIT_WITH_TIME + ); + await waitForUpdate(timeControlsStore, "2022-03-30T01:00:00.000Z"); + + metricsExplorerStore.setSelectedTimeRange(AD_BIDS_NAME, { + name: TimeRangePreset.LAST_24_HOURS, + start: undefined, + end: undefined, + interval: V1TimeGrain.TIME_GRAIN_HOUR, + }); + assertStartAndEnd( + get(timeControlsStore), + "2022-03-30T01:00:00.000Z", + "2022-03-31T01:00:00.000Z", + "2022-03-30T00:00:00.000Z", + "2022-03-31T02:00:00.000Z" + ); + + metricsExplorerStore.setSelectedTimeRange(AD_BIDS_NAME, { + name: TimeRangePreset.CUSTOM, + start: new Date("2022-03-20T01:00:00.000Z"), + end: new Date("2022-03-22T01:00:00.000Z"), + interval: V1TimeGrain.TIME_GRAIN_MONTH, + }); + let state = get(timeControlsStore); + assertStartAndEnd( + state, + "2022-03-20T01:00:00.000Z", + "2022-03-22T01:00:00.000Z", + "2022-03-20T00:00:00.000Z", + "2022-03-22T02:00:00.000Z" + ); + // invalid time grain of month is reset to hour + expect(state.selectedTimeRange.interval).toEqual( + V1TimeGrain.TIME_GRAIN_HOUR + ); + + metricsExplorerStore.setSelectedTimeRange(AD_BIDS_NAME, { + name: TimeRangePreset.LAST_7_DAYS, + start: new Date("2021-01-01"), + end: new Date("2021-03-31"), + interval: V1TimeGrain.TIME_GRAIN_HOUR, + }); + state = get(timeControlsStore); + // start and end from selected time range is ignored. + assertStartAndEnd( + state, + "2022-03-25T00:00:00.000Z", + "2022-04-01T00:00:00.000Z", + "2022-03-24T23:00:00.000Z", + "2022-04-01T01:00:00.000Z" + ); + // valid time grain of hour is retained + expect(state.selectedTimeRange.interval).toEqual( + V1TimeGrain.TIME_GRAIN_HOUR + ); + + unmount(); + }); + + it("Switching selected comparison time range", async () => { + dashboardFetchMocks.mockTimeRangeSummary( + AD_BIDS_SOURCE_NAME, + AD_BIDS_TIMESTAMP_DIMENSION, + { + min: "2022-01-01", + max: "2022-03-31", + } + ); + const { unmount, timeControlsStore } = initTimeControlStoreTest( + AD_BIDS_INIT_WITH_TIME + ); + await waitForUpdate(timeControlsStore, "2022-01-01T00:00:00.000Z"); + + metricsExplorerStore.displayComparison(AD_BIDS_NAME, true); + metricsExplorerStore.setSelectedTimeRange(AD_BIDS_NAME, { + name: TimeRangePreset.LAST_24_HOURS, + start: undefined, + end: undefined, + interval: V1TimeGrain.TIME_GRAIN_HOUR, + }); + metricsExplorerStore.setSelectedComparisonRange(AD_BIDS_NAME, {} as any); + assertComparisonStartAndEnd( + get(timeControlsStore), + // Sets to default comparison + "P1D", + "2022-03-29T01:00:00.000Z", + "2022-03-30T01:00:00.000Z", + "2022-03-29T00:00:00.000Z", + "2022-03-30T02:00:00.000Z" + ); + + metricsExplorerStore.setSelectedTimeRange(AD_BIDS_NAME, { + name: TimeRangePreset.LAST_12_MONTHS, + start: undefined, + end: undefined, + interval: V1TimeGrain.TIME_GRAIN_DAY, + }); + metricsExplorerStore.setSelectedComparisonRange(AD_BIDS_NAME, {} as any); + expect(get(timeControlsStore).showComparison).toBeFalsy(); + + metricsExplorerStore.setSelectedTimeRange(AD_BIDS_NAME, { + name: TimeRangePreset.LAST_7_DAYS, + start: undefined, + end: undefined, + interval: V1TimeGrain.TIME_GRAIN_DAY, + }); + metricsExplorerStore.setSelectedComparisonRange(AD_BIDS_NAME, {} as any); + assertComparisonStartAndEnd( + get(timeControlsStore), + // Sets to the one selected + "P1W", + "2022-03-18T00:00:00.000Z", + "2022-03-25T00:00:00.000Z", + "2022-03-17T00:00:00.000Z", + "2022-03-26T00:00:00.000Z" + ); + + unmount(); + }); + + it("Switching time zones", async () => { + dashboardFetchMocks.mockTimeRangeSummary( + AD_BIDS_SOURCE_NAME, + AD_BIDS_TIMESTAMP_DIMENSION, + { + min: "2022-01-01", + max: "2022-03-31", + } + ); + const { unmount, timeControlsStore } = initTimeControlStoreTest( + AD_BIDS_INIT_WITH_TIME + ); + await waitForUpdate(timeControlsStore, "2022-01-01T00:00:00.000Z"); + + metricsExplorerStore.setTimeZone(AD_BIDS_NAME, "IST"); + assertStartAndEnd( + get(timeControlsStore), + "2022-01-01T00:00:00.000Z", + "2022-03-31T00:00:00.001Z", + "2021-12-30T18:30:00.000Z", + "2022-03-31T18:30:00.000Z" + ); + + metricsExplorerStore.displayComparison(AD_BIDS_NAME, true); + metricsExplorerStore.setSelectedTimeRange(AD_BIDS_NAME, { + name: TimeRangePreset.LAST_24_HOURS, + start: undefined, + end: undefined, + interval: V1TimeGrain.TIME_GRAIN_HOUR, + }); + metricsExplorerStore.setSelectedComparisonRange(AD_BIDS_NAME, {} as any); + assertStartAndEnd( + get(timeControlsStore), + "2022-03-30T00:30:00.000Z", + "2022-03-31T00:30:00.000Z", + "2022-03-29T23:30:00.000Z", + "2022-03-31T01:30:00.000Z" + ); + assertComparisonStartAndEnd( + get(timeControlsStore), + // Sets to default comparison + "P1D", + "2022-03-29T00:30:00.000Z", + "2022-03-30T00:30:00.000Z", + "2022-03-28T23:30:00.000Z", + "2022-03-30T01:30:00.000Z" + ); + + unmount(); + }); + + it("Scrubbing to zoom", async () => { + dashboardFetchMocks.mockTimeRangeSummary( + AD_BIDS_SOURCE_NAME, + AD_BIDS_TIMESTAMP_DIMENSION, + { + min: "2022-01-01", + max: "2022-03-31", + } + ); + const { unmount, timeControlsStore } = initTimeControlStoreTest( + AD_BIDS_INIT_WITH_TIME + ); + await waitForUpdate(timeControlsStore, "2022-01-01T00:00:00.000Z"); + metricsExplorerStore.displayComparison(AD_BIDS_NAME, true); + metricsExplorerStore.setSelectedComparisonRange(AD_BIDS_NAME, { + name: "P1M", + } as any); + + metricsExplorerStore.setSelectedScrubRange(AD_BIDS_NAME, { + name: AD_BIDS_NAME, + start: new Date("2022-02-01 UTC"), + end: new Date("2022-02-10 UTC"), + isScrubbing: true, + }); + assertStartAndEnd( + get(timeControlsStore), + "2022-01-01T00:00:00.000Z", + "2022-03-31T00:00:00.001Z", + "2021-12-31T00:00:00.000Z", + "2022-04-01T00:00:00.000Z" + ); + assertComparisonStartAndEnd( + get(timeControlsStore), + // Sets to default comparison + "P1M", + "2021-12-01T00:00:00.000Z", + "2022-02-28T00:00:00.001Z", + "2021-11-30T00:00:00.000Z", + "2022-03-01T00:00:00.000Z" + ); + + metricsExplorerStore.setSelectedScrubRange(AD_BIDS_NAME, { + name: AD_BIDS_NAME, + start: new Date("2022-02-01 UTC"), + end: new Date("2022-02-10 UTC"), + isScrubbing: false, + }); + assertStartAndEnd( + get(timeControlsStore), + "2022-02-01T00:00:00.000Z", + "2022-02-10T00:00:00.000Z", + "2021-12-31T00:00:00.000Z", + "2022-04-01T00:00:00.000Z" + ); + assertComparisonStartAndEnd( + get(timeControlsStore), + // Sets to default comparison + "P1M", + "2022-01-01T00:00:00.000Z", + "2022-01-10T00:00:00.000Z", + "2021-11-30T00:00:00.000Z", + "2022-03-01T00:00:00.000Z" + ); + + unmount(); + }); + + function initTimeControlStoreTest(resp: V1MetricsView) { + initAdBidsInStore(); + dashboardFetchMocks.mockMetricsView(AD_BIDS_NAME, resp); + + const queryClient = new QueryClient({ + defaultOptions: { + queries: { + refetchOnMount: false, + refetchOnReconnect: false, + refetchOnWindowFocus: false, + retry: false, + }, + }, + }); + const stateManagers = createStateManagers({ + queryClient, + metricsViewName: AD_BIDS_NAME, + }); + const timeControlsStore = createTimeControlStore(stateManagers); + + const { unmount } = render(TimeControlsStoreTest, { + timeControlsStore, + }); + + return { unmount, queryClient, timeControlsStore }; + } +}); + +function assertStartAndEnd( + timeControlsSate: TimeControlState, + start: string, + end: string, + adjustedStart: string, + adjustedEnd: string +) { + expect(timeControlsSate.timeStart).toEqual(start); + expect(timeControlsSate.timeEnd).toEqual(end); + expect(timeControlsSate.adjustedStart).toEqual(adjustedStart); + expect(timeControlsSate.adjustedEnd).toEqual(adjustedEnd); +} + +function assertComparisonStartAndEnd( + timeControlsSate: TimeControlState, + name: string, + start: string, + end: string, + adjustedStart: string, + adjustedEnd: string +) { + expect(timeControlsSate.selectedComparisonTimeRange?.name).toBe(name); + expect(timeControlsSate.comparisonTimeStart).toBe(start); + expect(timeControlsSate.comparisonTimeEnd).toBe(end); + expect(timeControlsSate.comparisonAdjustedStart).toBe(adjustedStart); + expect(timeControlsSate.comparisonAdjustedEnd).toBe(adjustedEnd); +} + +async function waitForUpdate( + timeControlsStore: TimeControlStore, + startTime: string +) { + return waitUntil( + () => get(timeControlsStore).timeStart === startTime, + 1000, + 20 + ); +} diff --git a/web-common/src/features/dashboards/time-controls/time-control-store.ts b/web-common/src/features/dashboards/time-controls/time-control-store.ts new file mode 100644 index 00000000000..2b463972527 --- /dev/null +++ b/web-common/src/features/dashboards/time-controls/time-control-store.ts @@ -0,0 +1,356 @@ +import type { MetricsExplorerEntity } from "@rilldata/web-common/features/dashboards/dashboard-stores"; +import { useMetaQuery } from "@rilldata/web-common/features/dashboards/selectors/index"; +import { memoizeMetricsStore } from "@rilldata/web-common/features/dashboards/state-managers/state-managers"; +import type { StateManagers } from "@rilldata/web-common/features/dashboards/state-managers/state-managers"; +import { getOrderedStartEnd } from "@rilldata/web-common/features/dashboards/time-series/utils"; +import { + getComparionRangeForScrub, + getComparisonRange, + getTimeComparisonParametersForComponent, +} from "@rilldata/web-common/lib/time/comparisons"; +import { DEFAULT_TIME_RANGES } from "@rilldata/web-common/lib/time/config"; +import { + checkValidTimeGrain, + findValidTimeGrain, + getAllowedTimeGrains, + getDefaultTimeGrain, +} from "@rilldata/web-common/lib/time/grains"; +import { + convertTimeRangePreset, + getAdjustedFetchTime, + ISODurationToTimePreset, +} from "@rilldata/web-common/lib/time/ranges"; +import { + TimeComparisonOption, + TimeRange, + TimeRangePreset, +} from "@rilldata/web-common/lib/time/types"; +import type { TimeRangeType } from "@rilldata/web-common/lib/time/types"; +import type { DashboardTimeControls } from "@rilldata/web-common/lib/time/types"; +import { + createQueryServiceColumnTimeRange, + V1ColumnTimeRangeResponse, + V1TimeGrain, +} from "@rilldata/web-common/runtime-client"; +import type { CreateQueryResult } from "@tanstack/svelte-query"; +import { derived } from "svelte/store"; +import type { Readable } from "svelte/store"; + +export type TimeRangeState = { + // Selected ranges with start and end filled based on time range type + selectedTimeRange?: DashboardTimeControls; + // In all of our queries we do a check on hasTime and pass in undefined for start and end if false. + // Using these directly will simplify those usages since this store will take care of marking them undefined. + timeStart?: string; + adjustedStart?: string; + timeEnd?: string; + adjustedEnd?: string; +}; +export type ComparisonTimeRangeState = { + showComparison?: boolean; + selectedComparisonTimeRange?: DashboardTimeControls; + comparisonTimeStart?: string; + comparisonAdjustedStart?: string; + comparisonTimeEnd?: string; + comparisonAdjustedEnd?: string; +}; +export type TimeControlState = { + isFetching: boolean; + + // Computed properties from all time range query + defaultTimeRange?: TimeRangeType; + minTimeGrain?: V1TimeGrain; + allTimeRange?: TimeRange; + + ready?: boolean; +} & TimeRangeState & + ComparisonTimeRangeState; +export type TimeControlStore = Readable; + +function createTimeRangeSummary( + ctx: StateManagers +): CreateQueryResult { + return derived( + [ctx.runtime, useMetaQuery(ctx)], + ([runtime, metricsView], set) => + createQueryServiceColumnTimeRange( + runtime.instanceId, + metricsView.data?.model, + { + columnName: metricsView.data?.timeDimension, + }, + { + query: { + enabled: !!metricsView.data?.timeDimension, + queryClient: ctx.queryClient, + }, + } + ).subscribe(set) + ); +} + +export function createTimeControlStore(ctx: StateManagers) { + return derived( + [useMetaQuery(ctx), createTimeRangeSummary(ctx), ctx.dashboardStore], + ([metricsView, timeRangeResponse, metricsExplorer]) => { + const hasTimeSeries = Boolean(metricsView.data?.timeDimension); + if (!timeRangeResponse || !timeRangeResponse.isSuccess) { + return { + isFetching: metricsView.isFetching || timeRangeResponse.isRefetching, + ready: !hasTimeSeries, + } as TimeControlState; + } + + const allTimeRange = { + name: TimeRangePreset.ALL_TIME, + start: new Date(timeRangeResponse.data.timeRangeSummary.min), + end: new Date(timeRangeResponse.data.timeRangeSummary.max), + }; + const defaultTimeRange = ISODurationToTimePreset( + metricsView.data.defaultTimeRange + ); + const minTimeGrain = + (metricsView.data.smallestTimeGrain as V1TimeGrain) || + V1TimeGrain.TIME_GRAIN_UNSPECIFIED; + + const timeRangeState = calculateTimeRangePartial( + metricsExplorer, + allTimeRange, + minTimeGrain + ); + + const comparisonTimeRangeState = calculateComparisonTimeRangePartial( + metricsExplorer, + allTimeRange, + timeRangeState + ); + + return { + isFetching: false, + defaultTimeRange, + minTimeGrain, + allTimeRange, + ready: true, + + ...timeRangeState, + + ...comparisonTimeRangeState, + } as TimeControlState; + } + ) as TimeControlStore; +} + +/** + * Memoized version of the store. Currently, memoized by metrics view name. + */ +export const useTimeControlStore = memoizeMetricsStore( + (ctx: StateManagers) => createTimeControlStore(ctx) +); + +/** + * Calculates time range and grain from all time range and selected time range name. + * Also adds start, end and their adjusted counterparts as strings ready to use in requests. + */ +function calculateTimeRangePartial( + metricsExplorer: MetricsExplorerEntity, + allTimeRange: DashboardTimeControls, + minTimeGrain: V1TimeGrain +): TimeRangeState { + const selectedTimeRange = getTimeRange(metricsExplorer, allTimeRange); + selectedTimeRange.interval = getTimeGrain( + metricsExplorer, + selectedTimeRange, + minTimeGrain + ); + const { start: adjustedStart, end: adjustedEnd } = getAdjustedFetchTime( + selectedTimeRange.start, + selectedTimeRange.end, + metricsExplorer.selectedTimezone, + selectedTimeRange.interval + ); + + let timeStart = selectedTimeRange.start; + let timeEnd = selectedTimeRange.end; + if (metricsExplorer.lastDefinedScrubRange) { + const { start, end } = getOrderedStartEnd( + metricsExplorer.lastDefinedScrubRange.start, + metricsExplorer.lastDefinedScrubRange.end + ); + timeStart = start; + timeEnd = end; + } + + return { + selectedTimeRange, + timeStart: timeStart.toISOString(), + adjustedStart, + timeEnd: timeEnd.toISOString(), + adjustedEnd, + }; +} + +/** + * Calculates time range and grain for comparison based on time range and comparison selection. + * Also adds start, end and their adjusted counterparts as strings ready to use in requests. + */ +function calculateComparisonTimeRangePartial( + metricsExplorer: MetricsExplorerEntity, + allTimeRange: DashboardTimeControls, + timeRangeState: TimeRangeState +): ComparisonTimeRangeState { + const selectedComparisonTimeRange = getComparisonTimeRange( + metricsExplorer, + allTimeRange, + timeRangeState.selectedTimeRange, + metricsExplorer.selectedComparisonTimeRange + ); + const showComparison = Boolean( + metricsExplorer.showComparison && selectedComparisonTimeRange?.start + ); + let comparisonAdjustedStart: string; + let comparisonAdjustedEnd: string; + if (showComparison && selectedComparisonTimeRange) { + const adjustedComparisonTime = getAdjustedFetchTime( + selectedComparisonTimeRange.start, + selectedComparisonTimeRange.end, + metricsExplorer.selectedTimezone, + timeRangeState.selectedTimeRange.interval + ); + comparisonAdjustedStart = adjustedComparisonTime.start; + comparisonAdjustedEnd = adjustedComparisonTime.end; + } + + let comparisonTimeStart = selectedComparisonTimeRange?.start; + let comparisonTimeEnd = selectedComparisonTimeRange?.end; + if (selectedComparisonTimeRange && metricsExplorer.lastDefinedScrubRange) { + const { start, end } = getOrderedStartEnd( + metricsExplorer.lastDefinedScrubRange.start, + metricsExplorer.lastDefinedScrubRange.end + ); + + const comparisonRange = getComparionRangeForScrub( + timeRangeState.selectedTimeRange.start, + timeRangeState.selectedTimeRange.end, + selectedComparisonTimeRange.start, + selectedComparisonTimeRange.end, + start, + end + ); + comparisonTimeStart = comparisonRange.start; + comparisonTimeEnd = comparisonRange.end; + } + + return { + showComparison, + selectedComparisonTimeRange, + comparisonTimeStart: comparisonTimeStart?.toISOString(), + comparisonAdjustedStart, + comparisonTimeEnd: comparisonTimeEnd?.toISOString(), + comparisonAdjustedEnd, + }; +} + +function getTimeRange( + metricsExplorer: MetricsExplorerEntity, + allTimeRange: DashboardTimeControls +) { + let timeRange: DashboardTimeControls; + + if (metricsExplorer.selectedTimeRange.name === TimeRangePreset.CUSTOM) { + /** set the time range to the fixed custom time range */ + timeRange = { + name: TimeRangePreset.CUSTOM, + start: new Date(metricsExplorer.selectedTimeRange.start), + end: new Date(metricsExplorer.selectedTimeRange.end), + }; + } else { + /** rebuild off of relative time range */ + timeRange = convertTimeRangePreset( + metricsExplorer.selectedTimeRange?.name ?? TimeRangePreset.ALL_TIME, + allTimeRange.start, + allTimeRange.end, + metricsExplorer.selectedTimezone + ); + } + + return timeRange; +} + +function getTimeGrain( + metricsExplorer: MetricsExplorerEntity, + timeRange: DashboardTimeControls, + minTimeGrain: V1TimeGrain +) { + const timeGrainOptions = getAllowedTimeGrains(timeRange.start, timeRange.end); + const isValidTimeGrain = checkValidTimeGrain( + metricsExplorer.selectedTimeRange.interval, + timeGrainOptions, + minTimeGrain + ); + + let timeGrain: V1TimeGrain; + if (isValidTimeGrain) { + timeGrain = metricsExplorer.selectedTimeRange.interval; + } else { + const defaultTimeGrain = getDefaultTimeGrain( + timeRange.start, + timeRange.end + ).grain; + timeGrain = findValidTimeGrain( + defaultTimeGrain, + timeGrainOptions, + minTimeGrain + ); + } + + return timeGrain; +} + +function getComparisonTimeRange( + metricsExplorer: MetricsExplorerEntity, + allTimeRange: DashboardTimeControls, + timeRange: DashboardTimeControls, + comparisonTimeRange: DashboardTimeControls +) { + if (!comparisonTimeRange) return undefined; + + let selectedComparisonTimeRange: DashboardTimeControls; + if (!comparisonTimeRange?.name) { + const comparisonOption = DEFAULT_TIME_RANGES[timeRange.name] + ?.defaultComparison as TimeComparisonOption; + const range = getTimeComparisonParametersForComponent( + comparisonOption, + allTimeRange.start, + allTimeRange.end, + timeRange.start, + timeRange.end + ); + + if (range.isComparisonRangeAvailable) { + selectedComparisonTimeRange = { + start: range.start, + end: range.end, + name: comparisonOption, + }; + } + } else if (comparisonTimeRange.name === TimeComparisonOption.CUSTOM) { + selectedComparisonTimeRange = comparisonTimeRange; + } else if (!metricsExplorer.showComparison) { + return undefined; + } else { + // variable time range of some kind. + const comparisonOption = comparisonTimeRange.name as TimeComparisonOption; + const range = getComparisonRange( + timeRange.start, + timeRange.end, + comparisonOption + ); + + selectedComparisonTimeRange = { + ...range, + name: comparisonOption, + }; + } + + return selectedComparisonTimeRange; +} diff --git a/web-common/src/features/dashboards/time-series/MeasureChart.svelte b/web-common/src/features/dashboards/time-series/MeasureChart.svelte index 22c8eb41638..97b061e15c2 100644 --- a/web-common/src/features/dashboards/time-series/MeasureChart.svelte +++ b/web-common/src/features/dashboards/time-series/MeasureChart.svelte @@ -163,7 +163,6 @@ function zoomScrub() { if (isScrubbing) return; - resetScrub(); const { start, end } = getOrderedStartEnd(scrubStart, scrubEnd); const adjustedStart = start ? localToTimeZoneOffset(start, zone) : start; @@ -214,32 +213,32 @@
onMouseClick()} - on:scrub-start={(e) => scrub?.startScrub(e)} - on:scrub-move={(e) => scrub?.moveScrub(e)} - on:scrub-end={() => scrub?.endScrub()} on:contextmenu={(e) => onContextMenu(e)} + on:scrub-end={() => scrub?.endScrub()} + on:scrub-move={(e) => scrub?.moveScrub(e)} + on:scrub-start={(e) => scrub?.startScrub(e)} + overflowHidden={false} + right={50} + shareYScale={false} + top={4} + {width} + xMaxTweenProps={tweenProps} + xMinTweenProps={tweenProps} + xType="date" + yMax={internalYMax} + yMaxTweenProps={tweenProps} + yMin={internalYMin} + yMinTweenProps={tweenProps} + yType="number" > - + {@const bigNum = $totalsQuery?.data?.data?.[measure.name]} - {@const showComparison = displayComparison} {@const comparisonValue = totalsComparisons?.[measure.name]} {@const comparisonPercChange = comparisonValue && bigNum !== undefined && bigNum !== null @@ -329,7 +274,7 @@
{ + /** + * @generated from field: string organization = 1; + */ + organization = ""; + + /** + * @generated from field: string project = 2; + */ + project = ""; + + /** + * @generated from field: string email_query = 3; + */ + emailQuery = ""; + + /** + * @generated from field: uint32 page_size = 4; + */ + pageSize = 0; + + /** + * @generated from field: string page_token = 5; + */ + pageToken = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "rill.admin.v1.SearchProjectUsersRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "organization", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "project", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 3, name: "email_query", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 4, name: "page_size", kind: "scalar", T: 13 /* ScalarType.UINT32 */ }, + { no: 5, name: "page_token", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): SearchProjectUsersRequest { + return new SearchProjectUsersRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): SearchProjectUsersRequest { + return new SearchProjectUsersRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): SearchProjectUsersRequest { + return new SearchProjectUsersRequest().fromJsonString(jsonString, options); + } + + static equals(a: SearchProjectUsersRequest | PlainMessage | undefined, b: SearchProjectUsersRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(SearchProjectUsersRequest, a, b); + } +} + +/** + * @generated from message rill.admin.v1.SearchProjectUsersResponse + */ +export class SearchProjectUsersResponse extends Message { + /** + * @generated from field: repeated rill.admin.v1.User users = 1; + */ + users: User[] = []; + + /** + * @generated from field: string next_page_token = 2; + */ + nextPageToken = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "rill.admin.v1.SearchProjectUsersResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "users", kind: "message", T: User, repeated: true }, + { no: 2, name: "next_page_token", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): SearchProjectUsersResponse { + return new SearchProjectUsersResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): SearchProjectUsersResponse { + return new SearchProjectUsersResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): SearchProjectUsersResponse { + return new SearchProjectUsersResponse().fromJsonString(jsonString, options); + } + + static equals(a: SearchProjectUsersResponse | PlainMessage | undefined, b: SearchProjectUsersResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(SearchProjectUsersResponse, a, b); + } +} + +/** + * @generated from message rill.admin.v1.GetDeploymentCredentialsRequest + */ +export class GetDeploymentCredentialsRequest extends Message { + /** + * @generated from field: string organization = 1; + */ + organization = ""; + + /** + * @generated from field: string project = 2; + */ + project = ""; + + /** + * @generated from field: string branch = 3; + */ + branch = ""; + + /** + * @generated from oneof rill.admin.v1.GetDeploymentCredentialsRequest.for + */ + for: { + /** + * @generated from field: string user_id = 4; + */ + value: string; + case: "userId"; + } | { + /** + * @generated from field: google.protobuf.Struct attrs = 5; + */ + value: Struct; + case: "attrs"; + } | { case: undefined; value?: undefined } = { case: undefined }; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "rill.admin.v1.GetDeploymentCredentialsRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "organization", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "project", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 3, name: "branch", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 4, name: "user_id", kind: "scalar", T: 9 /* ScalarType.STRING */, oneof: "for" }, + { no: 5, name: "attrs", kind: "message", T: Struct, oneof: "for" }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): GetDeploymentCredentialsRequest { + return new GetDeploymentCredentialsRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): GetDeploymentCredentialsRequest { + return new GetDeploymentCredentialsRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): GetDeploymentCredentialsRequest { + return new GetDeploymentCredentialsRequest().fromJsonString(jsonString, options); + } + + static equals(a: GetDeploymentCredentialsRequest | PlainMessage | undefined, b: GetDeploymentCredentialsRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(GetDeploymentCredentialsRequest, a, b); + } +} + +/** + * @generated from message rill.admin.v1.GetDeploymentCredentialsResponse + */ +export class GetDeploymentCredentialsResponse extends Message { + /** + * @generated from field: string runtime_host = 1; + */ + runtimeHost = ""; + + /** + * @generated from field: string runtime_instance_id = 2; + */ + runtimeInstanceId = ""; + + /** + * @generated from field: string jwt = 3; + */ + jwt = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "rill.admin.v1.GetDeploymentCredentialsResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "runtime_host", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "runtime_instance_id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 3, name: "jwt", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): GetDeploymentCredentialsResponse { + return new GetDeploymentCredentialsResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): GetDeploymentCredentialsResponse { + return new GetDeploymentCredentialsResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): GetDeploymentCredentialsResponse { + return new GetDeploymentCredentialsResponse().fromJsonString(jsonString, options); + } + + static equals(a: GetDeploymentCredentialsResponse | PlainMessage | undefined, b: GetDeploymentCredentialsResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(GetDeploymentCredentialsResponse, a, b); + } +} + /** * @generated from message rill.admin.v1.ListServicesRequest */ diff --git a/web-common/src/proto/gen/rill/runtime/v1/catalog_pb.ts b/web-common/src/proto/gen/rill/runtime/v1/catalog_pb.ts index 5d54c2ef48b..d4d5727e775 100644 --- a/web-common/src/proto/gen/rill/runtime/v1/catalog_pb.ts +++ b/web-common/src/proto/gen/rill/runtime/v1/catalog_pb.ts @@ -4,7 +4,7 @@ // @ts-nocheck import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf"; -import { Message, proto3, protoInt64, Struct } from "@bufbuild/protobuf"; +import { Message, proto3, Struct } from "@bufbuild/protobuf"; import { StructType } from "./schema_pb.js"; import { TimeGrain } from "./time_grain_pb.js"; @@ -142,13 +142,6 @@ export class Source extends Message { */ schema?: StructType; - /** - * extraction policy for the source - * - * @generated from field: rill.runtime.v1.Source.ExtractPolicy policy = 6; - */ - policy?: Source_ExtractPolicy; - /** * timeout for source ingestion in seconds * @@ -168,7 +161,6 @@ export class Source extends Message { { no: 2, name: "connector", kind: "scalar", T: 9 /* ScalarType.STRING */ }, { no: 3, name: "properties", kind: "message", T: Struct }, { no: 5, name: "schema", kind: "message", T: StructType }, - { no: 6, name: "policy", kind: "message", T: Source_ExtractPolicy }, { no: 7, name: "timeout_seconds", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, ]); @@ -189,98 +181,6 @@ export class Source extends Message { } } -/** - * Extract policy for glob connectors - * - * @generated from message rill.runtime.v1.Source.ExtractPolicy - */ -export class Source_ExtractPolicy extends Message { - /** - * strategy for selecting rows in a file - * - * @generated from field: rill.runtime.v1.Source.ExtractPolicy.Strategy rows_strategy = 1; - */ - rowsStrategy = Source_ExtractPolicy_Strategy.UNSPECIFIED; - - /** - * could in future add: uint64 rows_limit = n; - * limit on data fetched in bytes - * - * @generated from field: uint64 rows_limit_bytes = 2; - */ - rowsLimitBytes = protoInt64.zero; - - /** - * strategy for selecting files - * - * @generated from field: rill.runtime.v1.Source.ExtractPolicy.Strategy files_strategy = 3; - */ - filesStrategy = Source_ExtractPolicy_Strategy.UNSPECIFIED; - - /** - * limit on number of files - * - * @generated from field: uint64 files_limit = 4; - */ - filesLimit = protoInt64.zero; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "rill.runtime.v1.Source.ExtractPolicy"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "rows_strategy", kind: "enum", T: proto3.getEnumType(Source_ExtractPolicy_Strategy) }, - { no: 2, name: "rows_limit_bytes", kind: "scalar", T: 4 /* ScalarType.UINT64 */ }, - { no: 3, name: "files_strategy", kind: "enum", T: proto3.getEnumType(Source_ExtractPolicy_Strategy) }, - { no: 4, name: "files_limit", kind: "scalar", T: 4 /* ScalarType.UINT64 */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): Source_ExtractPolicy { - return new Source_ExtractPolicy().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): Source_ExtractPolicy { - return new Source_ExtractPolicy().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): Source_ExtractPolicy { - return new Source_ExtractPolicy().fromJsonString(jsonString, options); - } - - static equals(a: Source_ExtractPolicy | PlainMessage | undefined, b: Source_ExtractPolicy | PlainMessage | undefined): boolean { - return proto3.util.equals(Source_ExtractPolicy, a, b); - } -} - -/** - * @generated from enum rill.runtime.v1.Source.ExtractPolicy.Strategy - */ -export enum Source_ExtractPolicy_Strategy { - /** - * @generated from enum value: STRATEGY_UNSPECIFIED = 0; - */ - UNSPECIFIED = 0, - - /** - * @generated from enum value: STRATEGY_HEAD = 1; - */ - HEAD = 1, - - /** - * @generated from enum value: STRATEGY_TAIL = 2; - */ - TAIL = 2, -} -// Retrieve enum metadata with: proto3.getEnumType(Source_ExtractPolicy_Strategy) -proto3.util.setEnumType(Source_ExtractPolicy_Strategy, "rill.runtime.v1.Source.ExtractPolicy.Strategy", [ - { no: 0, name: "STRATEGY_UNSPECIFIED" }, - { no: 1, name: "STRATEGY_HEAD" }, - { no: 2, name: "STRATEGY_TAIL" }, -]); - /** * Model is the internal representation of a model definition * diff --git a/web-common/src/proto/gen/rill/runtime/v1/connectors_pb.ts b/web-common/src/proto/gen/rill/runtime/v1/connectors_pb.ts index 88cef6cf38d..b694be44add 100644 --- a/web-common/src/proto/gen/rill/runtime/v1/connectors_pb.ts +++ b/web-common/src/proto/gen/rill/runtime/v1/connectors_pb.ts @@ -1151,3 +1151,128 @@ export class BigQueryListTablesResponse extends Message { + /** + * @generated from field: string instance_id = 1; + */ + instanceId = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "rill.runtime.v1.ScanConnectorsRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "instance_id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): ScanConnectorsRequest { + return new ScanConnectorsRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): ScanConnectorsRequest { + return new ScanConnectorsRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): ScanConnectorsRequest { + return new ScanConnectorsRequest().fromJsonString(jsonString, options); + } + + static equals(a: ScanConnectorsRequest | PlainMessage | undefined, b: ScanConnectorsRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(ScanConnectorsRequest, a, b); + } +} + +/** + * @generated from message rill.runtime.v1.ScanConnectorsResponse + */ +export class ScanConnectorsResponse extends Message { + /** + * @generated from field: repeated rill.runtime.v1.ScannedConnector connectors = 1; + */ + connectors: ScannedConnector[] = []; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "rill.runtime.v1.ScanConnectorsResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "connectors", kind: "message", T: ScannedConnector, repeated: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): ScanConnectorsResponse { + return new ScanConnectorsResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): ScanConnectorsResponse { + return new ScanConnectorsResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): ScanConnectorsResponse { + return new ScanConnectorsResponse().fromJsonString(jsonString, options); + } + + static equals(a: ScanConnectorsResponse | PlainMessage | undefined, b: ScanConnectorsResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(ScanConnectorsResponse, a, b); + } +} + +/** + * @generated from message rill.runtime.v1.ScannedConnector + */ +export class ScannedConnector extends Message { + /** + * @generated from field: string name = 1; + */ + name = ""; + + /** + * @generated from field: string type = 2; + */ + type = ""; + + /** + * reports whether access is present without any credentials + * + * @generated from field: bool has_anonymous_access = 3; + */ + hasAnonymousAccess = false; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "rill.runtime.v1.ScannedConnector"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "type", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 3, name: "has_anonymous_access", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): ScannedConnector { + return new ScannedConnector().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): ScannedConnector { + return new ScannedConnector().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): ScannedConnector { + return new ScannedConnector().fromJsonString(jsonString, options); + } + + static equals(a: ScannedConnector | PlainMessage | undefined, b: ScannedConnector | PlainMessage | undefined): boolean { + return proto3.util.equals(ScannedConnector, a, b); + } +} + diff --git a/web-common/src/proto/gen/rill/runtime/v1/queries_pb.ts b/web-common/src/proto/gen/rill/runtime/v1/queries_pb.ts index 34fe52b9a58..60213dc8235 100644 --- a/web-common/src/proto/gen/rill/runtime/v1/queries_pb.ts +++ b/web-common/src/proto/gen/rill/runtime/v1/queries_pb.ts @@ -42,6 +42,32 @@ proto3.util.setEnumType(ExportFormat, "rill.runtime.v1.ExportFormat", [ { no: 3, name: "EXPORT_FORMAT_PARQUET" }, ]); +/** + * @generated from enum rill.runtime.v1.BuiltinMeasure + */ +export enum BuiltinMeasure { + /** + * @generated from enum value: BUILTIN_MEASURE_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * @generated from enum value: BUILTIN_MEASURE_COUNT = 1; + */ + COUNT = 1, + + /** + * @generated from enum value: BUILTIN_MEASURE_COUNT_DISTINCT = 2; + */ + COUNT_DISTINCT = 2, +} +// Retrieve enum metadata with: proto3.getEnumType(BuiltinMeasure) +proto3.util.setEnumType(BuiltinMeasure, "rill.runtime.v1.BuiltinMeasure", [ + { no: 0, name: "BUILTIN_MEASURE_UNSPECIFIED" }, + { no: 1, name: "BUILTIN_MEASURE_COUNT" }, + { no: 2, name: "BUILTIN_MEASURE_COUNT_DISTINCT" }, +]); + /** * @generated from enum rill.runtime.v1.MetricsViewComparisonSortType */ @@ -259,6 +285,12 @@ export class ExportRequest extends Message { * @generated from oneof rill.runtime.v1.ExportRequest.request */ request: { + /** + * @generated from field: rill.runtime.v1.MetricsViewAggregationRequest metrics_view_aggregation_request = 7; + */ + value: MetricsViewAggregationRequest; + case: "metricsViewAggregationRequest"; + } | { /** * @generated from field: rill.runtime.v1.MetricsViewToplistRequest metrics_view_toplist_request = 4; */ @@ -289,6 +321,7 @@ export class ExportRequest extends Message { { no: 1, name: "instance_id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, { no: 2, name: "limit", kind: "scalar", T: 3 /* ScalarType.INT64 */, opt: true }, { no: 3, name: "format", kind: "enum", T: proto3.getEnumType(ExportFormat) }, + { no: 7, name: "metrics_view_aggregation_request", kind: "message", T: MetricsViewAggregationRequest, oneof: "request" }, { no: 4, name: "metrics_view_toplist_request", kind: "message", T: MetricsViewToplistRequest, oneof: "request" }, { no: 5, name: "metrics_view_rows_request", kind: "message", T: MetricsViewRowsRequest, oneof: "request" }, { no: 6, name: "metrics_view_time_series_request", kind: "message", T: MetricsViewTimeSeriesRequest, oneof: "request" }, @@ -350,6 +383,287 @@ export class ExportResponse extends Message { } } +/** + * @generated from message rill.runtime.v1.MetricsViewAggregationRequest + */ +export class MetricsViewAggregationRequest extends Message { + /** + * @generated from field: string instance_id = 1; + */ + instanceId = ""; + + /** + * @generated from field: string metrics_view = 2; + */ + metricsView = ""; + + /** + * @generated from field: repeated rill.runtime.v1.MetricsViewAggregationDimension dimensions = 3; + */ + dimensions: MetricsViewAggregationDimension[] = []; + + /** + * @generated from field: repeated rill.runtime.v1.MetricsViewAggregationMeasure measures = 4; + */ + measures: MetricsViewAggregationMeasure[] = []; + + /** + * @generated from field: repeated rill.runtime.v1.MetricsViewAggregationSort sort = 5; + */ + sort: MetricsViewAggregationSort[] = []; + + /** + * @generated from field: google.protobuf.Timestamp time_start = 6; + */ + timeStart?: Timestamp; + + /** + * @generated from field: google.protobuf.Timestamp time_end = 7; + */ + timeEnd?: Timestamp; + + /** + * @generated from field: rill.runtime.v1.MetricsViewFilter filter = 8; + */ + filter?: MetricsViewFilter; + + /** + * @generated from field: int64 limit = 9; + */ + limit = protoInt64.zero; + + /** + * @generated from field: int64 offset = 10; + */ + offset = protoInt64.zero; + + /** + * @generated from field: int32 priority = 11; + */ + priority = 0; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "rill.runtime.v1.MetricsViewAggregationRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "instance_id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "metrics_view", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 3, name: "dimensions", kind: "message", T: MetricsViewAggregationDimension, repeated: true }, + { no: 4, name: "measures", kind: "message", T: MetricsViewAggregationMeasure, repeated: true }, + { no: 5, name: "sort", kind: "message", T: MetricsViewAggregationSort, repeated: true }, + { no: 6, name: "time_start", kind: "message", T: Timestamp }, + { no: 7, name: "time_end", kind: "message", T: Timestamp }, + { no: 8, name: "filter", kind: "message", T: MetricsViewFilter }, + { no: 9, name: "limit", kind: "scalar", T: 3 /* ScalarType.INT64 */ }, + { no: 10, name: "offset", kind: "scalar", T: 3 /* ScalarType.INT64 */ }, + { no: 11, name: "priority", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): MetricsViewAggregationRequest { + return new MetricsViewAggregationRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): MetricsViewAggregationRequest { + return new MetricsViewAggregationRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): MetricsViewAggregationRequest { + return new MetricsViewAggregationRequest().fromJsonString(jsonString, options); + } + + static equals(a: MetricsViewAggregationRequest | PlainMessage | undefined, b: MetricsViewAggregationRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(MetricsViewAggregationRequest, a, b); + } +} + +/** + * @generated from message rill.runtime.v1.MetricsViewAggregationResponse + */ +export class MetricsViewAggregationResponse extends Message { + /** + * @generated from field: rill.runtime.v1.StructType schema = 1; + */ + schema?: StructType; + + /** + * @generated from field: repeated google.protobuf.Struct data = 2; + */ + data: Struct[] = []; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "rill.runtime.v1.MetricsViewAggregationResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "schema", kind: "message", T: StructType }, + { no: 2, name: "data", kind: "message", T: Struct, repeated: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): MetricsViewAggregationResponse { + return new MetricsViewAggregationResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): MetricsViewAggregationResponse { + return new MetricsViewAggregationResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): MetricsViewAggregationResponse { + return new MetricsViewAggregationResponse().fromJsonString(jsonString, options); + } + + static equals(a: MetricsViewAggregationResponse | PlainMessage | undefined, b: MetricsViewAggregationResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(MetricsViewAggregationResponse, a, b); + } +} + +/** + * @generated from message rill.runtime.v1.MetricsViewAggregationDimension + */ +export class MetricsViewAggregationDimension extends Message { + /** + * @generated from field: string name = 1; + */ + name = ""; + + /** + * @generated from field: rill.runtime.v1.TimeGrain time_grain = 2; + */ + timeGrain = TimeGrain.UNSPECIFIED; + + /** + * @generated from field: string time_zone = 3; + */ + timeZone = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "rill.runtime.v1.MetricsViewAggregationDimension"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "time_grain", kind: "enum", T: proto3.getEnumType(TimeGrain) }, + { no: 3, name: "time_zone", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): MetricsViewAggregationDimension { + return new MetricsViewAggregationDimension().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): MetricsViewAggregationDimension { + return new MetricsViewAggregationDimension().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): MetricsViewAggregationDimension { + return new MetricsViewAggregationDimension().fromJsonString(jsonString, options); + } + + static equals(a: MetricsViewAggregationDimension | PlainMessage | undefined, b: MetricsViewAggregationDimension | PlainMessage | undefined): boolean { + return proto3.util.equals(MetricsViewAggregationDimension, a, b); + } +} + +/** + * @generated from message rill.runtime.v1.MetricsViewAggregationMeasure + */ +export class MetricsViewAggregationMeasure extends Message { + /** + * @generated from field: string name = 1; + */ + name = ""; + + /** + * @generated from field: rill.runtime.v1.BuiltinMeasure builtin_measure = 2; + */ + builtinMeasure = BuiltinMeasure.UNSPECIFIED; + + /** + * @generated from field: repeated google.protobuf.Value builtin_measure_args = 3; + */ + builtinMeasureArgs: Value[] = []; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "rill.runtime.v1.MetricsViewAggregationMeasure"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "builtin_measure", kind: "enum", T: proto3.getEnumType(BuiltinMeasure) }, + { no: 3, name: "builtin_measure_args", kind: "message", T: Value, repeated: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): MetricsViewAggregationMeasure { + return new MetricsViewAggregationMeasure().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): MetricsViewAggregationMeasure { + return new MetricsViewAggregationMeasure().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): MetricsViewAggregationMeasure { + return new MetricsViewAggregationMeasure().fromJsonString(jsonString, options); + } + + static equals(a: MetricsViewAggregationMeasure | PlainMessage | undefined, b: MetricsViewAggregationMeasure | PlainMessage | undefined): boolean { + return proto3.util.equals(MetricsViewAggregationMeasure, a, b); + } +} + +/** + * @generated from message rill.runtime.v1.MetricsViewAggregationSort + */ +export class MetricsViewAggregationSort extends Message { + /** + * @generated from field: string name = 1; + */ + name = ""; + + /** + * @generated from field: bool desc = 2; + */ + desc = false; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "rill.runtime.v1.MetricsViewAggregationSort"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "desc", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): MetricsViewAggregationSort { + return new MetricsViewAggregationSort().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): MetricsViewAggregationSort { + return new MetricsViewAggregationSort().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): MetricsViewAggregationSort { + return new MetricsViewAggregationSort().fromJsonString(jsonString, options); + } + + static equals(a: MetricsViewAggregationSort | PlainMessage | undefined, b: MetricsViewAggregationSort | PlainMessage | undefined): boolean { + return proto3.util.equals(MetricsViewAggregationSort, a, b); + } +} + /** * Request message for QueryService.MetricsViewToplist * @@ -3664,6 +3978,12 @@ export class QueryBatchEntry extends Message { * @generated from oneof rill.runtime.v1.QueryBatchEntry.query */ query: { + /** + * @generated from field: rill.runtime.v1.MetricsViewAggregationRequest metrics_view_aggregation_request = 20; + */ + value: MetricsViewAggregationRequest; + case: "metricsViewAggregationRequest"; + } | { /** * @generated from field: rill.runtime.v1.MetricsViewToplistRequest metrics_view_toplist_request = 2; */ @@ -3782,6 +4102,7 @@ export class QueryBatchEntry extends Message { static readonly typeName = "rill.runtime.v1.QueryBatchEntry"; static readonly fields: FieldList = proto3.util.newFieldList(() => [ { no: 1, name: "key", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, + { no: 20, name: "metrics_view_aggregation_request", kind: "message", T: MetricsViewAggregationRequest, oneof: "query" }, { no: 2, name: "metrics_view_toplist_request", kind: "message", T: MetricsViewToplistRequest, oneof: "query" }, { no: 3, name: "metrics_view_comparison_toplist_request", kind: "message", T: MetricsViewComparisonToplistRequest, oneof: "query" }, { no: 4, name: "metrics_view_time_series_request", kind: "message", T: MetricsViewTimeSeriesRequest, oneof: "query" }, @@ -3880,6 +4201,12 @@ export class QueryBatchResponse extends Message { * @generated from oneof rill.runtime.v1.QueryBatchResponse.result */ result: { + /** + * @generated from field: rill.runtime.v1.MetricsViewAggregationResponse metrics_view_aggregation_response = 21; + */ + value: MetricsViewAggregationResponse; + case: "metricsViewAggregationResponse"; + } | { /** * @generated from field: rill.runtime.v1.MetricsViewToplistResponse metrics_view_toplist_response = 3; */ @@ -3999,6 +4326,7 @@ export class QueryBatchResponse extends Message { static readonly fields: FieldList = proto3.util.newFieldList(() => [ { no: 1, name: "key", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, { no: 2, name: "error", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 21, name: "metrics_view_aggregation_response", kind: "message", T: MetricsViewAggregationResponse, oneof: "result" }, { no: 3, name: "metrics_view_toplist_response", kind: "message", T: MetricsViewToplistResponse, oneof: "result" }, { no: 4, name: "metrics_view_comparison_toplist_response", kind: "message", T: MetricsViewComparisonToplistResponse, oneof: "result" }, { no: 5, name: "metrics_view_time_series_response", kind: "message", T: MetricsViewTimeSeriesResponse, oneof: "result" }, diff --git a/web-common/src/runtime-client/gen/connector-service/connector-service.ts b/web-common/src/runtime-client/gen/connector-service/connector-service.ts index c04c203adc9..6cf8cd1f146 100644 --- a/web-common/src/runtime-client/gen/connector-service/connector-service.ts +++ b/web-common/src/runtime-client/gen/connector-service/connector-service.ts @@ -17,6 +17,8 @@ import type { ConnectorServiceBigQueryListDatasetsParams, V1BigQueryListTablesResponse, ConnectorServiceBigQueryListTablesParams, + V1ScanConnectorsResponse, + ConnectorServiceScanConnectorsParams, V1GCSListObjectsResponse, ConnectorServiceGCSListObjectsParams, V1GCSListBucketsResponse, @@ -206,6 +208,94 @@ export const createConnectorServiceBigQueryListTables = < return query; }; +/** + * @summary ScanConnectors scans the artifacts for connectors and returns information about +the connectors referenced in the artifacts. The information includes name,type and +credentials for the connector. + */ +export const connectorServiceScanConnectors = ( + params?: ConnectorServiceScanConnectorsParams, + signal?: AbortSignal +) => { + return httpClient({ + url: `/v1/connectors/scan`, + method: "get", + params, + signal, + }); +}; + +export const getConnectorServiceScanConnectorsQueryKey = ( + params?: ConnectorServiceScanConnectorsParams +) => [`/v1/connectors/scan`, ...(params ? [params] : [])] as const; + +export const getConnectorServiceScanConnectorsQueryOptions = < + TData = Awaited>, + TError = RpcStatus +>( + params?: ConnectorServiceScanConnectorsParams, + options?: { + query?: CreateQueryOptions< + Awaited>, + TError, + TData + >; + } +): CreateQueryOptions< + Awaited>, + TError, + TData +> & { queryKey: QueryKey } => { + const { query: queryOptions } = options ?? {}; + + const queryKey = + queryOptions?.queryKey ?? getConnectorServiceScanConnectorsQueryKey(params); + + const queryFn: QueryFunction< + Awaited> + > = ({ signal }) => connectorServiceScanConnectors(params, signal); + + return { queryKey, queryFn, ...queryOptions }; +}; + +export type ConnectorServiceScanConnectorsQueryResult = NonNullable< + Awaited> +>; +export type ConnectorServiceScanConnectorsQueryError = RpcStatus; + +/** + * @summary ScanConnectors scans the artifacts for connectors and returns information about +the connectors referenced in the artifacts. The information includes name,type and +credentials for the connector. + */ +export const createConnectorServiceScanConnectors = < + TData = Awaited>, + TError = RpcStatus +>( + params?: ConnectorServiceScanConnectorsParams, + options?: { + query?: CreateQueryOptions< + Awaited>, + TError, + TData + >; + } +): CreateQueryResult & { queryKey: QueryKey } => { + const queryOptions = getConnectorServiceScanConnectorsQueryOptions( + params, + options + ); + + const query = createQuery(queryOptions) as CreateQueryResult< + TData, + TError + > & { queryKey: QueryKey }; + + query.queryKey = queryOptions.queryKey; + + return query; +}; + /** * @summary GCSListObjects lists objects for the given bucket. */ diff --git a/web-common/src/runtime-client/gen/index.schemas.ts b/web-common/src/runtime-client/gen/index.schemas.ts index 381ebba09c2..f4ff9168e75 100644 --- a/web-common/src/runtime-client/gen/index.schemas.ts +++ b/web-common/src/runtime-client/gen/index.schemas.ts @@ -221,9 +221,22 @@ export type QueryServiceMetricsViewComparisonToplistBody = { priority?: number; }; +export type QueryServiceMetricsViewAggregationBody = { + dimensions?: V1MetricsViewAggregationDimension[]; + measures?: V1MetricsViewAggregationMeasure[]; + sort?: V1MetricsViewAggregationSort[]; + timeStart?: string; + timeEnd?: string; + filter?: V1MetricsViewFilter; + limit?: string; + offset?: string; + priority?: number; +}; + export type QueryServiceExportBody = { limit?: string; format?: V1ExportFormat; + metricsViewAggregationRequest?: V1MetricsViewAggregationRequest; metricsViewToplistRequest?: V1MetricsViewToplistRequest; metricsViewRowsRequest?: V1MetricsViewRowsRequest; metricsViewTimeSeriesRequest?: V1MetricsViewTimeSeriesRequest; @@ -386,6 +399,10 @@ export type RuntimeServiceIssueDevJWTParams = { admin?: boolean; }; +export type ConnectorServiceScanConnectorsParams = { + instanceId?: string; +}; + export type ConnectorServiceBigQueryListTablesParams = { instanceId?: string; connector?: string; @@ -579,24 +596,13 @@ export interface V1SourceState { refreshedOn?: string; } -export type V1SourceSpecProperties = { [key: string]: any }; - -export interface V1SourceSpec { - sourceConnector?: string; - sinkConnector?: string; - properties?: V1SourceSpecProperties; - refreshSchedule?: V1Schedule; - timeoutSeconds?: number; - stageChanges?: boolean; - streamIngestion?: boolean; - trigger?: boolean; -} - export interface V1SourceV2 { spec?: V1SourceSpec; state?: V1SourceState; } +export type V1SourceSpecProperties = { [key: string]: any }; + export type V1SourceProperties = { [key: string]: any }; export interface V1Source { @@ -604,7 +610,6 @@ export interface V1Source { connector?: string; properties?: V1SourceProperties; schema?: V1StructType; - policy?: SourceExtractPolicy; timeoutSeconds?: number; } @@ -613,6 +618,27 @@ export interface V1Schedule { tickerSeconds?: number; } +export interface V1SourceSpec { + sourceConnector?: string; + sinkConnector?: string; + properties?: V1SourceSpecProperties; + refreshSchedule?: V1Schedule; + timeoutSeconds?: number; + stageChanges?: boolean; + streamIngestion?: boolean; + trigger?: boolean; +} + +export interface V1ScannedConnector { + name?: string; + type?: string; + hasAnonymousAccess?: boolean; +} + +export interface V1ScanConnectorsResponse { + connectors?: V1ScannedConnector[]; +} + export interface V1S3Object { name?: string; modifiedOn?: string; @@ -644,17 +670,6 @@ export interface V1ResourceName { name?: string; } -export type V1ReconcileStatus = - (typeof V1ReconcileStatus)[keyof typeof V1ReconcileStatus]; - -// eslint-disable-next-line @typescript-eslint/no-redeclare -export const V1ReconcileStatus = { - RECONCILE_STATUS_UNSPECIFIED: "RECONCILE_STATUS_UNSPECIFIED", - RECONCILE_STATUS_IDLE: "RECONCILE_STATUS_IDLE", - RECONCILE_STATUS_PENDING: "RECONCILE_STATUS_PENDING", - RECONCILE_STATUS_RUNNING: "RECONCILE_STATUS_RUNNING", -} as const; - export interface V1ResourceMeta { name?: V1ResourceName; refs?: V1ResourceName[]; @@ -749,6 +764,27 @@ export interface V1RefreshAndReconcileRequest { strict?: boolean; } +export type V1ReconcileStatus = + (typeof V1ReconcileStatus)[keyof typeof V1ReconcileStatus]; + +// eslint-disable-next-line @typescript-eslint/no-redeclare +export const V1ReconcileStatus = { + RECONCILE_STATUS_UNSPECIFIED: "RECONCILE_STATUS_UNSPECIFIED", + RECONCILE_STATUS_IDLE: "RECONCILE_STATUS_IDLE", + RECONCILE_STATUS_PENDING: "RECONCILE_STATUS_PENDING", + RECONCILE_STATUS_RUNNING: "RECONCILE_STATUS_RUNNING", +} as const; + +export interface V1ReconcileResponse { + /** Errors encountered during reconciliation. If strict = false, any path in +affected_paths without an error can be assumed to have been reconciled succesfully. */ + errors?: V1ReconcileError[]; + /** affected_paths lists all the file artifact paths that were considered while +executing the reconciliation. If changed_paths was empty, this will include all +code artifacts in the repo. */ + affectedPaths?: string[]; +} + /** * - CODE_UNSPECIFIED: Unspecified error - CODE_SYNTAX: Code artifact failed to parse @@ -793,16 +829,6 @@ Only applicable if file_path is set. */ endLocation?: V1ReconcileErrorCharLocation; } -export interface V1ReconcileResponse { - /** Errors encountered during reconciliation. If strict = false, any path in -affected_paths without an error can be assumed to have been reconciled succesfully. */ - errors?: V1ReconcileError[]; - /** affected_paths lists all the file artifact paths that were considered while -executing the reconciliation. If changed_paths was empty, this will include all -code artifacts in the repo. */ - affectedPaths?: string[]; -} - export type V1QueryResponseDataItem = { [key: string]: any }; export interface V1QueryResponse { @@ -813,6 +839,7 @@ export interface V1QueryResponse { export interface V1QueryBatchResponse { key?: number; error?: string; + metricsViewAggregationResponse?: V1MetricsViewAggregationResponse; metricsViewToplistResponse?: V1MetricsViewToplistResponse; metricsViewComparisonToplistResponse?: V1MetricsViewComparisonToplistResponse; metricsViewTimeSeriesResponse?: V1MetricsViewTimeSeriesResponse; @@ -836,6 +863,7 @@ export interface V1QueryBatchResponse { export interface V1QueryBatchEntry { /** Since response could out of order `key` is used to co-relate a specific response to request. */ key?: number; + metricsViewAggregationRequest?: V1MetricsViewAggregationRequest; metricsViewToplistRequest?: V1MetricsViewToplistRequest; metricsViewComparisonToplistRequest?: V1MetricsViewComparisonToplistRequest; metricsViewTimeSeriesRequest?: V1MetricsViewTimeSeriesRequest; @@ -896,6 +924,12 @@ export interface V1PullTrigger { state?: V1PullTriggerState; } +export interface V1ProjectParserState { + parseErrors?: V1ParseError[]; + currentCommitSha?: string; + changedPaths?: string[]; +} + export interface V1ProjectParserSpec { compiler?: string; watch?: boolean; @@ -928,12 +962,6 @@ export interface V1ParseError { startLocation?: Runtimev1CharLocation; } -export interface V1ProjectParserState { - parseErrors?: V1ParseError[]; - currentCommitSha?: string; - changedPaths?: string[]; -} - export type V1ObjectType = (typeof V1ObjectType)[keyof typeof V1ObjectType]; // eslint-disable-next-line @typescript-eslint/no-redeclare @@ -1024,6 +1052,11 @@ export interface V1Migration { state?: V1MigrationState; } +export interface V1MetricsViewV2 { + spec?: V1MetricsViewSpec; + state?: V1MetricsViewState; +} + export type V1MetricsViewTotalsResponseData = { [key: string]: any }; export interface V1MetricsViewTotalsResponse { @@ -1044,31 +1077,19 @@ export interface V1MetricsViewTotalsRequest { export type V1MetricsViewToplistResponseDataItem = { [key: string]: any }; -export interface V1MetricsViewToplistResponse { - meta?: V1MetricsViewColumn[]; - data?: V1MetricsViewToplistResponseDataItem[]; -} - -export interface V1MetricsViewToplistRequest { +export interface V1MetricsViewTimeSeriesRequest { instanceId?: string; metricsViewName?: string; - dimensionName?: string; measureNames?: string[]; inlineMeasures?: V1InlineMeasure[]; timeStart?: string; timeEnd?: string; - limit?: string; - offset?: string; - sort?: V1MetricsViewSort[]; + timeGranularity?: V1TimeGrain; filter?: V1MetricsViewFilter; + timeZone?: string; priority?: number; } -export interface V1MetricsViewTimeSeriesResponse { - meta?: V1MetricsViewColumn[]; - data?: V1TimeSeriesValue[]; -} - export interface V1MetricsViewTimeRangeResponse { timeRangeSummary?: V1TimeRangeSummary; } @@ -1092,16 +1113,26 @@ export interface V1MetricsViewState { validSpec?: V1MetricsViewSpec; } -export interface V1MetricsViewV2 { - spec?: V1MetricsViewSpec; - state?: V1MetricsViewState; -} - export interface V1MetricsViewSort { name?: string; ascending?: boolean; } +export interface V1MetricsViewToplistRequest { + instanceId?: string; + metricsViewName?: string; + dimensionName?: string; + measureNames?: string[]; + inlineMeasures?: V1InlineMeasure[]; + timeStart?: string; + timeEnd?: string; + limit?: string; + offset?: string; + sort?: V1MetricsViewSort[]; + filter?: V1MetricsViewFilter; + priority?: number; +} + export type V1MetricsViewRowsResponseDataItem = { [key: string]: any }; export interface V1MetricsViewRowsResponse { @@ -1114,19 +1145,6 @@ export interface V1MetricsViewFilter { exclude?: MetricsViewFilterCond[]; } -export interface V1MetricsViewTimeSeriesRequest { - instanceId?: string; - metricsViewName?: string; - measureNames?: string[]; - inlineMeasures?: V1InlineMeasure[]; - timeStart?: string; - timeEnd?: string; - timeGranularity?: V1TimeGrain; - filter?: V1MetricsViewFilter; - timeZone?: string; - priority?: number; -} - export interface V1MetricsViewRowsRequest { instanceId?: string; metricsViewName?: string; @@ -1149,6 +1167,10 @@ export interface V1MetricsViewComparisonValue { deltaRel?: unknown; } +export interface V1MetricsViewComparisonToplistResponse { + rows?: V1MetricsViewComparisonRow[]; +} + export type V1MetricsViewComparisonSortType = (typeof V1MetricsViewComparisonSortType)[keyof typeof V1MetricsViewComparisonSortType]; @@ -1192,16 +1214,60 @@ export interface V1MetricsViewComparisonRow { measureValues?: V1MetricsViewComparisonValue[]; } -export interface V1MetricsViewComparisonToplistResponse { - rows?: V1MetricsViewComparisonRow[]; -} - export interface V1MetricsViewColumn { name?: string; type?: string; nullable?: boolean; } +export interface V1MetricsViewToplistResponse { + meta?: V1MetricsViewColumn[]; + data?: V1MetricsViewToplistResponseDataItem[]; +} + +export interface V1MetricsViewTimeSeriesResponse { + meta?: V1MetricsViewColumn[]; + data?: V1TimeSeriesValue[]; +} + +export interface V1MetricsViewAggregationSort { + name?: string; + desc?: boolean; +} + +export type V1MetricsViewAggregationResponseDataItem = { [key: string]: any }; + +export interface V1MetricsViewAggregationResponse { + schema?: V1StructType; + data?: V1MetricsViewAggregationResponseDataItem[]; +} + +export interface V1MetricsViewAggregationMeasure { + name?: string; + builtinMeasure?: V1BuiltinMeasure; + builtinMeasureArgs?: unknown[]; +} + +export interface V1MetricsViewAggregationDimension { + name?: string; + timeGrain?: V1TimeGrain; + timeZone?: string; +} + +export interface V1MetricsViewAggregationRequest { + instanceId?: string; + metricsView?: string; + dimensions?: V1MetricsViewAggregationDimension[]; + measures?: V1MetricsViewAggregationMeasure[]; + sort?: V1MetricsViewAggregationSort[]; + timeStart?: string; + timeEnd?: string; + filter?: V1MetricsViewFilter; + limit?: string; + offset?: string; + priority?: number; +} + export interface V1MetricsView { name?: string; model?: string; @@ -1626,6 +1692,16 @@ export interface V1CatalogEntry { refreshedOn?: string; } +export type V1BuiltinMeasure = + (typeof V1BuiltinMeasure)[keyof typeof V1BuiltinMeasure]; + +// eslint-disable-next-line @typescript-eslint/no-redeclare +export const V1BuiltinMeasure = { + BUILTIN_MEASURE_UNSPECIFIED: "BUILTIN_MEASURE_UNSPECIFIED", + BUILTIN_MEASURE_COUNT: "BUILTIN_MEASURE_COUNT", + BUILTIN_MEASURE_COUNT_DISTINCT: "BUILTIN_MEASURE_COUNT_DISTINCT", +} as const; + export interface V1BucketPlannerState { region?: string; } @@ -1639,20 +1715,10 @@ export interface V1BucketPlanner { state?: V1BucketPlannerState; } -export type V1BucketExtractPolicyStrategy = - (typeof V1BucketExtractPolicyStrategy)[keyof typeof V1BucketExtractPolicyStrategy]; - -// eslint-disable-next-line @typescript-eslint/no-redeclare -export const V1BucketExtractPolicyStrategy = { - STRATEGY_UNSPECIFIED: "STRATEGY_UNSPECIFIED", - STRATEGY_HEAD: "STRATEGY_HEAD", - STRATEGY_TAIL: "STRATEGY_TAIL", -} as const; - export interface V1BucketExtractPolicy { - rowsStrategy?: V1BucketExtractPolicyStrategy; + rowsStrategy?: BucketExtractPolicyStrategy; rowsLimitBytes?: string; - filesStrategy?: V1BucketExtractPolicyStrategy; + filesStrategy?: BucketExtractPolicyStrategy; filesLimit?: string; } @@ -1721,23 +1787,6 @@ export interface StructTypeField { type?: Runtimev1Type; } -export type SourceExtractPolicyStrategy = - (typeof SourceExtractPolicyStrategy)[keyof typeof SourceExtractPolicyStrategy]; - -// eslint-disable-next-line @typescript-eslint/no-redeclare -export const SourceExtractPolicyStrategy = { - STRATEGY_UNSPECIFIED: "STRATEGY_UNSPECIFIED", - STRATEGY_HEAD: "STRATEGY_HEAD", - STRATEGY_TAIL: "STRATEGY_TAIL", -} as const; - -export interface SourceExtractPolicy { - rowsStrategy?: SourceExtractPolicyStrategy; - rowsLimitBytes?: string; - filesStrategy?: SourceExtractPolicyStrategy; - filesLimit?: string; -} - export interface SecurityV2FieldConditionV2 { condition?: string; names?: string[]; @@ -1852,3 +1901,13 @@ export interface ColumnTimeSeriesRequestBasicMeasure { expression?: string; sqlName?: string; } + +export type BucketExtractPolicyStrategy = + (typeof BucketExtractPolicyStrategy)[keyof typeof BucketExtractPolicyStrategy]; + +// eslint-disable-next-line @typescript-eslint/no-redeclare +export const BucketExtractPolicyStrategy = { + STRATEGY_UNSPECIFIED: "STRATEGY_UNSPECIFIED", + STRATEGY_HEAD: "STRATEGY_HEAD", + STRATEGY_TAIL: "STRATEGY_TAIL", +} as const; diff --git a/web-common/src/runtime-client/gen/query-service/query-service.ts b/web-common/src/runtime-client/gen/query-service/query-service.ts index 7d0e9a61698..ee6b60c0811 100644 --- a/web-common/src/runtime-client/gen/query-service/query-service.ts +++ b/web-common/src/runtime-client/gen/query-service/query-service.ts @@ -23,6 +23,8 @@ import type { QueryServiceColumnDescriptiveStatisticsParams, V1ExportResponse, QueryServiceExportBody, + V1MetricsViewAggregationResponse, + QueryServiceMetricsViewAggregationBody, V1MetricsViewComparisonToplistResponse, QueryServiceMetricsViewComparisonToplistBody, V1MetricsViewRowsResponse, @@ -452,6 +454,118 @@ export const createQueryServiceExport = < return createMutation(mutationOptions); }; +/** + * @summary MetricsViewAggregation is a generic API for running group-by queries against a metrics view. + */ +export const queryServiceMetricsViewAggregation = ( + instanceId: string, + metricsView: string, + queryServiceMetricsViewAggregationBody: QueryServiceMetricsViewAggregationBody +) => { + return httpClient({ + url: `/v1/instances/${instanceId}/queries/metrics-views/${metricsView}/aggregation`, + method: "post", + headers: { "Content-Type": "application/json" }, + data: queryServiceMetricsViewAggregationBody, + }); +}; + +export const getQueryServiceMetricsViewAggregationQueryKey = ( + instanceId: string, + metricsView: string, + queryServiceMetricsViewAggregationBody: QueryServiceMetricsViewAggregationBody +) => + [ + `/v1/instances/${instanceId}/queries/metrics-views/${metricsView}/aggregation`, + queryServiceMetricsViewAggregationBody, + ] as const; + +export const getQueryServiceMetricsViewAggregationQueryOptions = < + TData = Awaited>, + TError = RpcStatus +>( + instanceId: string, + metricsView: string, + queryServiceMetricsViewAggregationBody: QueryServiceMetricsViewAggregationBody, + options?: { + query?: CreateQueryOptions< + Awaited>, + TError, + TData + >; + } +): CreateQueryOptions< + Awaited>, + TError, + TData +> & { queryKey: QueryKey } => { + const { query: queryOptions } = options ?? {}; + + const queryKey = + queryOptions?.queryKey ?? + getQueryServiceMetricsViewAggregationQueryKey( + instanceId, + metricsView, + queryServiceMetricsViewAggregationBody + ); + + const queryFn: QueryFunction< + Awaited> + > = () => + queryServiceMetricsViewAggregation( + instanceId, + metricsView, + queryServiceMetricsViewAggregationBody + ); + + return { + queryKey, + queryFn, + enabled: !!(instanceId && metricsView), + ...queryOptions, + }; +}; + +export type QueryServiceMetricsViewAggregationQueryResult = NonNullable< + Awaited> +>; +export type QueryServiceMetricsViewAggregationQueryError = RpcStatus; + +/** + * @summary MetricsViewAggregation is a generic API for running group-by queries against a metrics view. + */ +export const createQueryServiceMetricsViewAggregation = < + TData = Awaited>, + TError = RpcStatus +>( + instanceId: string, + metricsView: string, + queryServiceMetricsViewAggregationBody: QueryServiceMetricsViewAggregationBody, + options?: { + query?: CreateQueryOptions< + Awaited>, + TError, + TData + >; + } +): CreateQueryResult & { queryKey: QueryKey } => { + const queryOptions = getQueryServiceMetricsViewAggregationQueryOptions( + instanceId, + metricsView, + queryServiceMetricsViewAggregationBody, + options + ); + + const query = createQuery(queryOptions) as CreateQueryResult< + TData, + TError + > & { queryKey: QueryKey }; + + query.queryKey = queryOptions.queryKey; + + return query; +}; + export const queryServiceMetricsViewComparisonToplist = ( instanceId: string, metricsViewName: string, diff --git a/web-common/src/runtime-client/http-request-queue/HttpRequestQueue.spec.disabled.ts b/web-common/src/runtime-client/http-request-queue/HttpRequestQueue.spec.disabled.ts index aca80b47961..b5bacf6876f 100644 --- a/web-common/src/runtime-client/http-request-queue/HttpRequestQueue.spec.disabled.ts +++ b/web-common/src/runtime-client/http-request-queue/HttpRequestQueue.spec.disabled.ts @@ -7,7 +7,7 @@ import { import { httpRequestQueue } from "@rilldata/web-common/runtime-client/http-client"; import { UrlExtractorRegex } from "@rilldata/web-common/runtime-client/http-request-queue/HttpRequestQueue"; import type { RequestQueueEntry } from "@rilldata/web-common/runtime-client/http-request-queue/HttpRequestQueueTypes"; -import { asyncWait, waitUntil } from "@rilldata/web-local/lib/util/waitUtils"; +import { asyncWait, waitUntil } from "@rilldata/web-common/lib/waitUtils"; import Mock = jest.Mock; // skipping because there is too much instability due to race conditions diff --git a/web-common/src/runtime-client/watch-request-client.ts b/web-common/src/runtime-client/watch-request-client.ts index 9c2e8581cae..dc4a82ad97c 100644 --- a/web-common/src/runtime-client/watch-request-client.ts +++ b/web-common/src/runtime-client/watch-request-client.ts @@ -6,7 +6,7 @@ import type { import { streamingFetchWrapper } from "@rilldata/web-common/runtime-client/fetch-streaming-wrapper"; import { runtime } from "@rilldata/web-common/runtime-client/runtime-store"; import type { Runtime } from "@rilldata/web-common/runtime-client/runtime-store"; -import { asyncWait } from "@rilldata/web-local/lib/util/waitUtils"; +import { asyncWait } from "@rilldata/web-common/lib/waitUtils"; import { get, Unsubscriber } from "svelte/store"; type WatchResponse = diff --git a/web-local/src/lib/errors/messages.ts b/web-local/src/lib/errors/messages.ts index 96154400017..82b2ea8bc56 100644 --- a/web-local/src/lib/errors/messages.ts +++ b/web-local/src/lib/errors/messages.ts @@ -1 +1 @@ -export const CATALOG_ENTRY_NOT_FOUND = "entry not found"; +export const CATALOG_ENTRY_NOT_FOUND = "not found"; diff --git a/web-local/src/routes/(application)/dashboard/[name]/+page.svelte b/web-local/src/routes/(application)/dashboard/[name]/+page.svelte index ebd75bed24d..b2ac27f11a5 100644 --- a/web-local/src/routes/(application)/dashboard/[name]/+page.svelte +++ b/web-local/src/routes/(application)/dashboard/[name]/+page.svelte @@ -63,7 +63,7 @@ } // When a mock user doesn't have access to the dashboard, stay on the page to show a message - if ($selectedMockUserStore !== null && err.response?.status === 401) + if ($selectedMockUserStore !== null && err.response?.status === 404) return; // On all other errors, redirect to the `/edit` page diff --git a/web-local/test/ui/utils/helpers.ts b/web-local/test/ui/utils/helpers.ts index 682925ca490..675abb52074 100644 --- a/web-local/test/ui/utils/helpers.ts +++ b/web-local/test/ui/utils/helpers.ts @@ -1,4 +1,4 @@ -import { asyncWaitUntil } from "@rilldata/web-local/lib/util/waitUtils"; +import { asyncWaitUntil } from "@rilldata/web-common/lib/waitUtils"; import type { Page } from "playwright"; export enum TestEntityType { diff --git a/web-local/test/ui/utils/sourceHelpers.ts b/web-local/test/ui/utils/sourceHelpers.ts index 276f7869dc9..79a806141de 100644 --- a/web-local/test/ui/utils/sourceHelpers.ts +++ b/web-local/test/ui/utils/sourceHelpers.ts @@ -1,5 +1,5 @@ import { expect } from "@playwright/test"; -import { asyncWait } from "@rilldata/web-local/lib/util/waitUtils"; +import { asyncWait } from "@rilldata/web-common/lib/waitUtils"; import path from "node:path"; import type { Page } from "playwright"; import { fileURLToPath } from "url"; diff --git a/web-local/test/ui/utils/startRuntimeForEachTest.ts b/web-local/test/ui/utils/startRuntimeForEachTest.ts index fb7bc0bdbc0..c9cb26e352c 100644 --- a/web-local/test/ui/utils/startRuntimeForEachTest.ts +++ b/web-local/test/ui/utils/startRuntimeForEachTest.ts @@ -4,7 +4,7 @@ import { spawn } from "node:child_process"; import type { ChildProcess } from "node:child_process"; import treeKill from "tree-kill"; import { isPortOpen } from "@rilldata/web-local/lib/util/isPortOpen"; -import { asyncWaitUntil } from "@rilldata/web-local/lib/util/waitUtils"; +import { asyncWaitUntil } from "@rilldata/web-common/lib/waitUtils"; import axios from "axios"; const TEST_PROJECT_DIRECTORY = "temp/test-project"; diff --git a/web-local/test/ui/utils/waitHelpers.ts b/web-local/test/ui/utils/waitHelpers.ts index a84fa0c95d7..5922e2d300e 100644 --- a/web-local/test/ui/utils/waitHelpers.ts +++ b/web-local/test/ui/utils/waitHelpers.ts @@ -1,5 +1,5 @@ import { expect } from "@playwright/test"; -import { asyncWait } from "@rilldata/web-local/lib/util/waitUtils"; +import { asyncWait } from "@rilldata/web-common/lib/waitUtils"; import type { Page } from "playwright"; import { getEntityLink, TestEntityType } from "./helpers";