diff --git a/Makefile b/Makefile index 615feed7c..b39ade392 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ TAG := $(shell git rev-list --tags --max-count=1) VERSION := $(shell git describe --tags ${TAG}) .PHONY: build check fmt lint test test-race vet test-cover-html help install proto admin-app compose-up-dev .DEFAULT_GOAL := build -PROTON_COMMIT := "9c069b5e749972014da7784f5c3802745a6e903e" +PROTON_COMMIT := "eeb82738610b07efaf8f8205c3b00f8b774cf31e" admin-app: @echo " > generating admin build" diff --git a/cmd/serve.go b/cmd/serve.go index d8cfefca8..b543857f5 100644 --- a/cmd/serve.go +++ b/cmd/serve.go @@ -13,6 +13,7 @@ import ( "github.com/raystack/frontier/core/aggregates/orgbilling" "github.com/raystack/frontier/core/aggregates/orginvoices" + "github.com/raystack/frontier/core/aggregates/orgpats" "github.com/raystack/frontier/core/aggregates/orgprojects" "github.com/raystack/frontier/core/aggregates/orgserviceuser" "github.com/raystack/frontier/core/aggregates/orgserviceusercredentials" @@ -465,6 +466,9 @@ func buildAPIDependencies( projectService := project.NewService(projectRepository, relationService, userService, policyService, authnService, serviceUserService, groupService) + orgPATsRepository := postgres.NewOrgPATsRepository(dbc) + orgPATsService := orgpats.NewService(orgPATsRepository, projectService) + resourcePGRepository := postgres.NewResourceRepository(dbc) resourceService := resource.NewService( resourcePGRepository, @@ -607,6 +611,7 @@ func buildAPIDependencies( OrgBillingService: orgBillingService, OrgInvoicesService: orgInvoicesService, OrgTokensService: orgTokensService, + OrgPATsService: orgPATsService, OrgUsersService: orgUserService, OrgProjectsService: orgProjectsService, OrgServiceUserCredentialsService: orgServiceUserCredentialsService, diff --git a/core/aggregates/orgpats/mocks/project_service.go b/core/aggregates/orgpats/mocks/project_service.go new file mode 100644 index 000000000..b9643e796 --- /dev/null +++ b/core/aggregates/orgpats/mocks/project_service.go @@ -0,0 +1,100 @@ +// Code generated by mockery v2.53.5. DO NOT EDIT. + +package mocks + +import ( + context "context" + + authenticate "github.com/raystack/frontier/core/authenticate" + + mock "github.com/stretchr/testify/mock" + + project "github.com/raystack/frontier/core/project" +) + +// ProjectService is an autogenerated mock type for the ProjectService type +type ProjectService struct { + mock.Mock +} + +type ProjectService_Expecter struct { + mock *mock.Mock +} + +func (_m *ProjectService) EXPECT() *ProjectService_Expecter { + return &ProjectService_Expecter{mock: &_m.Mock} +} + +// ListByUser provides a mock function with given fields: ctx, principal, flt +func (_m *ProjectService) ListByUser(ctx context.Context, principal authenticate.Principal, flt project.Filter) ([]project.Project, error) { + ret := _m.Called(ctx, principal, flt) + + if len(ret) == 0 { + panic("no return value specified for ListByUser") + } + + var r0 []project.Project + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, authenticate.Principal, project.Filter) ([]project.Project, error)); ok { + return rf(ctx, principal, flt) + } + if rf, ok := ret.Get(0).(func(context.Context, authenticate.Principal, project.Filter) []project.Project); ok { + r0 = rf(ctx, principal, flt) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]project.Project) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, authenticate.Principal, project.Filter) error); ok { + r1 = rf(ctx, principal, flt) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ProjectService_ListByUser_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ListByUser' +type ProjectService_ListByUser_Call struct { + *mock.Call +} + +// ListByUser is a helper method to define mock.On call +// - ctx context.Context +// - principal authenticate.Principal +// - flt project.Filter +func (_e *ProjectService_Expecter) ListByUser(ctx interface{}, principal interface{}, flt interface{}) *ProjectService_ListByUser_Call { + return &ProjectService_ListByUser_Call{Call: _e.mock.On("ListByUser", ctx, principal, flt)} +} + +func (_c *ProjectService_ListByUser_Call) Run(run func(ctx context.Context, principal authenticate.Principal, flt project.Filter)) *ProjectService_ListByUser_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(authenticate.Principal), args[2].(project.Filter)) + }) + return _c +} + +func (_c *ProjectService_ListByUser_Call) Return(_a0 []project.Project, _a1 error) *ProjectService_ListByUser_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ProjectService_ListByUser_Call) RunAndReturn(run func(context.Context, authenticate.Principal, project.Filter) ([]project.Project, error)) *ProjectService_ListByUser_Call { + _c.Call.Return(run) + return _c +} + +// NewProjectService creates a new instance of ProjectService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewProjectService(t interface { + mock.TestingT + Cleanup(func()) +}) *ProjectService { + mock := &ProjectService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/core/aggregates/orgpats/mocks/repository.go b/core/aggregates/orgpats/mocks/repository.go new file mode 100644 index 000000000..e3b839934 --- /dev/null +++ b/core/aggregates/orgpats/mocks/repository.go @@ -0,0 +1,97 @@ +// Code generated by mockery v2.53.5. DO NOT EDIT. + +package mocks + +import ( + context "context" + + orgpats "github.com/raystack/frontier/core/aggregates/orgpats" + mock "github.com/stretchr/testify/mock" + + rql "github.com/raystack/salt/rql" +) + +// Repository is an autogenerated mock type for the Repository type +type Repository struct { + mock.Mock +} + +type Repository_Expecter struct { + mock *mock.Mock +} + +func (_m *Repository) EXPECT() *Repository_Expecter { + return &Repository_Expecter{mock: &_m.Mock} +} + +// Search provides a mock function with given fields: ctx, orgID, query +func (_m *Repository) Search(ctx context.Context, orgID string, query *rql.Query) (orgpats.OrganizationPATs, error) { + ret := _m.Called(ctx, orgID, query) + + if len(ret) == 0 { + panic("no return value specified for Search") + } + + var r0 orgpats.OrganizationPATs + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, *rql.Query) (orgpats.OrganizationPATs, error)); ok { + return rf(ctx, orgID, query) + } + if rf, ok := ret.Get(0).(func(context.Context, string, *rql.Query) orgpats.OrganizationPATs); ok { + r0 = rf(ctx, orgID, query) + } else { + r0 = ret.Get(0).(orgpats.OrganizationPATs) + } + + if rf, ok := ret.Get(1).(func(context.Context, string, *rql.Query) error); ok { + r1 = rf(ctx, orgID, query) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Repository_Search_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Search' +type Repository_Search_Call struct { + *mock.Call +} + +// Search is a helper method to define mock.On call +// - ctx context.Context +// - orgID string +// - query *rql.Query +func (_e *Repository_Expecter) Search(ctx interface{}, orgID interface{}, query interface{}) *Repository_Search_Call { + return &Repository_Search_Call{Call: _e.mock.On("Search", ctx, orgID, query)} +} + +func (_c *Repository_Search_Call) Run(run func(ctx context.Context, orgID string, query *rql.Query)) *Repository_Search_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string), args[2].(*rql.Query)) + }) + return _c +} + +func (_c *Repository_Search_Call) Return(_a0 orgpats.OrganizationPATs, _a1 error) *Repository_Search_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *Repository_Search_Call) RunAndReturn(run func(context.Context, string, *rql.Query) (orgpats.OrganizationPATs, error)) *Repository_Search_Call { + _c.Call.Return(run) + return _c +} + +// NewRepository creates a new instance of Repository. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewRepository(t interface { + mock.TestingT + Cleanup(func()) +}) *Repository { + mock := &Repository{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/core/aggregates/orgpats/service.go b/core/aggregates/orgpats/service.go new file mode 100644 index 000000000..7977bab9a --- /dev/null +++ b/core/aggregates/orgpats/service.go @@ -0,0 +1,129 @@ +package orgpats + +import ( + "context" + "time" + + "github.com/raystack/frontier/core/authenticate" + "github.com/raystack/frontier/core/project" + patmodels "github.com/raystack/frontier/core/userpat/models" + "github.com/raystack/frontier/internal/bootstrap/schema" + "github.com/raystack/frontier/pkg/utils" + "github.com/raystack/salt/rql" +) + +type Repository interface { + Search(ctx context.Context, orgID string, query *rql.Query) (OrganizationPATs, error) +} + +type ProjectService interface { + ListByUser(ctx context.Context, principal authenticate.Principal, flt project.Filter) ([]project.Project, error) +} + +type Service struct { + repository Repository + projectService ProjectService +} + +func NewService(repository Repository, projectService ProjectService) *Service { + return &Service{ + repository: repository, + projectService: projectService, + } +} + +type CreatedBy struct { + ID string + Title string + Email string +} + +type AggregatedPAT struct { + ID string + Title string + CreatedBy CreatedBy + Scopes []patmodels.PATScope + CreatedAt time.Time + ExpiresAt time.Time + LastUsedAt *time.Time + UserID string +} + +// PATSearchFields is used for RQL validation — flat struct with rql tags. +type PATSearchFields struct { + ID string `rql:"name=id,type=string"` + Title string `rql:"name=title,type=string"` + CreatedByTitle string `rql:"name=created_by_title,type=string"` + CreatedByEmail string `rql:"name=created_by_email,type=string"` + CreatedAt time.Time `rql:"name=created_at,type=datetime"` + ExpiresAt time.Time `rql:"name=expires_at,type=datetime"` + LastUsedAt *time.Time `rql:"name=last_used_at,type=datetime"` +} + +type OrganizationPATs struct { + PATs []AggregatedPAT + Pagination utils.Page +} + +func (s *Service) Search(ctx context.Context, orgID string, query *rql.Query) (OrganizationPATs, error) { + result, err := s.repository.Search(ctx, orgID, query) + if err != nil { + return OrganizationPATs{}, err + } + + if err := s.resolveAllProjectsScope(ctx, orgID, result.PATs); err != nil { + return OrganizationPATs{}, err + } + + return result, nil +} + +// resolveAllProjectsScope populates ResourceIDs for all-projects scopes by calling SpiceDB. +// Groups PATs by user_id to minimize SpiceDB calls. +func (s *Service) resolveAllProjectsScope(ctx context.Context, orgID string, pats []AggregatedPAT) error { + // Collect users that have all-projects scopes + type allProjectsRef struct { + patIdx int + scopeIdx int + } + userRefs := make(map[string][]allProjectsRef) + + for i, pat := range pats { + for j, sc := range pat.Scopes { + if sc.ResourceType == schema.ProjectNamespace && len(sc.ResourceIDs) == 0 { + userRefs[pat.UserID] = append(userRefs[pat.UserID], allProjectsRef{i, j}) + } + } + } + + if len(userRefs) == 0 { + return nil + } + + // One SpiceDB call per unique user + for userID, refs := range userRefs { + principal := authenticate.Principal{ + ID: userID, + Type: schema.UserPrincipal, + } + projects, err := s.projectService.ListByUser(ctx, principal, project.Filter{OrgID: orgID}) + if err != nil { + return err + } + + projectIDs := make([]string, 0, len(projects)) + for _, p := range projects { + projectIDs = append(projectIDs, p.ID) + } + + // Copy per PAT to avoid slice aliasing — multiple PATs from the same user + // would otherwise share the same underlying array. + for _, ref := range refs { + idsCopy := make([]string, len(projectIDs)) + copy(idsCopy, projectIDs) + pats[ref.patIdx].Scopes[ref.scopeIdx].ResourceIDs = idsCopy + } + } + + return nil +} diff --git a/core/aggregates/orgpats/service_test.go b/core/aggregates/orgpats/service_test.go new file mode 100644 index 000000000..359ae4a87 --- /dev/null +++ b/core/aggregates/orgpats/service_test.go @@ -0,0 +1,151 @@ +package orgpats_test + +import ( + "context" + "errors" + "testing" + "time" + + "github.com/raystack/frontier/core/aggregates/orgpats" + "github.com/raystack/frontier/core/aggregates/orgpats/mocks" + "github.com/raystack/frontier/core/project" + patmodels "github.com/raystack/frontier/core/userpat/models" + "github.com/raystack/frontier/internal/bootstrap/schema" + "github.com/raystack/frontier/pkg/utils" + "github.com/raystack/salt/rql" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func TestService_Search(t *testing.T) { + ctx := context.Background() + orgID := "org-1" + now := time.Now() + query := &rql.Query{Limit: 30, Offset: 0} + + t.Run("returns results from repository", func(t *testing.T) { + repo := mocks.NewRepository(t) + projSvc := mocks.NewProjectService(t) + + expected := orgpats.OrganizationPATs{ + PATs: []orgpats.AggregatedPAT{ + { + ID: "pat-1", + Title: "my-token", + CreatedBy: orgpats.CreatedBy{ + ID: "user-1", Title: "John", Email: "john@test.com", + }, + Scopes: []patmodels.PATScope{ + {RoleID: "role-1", ResourceType: schema.OrganizationNamespace, ResourceIDs: []string{"org-1"}}, + }, + CreatedAt: now, + ExpiresAt: now.Add(24 * time.Hour), + UserID: "user-1", + }, + }, + Pagination: utils.Page{Offset: 0, Limit: 30, TotalCount: 1}, + } + + repo.EXPECT().Search(mock.Anything, orgID, query).Return(expected, nil) + + svc := orgpats.NewService(repo, projSvc) + result, err := svc.Search(ctx, orgID, query) + assert.NoError(t, err) + assert.Len(t, result.PATs, 1) + assert.Equal(t, "pat-1", result.PATs[0].ID) + }) + + t.Run("returns error from repository", func(t *testing.T) { + repo := mocks.NewRepository(t) + projSvc := mocks.NewProjectService(t) + + repo.EXPECT().Search(mock.Anything, orgID, query).Return(orgpats.OrganizationPATs{}, errors.New("db error")) + + svc := orgpats.NewService(repo, projSvc) + _, err := svc.Search(ctx, orgID, query) + assert.Error(t, err) + }) + + t.Run("resolves all-projects scope via SpiceDB", func(t *testing.T) { + repo := mocks.NewRepository(t) + projSvc := mocks.NewProjectService(t) + + repoResult := orgpats.OrganizationPATs{ + PATs: []orgpats.AggregatedPAT{ + { + ID: "pat-1", + Title: "all-proj-token", + CreatedBy: orgpats.CreatedBy{ + ID: "user-1", Title: "John", Email: "john@test.com", + }, + Scopes: []patmodels.PATScope{ + {RoleID: "role-proj", ResourceType: schema.ProjectNamespace, ResourceIDs: nil}, // all-projects + }, + CreatedAt: now, + ExpiresAt: now.Add(24 * time.Hour), + UserID: "user-1", + }, + }, + Pagination: utils.Page{Offset: 0, Limit: 30, TotalCount: 1}, + } + + repo.EXPECT().Search(mock.Anything, orgID, query).Return(repoResult, nil) + projSvc.EXPECT().ListByUser(mock.Anything, mock.Anything, mock.Anything). + Return([]project.Project{{ID: "proj-1"}, {ID: "proj-2"}}, nil).Maybe() + + svc := orgpats.NewService(repo, projSvc) + result, err := svc.Search(ctx, orgID, query) + assert.NoError(t, err) + assert.Len(t, result.PATs, 1) + // After resolution, the all-projects scope should have project IDs + if len(result.PATs[0].Scopes[0].ResourceIDs) > 0 { + assert.Contains(t, result.PATs[0].Scopes[0].ResourceIDs, "proj-1") + } + }) + + t.Run("skips resolution when no all-projects scopes", func(t *testing.T) { + repo := mocks.NewRepository(t) + projSvc := mocks.NewProjectService(t) + + repoResult := orgpats.OrganizationPATs{ + PATs: []orgpats.AggregatedPAT{ + { + ID: "pat-1", + Title: "specific-proj-token", + CreatedBy: orgpats.CreatedBy{ + ID: "user-1", Title: "John", Email: "john@test.com", + }, + Scopes: []patmodels.PATScope{ + {RoleID: "role-proj", ResourceType: schema.ProjectNamespace, ResourceIDs: []string{"proj-1"}}, + }, + CreatedAt: now, + ExpiresAt: now.Add(24 * time.Hour), + UserID: "user-1", + }, + }, + Pagination: utils.Page{Offset: 0, Limit: 30, TotalCount: 1}, + } + + repo.EXPECT().Search(mock.Anything, orgID, query).Return(repoResult, nil) + // ProjectService.ListByUser should NOT be called + svc := orgpats.NewService(repo, projSvc) + result, err := svc.Search(ctx, orgID, query) + assert.NoError(t, err) + assert.Equal(t, []string{"proj-1"}, result.PATs[0].Scopes[0].ResourceIDs) + }) + + t.Run("empty result", func(t *testing.T) { + repo := mocks.NewRepository(t) + projSvc := mocks.NewProjectService(t) + + repo.EXPECT().Search(mock.Anything, orgID, query).Return(orgpats.OrganizationPATs{ + Pagination: utils.Page{Offset: 0, Limit: 30, TotalCount: 0}, + }, nil) + + svc := orgpats.NewService(repo, projSvc) + result, err := svc.Search(ctx, orgID, query) + assert.NoError(t, err) + assert.Empty(t, result.PATs) + assert.Equal(t, int64(0), result.Pagination.TotalCount) + }) +} diff --git a/go.mod b/go.mod index 90fe27e3a..61233418c 100644 --- a/go.mod +++ b/go.mod @@ -25,7 +25,6 @@ require ( github.com/gorilla/securecookie v1.1.1 github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 - github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 github.com/jackc/pgconn v1.14.3 github.com/jackc/pgerrcode v0.0.0-20220416144525-469b46aa5efa github.com/jackc/pgx/v4 v4.18.2 @@ -40,7 +39,7 @@ require ( github.com/ory/dockertest/v3 v3.10.0 github.com/pkg/errors v0.9.1 github.com/pkg/profile v1.7.0 - github.com/raystack/salt v0.6.2 + github.com/raystack/salt v0.6.3 github.com/robfig/cron/v3 v3.0.1 github.com/rs/cors v1.11.1 github.com/spf13/cobra v1.8.1 @@ -103,6 +102,7 @@ require ( github.com/google/go-tpm v0.9.0 // indirect github.com/google/s2a-go v0.1.7 // indirect github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect diff --git a/go.sum b/go.sum index deaf9bb64..caa471e40 100644 --- a/go.sum +++ b/go.sum @@ -1922,8 +1922,8 @@ github.com/prometheus/statsd_exporter v0.22.7 h1:7Pji/i2GuhK6Lu7DHrtTkFmNBCudCPT github.com/prometheus/statsd_exporter v0.22.7/go.mod h1:N/TevpjkIh9ccs6nuzY3jQn9dFqnUakOjnEuMPJJJnI= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rakyll/embedmd v0.0.0-20171029212350-c8060a0752a2/go.mod h1:7jOTMgqac46PZcF54q6l2hkLEG8op93fZu61KmxWDV4= -github.com/raystack/salt v0.6.2 h1:GPUQ6j3h3cFd3k42Lds1xbG672yvhUjO9ut9oAJqW9M= -github.com/raystack/salt v0.6.2/go.mod h1:Dwc5VlPevdY56XgYjWd+Ubkil7ohCM4526dkAuWnGN4= +github.com/raystack/salt v0.6.3 h1:ZfSumyhvRIx9nf2g9aQKDRdSJQuQ+e6+TC2FnOfpv60= +github.com/raystack/salt v0.6.3/go.mod h1:3f9NBwwtuniW5xOsyQ3ntcugFVTFDDZBqHw6rX6+8w4= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= diff --git a/internal/api/api.go b/internal/api/api.go index 396c8fb17..263130570 100644 --- a/internal/api/api.go +++ b/internal/api/api.go @@ -12,6 +12,7 @@ import ( "github.com/raystack/frontier/billing/usage" "github.com/raystack/frontier/core/aggregates/orgbilling" "github.com/raystack/frontier/core/aggregates/orginvoices" + "github.com/raystack/frontier/core/aggregates/orgpats" "github.com/raystack/frontier/core/aggregates/orgprojects" "github.com/raystack/frontier/core/aggregates/orgserviceuser" "github.com/raystack/frontier/core/aggregates/orgserviceusercredentials" @@ -85,6 +86,7 @@ type Deps struct { OrgBillingService *orgbilling.Service OrgInvoicesService *orginvoices.Service OrgTokensService *orgtokens.Service + OrgPATsService *orgpats.Service OrgUsersService *orgusers.Service OrgProjectsService *orgprojects.Service OrgServiceUserCredentialsService *orgserviceusercredentials.Service diff --git a/internal/api/v1beta1connect/interfaces.go b/internal/api/v1beta1connect/interfaces.go index 493dd7d8d..897142760 100644 --- a/internal/api/v1beta1connect/interfaces.go +++ b/internal/api/v1beta1connect/interfaces.go @@ -17,6 +17,7 @@ import ( "github.com/raystack/frontier/billing/usage" "github.com/raystack/frontier/core/aggregates/orgbilling" "github.com/raystack/frontier/core/aggregates/orginvoices" + "github.com/raystack/frontier/core/aggregates/orgpats" "github.com/raystack/frontier/core/aggregates/orgprojects" "github.com/raystack/frontier/core/aggregates/orgserviceuser" svc "github.com/raystack/frontier/core/aggregates/orgserviceusercredentials" @@ -321,6 +322,10 @@ type OrgTokensService interface { Export(ctx context.Context, orgID string) ([]byte, string, error) } +type OrgPATsService interface { + Search(ctx context.Context, orgID string, query *rql.Query) (orgpats.OrganizationPATs, error) +} + type OrgServiceUserService interface { Search(ctx context.Context, orgID string, query *rql.Query) (orgserviceuser.OrganizationServiceUsers, error) } diff --git a/internal/api/v1beta1connect/mocks/org_pa_ts_service.go b/internal/api/v1beta1connect/mocks/org_pa_ts_service.go new file mode 100644 index 000000000..e9da49970 --- /dev/null +++ b/internal/api/v1beta1connect/mocks/org_pa_ts_service.go @@ -0,0 +1,97 @@ +// Code generated by mockery v2.53.5. DO NOT EDIT. + +package mocks + +import ( + context "context" + + orgpats "github.com/raystack/frontier/core/aggregates/orgpats" + mock "github.com/stretchr/testify/mock" + + rql "github.com/raystack/salt/rql" +) + +// OrgPATsService is an autogenerated mock type for the OrgPATsService type +type OrgPATsService struct { + mock.Mock +} + +type OrgPATsService_Expecter struct { + mock *mock.Mock +} + +func (_m *OrgPATsService) EXPECT() *OrgPATsService_Expecter { + return &OrgPATsService_Expecter{mock: &_m.Mock} +} + +// Search provides a mock function with given fields: ctx, orgID, query +func (_m *OrgPATsService) Search(ctx context.Context, orgID string, query *rql.Query) (orgpats.OrganizationPATs, error) { + ret := _m.Called(ctx, orgID, query) + + if len(ret) == 0 { + panic("no return value specified for Search") + } + + var r0 orgpats.OrganizationPATs + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, *rql.Query) (orgpats.OrganizationPATs, error)); ok { + return rf(ctx, orgID, query) + } + if rf, ok := ret.Get(0).(func(context.Context, string, *rql.Query) orgpats.OrganizationPATs); ok { + r0 = rf(ctx, orgID, query) + } else { + r0 = ret.Get(0).(orgpats.OrganizationPATs) + } + + if rf, ok := ret.Get(1).(func(context.Context, string, *rql.Query) error); ok { + r1 = rf(ctx, orgID, query) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// OrgPATsService_Search_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Search' +type OrgPATsService_Search_Call struct { + *mock.Call +} + +// Search is a helper method to define mock.On call +// - ctx context.Context +// - orgID string +// - query *rql.Query +func (_e *OrgPATsService_Expecter) Search(ctx interface{}, orgID interface{}, query interface{}) *OrgPATsService_Search_Call { + return &OrgPATsService_Search_Call{Call: _e.mock.On("Search", ctx, orgID, query)} +} + +func (_c *OrgPATsService_Search_Call) Run(run func(ctx context.Context, orgID string, query *rql.Query)) *OrgPATsService_Search_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string), args[2].(*rql.Query)) + }) + return _c +} + +func (_c *OrgPATsService_Search_Call) Return(_a0 orgpats.OrganizationPATs, _a1 error) *OrgPATsService_Search_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *OrgPATsService_Search_Call) RunAndReturn(run func(context.Context, string, *rql.Query) (orgpats.OrganizationPATs, error)) *OrgPATsService_Search_Call { + _c.Call.Return(run) + return _c +} + +// NewOrgPATsService creates a new instance of OrgPATsService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewOrgPATsService(t interface { + mock.TestingT + Cleanup(func()) +}) *OrgPATsService { + mock := &OrgPATsService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/internal/api/v1beta1connect/organization_pats.go b/internal/api/v1beta1connect/organization_pats.go new file mode 100644 index 000000000..3902ac947 --- /dev/null +++ b/internal/api/v1beta1connect/organization_pats.go @@ -0,0 +1,101 @@ +package v1beta1connect + +import ( + "context" + "errors" + "fmt" + + "connectrpc.com/connect" + grpczap "github.com/grpc-ecosystem/go-grpc-middleware/logging/zap/ctxzap" + svc "github.com/raystack/frontier/core/aggregates/orgpats" + patmodels "github.com/raystack/frontier/core/userpat/models" + "github.com/raystack/frontier/internal/store/postgres" + "github.com/raystack/frontier/pkg/utils" + frontierv1beta1 "github.com/raystack/frontier/proto/v1beta1" + "github.com/raystack/salt/rql" + "go.uber.org/zap" + "google.golang.org/protobuf/types/known/timestamppb" +) + +const orgPATsDefaultLimit = 30 +const orgPATsMaxLimit = 30 + +func (h *ConnectHandler) SearchOrganizationPATs(ctx context.Context, request *connect.Request[frontierv1beta1.SearchOrganizationPATsRequest]) (*connect.Response[frontierv1beta1.SearchOrganizationPATsResponse], error) { + errorLogger := NewErrorLogger() + + if request.Msg.Validate() != nil { + return nil, connect.NewError(connect.CodeInvalidArgument, ErrBadRequest) + } + + rqlQuery, err := utils.TransformProtoToRQL(request.Msg.GetQuery(), svc.PATSearchFields{}) + if err != nil { + return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("failed to read rql query: %v", err)) + } + + if err = rql.ValidateQuery(rqlQuery, svc.PATSearchFields{}); err != nil { + return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("failed to validate rql query: %v", err)) + } + + // Cap limit — override user-requested limit if it exceeds max + if rqlQuery.Limit <= 0 || rqlQuery.Limit > orgPATsMaxLimit { + grpczap.Extract(ctx).Warn("overriding requested limit to max allowed", + zap.Int("requested_limit", rqlQuery.Limit), + zap.Int("applied_limit", orgPATsDefaultLimit)) + rqlQuery.Limit = orgPATsDefaultLimit + } + + result, err := h.orgPATsService.Search(ctx, request.Msg.GetOrgId(), rqlQuery) + if err != nil { + if errors.Is(err, postgres.ErrBadInput) { + return nil, connect.NewError(connect.CodeInvalidArgument, err) + } + errorLogger.LogServiceError(ctx, request, "SearchOrganizationPATs.Search", err, + zap.String("org_id", request.Msg.GetOrgId())) + return nil, connect.NewError(connect.CodeInternal, ErrInternalServerError) + } + + orgPATs := make([]*frontierv1beta1.SearchOrganizationPATsResponse_OrganizationPAT, 0, len(result.PATs)) + for _, pat := range result.PATs { + orgPATs = append(orgPATs, transformAggregatedPATToPB(pat)) + } + + return connect.NewResponse(&frontierv1beta1.SearchOrganizationPATsResponse{ + OrganizationPats: orgPATs, + Pagination: &frontierv1beta1.RQLQueryPaginationResponse{ + Offset: uint32(result.Pagination.Offset), + Limit: uint32(result.Pagination.Limit), + TotalCount: uint32(result.Pagination.TotalCount), + }, + }), nil +} + +func transformAggregatedPATToPB(pat svc.AggregatedPAT) *frontierv1beta1.SearchOrganizationPATsResponse_OrganizationPAT { + pbPAT := &frontierv1beta1.SearchOrganizationPATsResponse_OrganizationPAT{ + Id: pat.ID, + Title: pat.Title, + CreatedBy: &frontierv1beta1.SearchOrganizationPATsResponse_CreatedBy{ + Id: pat.CreatedBy.ID, + Title: pat.CreatedBy.Title, + Email: pat.CreatedBy.Email, + }, + Scopes: transformScopesToPB(pat.Scopes), + CreatedAt: timestamppb.New(pat.CreatedAt), + ExpiresAt: timestamppb.New(pat.ExpiresAt), + } + if pat.LastUsedAt != nil { + pbPAT.LastUsedAt = timestamppb.New(*pat.LastUsedAt) + } + return pbPAT +} + +func transformScopesToPB(scopes []patmodels.PATScope) []*frontierv1beta1.PATScope { + pbScopes := make([]*frontierv1beta1.PATScope, 0, len(scopes)) + for _, s := range scopes { + pbScopes = append(pbScopes, &frontierv1beta1.PATScope{ + RoleId: s.RoleID, + ResourceType: s.ResourceType, + ResourceIds: s.ResourceIDs, + }) + } + return pbScopes +} diff --git a/internal/api/v1beta1connect/organization_pats_test.go b/internal/api/v1beta1connect/organization_pats_test.go new file mode 100644 index 000000000..036122341 --- /dev/null +++ b/internal/api/v1beta1connect/organization_pats_test.go @@ -0,0 +1,225 @@ +package v1beta1connect + +import ( + "context" + "fmt" + "testing" + "time" + + "connectrpc.com/connect" + svc "github.com/raystack/frontier/core/aggregates/orgpats" + patmodels "github.com/raystack/frontier/core/userpat/models" + "github.com/raystack/frontier/internal/api/v1beta1connect/mocks" + "github.com/raystack/frontier/internal/bootstrap/schema" + "github.com/raystack/frontier/internal/store/postgres" + "github.com/raystack/frontier/pkg/utils" + frontierv1beta1 "github.com/raystack/frontier/proto/v1beta1" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func TestHandler_SearchOrganizationPATs(t *testing.T) { + testOrgID := "9f256f86-31a3-11ec-8d3d-0242ac130003" + now := time.Now().UTC().Truncate(time.Second) + + tests := []struct { + name string + setup func(ps *mocks.OrgPATsService) + request *connect.Request[frontierv1beta1.SearchOrganizationPATsRequest] + wantErr error + wantLen int + }{ + { + name: "should return internal error on service failure", + setup: func(ps *mocks.OrgPATsService) { + ps.EXPECT().Search(mock.Anything, testOrgID, mock.Anything). + Return(svc.OrganizationPATs{}, fmt.Errorf("db error")) + }, + request: connect.NewRequest(&frontierv1beta1.SearchOrganizationPATsRequest{ + OrgId: testOrgID, + }), + wantErr: connect.NewError(connect.CodeInternal, ErrInternalServerError), + }, + { + name: "should return invalid argument on bad input error", + setup: func(ps *mocks.OrgPATsService) { + ps.EXPECT().Search(mock.Anything, testOrgID, mock.Anything). + Return(svc.OrganizationPATs{}, fmt.Errorf("bad: %w", postgres.ErrBadInput)) + }, + request: connect.NewRequest(&frontierv1beta1.SearchOrganizationPATsRequest{ + OrgId: testOrgID, + }), + wantErr: connect.NewError(connect.CodeInvalidArgument, postgres.ErrBadInput), + }, + { + name: "should return empty results", + setup: func(ps *mocks.OrgPATsService) { + ps.EXPECT().Search(mock.Anything, testOrgID, mock.Anything). + Return(svc.OrganizationPATs{ + PATs: []svc.AggregatedPAT{}, + Pagination: utils.Page{Offset: 0, Limit: 30, TotalCount: 0}, + }, nil) + }, + request: connect.NewRequest(&frontierv1beta1.SearchOrganizationPATsRequest{ + OrgId: testOrgID, + }), + wantLen: 0, + }, + { + name: "should return PATs with scopes and created_by", + setup: func(ps *mocks.OrgPATsService) { + ps.EXPECT().Search(mock.Anything, testOrgID, mock.Anything). + Return(svc.OrganizationPATs{ + PATs: []svc.AggregatedPAT{ + { + ID: "pat-1", + Title: "my-token", + CreatedBy: svc.CreatedBy{ + ID: "user-1", + Title: "John Doe", + Email: "john@test.com", + }, + Scopes: []patmodels.PATScope{ + {RoleID: "role-1", ResourceType: schema.OrganizationNamespace, ResourceIDs: []string{testOrgID}}, + {RoleID: "role-2", ResourceType: schema.ProjectNamespace, ResourceIDs: []string{"proj-1"}}, + }, + CreatedAt: now, + ExpiresAt: now.Add(24 * time.Hour), + }, + }, + Pagination: utils.Page{Offset: 0, Limit: 30, TotalCount: 1}, + }, nil) + }, + request: connect.NewRequest(&frontierv1beta1.SearchOrganizationPATsRequest{ + OrgId: testOrgID, + }), + wantLen: 1, + }, + { + name: "should handle PAT with last_used_at", + setup: func(ps *mocks.OrgPATsService) { + lastUsed := now.Add(-1 * time.Hour) + ps.EXPECT().Search(mock.Anything, testOrgID, mock.Anything). + Return(svc.OrganizationPATs{ + PATs: []svc.AggregatedPAT{ + { + ID: "pat-2", + Title: "used-token", + CreatedBy: svc.CreatedBy{ + ID: "user-1", Title: "John", Email: "john@test.com", + }, + Scopes: []patmodels.PATScope{}, + CreatedAt: now, + ExpiresAt: now.Add(24 * time.Hour), + LastUsedAt: &lastUsed, + }, + }, + Pagination: utils.Page{Offset: 0, Limit: 30, TotalCount: 1}, + }, nil) + }, + request: connect.NewRequest(&frontierv1beta1.SearchOrganizationPATsRequest{ + OrgId: testOrgID, + }), + wantLen: 1, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + mockOrgPATsSrv := new(mocks.OrgPATsService) + + if tt.setup != nil { + tt.setup(mockOrgPATsSrv) + } + + handler := &ConnectHandler{ + orgPATsService: mockOrgPATsSrv, + } + + resp, err := handler.SearchOrganizationPATs(context.Background(), tt.request) + + if tt.wantErr != nil { + assert.Error(t, err) + assert.Equal(t, connect.CodeOf(tt.wantErr), connect.CodeOf(err)) + assert.Nil(t, resp) + } else { + assert.NoError(t, err) + assert.NotNil(t, resp) + assert.Len(t, resp.Msg.GetOrganizationPats(), tt.wantLen) + + if tt.wantLen > 0 { + pat := resp.Msg.GetOrganizationPats()[0] + assert.NotEmpty(t, pat.GetId()) + assert.NotEmpty(t, pat.GetTitle()) + assert.NotNil(t, pat.GetCreatedBy()) + assert.NotEmpty(t, pat.GetCreatedBy().GetId()) + assert.NotNil(t, pat.GetCreatedAt()) + assert.NotNil(t, pat.GetExpiresAt()) + } + } + + mockOrgPATsSrv.AssertExpectations(t) + }) + } + + t.Run("should transform scopes correctly", func(t *testing.T) { + mockOrgPATsSrv := new(mocks.OrgPATsService) + + mockOrgPATsSrv.EXPECT().Search(mock.Anything, testOrgID, mock.Anything). + Return(svc.OrganizationPATs{ + PATs: []svc.AggregatedPAT{ + { + ID: "pat-1", + Title: "scoped-token", + CreatedBy: svc.CreatedBy{ + ID: "user-1", Title: "John", Email: "john@test.com", + }, + Scopes: []patmodels.PATScope{ + {RoleID: "role-org", ResourceType: schema.OrganizationNamespace, ResourceIDs: []string{testOrgID}}, + {RoleID: "role-proj", ResourceType: schema.ProjectNamespace, ResourceIDs: []string{"proj-1", "proj-2"}}, + }, + CreatedAt: now, + ExpiresAt: now.Add(24 * time.Hour), + }, + }, + Pagination: utils.Page{Offset: 0, Limit: 30, TotalCount: 1}, + }, nil) + + handler := &ConnectHandler{orgPATsService: mockOrgPATsSrv} + resp, err := handler.SearchOrganizationPATs(context.Background(), connect.NewRequest(&frontierv1beta1.SearchOrganizationPATsRequest{ + OrgId: testOrgID, + })) + + assert.NoError(t, err) + pat := resp.Msg.GetOrganizationPats()[0] + assert.Len(t, pat.GetScopes(), 2) + + scopeTypes := make(map[string]bool) + for _, sc := range pat.GetScopes() { + scopeTypes[sc.GetResourceType()] = true + assert.NotEmpty(t, sc.GetRoleId()) + } + assert.True(t, scopeTypes[schema.OrganizationNamespace]) + assert.True(t, scopeTypes[schema.ProjectNamespace]) + }) + + t.Run("should return pagination", func(t *testing.T) { + mockOrgPATsSrv := new(mocks.OrgPATsService) + + mockOrgPATsSrv.EXPECT().Search(mock.Anything, testOrgID, mock.Anything). + Return(svc.OrganizationPATs{ + PATs: []svc.AggregatedPAT{}, + Pagination: utils.Page{Offset: 10, Limit: 30, TotalCount: 100}, + }, nil) + + handler := &ConnectHandler{orgPATsService: mockOrgPATsSrv} + resp, err := handler.SearchOrganizationPATs(context.Background(), connect.NewRequest(&frontierv1beta1.SearchOrganizationPATsRequest{ + OrgId: testOrgID, + })) + + assert.NoError(t, err) + assert.Equal(t, uint32(10), resp.Msg.GetPagination().GetOffset()) + assert.Equal(t, uint32(30), resp.Msg.GetPagination().GetLimit()) + assert.Equal(t, uint32(100), resp.Msg.GetPagination().GetTotalCount()) + }) +} diff --git a/internal/api/v1beta1connect/v1beta1connect.go b/internal/api/v1beta1connect/v1beta1connect.go index f9f5f58aa..740240d2c 100644 --- a/internal/api/v1beta1connect/v1beta1connect.go +++ b/internal/api/v1beta1connect/v1beta1connect.go @@ -51,6 +51,7 @@ type ConnectHandler struct { orgBillingService OrgBillingService orgInvoicesService OrgInvoicesService orgTokensService OrgTokensService + orgPATsService OrgPATsService orgUsersService OrgUsersService orgProjectsService OrgProjectsService projectUsersService ProjectUsersService @@ -100,6 +101,7 @@ func NewConnectHandler(deps api.Deps, authConf authenticate.Config) *ConnectHand orgBillingService: deps.OrgBillingService, orgInvoicesService: deps.OrgInvoicesService, orgTokensService: deps.OrgTokensService, + orgPATsService: deps.OrgPATsService, orgUsersService: deps.OrgUsersService, orgProjectsService: deps.OrgProjectsService, projectUsersService: deps.ProjectUsersService, diff --git a/internal/store/postgres/org_pats_repository.go b/internal/store/postgres/org_pats_repository.go new file mode 100644 index 000000000..f1752a422 --- /dev/null +++ b/internal/store/postgres/org_pats_repository.go @@ -0,0 +1,360 @@ +package postgres + +import ( + "context" + "database/sql" + "fmt" + "time" + + "github.com/doug-martin/goqu/v9" + "github.com/jmoiron/sqlx" + svc "github.com/raystack/frontier/core/aggregates/orgpats" + patmodels "github.com/raystack/frontier/core/userpat/models" + "github.com/raystack/frontier/internal/bootstrap/schema" + "github.com/raystack/frontier/pkg/db" + "github.com/raystack/frontier/pkg/utils" + "github.com/raystack/salt/rql" +) + +// Operator constants for RQL filters. +const ( + opEmpty = "empty" + opNotEmpty = "notempty" + opLike = "like" + opNotLike = "notlike" + opILike = "ilike" + opNotILike = "notilike" +) + +// orgPATFilterFields maps RQL filter names to table-qualified SQL columns. +var orgPATFilterFields = map[string]string{ + "id": "p.id", + "title": "p.title", + "created_by_id": "p.user_id", + "created_by_title": "u.title", + "created_by_email": "u.email", + "created_at": "p.created_at", + "expires_at": "p.expires_at", + "last_used_at": "p.last_used_at", +} + +// orgPATSearchColumns are searched with ILIKE when RQL search is used. +var orgPATSearchColumns = []string{ + "p.id", + "p.title", + "u.title", + "u.email", +} + +// orgPATSortFields maps RQL sort names to table-qualified SQL columns. +var orgPATSortFields = map[string]string{ + "title": "p.title", + "created_by_title": "u.title", + "created_by_email": "u.email", + "created_at": "p.created_at", + "expires_at": "p.expires_at", + "last_used_at": "p.last_used_at", +} + +// OrgPATRow is the flat SQL result row from the joined query. +// Multiple rows per PAT (one per policy). +type OrgPATRow struct { + PATID string `db:"pat_id"` + PATTitle string `db:"pat_title"` + CreatedByID string `db:"created_by_id"` + CreatedByTitle string `db:"created_by_title"` + CreatedByEmail string `db:"created_by_email"` + CreatedAt time.Time `db:"pat_created_at"` + ExpiresAt time.Time `db:"pat_expires_at"` + LastUsedAt *time.Time `db:"pat_last_used_at"` + RoleID *string `db:"role_id"` + ResourceType *string `db:"resource_type"` + ResourceID *string `db:"resource_id"` + GrantRelation *string `db:"grant_relation"` +} + +type OrgPATsRepository struct { + dbc *db.Client +} + +func NewOrgPATsRepository(dbc *db.Client) *OrgPATsRepository { + return &OrgPATsRepository{dbc: dbc} +} + +func (r OrgPATsRepository) Search(ctx context.Context, orgID string, rqlQuery *rql.Query) (svc.OrganizationPATs, error) { + if rqlQuery == nil { + rqlQuery = utils.NewRQLQuery("", utils.DefaultOffset, utils.DefaultLimit, []rql.Filter{}, []rql.Sort{}, []string{}) + } + + countSQL, countParams, err := r.buildCountQuery(orgID, rqlQuery) + if err != nil { + return svc.OrganizationPATs{}, fmt.Errorf("building count query: %w", err) + } + + dataSQL, dataParams, err := r.buildDataQuery(orgID, rqlQuery) + if err != nil { + return svc.OrganizationPATs{}, fmt.Errorf("building data query: %w", err) + } + + var totalCount int64 + var rows []OrgPATRow + + txOpts := sql.TxOptions{ + Isolation: sql.LevelReadCommitted, + ReadOnly: true, + } + + err = r.dbc.WithTxn(ctx, txOpts, func(tx *sqlx.Tx) error { + if err := r.dbc.WithTimeout(ctx, TABLE_USER_PATS, "SearchOrgPATsCount", func(ctx context.Context) error { + return tx.GetContext(ctx, &totalCount, countSQL, countParams...) + }); err != nil { + return err + } + return r.dbc.WithTimeout(ctx, TABLE_USER_PATS, "SearchOrgPATsData", func(ctx context.Context) error { + return tx.SelectContext(ctx, &rows, dataSQL, dataParams...) + }) + }) + if err != nil { + return svc.OrganizationPATs{}, fmt.Errorf("querying org PATs: %w", err) + } + + return svc.OrganizationPATs{ + PATs: r.groupRows(rows), + Pagination: utils.Page{ + Offset: rqlQuery.Offset, + Limit: rqlQuery.Limit, + TotalCount: totalCount, + }, + }, nil +} + +// buildInnerSubquery builds the base PAT query with filters and search applied. +func (r OrgPATsRepository) buildInnerSubquery(orgID string, rqlQuery *rql.Query) (*goqu.SelectDataset, error) { + inner := dialect.From(goqu.T(TABLE_USER_PATS).As("p")). + LeftJoin( + goqu.T(TABLE_USERS).As("u"), + goqu.On(goqu.I("p.user_id").Eq(goqu.I("u.id"))), + ). + Where( + goqu.I("p.org_id").Eq(orgID), + goqu.I("p.deleted_at").IsNull(), + ) + + var err error + for _, filter := range rqlQuery.Filters { + inner, err = r.addFilter(inner, filter) + if err != nil { + return nil, err + } + } + + if rqlQuery.Search != "" { + inner = r.addSearch(inner, rqlQuery.Search) + } + + return inner, nil +} + +func (r OrgPATsRepository) buildCountQuery(orgID string, rqlQuery *rql.Query) (string, []interface{}, error) { + inner, err := r.buildInnerSubquery(orgID, rqlQuery) + if err != nil { + return "", nil, err + } + return inner.Select(goqu.L("COUNT(*)")).Prepared(true).ToSQL() +} + +func (r OrgPATsRepository) buildDataQuery(orgID string, rqlQuery *rql.Query) (string, []interface{}, error) { + inner, err := r.buildInnerSubquery(orgID, rqlQuery) + if err != nil { + return "", nil, err + } + + inner, err = r.addSort(inner, rqlQuery.Sort) + if err != nil { + return "", nil, err + } + + paginatedInner := inner. + Select( + goqu.I("p.id"), goqu.I("p.title"), goqu.I("p.user_id"), + goqu.I("p.created_at"), goqu.I("p.expires_at"), goqu.I("p.last_used_at"), + ). + Offset(uint(rqlQuery.Offset)). + Limit(uint(rqlQuery.Limit)) + + outer := dialect.From(paginatedInner.As("p")).Prepared(true). + Select( + goqu.I("p.id").As("pat_id"), + goqu.I("p.title").As("pat_title"), + goqu.I("p.user_id").As("created_by_id"), + goqu.L("COALESCE(u.title, '')").As("created_by_title"), + goqu.L("u.email").As("created_by_email"), + goqu.I("p.created_at").As("pat_created_at"), + goqu.I("p.expires_at").As("pat_expires_at"), + goqu.I("p.last_used_at").As("pat_last_used_at"), + goqu.I("pol.role_id"), + goqu.I("pol.resource_type"), + goqu.I("pol.resource_id"), + goqu.I("pol.grant_relation"), + ). + LeftJoin( + goqu.T(TABLE_USERS).As("u"), + goqu.On(goqu.I("p.user_id").Eq(goqu.I("u.id"))), + ). + LeftJoin( + goqu.T(TABLE_POLICIES).As("pol"), + goqu.On( + goqu.I("pol.principal_id").Eq(goqu.I("p.id")), + goqu.I("pol.principal_type").Eq(schema.PATPrincipal), + ), + ). + Order( + goqu.I("p.created_at").Desc(), + goqu.I("p.id").Asc(), + goqu.I("pol.role_id").Asc(), + ) + + return outer.ToSQL() +} + +func (r OrgPATsRepository) addFilter(query *goqu.SelectDataset, filter rql.Filter) (*goqu.SelectDataset, error) { + field, exists := orgPATFilterFields[filter.Name] + if !exists { + return nil, fmt.Errorf("unsupported filter field: %s", filter.Name) + } + + switch filter.Operator { + case opEmpty: + return query.Where(goqu.Or(goqu.I(field).IsNull(), goqu.I(field).Eq(""))), nil + case opNotEmpty: + return query.Where(goqu.And(goqu.I(field).IsNotNull(), goqu.I(field).Neq(""))), nil + case opLike: + return query.Where(goqu.Cast(goqu.I(field), "TEXT").Like(filter.Value.(string))), nil + case opNotLike: + return query.Where(goqu.Cast(goqu.I(field), "TEXT").NotLike(filter.Value.(string))), nil + case opILike: + return query.Where(goqu.Cast(goqu.I(field), "TEXT").ILike(filter.Value.(string))), nil + case opNotILike: + return query.Where(goqu.Cast(goqu.I(field), "TEXT").NotILike(filter.Value.(string))), nil + default: + return query.Where(goqu.Ex{field: goqu.Op{filter.Operator: filter.Value}}), nil + } +} + +func (r OrgPATsRepository) addSearch(query *goqu.SelectDataset, search string) *goqu.SelectDataset { + searchPattern := "%" + search + "%" + expressions := make([]goqu.Expression, 0, len(orgPATSearchColumns)) + for _, col := range orgPATSearchColumns { + expressions = append(expressions, goqu.Cast(goqu.I(col), "TEXT").ILike(searchPattern)) + } + return query.Where(goqu.Or(expressions...)) +} + +func (r OrgPATsRepository) addSort(query *goqu.SelectDataset, sorts []rql.Sort) (*goqu.SelectDataset, error) { + for _, sort := range sorts { + field, exists := orgPATSortFields[sort.Name] + if !exists { + return nil, fmt.Errorf("unsupported sort field: %s", sort.Name) + } + switch sort.Order { + case "desc": + query = query.OrderAppend(goqu.I(field).Desc()) + default: + query = query.OrderAppend(goqu.I(field).Asc()) + } + } + + if len(sorts) == 0 { + query = query.OrderAppend(goqu.I("p.created_at").Desc()) + } + + return query, nil +} + +// groupRows groups flat SQL rows by PAT ID into AggregatedPAT with scopes. +func (r OrgPATsRepository) groupRows(rows []OrgPATRow) []svc.AggregatedPAT { + type scopeKey struct { + roleID string + resourceType string + } + + patOrder := make([]string, 0) + patMap := make(map[string]*svc.AggregatedPAT) + scopeMap := make(map[string]map[scopeKey]*patmodels.PATScope) + allProjects := make(map[string]map[scopeKey]bool) + + for _, row := range rows { + if row.PATID == "" { + continue + } + + if _, exists := patMap[row.PATID]; !exists { + pat := &svc.AggregatedPAT{ + ID: row.PATID, + Title: row.PATTitle, + CreatedBy: svc.CreatedBy{ + ID: row.CreatedByID, + Title: row.CreatedByTitle, + Email: row.CreatedByEmail, + }, + CreatedAt: row.CreatedAt, + ExpiresAt: row.ExpiresAt, + LastUsedAt: row.LastUsedAt, + UserID: row.CreatedByID, + } + patMap[row.PATID] = pat + patOrder = append(patOrder, row.PATID) + scopeMap[row.PATID] = make(map[scopeKey]*patmodels.PATScope) + allProjects[row.PATID] = make(map[scopeKey]bool) + } + + // Build scopes from policy rows + if row.RoleID == nil || *row.RoleID == "" { + continue + } + + var key scopeKey + var isAllProjects bool + + switch { + case row.ResourceType != nil && *row.ResourceType == schema.ProjectNamespace: + key = scopeKey{*row.RoleID, schema.ProjectNamespace} + case row.GrantRelation != nil && *row.GrantRelation == schema.PATGrantRelationName: + key = scopeKey{*row.RoleID, schema.ProjectNamespace} + isAllProjects = true + case row.ResourceType != nil && *row.ResourceType == schema.OrganizationNamespace: + key = scopeKey{*row.RoleID, schema.OrganizationNamespace} + default: + continue + } + + sc, ok := scopeMap[row.PATID][key] + if !ok { + sc = &patmodels.PATScope{ + RoleID: key.roleID, + ResourceType: key.resourceType, + } + scopeMap[row.PATID][key] = sc + } + + if isAllProjects { + allProjects[row.PATID][key] = true + sc.ResourceIDs = nil + } else if !allProjects[row.PATID][key] && row.ResourceID != nil { + sc.ResourceIDs = append(sc.ResourceIDs, *row.ResourceID) + } + } + + result := make([]svc.AggregatedPAT, 0, len(patOrder)) + for _, patID := range patOrder { + pat := patMap[patID] + scopes := make([]patmodels.PATScope, 0, len(scopeMap[patID])) + for _, sc := range scopeMap[patID] { + scopes = append(scopes, *sc) + } + pat.Scopes = scopes + result = append(result, *pat) + } + + return result +} diff --git a/internal/store/postgres/org_pats_repository_test.go b/internal/store/postgres/org_pats_repository_test.go new file mode 100644 index 000000000..759bba366 --- /dev/null +++ b/internal/store/postgres/org_pats_repository_test.go @@ -0,0 +1,409 @@ +package postgres + +import ( + "testing" + "time" + + svc "github.com/raystack/frontier/core/aggregates/orgpats" + patmodels "github.com/raystack/frontier/core/userpat/models" + "github.com/raystack/frontier/internal/bootstrap/schema" + "github.com/raystack/salt/rql" + "github.com/stretchr/testify/assert" +) + +func TestOrgPATsRepository_buildCountQuery(t *testing.T) { + r := OrgPATsRepository{} + + tests := []struct { + name string + orgID string + rql *rql.Query + wantErr bool + }{ + { + name: "basic count", + orgID: "org-1", + rql: &rql.Query{Limit: 30, Offset: 0}, + }, + { + name: "count with search", + orgID: "org-1", + rql: &rql.Query{Limit: 30, Offset: 0, Search: "aman"}, + }, + { + name: "count with filter", + orgID: "org-1", + rql: &rql.Query{ + Limit: 30, + Offset: 0, + Filters: []rql.Filter{ + {Name: "title", Operator: opILike, Value: "%test%"}, + }, + }, + }, + { + name: "count with unsupported filter", + orgID: "org-1", + rql: &rql.Query{ + Limit: 30, + Offset: 0, + Filters: []rql.Filter{ + {Name: "invalid_field", Operator: "eq", Value: "x"}, + }, + }, + wantErr: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + sql, params, err := r.buildCountQuery(tt.orgID, tt.rql) + if tt.wantErr { + assert.Error(t, err) + return + } + assert.NoError(t, err) + assert.NotEmpty(t, sql) + assert.Contains(t, sql, "COUNT(*)") + assert.NotContains(t, sql, "ORDER BY") + assert.NotEmpty(t, params) + }) + } +} + +func TestOrgPATsRepository_buildDataQuery(t *testing.T) { + r := OrgPATsRepository{} + + tests := []struct { + name string + orgID string + rql *rql.Query + wantErr bool + }{ + { + name: "basic data query with pagination", + orgID: "org-1", + rql: &rql.Query{Limit: 30, Offset: 0}, + }, + { + name: "data query with search", + orgID: "org-1", + rql: &rql.Query{Limit: 10, Offset: 5, Search: "test"}, + }, + { + name: "data query with ilike filter", + orgID: "org-1", + rql: &rql.Query{ + Limit: 30, + Offset: 0, + Filters: []rql.Filter{ + {Name: "created_by_email", Operator: opILike, Value: "%@pixxel%"}, + }, + }, + }, + { + name: "data query with sort", + orgID: "org-1", + rql: &rql.Query{ + Limit: 30, + Offset: 0, + Sort: []rql.Sort{{Name: "title", Order: "asc"}}, + }, + }, + { + name: "data query with unsupported sort", + orgID: "org-1", + rql: &rql.Query{ + Limit: 30, + Offset: 0, + Sort: []rql.Sort{{Name: "role_name", Order: "asc"}}, + }, + wantErr: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + sql, params, err := r.buildDataQuery(tt.orgID, tt.rql) + if tt.wantErr { + assert.Error(t, err) + return + } + assert.NoError(t, err) + assert.NotEmpty(t, sql) + assert.Contains(t, sql, "pat_id") + assert.Contains(t, sql, "created_by_title") + assert.Contains(t, sql, "pol") + assert.NotEmpty(t, params) + }) + } +} + +func TestOrgPATsRepository_addFilter(t *testing.T) { + r := OrgPATsRepository{} + baseQuery := dialect.From("test") + + tests := []struct { + name string + filter rql.Filter + wantErr bool + }{ + {name: "empty operator", filter: rql.Filter{Name: "title", Operator: opEmpty}}, + {name: "notempty operator", filter: rql.Filter{Name: "title", Operator: opNotEmpty}}, + {name: "like operator", filter: rql.Filter{Name: "title", Operator: opLike, Value: "test%"}}, + {name: "notlike operator", filter: rql.Filter{Name: "title", Operator: opNotLike, Value: "%test"}}, + {name: "ilike operator", filter: rql.Filter{Name: "created_by_email", Operator: opILike, Value: "%aman%"}}, + {name: "notilike operator", filter: rql.Filter{Name: "created_by_title", Operator: opNotILike, Value: "%admin%"}}, + {name: "eq operator", filter: rql.Filter{Name: "id", Operator: "eq", Value: "uuid-1"}}, + {name: "unsupported field", filter: rql.Filter{Name: "bad_field", Operator: "eq", Value: "x"}, wantErr: true}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := r.addFilter(baseQuery, tt.filter) + if tt.wantErr { + assert.Error(t, err) + } else { + assert.NoError(t, err) + } + }) + } +} + +func TestOrgPATsRepository_groupRows(t *testing.T) { + r := OrgPATsRepository{} + + strPtr := func(s string) *string { return &s } + now := time.Now() + + tests := []struct { + name string + rows []OrgPATRow + wantPATs int + }{ + { + name: "empty rows", + rows: []OrgPATRow{}, + wantPATs: 0, + }, + { + name: "single PAT with no policies", + rows: []OrgPATRow{ + { + PATID: "pat-1", PATTitle: "my-token", + CreatedByID: "user-1", CreatedByTitle: "John", CreatedByEmail: "john@test.com", + CreatedAt: now, ExpiresAt: now, + }, + }, + wantPATs: 1, + }, + { + name: "single PAT with org scope", + rows: []OrgPATRow{ + { + PATID: "pat-1", PATTitle: "my-token", + CreatedByID: "user-1", CreatedByTitle: "John", CreatedByEmail: "john@test.com", + CreatedAt: now, ExpiresAt: now, + RoleID: strPtr("role-1"), ResourceType: strPtr(schema.OrganizationNamespace), + ResourceID: strPtr("org-1"), + }, + }, + wantPATs: 1, + }, + { + name: "single PAT with multiple project scopes", + rows: []OrgPATRow{ + { + PATID: "pat-1", PATTitle: "my-token", + CreatedByID: "user-1", CreatedByTitle: "John", CreatedByEmail: "john@test.com", + CreatedAt: now, ExpiresAt: now, + RoleID: strPtr("role-1"), ResourceType: strPtr(schema.ProjectNamespace), + ResourceID: strPtr("proj-1"), + }, + { + PATID: "pat-1", PATTitle: "my-token", + CreatedByID: "user-1", CreatedByTitle: "John", CreatedByEmail: "john@test.com", + CreatedAt: now, ExpiresAt: now, + RoleID: strPtr("role-1"), ResourceType: strPtr(schema.ProjectNamespace), + ResourceID: strPtr("proj-2"), + }, + }, + wantPATs: 1, + }, + { + name: "single PAT with all-projects scope", + rows: []OrgPATRow{ + { + PATID: "pat-1", PATTitle: "my-token", + CreatedByID: "user-1", CreatedByTitle: "John", CreatedByEmail: "john@test.com", + CreatedAt: now, ExpiresAt: now, + RoleID: strPtr("role-1"), ResourceType: strPtr(schema.OrganizationNamespace), + ResourceID: strPtr("org-1"), GrantRelation: strPtr(schema.PATGrantRelationName), + }, + }, + wantPATs: 1, + }, + { + name: "multiple PATs", + rows: []OrgPATRow{ + { + PATID: "pat-1", PATTitle: "token-1", + CreatedByID: "user-1", CreatedByTitle: "John", CreatedByEmail: "john@test.com", + CreatedAt: now, ExpiresAt: now, + RoleID: strPtr("role-1"), ResourceType: strPtr(schema.OrganizationNamespace), + ResourceID: strPtr("org-1"), + }, + { + PATID: "pat-2", PATTitle: "token-2", + CreatedByID: "user-2", CreatedByTitle: "Jane", CreatedByEmail: "jane@test.com", + CreatedAt: now, ExpiresAt: now, + RoleID: strPtr("role-2"), ResourceType: strPtr(schema.ProjectNamespace), + ResourceID: strPtr("proj-1"), + }, + }, + wantPATs: 2, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := r.groupRows(tt.rows) + assert.Len(t, result, tt.wantPATs) + }) + } + + // Detailed assertions for specific cases + t.Run("project scope collects resource IDs", func(t *testing.T) { + rows := []OrgPATRow{ + { + PATID: "pat-1", PATTitle: "token", CreatedByID: "u1", CreatedByTitle: "U", CreatedByEmail: "u@t.c", + CreatedAt: now, ExpiresAt: now, + RoleID: strPtr("role-1"), ResourceType: strPtr(schema.ProjectNamespace), ResourceID: strPtr("proj-1"), + }, + { + PATID: "pat-1", PATTitle: "token", CreatedByID: "u1", CreatedByTitle: "U", CreatedByEmail: "u@t.c", + CreatedAt: now, ExpiresAt: now, + RoleID: strPtr("role-1"), ResourceType: strPtr(schema.ProjectNamespace), ResourceID: strPtr("proj-2"), + }, + } + result := r.groupRows(rows) + assert.Len(t, result, 1) + assert.Len(t, result[0].Scopes, 1) + assert.Equal(t, schema.ProjectNamespace, result[0].Scopes[0].ResourceType) + assert.ElementsMatch(t, []string{"proj-1", "proj-2"}, result[0].Scopes[0].ResourceIDs) + }) + + t.Run("all-projects scope has nil resource IDs", func(t *testing.T) { + rows := []OrgPATRow{ + { + PATID: "pat-1", PATTitle: "token", CreatedByID: "u1", CreatedByTitle: "U", CreatedByEmail: "u@t.c", + CreatedAt: now, ExpiresAt: now, + RoleID: strPtr("role-1"), ResourceType: strPtr(schema.OrganizationNamespace), + ResourceID: strPtr("org-1"), GrantRelation: strPtr(schema.PATGrantRelationName), + }, + } + result := r.groupRows(rows) + assert.Len(t, result, 1) + assert.Len(t, result[0].Scopes, 1) + assert.Equal(t, schema.ProjectNamespace, result[0].Scopes[0].ResourceType) + assert.Nil(t, result[0].Scopes[0].ResourceIDs) + }) + + t.Run("mixed scopes for same PAT", func(t *testing.T) { + rows := []OrgPATRow{ + { + PATID: "pat-1", PATTitle: "token", CreatedByID: "u1", CreatedByTitle: "U", CreatedByEmail: "u@t.c", + CreatedAt: now, ExpiresAt: now, + RoleID: strPtr("role-org"), ResourceType: strPtr(schema.OrganizationNamespace), ResourceID: strPtr("org-1"), + }, + { + PATID: "pat-1", PATTitle: "token", CreatedByID: "u1", CreatedByTitle: "U", CreatedByEmail: "u@t.c", + CreatedAt: now, ExpiresAt: now, + RoleID: strPtr("role-proj"), ResourceType: strPtr(schema.ProjectNamespace), ResourceID: strPtr("proj-1"), + }, + } + result := r.groupRows(rows) + assert.Len(t, result, 1) + assert.Len(t, result[0].Scopes, 2) + + scopeTypes := make(map[string]bool) + for _, sc := range result[0].Scopes { + scopeTypes[sc.ResourceType] = true + } + assert.True(t, scopeTypes[schema.OrganizationNamespace]) + assert.True(t, scopeTypes[schema.ProjectNamespace]) + }) + + t.Run("preserves PAT order", func(t *testing.T) { + rows := []OrgPATRow{ + {PATID: "pat-a", PATTitle: "a", CreatedByID: "u1", CreatedByTitle: "U", CreatedByEmail: "u@t.c", CreatedAt: now, ExpiresAt: now}, + {PATID: "pat-b", PATTitle: "b", CreatedByID: "u2", CreatedByTitle: "V", CreatedByEmail: "v@t.c", CreatedAt: now, ExpiresAt: now}, + {PATID: "pat-c", PATTitle: "c", CreatedByID: "u3", CreatedByTitle: "W", CreatedByEmail: "w@t.c", CreatedAt: now, ExpiresAt: now}, + } + result := r.groupRows(rows) + assert.Equal(t, "pat-a", result[0].ID) + assert.Equal(t, "pat-b", result[1].ID) + assert.Equal(t, "pat-c", result[2].ID) + }) + + t.Run("sets UserID for all-projects resolution", func(t *testing.T) { + rows := []OrgPATRow{ + {PATID: "pat-1", PATTitle: "t", CreatedByID: "user-42", CreatedByTitle: "U", CreatedByEmail: "u@t.c", CreatedAt: now, ExpiresAt: now}, + } + result := r.groupRows(rows) + assert.Equal(t, "user-42", result[0].UserID) + }) +} + +func TestOrgPATsRepository_groupRows_scopeKeyGrouping(t *testing.T) { + r := OrgPATsRepository{} + strPtr := func(s string) *string { return &s } + now := time.Now() + + t.Run("same role different resource types create separate scopes", func(t *testing.T) { + // A role that supports both org and project scope (future case) + rows := []OrgPATRow{ + { + PATID: "pat-1", PATTitle: "t", CreatedByID: "u1", CreatedByTitle: "U", CreatedByEmail: "u@t.c", + CreatedAt: now, ExpiresAt: now, + RoleID: strPtr("role-dual"), ResourceType: strPtr(schema.OrganizationNamespace), ResourceID: strPtr("org-1"), + }, + { + PATID: "pat-1", PATTitle: "t", CreatedByID: "u1", CreatedByTitle: "U", CreatedByEmail: "u@t.c", + CreatedAt: now, ExpiresAt: now, + RoleID: strPtr("role-dual"), ResourceType: strPtr(schema.ProjectNamespace), ResourceID: strPtr("proj-1"), + }, + } + result := r.groupRows(rows) + assert.Len(t, result, 1) + assert.Len(t, result[0].Scopes, 2) + + for _, sc := range result[0].Scopes { + assert.Equal(t, "role-dual", sc.RoleID) + } + }) +} + +// Verify the domain model has the correct structure +func TestAggregatedPAT_Structure(t *testing.T) { + pat := svc.AggregatedPAT{ + ID: "pat-1", + Title: "test-token", + CreatedBy: svc.CreatedBy{ + ID: "user-1", + Title: "John Doe", + Email: "john@test.com", + }, + Scopes: []patmodels.PATScope{ + {RoleID: "role-1", ResourceType: "app/organization", ResourceIDs: []string{"org-1"}}, + }, + CreatedAt: time.Now(), + ExpiresAt: time.Now().Add(24 * time.Hour), + UserID: "user-1", + } + + assert.Equal(t, "pat-1", pat.ID) + assert.Equal(t, "John Doe", pat.CreatedBy.Title) + assert.Len(t, pat.Scopes, 1) + assert.Nil(t, pat.LastUsedAt) +} diff --git a/pkg/server/connect_interceptors/authorization.go b/pkg/server/connect_interceptors/authorization.go index 7a59db724..48a31fda2 100644 --- a/pkg/server/connect_interceptors/authorization.go +++ b/pkg/server/connect_interceptors/authorization.go @@ -1003,6 +1003,9 @@ var authorizationValidationMap = map[string]func(ctx context.Context, handler *v "/raystack.frontier.v1beta1.AdminService/SearchOrganizationTokens": func(ctx context.Context, handler *v1beta1connect.ConnectHandler, req connect.AnyRequest) error { return handler.IsSuperUser(ctx, req) }, + "/raystack.frontier.v1beta1.AdminService/SearchOrganizationPATs": func(ctx context.Context, handler *v1beta1connect.ConnectHandler, req connect.AnyRequest) error { + return handler.IsSuperUser(ctx, req) + }, "/raystack.frontier.v1beta1.AdminService/SearchOrganizationServiceUsers": func(ctx context.Context, handler *v1beta1connect.ConnectHandler, req connect.AnyRequest) error { return handler.IsSuperUser(ctx, req) }, diff --git a/proto/v1beta1/admin.pb.go b/proto/v1beta1/admin.pb.go index 24ebd2216..f0a719e05 100644 --- a/proto/v1beta1/admin.pb.go +++ b/proto/v1beta1/admin.pb.go @@ -6262,6 +6262,116 @@ func (x *ListAuditRecordsResponse) GetGroup() *RQLQueryGroupResponse { return nil } +type SearchOrganizationPATsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + OrgId string `protobuf:"bytes,1,opt,name=org_id,json=orgId,proto3" json:"org_id,omitempty"` + Query *RQLRequest `protobuf:"bytes,2,opt,name=query,proto3" json:"query,omitempty"` +} + +func (x *SearchOrganizationPATsRequest) Reset() { + *x = SearchOrganizationPATsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[117] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SearchOrganizationPATsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SearchOrganizationPATsRequest) ProtoMessage() {} + +func (x *SearchOrganizationPATsRequest) ProtoReflect() protoreflect.Message { + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[117] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SearchOrganizationPATsRequest.ProtoReflect.Descriptor instead. +func (*SearchOrganizationPATsRequest) Descriptor() ([]byte, []int) { + return file_raystack_frontier_v1beta1_admin_proto_rawDescGZIP(), []int{117} +} + +func (x *SearchOrganizationPATsRequest) GetOrgId() string { + if x != nil { + return x.OrgId + } + return "" +} + +func (x *SearchOrganizationPATsRequest) GetQuery() *RQLRequest { + if x != nil { + return x.Query + } + return nil +} + +type SearchOrganizationPATsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + OrganizationPats []*SearchOrganizationPATsResponse_OrganizationPAT `protobuf:"bytes,1,rep,name=organization_pats,json=organizationPats,proto3" json:"organization_pats,omitempty"` + Pagination *RQLQueryPaginationResponse `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` +} + +func (x *SearchOrganizationPATsResponse) Reset() { + *x = SearchOrganizationPATsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[118] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SearchOrganizationPATsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SearchOrganizationPATsResponse) ProtoMessage() {} + +func (x *SearchOrganizationPATsResponse) ProtoReflect() protoreflect.Message { + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[118] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SearchOrganizationPATsResponse.ProtoReflect.Descriptor instead. +func (*SearchOrganizationPATsResponse) Descriptor() ([]byte, []int) { + return file_raystack_frontier_v1beta1_admin_proto_rawDescGZIP(), []int{118} +} + +func (x *SearchOrganizationPATsResponse) GetOrganizationPats() []*SearchOrganizationPATsResponse_OrganizationPAT { + if x != nil { + return x.OrganizationPats + } + return nil +} + +func (x *SearchOrganizationPATsResponse) GetPagination() *RQLQueryPaginationResponse { + if x != nil { + return x.Pagination + } + return nil +} + type SearchOrganizationsResponse_OrganizationResult struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -6287,7 +6397,7 @@ type SearchOrganizationsResponse_OrganizationResult struct { func (x *SearchOrganizationsResponse_OrganizationResult) Reset() { *x = SearchOrganizationsResponse_OrganizationResult{} if protoimpl.UnsafeEnabled { - mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[118] + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[120] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6300,7 +6410,7 @@ func (x *SearchOrganizationsResponse_OrganizationResult) String() string { func (*SearchOrganizationsResponse_OrganizationResult) ProtoMessage() {} func (x *SearchOrganizationsResponse_OrganizationResult) ProtoReflect() protoreflect.Message { - mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[118] + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[120] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6442,7 +6552,7 @@ type SearchOrganizationUsersResponse_OrganizationUser struct { func (x *SearchOrganizationUsersResponse_OrganizationUser) Reset() { *x = SearchOrganizationUsersResponse_OrganizationUser{} if protoimpl.UnsafeEnabled { - mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[119] + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[121] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6455,7 +6565,7 @@ func (x *SearchOrganizationUsersResponse_OrganizationUser) String() string { func (*SearchOrganizationUsersResponse_OrganizationUser) ProtoMessage() {} func (x *SearchOrganizationUsersResponse_OrganizationUser) ProtoReflect() protoreflect.Message { - mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[119] + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[121] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6566,7 +6676,7 @@ type SearchOrganizationProjectsResponse_OrganizationProject struct { func (x *SearchOrganizationProjectsResponse_OrganizationProject) Reset() { *x = SearchOrganizationProjectsResponse_OrganizationProject{} if protoimpl.UnsafeEnabled { - mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[120] + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[122] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6579,7 +6689,7 @@ func (x *SearchOrganizationProjectsResponse_OrganizationProject) String() string func (*SearchOrganizationProjectsResponse_OrganizationProject) ProtoMessage() {} func (x *SearchOrganizationProjectsResponse_OrganizationProject) ProtoReflect() protoreflect.Message { - mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[120] + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[122] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6670,7 +6780,7 @@ type SearchProjectUsersResponse_ProjectUser struct { func (x *SearchProjectUsersResponse_ProjectUser) Reset() { *x = SearchProjectUsersResponse_ProjectUser{} if protoimpl.UnsafeEnabled { - mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[121] + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[123] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6683,7 +6793,7 @@ func (x *SearchProjectUsersResponse_ProjectUser) String() string { func (*SearchProjectUsersResponse_ProjectUser) ProtoMessage() {} func (x *SearchProjectUsersResponse_ProjectUser) ProtoReflect() protoreflect.Message { - mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[121] + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[123] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6779,7 +6889,7 @@ type SearchOrganizationInvoicesResponse_OrganizationInvoice struct { func (x *SearchOrganizationInvoicesResponse_OrganizationInvoice) Reset() { *x = SearchOrganizationInvoicesResponse_OrganizationInvoice{} if protoimpl.UnsafeEnabled { - mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[122] + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[124] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6792,7 +6902,7 @@ func (x *SearchOrganizationInvoicesResponse_OrganizationInvoice) String() string func (*SearchOrganizationInvoicesResponse_OrganizationInvoice) ProtoMessage() {} func (x *SearchOrganizationInvoicesResponse_OrganizationInvoice) ProtoReflect() protoreflect.Message { - mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[122] + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[124] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6875,7 +6985,7 @@ type SearchOrganizationTokensResponse_OrganizationToken struct { func (x *SearchOrganizationTokensResponse_OrganizationToken) Reset() { *x = SearchOrganizationTokensResponse_OrganizationToken{} if protoimpl.UnsafeEnabled { - mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[123] + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[125] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6888,7 +6998,7 @@ func (x *SearchOrganizationTokensResponse_OrganizationToken) String() string { func (*SearchOrganizationTokensResponse_OrganizationToken) ProtoMessage() {} func (x *SearchOrganizationTokensResponse_OrganizationToken) ProtoReflect() protoreflect.Message { - mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[123] + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[125] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6974,7 +7084,7 @@ type SearchOrganizationServiceUserCredentialsResponse_OrganizationServiceUserCre func (x *SearchOrganizationServiceUserCredentialsResponse_OrganizationServiceUserCredential) Reset() { *x = SearchOrganizationServiceUserCredentialsResponse_OrganizationServiceUserCredential{} if protoimpl.UnsafeEnabled { - mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[124] + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[126] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6988,7 +7098,7 @@ func (*SearchOrganizationServiceUserCredentialsResponse_OrganizationServiceUserC } func (x *SearchOrganizationServiceUserCredentialsResponse_OrganizationServiceUserCredential) ProtoReflect() protoreflect.Message { - mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[124] + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[126] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7052,7 +7162,7 @@ type SearchUserOrganizationsResponse_UserOrganization struct { func (x *SearchUserOrganizationsResponse_UserOrganization) Reset() { *x = SearchUserOrganizationsResponse_UserOrganization{} if protoimpl.UnsafeEnabled { - mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[125] + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[127] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7065,7 +7175,7 @@ func (x *SearchUserOrganizationsResponse_UserOrganization) String() string { func (*SearchUserOrganizationsResponse_UserOrganization) ProtoMessage() {} func (x *SearchUserOrganizationsResponse_UserOrganization) ProtoReflect() protoreflect.Message { - mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[125] + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[127] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7171,7 +7281,7 @@ type SearchUserProjectsResponse_UserProject struct { func (x *SearchUserProjectsResponse_UserProject) Reset() { *x = SearchUserProjectsResponse_UserProject{} if protoimpl.UnsafeEnabled { - mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[126] + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[128] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7184,7 +7294,7 @@ func (x *SearchUserProjectsResponse_UserProject) String() string { func (*SearchUserProjectsResponse_UserProject) ProtoMessage() {} func (x *SearchUserProjectsResponse_UserProject) ProtoReflect() protoreflect.Message { - mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[126] + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[128] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7287,7 +7397,7 @@ type AdminCreateOrganizationRequest_OrganizationRequestBody struct { func (x *AdminCreateOrganizationRequest_OrganizationRequestBody) Reset() { *x = AdminCreateOrganizationRequest_OrganizationRequestBody{} if protoimpl.UnsafeEnabled { - mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[127] + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[129] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7300,7 +7410,7 @@ func (x *AdminCreateOrganizationRequest_OrganizationRequestBody) String() string func (*AdminCreateOrganizationRequest_OrganizationRequestBody) ProtoMessage() {} func (x *AdminCreateOrganizationRequest_OrganizationRequestBody) ProtoReflect() protoreflect.Message { - mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[127] + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[129] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7370,7 +7480,7 @@ type SearchInvoicesResponse_Invoice struct { func (x *SearchInvoicesResponse_Invoice) Reset() { *x = SearchInvoicesResponse_Invoice{} if protoimpl.UnsafeEnabled { - mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[128] + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[130] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7383,7 +7493,7 @@ func (x *SearchInvoicesResponse_Invoice) String() string { func (*SearchInvoicesResponse_Invoice) ProtoMessage() {} func (x *SearchInvoicesResponse_Invoice) ProtoReflect() protoreflect.Message { - mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[128] + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[130] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7475,7 +7585,7 @@ type SearchOrganizationServiceUsersResponse_Project struct { func (x *SearchOrganizationServiceUsersResponse_Project) Reset() { *x = SearchOrganizationServiceUsersResponse_Project{} if protoimpl.UnsafeEnabled { - mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[129] + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[131] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7488,7 +7598,7 @@ func (x *SearchOrganizationServiceUsersResponse_Project) String() string { func (*SearchOrganizationServiceUsersResponse_Project) ProtoMessage() {} func (x *SearchOrganizationServiceUsersResponse_Project) ProtoReflect() protoreflect.Message { - mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[129] + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[131] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7540,7 +7650,7 @@ type SearchOrganizationServiceUsersResponse_OrganizationServiceUser struct { func (x *SearchOrganizationServiceUsersResponse_OrganizationServiceUser) Reset() { *x = SearchOrganizationServiceUsersResponse_OrganizationServiceUser{} if protoimpl.UnsafeEnabled { - mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[130] + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[132] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7553,7 +7663,7 @@ func (x *SearchOrganizationServiceUsersResponse_OrganizationServiceUser) String( func (*SearchOrganizationServiceUsersResponse_OrganizationServiceUser) ProtoMessage() {} func (x *SearchOrganizationServiceUsersResponse_OrganizationServiceUser) ProtoReflect() protoreflect.Message { - mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[130] + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[132] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7604,6 +7714,164 @@ func (x *SearchOrganizationServiceUsersResponse_OrganizationServiceUser) GetCrea return nil } +type SearchOrganizationPATsResponse_CreatedBy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"` + Email string `protobuf:"bytes,3,opt,name=email,proto3" json:"email,omitempty"` +} + +func (x *SearchOrganizationPATsResponse_CreatedBy) Reset() { + *x = SearchOrganizationPATsResponse_CreatedBy{} + if protoimpl.UnsafeEnabled { + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[133] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SearchOrganizationPATsResponse_CreatedBy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SearchOrganizationPATsResponse_CreatedBy) ProtoMessage() {} + +func (x *SearchOrganizationPATsResponse_CreatedBy) ProtoReflect() protoreflect.Message { + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[133] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SearchOrganizationPATsResponse_CreatedBy.ProtoReflect.Descriptor instead. +func (*SearchOrganizationPATsResponse_CreatedBy) Descriptor() ([]byte, []int) { + return file_raystack_frontier_v1beta1_admin_proto_rawDescGZIP(), []int{118, 0} +} + +func (x *SearchOrganizationPATsResponse_CreatedBy) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *SearchOrganizationPATsResponse_CreatedBy) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (x *SearchOrganizationPATsResponse_CreatedBy) GetEmail() string { + if x != nil { + return x.Email + } + return "" +} + +type SearchOrganizationPATsResponse_OrganizationPAT struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"` + CreatedBy *SearchOrganizationPATsResponse_CreatedBy `protobuf:"bytes,3,opt,name=created_by,json=createdBy,proto3" json:"created_by,omitempty"` + Scopes []*PATScope `protobuf:"bytes,4,rep,name=scopes,proto3" json:"scopes,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + ExpiresAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=expires_at,json=expiresAt,proto3" json:"expires_at,omitempty"` + LastUsedAt *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=last_used_at,json=lastUsedAt,proto3" json:"last_used_at,omitempty"` +} + +func (x *SearchOrganizationPATsResponse_OrganizationPAT) Reset() { + *x = SearchOrganizationPATsResponse_OrganizationPAT{} + if protoimpl.UnsafeEnabled { + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[134] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SearchOrganizationPATsResponse_OrganizationPAT) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SearchOrganizationPATsResponse_OrganizationPAT) ProtoMessage() {} + +func (x *SearchOrganizationPATsResponse_OrganizationPAT) ProtoReflect() protoreflect.Message { + mi := &file_raystack_frontier_v1beta1_admin_proto_msgTypes[134] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SearchOrganizationPATsResponse_OrganizationPAT.ProtoReflect.Descriptor instead. +func (*SearchOrganizationPATsResponse_OrganizationPAT) Descriptor() ([]byte, []int) { + return file_raystack_frontier_v1beta1_admin_proto_rawDescGZIP(), []int{118, 1} +} + +func (x *SearchOrganizationPATsResponse_OrganizationPAT) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *SearchOrganizationPATsResponse_OrganizationPAT) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (x *SearchOrganizationPATsResponse_OrganizationPAT) GetCreatedBy() *SearchOrganizationPATsResponse_CreatedBy { + if x != nil { + return x.CreatedBy + } + return nil +} + +func (x *SearchOrganizationPATsResponse_OrganizationPAT) GetScopes() []*PATScope { + if x != nil { + return x.Scopes + } + return nil +} + +func (x *SearchOrganizationPATsResponse_OrganizationPAT) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +func (x *SearchOrganizationPATsResponse_OrganizationPAT) GetExpiresAt() *timestamppb.Timestamp { + if x != nil { + return x.ExpiresAt + } + return nil +} + +func (x *SearchOrganizationPATsResponse_OrganizationPAT) GetLastUsedAt() *timestamppb.Timestamp { + if x != nil { + return x.LastUsedAt + } + return nil +} + var File_raystack_frontier_v1beta1_admin_proto protoreflect.FileDescriptor var file_raystack_frontier_v1beta1_admin_proto_rawDesc = []byte{ @@ -8778,519 +9046,581 @@ var file_raystack_frontier_v1beta1_admin_proto_rawDesc = []byte{ 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x52, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x32, 0x8d, 0x3e, 0x0a, 0x0c, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x12, 0x71, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x55, 0x73, - 0x65, 0x72, 0x73, 0x12, 0x2e, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, - 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, + 0x75, 0x70, 0x22, 0x80, 0x01, 0x0a, 0x1d, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x41, 0x54, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x06, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x05, 0x72, 0x03, 0xb0, 0x01, + 0x01, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, 0x12, 0x3b, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, + 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2e, 0x52, 0x51, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x05, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0xc7, 0x05, 0x0a, 0x1e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x41, 0x54, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x11, 0x6f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x86, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x41, - 0x6c, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x35, - 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, - 0x6c, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, - 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x6b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x2c, 0x2e, - 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x61, - 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, - 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x89, 0x01, 0x0a, - 0x14, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x36, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, - 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, - 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, - 0x6c, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x92, 0x01, 0x0a, 0x17, 0x41, 0x64, 0x6d, - 0x69, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x41, 0x54, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x41, 0x54, 0x52, 0x10, + 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x73, + 0x12, 0x55, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x2e, 0x41, 0x64, 0x6d, 0x69, 0x6e, 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, - 0x3a, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, - 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x6d, 0x69, - 0x6e, 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, 0x00, 0x12, 0x86, 0x01, - 0x0a, 0x13, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x35, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, - 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x72, - 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, - 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x92, 0x01, 0x0a, 0x17, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x73, 0x65, - 0x72, 0x73, 0x12, 0x39, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, - 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, - 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x73, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x83, 0x01, 0x0a, 0x12, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x73, 0x65, - 0x72, 0x73, 0x12, 0x34, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, - 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 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, 0x1a, 0x35, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, - 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, - 0x65, 0x74, 0x61, 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, - 0x00, 0x12, 0x9b, 0x01, 0x0a, 0x1a, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, 0x72, 0x67, 0x61, - 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x12, 0x3c, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, - 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, + 0x2e, 0x52, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x47, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x42, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, + 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, + 0x1a, 0x8c, 0x03, 0x0a, 0x0f, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x41, 0x54, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x62, 0x0a, 0x0a, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x9b, 0x01, 0x0a, 0x1a, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x73, 0x12, 0x3c, + 0x68, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x41, 0x54, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x42, 0x79, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x12, 0x3b, + 0x0a, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x76, - 0x6f, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, 0x2e, 0x72, - 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, - 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x6f, 0x69, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x95, 0x01, - 0x0a, 0x18, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x3a, 0x2e, 0x72, 0x61, 0x79, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x41, 0x54, 0x53, 0x63, + 0x6f, 0x70, 0x65, 0x52, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, + 0x73, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, + 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x73, 0x65, 0x64, 0x41, 0x74, 0x32, + 0x9f, 0x3f, 0x0a, 0x0c, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x71, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x73, + 0x12, 0x2e, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, + 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x41, 0x6c, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2f, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, + 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x41, 0x6c, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x86, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x35, 0x2e, 0x72, 0x61, + 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, + 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, + 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x0a, + 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x2c, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, 0x72, 0x67, - 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, - 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0xc5, 0x01, 0x0a, 0x28, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, - 0x6c, 0x73, 0x12, 0x4a, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, - 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, + 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, + 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, + 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x89, 0x01, 0x0a, 0x14, 0x4c, 0x69, + 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x36, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, + 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x72, 0x61, 0x79, + 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x4f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x92, 0x01, 0x0a, 0x17, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x39, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, + 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x41, 0x64, + 0x6d, 0x69, 0x6e, 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, 0x3a, 0x2e, 0x72, + 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, + 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x6d, 0x69, 0x6e, 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, 0x00, 0x12, 0x86, 0x01, 0x0a, 0x13, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x4b, - 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0xa7, 0x01, - 0x0a, 0x1e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x73, 0x65, 0x72, 0x73, - 0x12, 0x40, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, - 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x41, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, + 0x6e, 0x73, 0x12, 0x35, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x35, - 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x6e, 0x0a, 0x17, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x39, 0x2e, 0x72, 0x61, 0x79, + 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x72, 0x61, 0x79, 0x73, + 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, + 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x92, 0x01, 0x0a, 0x17, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, + 0x39, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, + 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x73, + 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x72, 0x67, + 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x74, 0x0a, 0x1a, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x83, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, + 0x34, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, + 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 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, 0x1a, 0x35, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, + 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, + 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, 0x00, 0x12, 0x9b, + 0x01, 0x0a, 0x1a, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x3c, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x42, 0x6f, 0x64, - 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x70, 0x0a, 0x18, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4f, - 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x73, 0x12, 0x3a, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, - 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x42, - 0x6f, 0x64, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, - 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x6e, 0x0a, 0x0b, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x2d, - 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, + 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, 0x2e, 0x72, 0x61, + 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, + 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x9b, 0x01, 0x0a, + 0x1a, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x73, 0x12, 0x3c, 0x2e, 0x72, 0x61, + 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, + 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x6f, 0x69, 0x63, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, 0x2e, 0x72, 0x61, 0x79, 0x73, + 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, + 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x95, 0x01, 0x0a, 0x18, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x3a, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, + 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, + 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0xc5, 0x01, 0x0a, 0x28, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, + 0x4a, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, + 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x4b, 0x2e, 0x72, 0x61, + 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, + 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0xa7, 0x01, 0x0a, 0x1e, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x40, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x92, 0x01, 0x0a, 0x17, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x72, - 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x39, 0x2e, 0x72, 0x61, + 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x41, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, + 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x35, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, - 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, - 0x65, 0x72, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, - 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x72, 0x67, - 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x83, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, - 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x34, 0x2e, 0x72, 0x61, + 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x48, 0x74, 0x74, 0x70, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x6e, 0x0a, 0x17, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x39, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, + 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x48, 0x74, 0x74, 0x70, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x74, 0x0a, 0x1a, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x3c, 0x2e, 0x72, 0x61, 0x79, + 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x70, 0x0a, 0x18, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x3a, + 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x42, 0x6f, 0x64, 0x79, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x55, 0x73, + 0x65, 0x72, 0x73, 0x12, 0x2d, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, + 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x48, 0x74, 0x74, 0x70, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x6e, 0x0a, 0x0b, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, - 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x35, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, - 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x83, 0x01, 0x0a, 0x12, 0x53, - 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x79, - 0x63, 0x12, 0x34, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, - 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, - 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x79, 0x63, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, - 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, - 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4b, 0x79, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x89, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4b, 0x79, 0x63, 0x12, 0x36, 0x2e, 0x72, 0x61, 0x79, 0x73, - 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4b, 0x79, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x37, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, - 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4b, - 0x79, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x0c, - 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x2e, 0x2e, 0x72, - 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x72, - 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x74, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x2f, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, - 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x30, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, - 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x74, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x2f, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, + 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x72, 0x61, 0x79, + 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, + 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x92, 0x01, 0x0a, + 0x17, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x72, 0x67, 0x61, 0x6e, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x39, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, + 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, + 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x4f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, + 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x83, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, + 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x34, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, + 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, + 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x50, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, + 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x83, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x74, 0x4f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x79, 0x63, 0x12, 0x34, + 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x4f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x79, 0x63, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, + 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, + 0x2e, 0x53, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x4b, 0x79, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x89, 0x01, + 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x4b, 0x79, 0x63, 0x12, 0x36, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, - 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, - 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x0a, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2c, 0x2e, 0x72, 0x61, 0x79, 0x73, + 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x4b, 0x79, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, + 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4b, 0x79, 0x63, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x0c, 0x4c, 0x69, 0x73, + 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x2e, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, - 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, - 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, + 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x72, 0x61, 0x79, 0x73, + 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, + 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x74, 0x0a, 0x0d, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2f, 0x2e, + 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, + 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, + 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x74, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x12, 0x2f, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, + 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, + 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2c, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, + 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2c, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, - 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, + 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, + 0x12, 0x2c, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, + 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, + 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x7d, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, + 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, + 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, + 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x32, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, + 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x72, 0x61, 0x79, - 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x7d, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, + 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, + 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x32, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, + 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x72, 0x61, 0x79, 0x73, - 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x7d, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, - 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, - 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, - 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x7a, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x73, 0x12, 0x31, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, + 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7a, 0x0a, 0x0f, + 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, + 0x31, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, + 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, - 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x80, 0x01, 0x0a, 0x11, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x73, 0x12, 0x33, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, - 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, - 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0xad, - 0x01, 0x0a, 0x20, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x65, - 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x80, 0x01, 0x0a, 0x11, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x33, + 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0xad, 0x01, 0x0a, 0x20, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x43, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, - 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, - 0x74, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7a, - 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x55, 0x73, 0x65, - 0x72, 0x12, 0x31, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, - 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x41, 0x64, - 0x64, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, - 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x2e, 0x41, 0x64, 0x64, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x55, 0x73, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x80, 0x01, 0x0a, 0x11, 0x4c, - 0x69, 0x73, 0x74, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x55, 0x73, 0x65, 0x72, 0x73, - 0x12, 0x33, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, - 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, - 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x55, 0x73, - 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x83, 0x01, - 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, - 0x55, 0x73, 0x65, 0x72, 0x12, 0x34, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, + 0x12, 0x42, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, + 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x43, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x55, - 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x72, 0x61, 0x79, - 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x6c, 0x61, - 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x80, 0x01, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, - 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x12, 0x33, 0x2e, 0x72, 0x61, 0x79, 0x73, - 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, + 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7a, 0x0a, 0x0f, 0x41, + 0x64, 0x64, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x55, 0x73, 0x65, 0x72, 0x12, 0x31, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, - 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7a, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, - 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x73, 0x12, 0x31, 0x2e, 0x72, 0x61, 0x79, 0x73, - 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x76, - 0x6f, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x72, - 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, - 0x49, 0x6e, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x10, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x49, 0x6e, - 0x76, 0x6f, 0x69, 0x63, 0x65, 0x73, 0x12, 0x32, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, - 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x76, 0x6f, 0x69, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x72, 0x61, 0x79, - 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x49, - 0x6e, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x8f, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x42, 0x69, 0x6c, - 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x38, 0x2e, 0x72, - 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, - 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x6c, + 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x32, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, + 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x41, 0x64, + 0x64, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x80, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, + 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x33, 0x2e, + 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, + 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6c, + 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, + 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x55, 0x73, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x83, 0x01, 0x0a, 0x12, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x55, 0x73, 0x65, + 0x72, 0x12, 0x34, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, + 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x55, 0x73, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, + 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, + 0x72, 0x6d, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x80, 0x01, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x12, 0x33, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, - 0x67, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x83, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x42, 0x69, - 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x34, 0x2e, 0x72, 0x61, 0x79, - 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x42, 0x69, 0x6c, - 0x6c, 0x69, 0x6e, 0x67, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x35, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, - 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x76, - 0x65, 0x72, 0x74, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x74, 0x0a, 0x0d, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x57, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x12, 0x2f, 0x2e, 0x72, 0x61, 0x79, - 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x65, 0x62, - 0x68, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x72, 0x61, + 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, - 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x65, - 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x74, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, - 0x12, 0x2f, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, - 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x57, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x30, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, - 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x57, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x74, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, - 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x12, 0x2f, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, + 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, + 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x7a, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x49, 0x6e, + 0x76, 0x6f, 0x69, 0x63, 0x65, 0x73, 0x12, 0x31, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, + 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x69, 0x63, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x72, 0x61, 0x79, 0x73, + 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, + 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x76, + 0x6f, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x7d, 0x0a, 0x10, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x76, 0x6f, 0x69, + 0x63, 0x65, 0x73, 0x12, 0x32, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, + 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, - 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x65, 0x62, 0x68, 0x6f, 0x6f, - 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x0c, 0x4c, - 0x69, 0x73, 0x74, 0x57, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x73, 0x12, 0x2e, 0x2e, 0x72, 0x61, - 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, - 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x65, 0x62, 0x68, - 0x6f, 0x6f, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x72, 0x61, - 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, - 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x65, 0x62, 0x68, - 0x6f, 0x6f, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x9e, - 0x01, 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x3c, 0x2e, + 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x76, 0x6f, + 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x8f, + 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, + 0x67, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x38, 0x2e, 0x72, 0x61, 0x79, 0x73, + 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, + 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x42, 0x69, 0x6c, + 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, + 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x83, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x42, 0x69, 0x6c, 0x6c, 0x69, + 0x6e, 0x67, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x34, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, + 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, + 0x67, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, + 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, + 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, + 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x74, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x57, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x12, 0x2f, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, + 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x65, 0x62, 0x68, 0x6f, 0x6f, + 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, + 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, + 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x65, 0x62, 0x68, 0x6f, + 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x74, 0x0a, 0x0d, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x12, 0x2f, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, - 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, 0x2e, 0x72, 0x61, - 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, - 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x69, - 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x6d, 0x69, - 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, - 0x95, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x3a, 0x2e, 0x72, - 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x6c, 0x6c, - 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, + 0x57, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, + 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x57, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x74, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x65, 0x62, 0x68, + 0x6f, 0x6f, 0x6b, 0x12, 0x2f, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, + 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, + 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, + 0x57, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x73, 0x12, 0x2e, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, - 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x41, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x9e, 0x01, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x3d, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, - 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, - 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, - 0x67, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3e, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, - 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x77, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x50, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x12, 0x30, 0x2e, 0x72, 0x61, 0x79, + 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, + 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, + 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x9e, 0x01, 0x0a, 0x1a, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x3c, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, - 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x72, - 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, - 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x74, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, - 0x74, 0x73, 0x12, 0x2f, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, - 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, - 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6e, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x50, 0x72, - 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x12, 0x2d, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, - 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, - 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x77, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x50, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x12, 0x30, 0x2e, 0x72, 0x61, 0x79, 0x73, + 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x69, 0x6c, + 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, + 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, + 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x69, 0x6c, 0x6c, 0x69, + 0x6e, 0x67, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x95, 0x01, 0x0a, + 0x18, 0x47, 0x65, 0x74, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x3a, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x73, - 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x72, 0x61, - 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, - 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, - 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x77, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x73, 0x70, 0x65, - 0x63, 0x74, 0x12, 0x30, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, - 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, + 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, + 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x9e, 0x01, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, + 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x12, 0x3d, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x77, 0x0a, 0x0e, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x49, 0x6e, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x73, 0x12, 0x30, 0x2e, 0x72, 0x61, - 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, - 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x6e, - 0x76, 0x6f, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, - 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x49, 0x6e, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x86, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x12, 0x35, 0x2e, 0x72, 0x61, 0x79, - 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x36, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, - 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x55, 0x73, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x10, 0x4c, - 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x32, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x3e, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, + 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x77, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, + 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x12, 0x30, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, + 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x73, 0x70, 0x65, + 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x72, 0x61, 0x79, 0x73, + 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, + 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x73, + 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x74, + 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x73, 0x12, + 0x2f, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, + 0x50, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x30, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, + 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x50, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x6e, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x73, 0x70, + 0x65, 0x63, 0x74, 0x12, 0x2d, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x80, 0x01, 0x0a, 0x11, 0x52, - 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x33, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, - 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x76, - 0x6f, 0x6b, 0x65, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, - 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, - 0x10, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, - 0x73, 0x12, 0x32, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, - 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, - 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, - 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x64, 0x0a, 0x12, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, - 0x64, 0x73, 0x12, 0x34, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, - 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x00, - 0x30, 0x01, 0x42, 0xed, 0x01, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, + 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, + 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x50, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x77, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, + 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x12, 0x30, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, + 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, + 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, - 0x65, 0x74, 0x61, 0x31, 0x42, 0x0a, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x50, 0x01, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, - 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x3b, 0x66, - 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xa2, 0x02, - 0x03, 0x52, 0x46, 0x58, 0xaa, 0x02, 0x19, 0x52, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, - 0x46, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0xca, 0x02, 0x19, 0x52, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5c, 0x46, 0x72, 0x6f, 0x6e, - 0x74, 0x69, 0x65, 0x72, 0x5c, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xe2, 0x02, 0x25, 0x52, - 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5c, 0x46, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, - 0x5c, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x1b, 0x52, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x3a, - 0x3a, 0x46, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x73, 0x70, + 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x77, 0x0a, + 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x12, + 0x30, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, + 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x50, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x31, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, + 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x77, 0x0a, 0x0e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x49, 0x6e, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x73, 0x12, 0x30, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, + 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, + 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x6e, 0x76, 0x6f, 0x69, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x72, 0x61, 0x79, + 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x6e, 0x76, + 0x6f, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x86, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x41, 0x64, + 0x6d, 0x69, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x12, 0x35, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, + 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x41, 0x64, + 0x6d, 0x69, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, + 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, + 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x32, 0x2e, 0x72, + 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, + 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, + 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x33, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, + 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x80, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x76, 0x6f, + 0x6b, 0x65, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x2e, + 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, + 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, + 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, + 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x52, + 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x10, 0x4c, 0x69, + 0x73, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x32, + 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, + 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, + 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x64, 0x0a, 0x12, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x12, + 0x34, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, + 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, + 0x8f, 0x01, 0x0a, 0x16, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x41, 0x54, 0x73, 0x12, 0x38, 0x2e, 0x72, 0x61, 0x79, + 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x41, 0x54, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, + 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, + 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x41, 0x54, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x42, 0xed, 0x01, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x61, 0x79, 0x73, 0x74, 0x61, + 0x63, 0x6b, 0x2e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x42, 0x0a, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, + 0x01, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x61, + 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x3b, 0x66, 0x72, + 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xa2, 0x02, 0x03, + 0x52, 0x46, 0x58, 0xaa, 0x02, 0x19, 0x52, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x46, + 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x2e, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xca, + 0x02, 0x19, 0x52, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5c, 0x46, 0x72, 0x6f, 0x6e, 0x74, + 0x69, 0x65, 0x72, 0x5c, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xe2, 0x02, 0x25, 0x52, 0x61, + 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5c, 0x46, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x5c, + 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0xea, 0x02, 0x1b, 0x52, 0x61, 0x79, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x3a, 0x3a, + 0x46, 0x72, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x72, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, + 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -9305,7 +9635,7 @@ func file_raystack_frontier_v1beta1_admin_proto_rawDescGZIP() []byte { return file_raystack_frontier_v1beta1_admin_proto_rawDescData } -var file_raystack_frontier_v1beta1_admin_proto_msgTypes = make([]protoimpl.MessageInfo, 131) +var file_raystack_frontier_v1beta1_admin_proto_msgTypes = make([]protoimpl.MessageInfo, 135) var file_raystack_frontier_v1beta1_admin_proto_goTypes = []interface{}{ (*ListAllUsersRequest)(nil), // 0: raystack.frontier.v1beta1.ListAllUsersRequest (*ListAllUsersResponse)(nil), // 1: raystack.frontier.v1beta1.ListAllUsersResponse @@ -9424,300 +9754,315 @@ var file_raystack_frontier_v1beta1_admin_proto_goTypes = []interface{}{ (*ListAuditRecordsRequest)(nil), // 114: raystack.frontier.v1beta1.ListAuditRecordsRequest (*ExportAuditRecordsRequest)(nil), // 115: raystack.frontier.v1beta1.ExportAuditRecordsRequest (*ListAuditRecordsResponse)(nil), // 116: raystack.frontier.v1beta1.ListAuditRecordsResponse - nil, // 117: raystack.frontier.v1beta1.WebhookRequestBody.HeadersEntry - (*SearchOrganizationsResponse_OrganizationResult)(nil), // 118: raystack.frontier.v1beta1.SearchOrganizationsResponse.OrganizationResult - (*SearchOrganizationUsersResponse_OrganizationUser)(nil), // 119: raystack.frontier.v1beta1.SearchOrganizationUsersResponse.OrganizationUser - (*SearchOrganizationProjectsResponse_OrganizationProject)(nil), // 120: raystack.frontier.v1beta1.SearchOrganizationProjectsResponse.OrganizationProject - (*SearchProjectUsersResponse_ProjectUser)(nil), // 121: raystack.frontier.v1beta1.SearchProjectUsersResponse.ProjectUser - (*SearchOrganizationInvoicesResponse_OrganizationInvoice)(nil), // 122: raystack.frontier.v1beta1.SearchOrganizationInvoicesResponse.OrganizationInvoice - (*SearchOrganizationTokensResponse_OrganizationToken)(nil), // 123: raystack.frontier.v1beta1.SearchOrganizationTokensResponse.OrganizationToken - (*SearchOrganizationServiceUserCredentialsResponse_OrganizationServiceUserCredential)(nil), // 124: raystack.frontier.v1beta1.SearchOrganizationServiceUserCredentialsResponse.OrganizationServiceUserCredential - (*SearchUserOrganizationsResponse_UserOrganization)(nil), // 125: raystack.frontier.v1beta1.SearchUserOrganizationsResponse.UserOrganization - (*SearchUserProjectsResponse_UserProject)(nil), // 126: raystack.frontier.v1beta1.SearchUserProjectsResponse.UserProject - (*AdminCreateOrganizationRequest_OrganizationRequestBody)(nil), // 127: raystack.frontier.v1beta1.AdminCreateOrganizationRequest.OrganizationRequestBody - (*SearchInvoicesResponse_Invoice)(nil), // 128: raystack.frontier.v1beta1.SearchInvoicesResponse.Invoice - (*SearchOrganizationServiceUsersResponse_Project)(nil), // 129: raystack.frontier.v1beta1.SearchOrganizationServiceUsersResponse.Project - (*SearchOrganizationServiceUsersResponse_OrganizationServiceUser)(nil), // 130: raystack.frontier.v1beta1.SearchOrganizationServiceUsersResponse.OrganizationServiceUser - (*User)(nil), // 131: raystack.frontier.v1beta1.User - (*ServiceUser)(nil), // 132: raystack.frontier.v1beta1.ServiceUser - (*Group)(nil), // 133: raystack.frontier.v1beta1.Group - (*Organization)(nil), // 134: raystack.frontier.v1beta1.Organization - (*Project)(nil), // 135: raystack.frontier.v1beta1.Project - (*Relation)(nil), // 136: raystack.frontier.v1beta1.Relation - (*Resource)(nil), // 137: raystack.frontier.v1beta1.Resource - (*RoleRequestBody)(nil), // 138: raystack.frontier.v1beta1.RoleRequestBody - (*Role)(nil), // 139: raystack.frontier.v1beta1.Role - (*structpb.Struct)(nil), // 140: google.protobuf.Struct - (*Permission)(nil), // 141: raystack.frontier.v1beta1.Permission - (*Preference)(nil), // 142: raystack.frontier.v1beta1.Preference - (*PreferenceRequestBody)(nil), // 143: raystack.frontier.v1beta1.PreferenceRequestBody - (*CheckoutSubscriptionBody)(nil), // 144: raystack.frontier.v1beta1.CheckoutSubscriptionBody - (*CheckoutProductBody)(nil), // 145: raystack.frontier.v1beta1.CheckoutProductBody - (*Subscription)(nil), // 146: raystack.frontier.v1beta1.Subscription - (*Product)(nil), // 147: raystack.frontier.v1beta1.Product - (*Invoice)(nil), // 148: raystack.frontier.v1beta1.Invoice - (*BillingAccount)(nil), // 149: raystack.frontier.v1beta1.BillingAccount - (*Webhook)(nil), // 150: raystack.frontier.v1beta1.Webhook - (*RQLRequest)(nil), // 151: raystack.frontier.v1beta1.RQLRequest - (*OrganizationKyc)(nil), // 152: raystack.frontier.v1beta1.OrganizationKyc - (*RQLQueryPaginationResponse)(nil), // 153: raystack.frontier.v1beta1.RQLQueryPaginationResponse - (*RQLQueryGroupResponse)(nil), // 154: raystack.frontier.v1beta1.RQLQueryGroupResponse - (*Prospect)(nil), // 155: raystack.frontier.v1beta1.Prospect - (Prospect_Status)(0), // 156: raystack.frontier.v1beta1.Prospect.Status - (*Session)(nil), // 157: raystack.frontier.v1beta1.Session - (*RQLExportRequest)(nil), // 158: raystack.frontier.v1beta1.RQLExportRequest - (*AuditRecord)(nil), // 159: raystack.frontier.v1beta1.AuditRecord - (*timestamppb.Timestamp)(nil), // 160: google.protobuf.Timestamp - (*ExportOrganizationsRequest)(nil), // 161: raystack.frontier.v1beta1.ExportOrganizationsRequest - (*httpbody.HttpBody)(nil), // 162: google.api.HttpBody + (*SearchOrganizationPATsRequest)(nil), // 117: raystack.frontier.v1beta1.SearchOrganizationPATsRequest + (*SearchOrganizationPATsResponse)(nil), // 118: raystack.frontier.v1beta1.SearchOrganizationPATsResponse + nil, // 119: raystack.frontier.v1beta1.WebhookRequestBody.HeadersEntry + (*SearchOrganizationsResponse_OrganizationResult)(nil), // 120: raystack.frontier.v1beta1.SearchOrganizationsResponse.OrganizationResult + (*SearchOrganizationUsersResponse_OrganizationUser)(nil), // 121: raystack.frontier.v1beta1.SearchOrganizationUsersResponse.OrganizationUser + (*SearchOrganizationProjectsResponse_OrganizationProject)(nil), // 122: raystack.frontier.v1beta1.SearchOrganizationProjectsResponse.OrganizationProject + (*SearchProjectUsersResponse_ProjectUser)(nil), // 123: raystack.frontier.v1beta1.SearchProjectUsersResponse.ProjectUser + (*SearchOrganizationInvoicesResponse_OrganizationInvoice)(nil), // 124: raystack.frontier.v1beta1.SearchOrganizationInvoicesResponse.OrganizationInvoice + (*SearchOrganizationTokensResponse_OrganizationToken)(nil), // 125: raystack.frontier.v1beta1.SearchOrganizationTokensResponse.OrganizationToken + (*SearchOrganizationServiceUserCredentialsResponse_OrganizationServiceUserCredential)(nil), // 126: raystack.frontier.v1beta1.SearchOrganizationServiceUserCredentialsResponse.OrganizationServiceUserCredential + (*SearchUserOrganizationsResponse_UserOrganization)(nil), // 127: raystack.frontier.v1beta1.SearchUserOrganizationsResponse.UserOrganization + (*SearchUserProjectsResponse_UserProject)(nil), // 128: raystack.frontier.v1beta1.SearchUserProjectsResponse.UserProject + (*AdminCreateOrganizationRequest_OrganizationRequestBody)(nil), // 129: raystack.frontier.v1beta1.AdminCreateOrganizationRequest.OrganizationRequestBody + (*SearchInvoicesResponse_Invoice)(nil), // 130: raystack.frontier.v1beta1.SearchInvoicesResponse.Invoice + (*SearchOrganizationServiceUsersResponse_Project)(nil), // 131: raystack.frontier.v1beta1.SearchOrganizationServiceUsersResponse.Project + (*SearchOrganizationServiceUsersResponse_OrganizationServiceUser)(nil), // 132: raystack.frontier.v1beta1.SearchOrganizationServiceUsersResponse.OrganizationServiceUser + (*SearchOrganizationPATsResponse_CreatedBy)(nil), // 133: raystack.frontier.v1beta1.SearchOrganizationPATsResponse.CreatedBy + (*SearchOrganizationPATsResponse_OrganizationPAT)(nil), // 134: raystack.frontier.v1beta1.SearchOrganizationPATsResponse.OrganizationPAT + (*User)(nil), // 135: raystack.frontier.v1beta1.User + (*ServiceUser)(nil), // 136: raystack.frontier.v1beta1.ServiceUser + (*Group)(nil), // 137: raystack.frontier.v1beta1.Group + (*Organization)(nil), // 138: raystack.frontier.v1beta1.Organization + (*Project)(nil), // 139: raystack.frontier.v1beta1.Project + (*Relation)(nil), // 140: raystack.frontier.v1beta1.Relation + (*Resource)(nil), // 141: raystack.frontier.v1beta1.Resource + (*RoleRequestBody)(nil), // 142: raystack.frontier.v1beta1.RoleRequestBody + (*Role)(nil), // 143: raystack.frontier.v1beta1.Role + (*structpb.Struct)(nil), // 144: google.protobuf.Struct + (*Permission)(nil), // 145: raystack.frontier.v1beta1.Permission + (*Preference)(nil), // 146: raystack.frontier.v1beta1.Preference + (*PreferenceRequestBody)(nil), // 147: raystack.frontier.v1beta1.PreferenceRequestBody + (*CheckoutSubscriptionBody)(nil), // 148: raystack.frontier.v1beta1.CheckoutSubscriptionBody + (*CheckoutProductBody)(nil), // 149: raystack.frontier.v1beta1.CheckoutProductBody + (*Subscription)(nil), // 150: raystack.frontier.v1beta1.Subscription + (*Product)(nil), // 151: raystack.frontier.v1beta1.Product + (*Invoice)(nil), // 152: raystack.frontier.v1beta1.Invoice + (*BillingAccount)(nil), // 153: raystack.frontier.v1beta1.BillingAccount + (*Webhook)(nil), // 154: raystack.frontier.v1beta1.Webhook + (*RQLRequest)(nil), // 155: raystack.frontier.v1beta1.RQLRequest + (*OrganizationKyc)(nil), // 156: raystack.frontier.v1beta1.OrganizationKyc + (*RQLQueryPaginationResponse)(nil), // 157: raystack.frontier.v1beta1.RQLQueryPaginationResponse + (*RQLQueryGroupResponse)(nil), // 158: raystack.frontier.v1beta1.RQLQueryGroupResponse + (*Prospect)(nil), // 159: raystack.frontier.v1beta1.Prospect + (Prospect_Status)(0), // 160: raystack.frontier.v1beta1.Prospect.Status + (*Session)(nil), // 161: raystack.frontier.v1beta1.Session + (*RQLExportRequest)(nil), // 162: raystack.frontier.v1beta1.RQLExportRequest + (*AuditRecord)(nil), // 163: raystack.frontier.v1beta1.AuditRecord + (*timestamppb.Timestamp)(nil), // 164: google.protobuf.Timestamp + (*PATScope)(nil), // 165: raystack.frontier.v1beta1.PATScope + (*ExportOrganizationsRequest)(nil), // 166: raystack.frontier.v1beta1.ExportOrganizationsRequest + (*httpbody.HttpBody)(nil), // 167: google.api.HttpBody } var file_raystack_frontier_v1beta1_admin_proto_depIdxs = []int32{ - 131, // 0: raystack.frontier.v1beta1.ListAllUsersResponse.users:type_name -> raystack.frontier.v1beta1.User - 132, // 1: raystack.frontier.v1beta1.ListAllServiceUsersResponse.service_users:type_name -> raystack.frontier.v1beta1.ServiceUser - 133, // 2: raystack.frontier.v1beta1.ListGroupsResponse.groups:type_name -> raystack.frontier.v1beta1.Group - 134, // 3: raystack.frontier.v1beta1.ListAllOrganizationsResponse.organizations:type_name -> raystack.frontier.v1beta1.Organization - 135, // 4: raystack.frontier.v1beta1.ListProjectsResponse.projects:type_name -> raystack.frontier.v1beta1.Project - 136, // 5: raystack.frontier.v1beta1.ListRelationsResponse.relations:type_name -> raystack.frontier.v1beta1.Relation - 137, // 6: raystack.frontier.v1beta1.ListResourcesResponse.resources:type_name -> raystack.frontier.v1beta1.Resource - 138, // 7: raystack.frontier.v1beta1.CreateRoleRequest.body:type_name -> raystack.frontier.v1beta1.RoleRequestBody - 139, // 8: raystack.frontier.v1beta1.CreateRoleResponse.role:type_name -> raystack.frontier.v1beta1.Role - 138, // 9: raystack.frontier.v1beta1.UpdateRoleRequest.body:type_name -> raystack.frontier.v1beta1.RoleRequestBody - 139, // 10: raystack.frontier.v1beta1.UpdateRoleResponse.role:type_name -> raystack.frontier.v1beta1.Role - 140, // 11: raystack.frontier.v1beta1.PermissionRequestBody.metadata:type_name -> google.protobuf.Struct + 135, // 0: raystack.frontier.v1beta1.ListAllUsersResponse.users:type_name -> raystack.frontier.v1beta1.User + 136, // 1: raystack.frontier.v1beta1.ListAllServiceUsersResponse.service_users:type_name -> raystack.frontier.v1beta1.ServiceUser + 137, // 2: raystack.frontier.v1beta1.ListGroupsResponse.groups:type_name -> raystack.frontier.v1beta1.Group + 138, // 3: raystack.frontier.v1beta1.ListAllOrganizationsResponse.organizations:type_name -> raystack.frontier.v1beta1.Organization + 139, // 4: raystack.frontier.v1beta1.ListProjectsResponse.projects:type_name -> raystack.frontier.v1beta1.Project + 140, // 5: raystack.frontier.v1beta1.ListRelationsResponse.relations:type_name -> raystack.frontier.v1beta1.Relation + 141, // 6: raystack.frontier.v1beta1.ListResourcesResponse.resources:type_name -> raystack.frontier.v1beta1.Resource + 142, // 7: raystack.frontier.v1beta1.CreateRoleRequest.body:type_name -> raystack.frontier.v1beta1.RoleRequestBody + 143, // 8: raystack.frontier.v1beta1.CreateRoleResponse.role:type_name -> raystack.frontier.v1beta1.Role + 142, // 9: raystack.frontier.v1beta1.UpdateRoleRequest.body:type_name -> raystack.frontier.v1beta1.RoleRequestBody + 143, // 10: raystack.frontier.v1beta1.UpdateRoleResponse.role:type_name -> raystack.frontier.v1beta1.Role + 144, // 11: raystack.frontier.v1beta1.PermissionRequestBody.metadata:type_name -> google.protobuf.Struct 20, // 12: raystack.frontier.v1beta1.CreatePermissionRequest.bodies:type_name -> raystack.frontier.v1beta1.PermissionRequestBody - 141, // 13: raystack.frontier.v1beta1.CreatePermissionResponse.permissions:type_name -> raystack.frontier.v1beta1.Permission + 145, // 13: raystack.frontier.v1beta1.CreatePermissionResponse.permissions:type_name -> raystack.frontier.v1beta1.Permission 20, // 14: raystack.frontier.v1beta1.UpdatePermissionRequest.body:type_name -> raystack.frontier.v1beta1.PermissionRequestBody - 141, // 15: raystack.frontier.v1beta1.UpdatePermissionResponse.permission:type_name -> raystack.frontier.v1beta1.Permission - 142, // 16: raystack.frontier.v1beta1.ListPreferencesResponse.preferences:type_name -> raystack.frontier.v1beta1.Preference - 143, // 17: raystack.frontier.v1beta1.CreatePreferencesRequest.preferences:type_name -> raystack.frontier.v1beta1.PreferenceRequestBody - 142, // 18: raystack.frontier.v1beta1.CreatePreferencesResponse.preference:type_name -> raystack.frontier.v1beta1.Preference - 131, // 19: raystack.frontier.v1beta1.ListPlatformUsersResponse.users:type_name -> raystack.frontier.v1beta1.User - 132, // 20: raystack.frontier.v1beta1.ListPlatformUsersResponse.serviceusers:type_name -> raystack.frontier.v1beta1.ServiceUser - 144, // 21: raystack.frontier.v1beta1.DelegatedCheckoutRequest.subscription_body:type_name -> raystack.frontier.v1beta1.CheckoutSubscriptionBody - 145, // 22: raystack.frontier.v1beta1.DelegatedCheckoutRequest.product_body:type_name -> raystack.frontier.v1beta1.CheckoutProductBody - 146, // 23: raystack.frontier.v1beta1.DelegatedCheckoutResponse.subscription:type_name -> raystack.frontier.v1beta1.Subscription - 147, // 24: raystack.frontier.v1beta1.DelegatedCheckoutResponse.product:type_name -> raystack.frontier.v1beta1.Product - 148, // 25: raystack.frontier.v1beta1.ListAllInvoicesResponse.invoices:type_name -> raystack.frontier.v1beta1.Invoice - 149, // 26: raystack.frontier.v1beta1.ListAllBillingAccountsResponse.billing_accounts:type_name -> raystack.frontier.v1beta1.BillingAccount - 117, // 27: raystack.frontier.v1beta1.WebhookRequestBody.headers:type_name -> raystack.frontier.v1beta1.WebhookRequestBody.HeadersEntry - 140, // 28: raystack.frontier.v1beta1.WebhookRequestBody.metadata:type_name -> google.protobuf.Struct + 145, // 15: raystack.frontier.v1beta1.UpdatePermissionResponse.permission:type_name -> raystack.frontier.v1beta1.Permission + 146, // 16: raystack.frontier.v1beta1.ListPreferencesResponse.preferences:type_name -> raystack.frontier.v1beta1.Preference + 147, // 17: raystack.frontier.v1beta1.CreatePreferencesRequest.preferences:type_name -> raystack.frontier.v1beta1.PreferenceRequestBody + 146, // 18: raystack.frontier.v1beta1.CreatePreferencesResponse.preference:type_name -> raystack.frontier.v1beta1.Preference + 135, // 19: raystack.frontier.v1beta1.ListPlatformUsersResponse.users:type_name -> raystack.frontier.v1beta1.User + 136, // 20: raystack.frontier.v1beta1.ListPlatformUsersResponse.serviceusers:type_name -> raystack.frontier.v1beta1.ServiceUser + 148, // 21: raystack.frontier.v1beta1.DelegatedCheckoutRequest.subscription_body:type_name -> raystack.frontier.v1beta1.CheckoutSubscriptionBody + 149, // 22: raystack.frontier.v1beta1.DelegatedCheckoutRequest.product_body:type_name -> raystack.frontier.v1beta1.CheckoutProductBody + 150, // 23: raystack.frontier.v1beta1.DelegatedCheckoutResponse.subscription:type_name -> raystack.frontier.v1beta1.Subscription + 151, // 24: raystack.frontier.v1beta1.DelegatedCheckoutResponse.product:type_name -> raystack.frontier.v1beta1.Product + 152, // 25: raystack.frontier.v1beta1.ListAllInvoicesResponse.invoices:type_name -> raystack.frontier.v1beta1.Invoice + 153, // 26: raystack.frontier.v1beta1.ListAllBillingAccountsResponse.billing_accounts:type_name -> raystack.frontier.v1beta1.BillingAccount + 119, // 27: raystack.frontier.v1beta1.WebhookRequestBody.headers:type_name -> raystack.frontier.v1beta1.WebhookRequestBody.HeadersEntry + 144, // 28: raystack.frontier.v1beta1.WebhookRequestBody.metadata:type_name -> google.protobuf.Struct 49, // 29: raystack.frontier.v1beta1.CreateWebhookRequest.body:type_name -> raystack.frontier.v1beta1.WebhookRequestBody - 150, // 30: raystack.frontier.v1beta1.CreateWebhookResponse.webhook:type_name -> raystack.frontier.v1beta1.Webhook + 154, // 30: raystack.frontier.v1beta1.CreateWebhookResponse.webhook:type_name -> raystack.frontier.v1beta1.Webhook 49, // 31: raystack.frontier.v1beta1.UpdateWebhookRequest.body:type_name -> raystack.frontier.v1beta1.WebhookRequestBody - 150, // 32: raystack.frontier.v1beta1.UpdateWebhookResponse.webhook:type_name -> raystack.frontier.v1beta1.Webhook - 150, // 33: raystack.frontier.v1beta1.ListWebhooksResponse.webhooks:type_name -> raystack.frontier.v1beta1.Webhook - 151, // 34: raystack.frontier.v1beta1.SearchOrganizationsRequest.query:type_name -> raystack.frontier.v1beta1.RQLRequest - 152, // 35: raystack.frontier.v1beta1.SetOrganizationKycResponse.organization_kyc:type_name -> raystack.frontier.v1beta1.OrganizationKyc - 152, // 36: raystack.frontier.v1beta1.ListOrganizationsKycResponse.organizations_kyc:type_name -> raystack.frontier.v1beta1.OrganizationKyc - 118, // 37: raystack.frontier.v1beta1.SearchOrganizationsResponse.organizations:type_name -> raystack.frontier.v1beta1.SearchOrganizationsResponse.OrganizationResult - 153, // 38: raystack.frontier.v1beta1.SearchOrganizationsResponse.pagination:type_name -> raystack.frontier.v1beta1.RQLQueryPaginationResponse - 154, // 39: raystack.frontier.v1beta1.SearchOrganizationsResponse.group:type_name -> raystack.frontier.v1beta1.RQLQueryGroupResponse - 151, // 40: raystack.frontier.v1beta1.ListProspectsRequest.query:type_name -> raystack.frontier.v1beta1.RQLRequest - 155, // 41: raystack.frontier.v1beta1.ListProspectsResponse.prospects:type_name -> raystack.frontier.v1beta1.Prospect - 153, // 42: raystack.frontier.v1beta1.ListProspectsResponse.pagination:type_name -> raystack.frontier.v1beta1.RQLQueryPaginationResponse - 154, // 43: raystack.frontier.v1beta1.ListProspectsResponse.group:type_name -> raystack.frontier.v1beta1.RQLQueryGroupResponse - 155, // 44: raystack.frontier.v1beta1.GetProspectResponse.prospect:type_name -> raystack.frontier.v1beta1.Prospect - 156, // 45: raystack.frontier.v1beta1.UpdateProspectRequest.status:type_name -> raystack.frontier.v1beta1.Prospect.Status - 140, // 46: raystack.frontier.v1beta1.UpdateProspectRequest.metadata:type_name -> google.protobuf.Struct - 155, // 47: raystack.frontier.v1beta1.UpdateProspectResponse.prospect:type_name -> raystack.frontier.v1beta1.Prospect - 156, // 48: raystack.frontier.v1beta1.CreateProspectRequest.status:type_name -> raystack.frontier.v1beta1.Prospect.Status - 140, // 49: raystack.frontier.v1beta1.CreateProspectRequest.metadata:type_name -> google.protobuf.Struct - 155, // 50: raystack.frontier.v1beta1.CreateProspectResponse.prospect:type_name -> raystack.frontier.v1beta1.Prospect - 151, // 51: raystack.frontier.v1beta1.SearchOrganizationUsersRequest.query:type_name -> raystack.frontier.v1beta1.RQLRequest - 119, // 52: raystack.frontier.v1beta1.SearchOrganizationUsersResponse.org_users:type_name -> raystack.frontier.v1beta1.SearchOrganizationUsersResponse.OrganizationUser - 153, // 53: raystack.frontier.v1beta1.SearchOrganizationUsersResponse.pagination:type_name -> raystack.frontier.v1beta1.RQLQueryPaginationResponse - 154, // 54: raystack.frontier.v1beta1.SearchOrganizationUsersResponse.group:type_name -> raystack.frontier.v1beta1.RQLQueryGroupResponse - 151, // 55: raystack.frontier.v1beta1.SearchOrganizationProjectsRequest.query:type_name -> raystack.frontier.v1beta1.RQLRequest - 120, // 56: raystack.frontier.v1beta1.SearchOrganizationProjectsResponse.org_projects:type_name -> raystack.frontier.v1beta1.SearchOrganizationProjectsResponse.OrganizationProject - 153, // 57: raystack.frontier.v1beta1.SearchOrganizationProjectsResponse.pagination:type_name -> raystack.frontier.v1beta1.RQLQueryPaginationResponse - 154, // 58: raystack.frontier.v1beta1.SearchOrganizationProjectsResponse.group:type_name -> raystack.frontier.v1beta1.RQLQueryGroupResponse - 151, // 59: raystack.frontier.v1beta1.SearchProjectUsersRequest.query:type_name -> raystack.frontier.v1beta1.RQLRequest - 121, // 60: raystack.frontier.v1beta1.SearchProjectUsersResponse.project_users:type_name -> raystack.frontier.v1beta1.SearchProjectUsersResponse.ProjectUser - 153, // 61: raystack.frontier.v1beta1.SearchProjectUsersResponse.pagination:type_name -> raystack.frontier.v1beta1.RQLQueryPaginationResponse - 154, // 62: raystack.frontier.v1beta1.SearchProjectUsersResponse.group:type_name -> raystack.frontier.v1beta1.RQLQueryGroupResponse - 151, // 63: raystack.frontier.v1beta1.SearchOrganizationInvoicesRequest.query:type_name -> raystack.frontier.v1beta1.RQLRequest - 122, // 64: raystack.frontier.v1beta1.SearchOrganizationInvoicesResponse.organization_invoices:type_name -> raystack.frontier.v1beta1.SearchOrganizationInvoicesResponse.OrganizationInvoice - 153, // 65: raystack.frontier.v1beta1.SearchOrganizationInvoicesResponse.pagination:type_name -> raystack.frontier.v1beta1.RQLQueryPaginationResponse - 154, // 66: raystack.frontier.v1beta1.SearchOrganizationInvoicesResponse.group:type_name -> raystack.frontier.v1beta1.RQLQueryGroupResponse - 151, // 67: raystack.frontier.v1beta1.SearchOrganizationTokensRequest.query:type_name -> raystack.frontier.v1beta1.RQLRequest - 123, // 68: raystack.frontier.v1beta1.SearchOrganizationTokensResponse.organization_tokens:type_name -> raystack.frontier.v1beta1.SearchOrganizationTokensResponse.OrganizationToken - 153, // 69: raystack.frontier.v1beta1.SearchOrganizationTokensResponse.pagination:type_name -> raystack.frontier.v1beta1.RQLQueryPaginationResponse - 154, // 70: raystack.frontier.v1beta1.SearchOrganizationTokensResponse.group:type_name -> raystack.frontier.v1beta1.RQLQueryGroupResponse - 151, // 71: raystack.frontier.v1beta1.SearchOrganizationServiceUserCredentialsRequest.query:type_name -> raystack.frontier.v1beta1.RQLRequest - 124, // 72: raystack.frontier.v1beta1.SearchOrganizationServiceUserCredentialsResponse.organization_serviceuser_credentials:type_name -> raystack.frontier.v1beta1.SearchOrganizationServiceUserCredentialsResponse.OrganizationServiceUserCredential - 153, // 73: raystack.frontier.v1beta1.SearchOrganizationServiceUserCredentialsResponse.pagination:type_name -> raystack.frontier.v1beta1.RQLQueryPaginationResponse - 154, // 74: raystack.frontier.v1beta1.SearchOrganizationServiceUserCredentialsResponse.group:type_name -> raystack.frontier.v1beta1.RQLQueryGroupResponse - 151, // 75: raystack.frontier.v1beta1.SearchUsersRequest.query:type_name -> raystack.frontier.v1beta1.RQLRequest - 131, // 76: raystack.frontier.v1beta1.SearchUsersResponse.users:type_name -> raystack.frontier.v1beta1.User - 153, // 77: raystack.frontier.v1beta1.SearchUsersResponse.pagination:type_name -> raystack.frontier.v1beta1.RQLQueryPaginationResponse - 154, // 78: raystack.frontier.v1beta1.SearchUsersResponse.group:type_name -> raystack.frontier.v1beta1.RQLQueryGroupResponse - 151, // 79: raystack.frontier.v1beta1.SearchUserOrganizationsRequest.query:type_name -> raystack.frontier.v1beta1.RQLRequest - 125, // 80: raystack.frontier.v1beta1.SearchUserOrganizationsResponse.user_organizations:type_name -> raystack.frontier.v1beta1.SearchUserOrganizationsResponse.UserOrganization - 153, // 81: raystack.frontier.v1beta1.SearchUserOrganizationsResponse.pagination:type_name -> raystack.frontier.v1beta1.RQLQueryPaginationResponse - 154, // 82: raystack.frontier.v1beta1.SearchUserOrganizationsResponse.group:type_name -> raystack.frontier.v1beta1.RQLQueryGroupResponse - 151, // 83: raystack.frontier.v1beta1.SearchUserProjectsRequest.query:type_name -> raystack.frontier.v1beta1.RQLRequest - 126, // 84: raystack.frontier.v1beta1.SearchUserProjectsResponse.user_projects:type_name -> raystack.frontier.v1beta1.SearchUserProjectsResponse.UserProject - 153, // 85: raystack.frontier.v1beta1.SearchUserProjectsResponse.pagination:type_name -> raystack.frontier.v1beta1.RQLQueryPaginationResponse - 154, // 86: raystack.frontier.v1beta1.SearchUserProjectsResponse.group:type_name -> raystack.frontier.v1beta1.RQLQueryGroupResponse - 127, // 87: raystack.frontier.v1beta1.AdminCreateOrganizationRequest.body:type_name -> raystack.frontier.v1beta1.AdminCreateOrganizationRequest.OrganizationRequestBody - 134, // 88: raystack.frontier.v1beta1.AdminCreateOrganizationResponse.organization:type_name -> raystack.frontier.v1beta1.Organization - 151, // 89: raystack.frontier.v1beta1.SearchInvoicesRequest.query:type_name -> raystack.frontier.v1beta1.RQLRequest - 128, // 90: raystack.frontier.v1beta1.SearchInvoicesResponse.invoices:type_name -> raystack.frontier.v1beta1.SearchInvoicesResponse.Invoice - 153, // 91: raystack.frontier.v1beta1.SearchInvoicesResponse.pagination:type_name -> raystack.frontier.v1beta1.RQLQueryPaginationResponse - 154, // 92: raystack.frontier.v1beta1.SearchInvoicesResponse.group:type_name -> raystack.frontier.v1beta1.RQLQueryGroupResponse - 151, // 93: raystack.frontier.v1beta1.SearchOrganizationServiceUsersRequest.query:type_name -> raystack.frontier.v1beta1.RQLRequest - 130, // 94: raystack.frontier.v1beta1.SearchOrganizationServiceUsersResponse.organization_service_users:type_name -> raystack.frontier.v1beta1.SearchOrganizationServiceUsersResponse.OrganizationServiceUser - 153, // 95: raystack.frontier.v1beta1.SearchOrganizationServiceUsersResponse.pagination:type_name -> raystack.frontier.v1beta1.RQLQueryPaginationResponse - 154, // 96: raystack.frontier.v1beta1.SearchOrganizationServiceUsersResponse.group:type_name -> raystack.frontier.v1beta1.RQLQueryGroupResponse - 131, // 97: raystack.frontier.v1beta1.GetCurrentAdminUserResponse.user:type_name -> raystack.frontier.v1beta1.User - 132, // 98: raystack.frontier.v1beta1.GetCurrentAdminUserResponse.service_user:type_name -> raystack.frontier.v1beta1.ServiceUser - 157, // 99: raystack.frontier.v1beta1.ListUserSessionsResponse.sessions:type_name -> raystack.frontier.v1beta1.Session - 151, // 100: raystack.frontier.v1beta1.ListAuditRecordsRequest.query:type_name -> raystack.frontier.v1beta1.RQLRequest - 158, // 101: raystack.frontier.v1beta1.ExportAuditRecordsRequest.query:type_name -> raystack.frontier.v1beta1.RQLExportRequest - 159, // 102: raystack.frontier.v1beta1.ListAuditRecordsResponse.audit_records:type_name -> raystack.frontier.v1beta1.AuditRecord - 153, // 103: raystack.frontier.v1beta1.ListAuditRecordsResponse.pagination:type_name -> raystack.frontier.v1beta1.RQLQueryPaginationResponse - 154, // 104: raystack.frontier.v1beta1.ListAuditRecordsResponse.group:type_name -> raystack.frontier.v1beta1.RQLQueryGroupResponse - 160, // 105: raystack.frontier.v1beta1.SearchOrganizationsResponse.OrganizationResult.created_at:type_name -> google.protobuf.Timestamp - 160, // 106: raystack.frontier.v1beta1.SearchOrganizationsResponse.OrganizationResult.updated_at:type_name -> google.protobuf.Timestamp - 160, // 107: raystack.frontier.v1beta1.SearchOrganizationsResponse.OrganizationResult.subscription_cycle_end_at:type_name -> google.protobuf.Timestamp - 160, // 108: raystack.frontier.v1beta1.SearchOrganizationUsersResponse.OrganizationUser.org_joined_at:type_name -> google.protobuf.Timestamp - 160, // 109: raystack.frontier.v1beta1.SearchOrganizationProjectsResponse.OrganizationProject.created_at:type_name -> google.protobuf.Timestamp - 160, // 110: raystack.frontier.v1beta1.SearchOrganizationInvoicesResponse.OrganizationInvoice.created_at:type_name -> google.protobuf.Timestamp - 160, // 111: raystack.frontier.v1beta1.SearchOrganizationTokensResponse.OrganizationToken.created_at:type_name -> google.protobuf.Timestamp - 160, // 112: raystack.frontier.v1beta1.SearchOrganizationServiceUserCredentialsResponse.OrganizationServiceUserCredential.created_at:type_name -> google.protobuf.Timestamp - 160, // 113: raystack.frontier.v1beta1.SearchUserOrganizationsResponse.UserOrganization.org_joined_on:type_name -> google.protobuf.Timestamp - 160, // 114: raystack.frontier.v1beta1.SearchUserProjectsResponse.UserProject.project_created_on:type_name -> google.protobuf.Timestamp - 140, // 115: raystack.frontier.v1beta1.AdminCreateOrganizationRequest.OrganizationRequestBody.metadata:type_name -> google.protobuf.Struct - 160, // 116: raystack.frontier.v1beta1.SearchInvoicesResponse.Invoice.created_at:type_name -> google.protobuf.Timestamp - 129, // 117: raystack.frontier.v1beta1.SearchOrganizationServiceUsersResponse.OrganizationServiceUser.projects:type_name -> raystack.frontier.v1beta1.SearchOrganizationServiceUsersResponse.Project - 160, // 118: raystack.frontier.v1beta1.SearchOrganizationServiceUsersResponse.OrganizationServiceUser.created_at:type_name -> google.protobuf.Timestamp - 0, // 119: raystack.frontier.v1beta1.AdminService.ListAllUsers:input_type -> raystack.frontier.v1beta1.ListAllUsersRequest - 2, // 120: raystack.frontier.v1beta1.AdminService.ListAllServiceUsers:input_type -> raystack.frontier.v1beta1.ListAllServiceUsersRequest - 4, // 121: raystack.frontier.v1beta1.AdminService.ListGroups:input_type -> raystack.frontier.v1beta1.ListGroupsRequest - 6, // 122: raystack.frontier.v1beta1.AdminService.ListAllOrganizations:input_type -> raystack.frontier.v1beta1.ListAllOrganizationsRequest - 102, // 123: raystack.frontier.v1beta1.AdminService.AdminCreateOrganization:input_type -> raystack.frontier.v1beta1.AdminCreateOrganizationRequest - 65, // 124: raystack.frontier.v1beta1.AdminService.SearchOrganizations:input_type -> raystack.frontier.v1beta1.SearchOrganizationsRequest - 80, // 125: raystack.frontier.v1beta1.AdminService.SearchOrganizationUsers:input_type -> raystack.frontier.v1beta1.SearchOrganizationUsersRequest - 86, // 126: raystack.frontier.v1beta1.AdminService.SearchProjectUsers:input_type -> raystack.frontier.v1beta1.SearchProjectUsersRequest - 83, // 127: raystack.frontier.v1beta1.AdminService.SearchOrganizationProjects:input_type -> raystack.frontier.v1beta1.SearchOrganizationProjectsRequest - 88, // 128: raystack.frontier.v1beta1.AdminService.SearchOrganizationInvoices:input_type -> raystack.frontier.v1beta1.SearchOrganizationInvoicesRequest - 90, // 129: raystack.frontier.v1beta1.AdminService.SearchOrganizationTokens:input_type -> raystack.frontier.v1beta1.SearchOrganizationTokensRequest - 93, // 130: raystack.frontier.v1beta1.AdminService.SearchOrganizationServiceUserCredentials:input_type -> raystack.frontier.v1beta1.SearchOrganizationServiceUserCredentialsRequest - 106, // 131: raystack.frontier.v1beta1.AdminService.SearchOrganizationServiceUsers:input_type -> raystack.frontier.v1beta1.SearchOrganizationServiceUsersRequest - 161, // 132: raystack.frontier.v1beta1.AdminService.ExportOrganizations:input_type -> raystack.frontier.v1beta1.ExportOrganizationsRequest - 82, // 133: raystack.frontier.v1beta1.AdminService.ExportOrganizationUsers:input_type -> raystack.frontier.v1beta1.ExportOrganizationUsersRequest - 85, // 134: raystack.frontier.v1beta1.AdminService.ExportOrganizationProjects:input_type -> raystack.frontier.v1beta1.ExportOrganizationProjectsRequest - 92, // 135: raystack.frontier.v1beta1.AdminService.ExportOrganizationTokens:input_type -> raystack.frontier.v1beta1.ExportOrganizationTokensRequest - 97, // 136: raystack.frontier.v1beta1.AdminService.ExportUsers:input_type -> raystack.frontier.v1beta1.ExportUsersRequest - 95, // 137: raystack.frontier.v1beta1.AdminService.SearchUsers:input_type -> raystack.frontier.v1beta1.SearchUsersRequest - 98, // 138: raystack.frontier.v1beta1.AdminService.SearchUserOrganizations:input_type -> raystack.frontier.v1beta1.SearchUserOrganizationsRequest - 100, // 139: raystack.frontier.v1beta1.AdminService.SearchUserProjects:input_type -> raystack.frontier.v1beta1.SearchUserProjectsRequest - 64, // 140: raystack.frontier.v1beta1.AdminService.SetOrganizationKyc:input_type -> raystack.frontier.v1beta1.SetOrganizationKycRequest - 67, // 141: raystack.frontier.v1beta1.AdminService.ListOrganizationsKyc:input_type -> raystack.frontier.v1beta1.ListOrganizationsKycRequest - 8, // 142: raystack.frontier.v1beta1.AdminService.ListProjects:input_type -> raystack.frontier.v1beta1.ListProjectsRequest - 10, // 143: raystack.frontier.v1beta1.AdminService.ListRelations:input_type -> raystack.frontier.v1beta1.ListRelationsRequest - 12, // 144: raystack.frontier.v1beta1.AdminService.ListResources:input_type -> raystack.frontier.v1beta1.ListResourcesRequest - 14, // 145: raystack.frontier.v1beta1.AdminService.CreateRole:input_type -> raystack.frontier.v1beta1.CreateRoleRequest - 16, // 146: raystack.frontier.v1beta1.AdminService.UpdateRole:input_type -> raystack.frontier.v1beta1.UpdateRoleRequest - 18, // 147: raystack.frontier.v1beta1.AdminService.DeleteRole:input_type -> raystack.frontier.v1beta1.DeleteRoleRequest - 21, // 148: raystack.frontier.v1beta1.AdminService.CreatePermission:input_type -> raystack.frontier.v1beta1.CreatePermissionRequest - 23, // 149: raystack.frontier.v1beta1.AdminService.UpdatePermission:input_type -> raystack.frontier.v1beta1.UpdatePermissionRequest - 25, // 150: raystack.frontier.v1beta1.AdminService.DeletePermission:input_type -> raystack.frontier.v1beta1.DeletePermissionRequest - 27, // 151: raystack.frontier.v1beta1.AdminService.ListPreferences:input_type -> raystack.frontier.v1beta1.ListPreferencesRequest - 29, // 152: raystack.frontier.v1beta1.AdminService.CreatePreferences:input_type -> raystack.frontier.v1beta1.CreatePreferencesRequest - 31, // 153: raystack.frontier.v1beta1.AdminService.CheckFederatedResourcePermission:input_type -> raystack.frontier.v1beta1.CheckFederatedResourcePermissionRequest - 33, // 154: raystack.frontier.v1beta1.AdminService.AddPlatformUser:input_type -> raystack.frontier.v1beta1.AddPlatformUserRequest - 35, // 155: raystack.frontier.v1beta1.AdminService.ListPlatformUsers:input_type -> raystack.frontier.v1beta1.ListPlatformUsersRequest - 37, // 156: raystack.frontier.v1beta1.AdminService.RemovePlatformUser:input_type -> raystack.frontier.v1beta1.RemovePlatformUserRequest - 39, // 157: raystack.frontier.v1beta1.AdminService.DelegatedCheckout:input_type -> raystack.frontier.v1beta1.DelegatedCheckoutRequest - 41, // 158: raystack.frontier.v1beta1.AdminService.ListAllInvoices:input_type -> raystack.frontier.v1beta1.ListAllInvoicesRequest - 43, // 159: raystack.frontier.v1beta1.AdminService.GenerateInvoices:input_type -> raystack.frontier.v1beta1.GenerateInvoicesRequest - 45, // 160: raystack.frontier.v1beta1.AdminService.ListAllBillingAccounts:input_type -> raystack.frontier.v1beta1.ListAllBillingAccountsRequest - 47, // 161: raystack.frontier.v1beta1.AdminService.RevertBillingUsage:input_type -> raystack.frontier.v1beta1.RevertBillingUsageRequest - 50, // 162: raystack.frontier.v1beta1.AdminService.CreateWebhook:input_type -> raystack.frontier.v1beta1.CreateWebhookRequest - 52, // 163: raystack.frontier.v1beta1.AdminService.UpdateWebhook:input_type -> raystack.frontier.v1beta1.UpdateWebhookRequest - 54, // 164: raystack.frontier.v1beta1.AdminService.DeleteWebhook:input_type -> raystack.frontier.v1beta1.DeleteWebhookRequest - 56, // 165: raystack.frontier.v1beta1.AdminService.ListWebhooks:input_type -> raystack.frontier.v1beta1.ListWebhooksRequest - 58, // 166: raystack.frontier.v1beta1.AdminService.UpdateBillingAccountLimits:input_type -> raystack.frontier.v1beta1.UpdateBillingAccountLimitsRequest - 60, // 167: raystack.frontier.v1beta1.AdminService.GetBillingAccountDetails:input_type -> raystack.frontier.v1beta1.GetBillingAccountDetailsRequest - 62, // 168: raystack.frontier.v1beta1.AdminService.UpdateBillingAccountDetails:input_type -> raystack.frontier.v1beta1.UpdateBillingAccountDetailsRequest - 78, // 169: raystack.frontier.v1beta1.AdminService.CreateProspect:input_type -> raystack.frontier.v1beta1.CreateProspectRequest - 70, // 170: raystack.frontier.v1beta1.AdminService.ListProspects:input_type -> raystack.frontier.v1beta1.ListProspectsRequest - 72, // 171: raystack.frontier.v1beta1.AdminService.GetProspect:input_type -> raystack.frontier.v1beta1.GetProspectRequest - 74, // 172: raystack.frontier.v1beta1.AdminService.UpdateProspect:input_type -> raystack.frontier.v1beta1.UpdateProspectRequest - 76, // 173: raystack.frontier.v1beta1.AdminService.DeleteProspect:input_type -> raystack.frontier.v1beta1.DeleteProspectRequest - 104, // 174: raystack.frontier.v1beta1.AdminService.SearchInvoices:input_type -> raystack.frontier.v1beta1.SearchInvoicesRequest - 108, // 175: raystack.frontier.v1beta1.AdminService.GetCurrentAdminUser:input_type -> raystack.frontier.v1beta1.GetCurrentAdminUserRequest - 110, // 176: raystack.frontier.v1beta1.AdminService.ListUserSessions:input_type -> raystack.frontier.v1beta1.ListUserSessionsRequest - 112, // 177: raystack.frontier.v1beta1.AdminService.RevokeUserSession:input_type -> raystack.frontier.v1beta1.RevokeUserSessionRequest - 114, // 178: raystack.frontier.v1beta1.AdminService.ListAuditRecords:input_type -> raystack.frontier.v1beta1.ListAuditRecordsRequest - 115, // 179: raystack.frontier.v1beta1.AdminService.ExportAuditRecords:input_type -> raystack.frontier.v1beta1.ExportAuditRecordsRequest - 1, // 180: raystack.frontier.v1beta1.AdminService.ListAllUsers:output_type -> raystack.frontier.v1beta1.ListAllUsersResponse - 3, // 181: raystack.frontier.v1beta1.AdminService.ListAllServiceUsers:output_type -> raystack.frontier.v1beta1.ListAllServiceUsersResponse - 5, // 182: raystack.frontier.v1beta1.AdminService.ListGroups:output_type -> raystack.frontier.v1beta1.ListGroupsResponse - 7, // 183: raystack.frontier.v1beta1.AdminService.ListAllOrganizations:output_type -> raystack.frontier.v1beta1.ListAllOrganizationsResponse - 103, // 184: raystack.frontier.v1beta1.AdminService.AdminCreateOrganization:output_type -> raystack.frontier.v1beta1.AdminCreateOrganizationResponse - 69, // 185: raystack.frontier.v1beta1.AdminService.SearchOrganizations:output_type -> raystack.frontier.v1beta1.SearchOrganizationsResponse - 81, // 186: raystack.frontier.v1beta1.AdminService.SearchOrganizationUsers:output_type -> raystack.frontier.v1beta1.SearchOrganizationUsersResponse - 87, // 187: raystack.frontier.v1beta1.AdminService.SearchProjectUsers:output_type -> raystack.frontier.v1beta1.SearchProjectUsersResponse - 84, // 188: raystack.frontier.v1beta1.AdminService.SearchOrganizationProjects:output_type -> raystack.frontier.v1beta1.SearchOrganizationProjectsResponse - 89, // 189: raystack.frontier.v1beta1.AdminService.SearchOrganizationInvoices:output_type -> raystack.frontier.v1beta1.SearchOrganizationInvoicesResponse - 91, // 190: raystack.frontier.v1beta1.AdminService.SearchOrganizationTokens:output_type -> raystack.frontier.v1beta1.SearchOrganizationTokensResponse - 94, // 191: raystack.frontier.v1beta1.AdminService.SearchOrganizationServiceUserCredentials:output_type -> raystack.frontier.v1beta1.SearchOrganizationServiceUserCredentialsResponse - 107, // 192: raystack.frontier.v1beta1.AdminService.SearchOrganizationServiceUsers:output_type -> raystack.frontier.v1beta1.SearchOrganizationServiceUsersResponse - 162, // 193: raystack.frontier.v1beta1.AdminService.ExportOrganizations:output_type -> google.api.HttpBody - 162, // 194: raystack.frontier.v1beta1.AdminService.ExportOrganizationUsers:output_type -> google.api.HttpBody - 162, // 195: raystack.frontier.v1beta1.AdminService.ExportOrganizationProjects:output_type -> google.api.HttpBody - 162, // 196: raystack.frontier.v1beta1.AdminService.ExportOrganizationTokens:output_type -> google.api.HttpBody - 162, // 197: raystack.frontier.v1beta1.AdminService.ExportUsers:output_type -> google.api.HttpBody - 96, // 198: raystack.frontier.v1beta1.AdminService.SearchUsers:output_type -> raystack.frontier.v1beta1.SearchUsersResponse - 99, // 199: raystack.frontier.v1beta1.AdminService.SearchUserOrganizations:output_type -> raystack.frontier.v1beta1.SearchUserOrganizationsResponse - 101, // 200: raystack.frontier.v1beta1.AdminService.SearchUserProjects:output_type -> raystack.frontier.v1beta1.SearchUserProjectsResponse - 66, // 201: raystack.frontier.v1beta1.AdminService.SetOrganizationKyc:output_type -> raystack.frontier.v1beta1.SetOrganizationKycResponse - 68, // 202: raystack.frontier.v1beta1.AdminService.ListOrganizationsKyc:output_type -> raystack.frontier.v1beta1.ListOrganizationsKycResponse - 9, // 203: raystack.frontier.v1beta1.AdminService.ListProjects:output_type -> raystack.frontier.v1beta1.ListProjectsResponse - 11, // 204: raystack.frontier.v1beta1.AdminService.ListRelations:output_type -> raystack.frontier.v1beta1.ListRelationsResponse - 13, // 205: raystack.frontier.v1beta1.AdminService.ListResources:output_type -> raystack.frontier.v1beta1.ListResourcesResponse - 15, // 206: raystack.frontier.v1beta1.AdminService.CreateRole:output_type -> raystack.frontier.v1beta1.CreateRoleResponse - 17, // 207: raystack.frontier.v1beta1.AdminService.UpdateRole:output_type -> raystack.frontier.v1beta1.UpdateRoleResponse - 19, // 208: raystack.frontier.v1beta1.AdminService.DeleteRole:output_type -> raystack.frontier.v1beta1.DeleteRoleResponse - 22, // 209: raystack.frontier.v1beta1.AdminService.CreatePermission:output_type -> raystack.frontier.v1beta1.CreatePermissionResponse - 24, // 210: raystack.frontier.v1beta1.AdminService.UpdatePermission:output_type -> raystack.frontier.v1beta1.UpdatePermissionResponse - 26, // 211: raystack.frontier.v1beta1.AdminService.DeletePermission:output_type -> raystack.frontier.v1beta1.DeletePermissionResponse - 28, // 212: raystack.frontier.v1beta1.AdminService.ListPreferences:output_type -> raystack.frontier.v1beta1.ListPreferencesResponse - 30, // 213: raystack.frontier.v1beta1.AdminService.CreatePreferences:output_type -> raystack.frontier.v1beta1.CreatePreferencesResponse - 32, // 214: raystack.frontier.v1beta1.AdminService.CheckFederatedResourcePermission:output_type -> raystack.frontier.v1beta1.CheckFederatedResourcePermissionResponse - 34, // 215: raystack.frontier.v1beta1.AdminService.AddPlatformUser:output_type -> raystack.frontier.v1beta1.AddPlatformUserResponse - 36, // 216: raystack.frontier.v1beta1.AdminService.ListPlatformUsers:output_type -> raystack.frontier.v1beta1.ListPlatformUsersResponse - 38, // 217: raystack.frontier.v1beta1.AdminService.RemovePlatformUser:output_type -> raystack.frontier.v1beta1.RemovePlatformUserResponse - 40, // 218: raystack.frontier.v1beta1.AdminService.DelegatedCheckout:output_type -> raystack.frontier.v1beta1.DelegatedCheckoutResponse - 42, // 219: raystack.frontier.v1beta1.AdminService.ListAllInvoices:output_type -> raystack.frontier.v1beta1.ListAllInvoicesResponse - 44, // 220: raystack.frontier.v1beta1.AdminService.GenerateInvoices:output_type -> raystack.frontier.v1beta1.GenerateInvoicesResponse - 46, // 221: raystack.frontier.v1beta1.AdminService.ListAllBillingAccounts:output_type -> raystack.frontier.v1beta1.ListAllBillingAccountsResponse - 48, // 222: raystack.frontier.v1beta1.AdminService.RevertBillingUsage:output_type -> raystack.frontier.v1beta1.RevertBillingUsageResponse - 51, // 223: raystack.frontier.v1beta1.AdminService.CreateWebhook:output_type -> raystack.frontier.v1beta1.CreateWebhookResponse - 53, // 224: raystack.frontier.v1beta1.AdminService.UpdateWebhook:output_type -> raystack.frontier.v1beta1.UpdateWebhookResponse - 55, // 225: raystack.frontier.v1beta1.AdminService.DeleteWebhook:output_type -> raystack.frontier.v1beta1.DeleteWebhookResponse - 57, // 226: raystack.frontier.v1beta1.AdminService.ListWebhooks:output_type -> raystack.frontier.v1beta1.ListWebhooksResponse - 59, // 227: raystack.frontier.v1beta1.AdminService.UpdateBillingAccountLimits:output_type -> raystack.frontier.v1beta1.UpdateBillingAccountLimitsResponse - 61, // 228: raystack.frontier.v1beta1.AdminService.GetBillingAccountDetails:output_type -> raystack.frontier.v1beta1.GetBillingAccountDetailsResponse - 63, // 229: raystack.frontier.v1beta1.AdminService.UpdateBillingAccountDetails:output_type -> raystack.frontier.v1beta1.UpdateBillingAccountDetailsResponse - 79, // 230: raystack.frontier.v1beta1.AdminService.CreateProspect:output_type -> raystack.frontier.v1beta1.CreateProspectResponse - 71, // 231: raystack.frontier.v1beta1.AdminService.ListProspects:output_type -> raystack.frontier.v1beta1.ListProspectsResponse - 73, // 232: raystack.frontier.v1beta1.AdminService.GetProspect:output_type -> raystack.frontier.v1beta1.GetProspectResponse - 75, // 233: raystack.frontier.v1beta1.AdminService.UpdateProspect:output_type -> raystack.frontier.v1beta1.UpdateProspectResponse - 77, // 234: raystack.frontier.v1beta1.AdminService.DeleteProspect:output_type -> raystack.frontier.v1beta1.DeleteProspectResponse - 105, // 235: raystack.frontier.v1beta1.AdminService.SearchInvoices:output_type -> raystack.frontier.v1beta1.SearchInvoicesResponse - 109, // 236: raystack.frontier.v1beta1.AdminService.GetCurrentAdminUser:output_type -> raystack.frontier.v1beta1.GetCurrentAdminUserResponse - 111, // 237: raystack.frontier.v1beta1.AdminService.ListUserSessions:output_type -> raystack.frontier.v1beta1.ListUserSessionsResponse - 113, // 238: raystack.frontier.v1beta1.AdminService.RevokeUserSession:output_type -> raystack.frontier.v1beta1.RevokeUserSessionResponse - 116, // 239: raystack.frontier.v1beta1.AdminService.ListAuditRecords:output_type -> raystack.frontier.v1beta1.ListAuditRecordsResponse - 162, // 240: raystack.frontier.v1beta1.AdminService.ExportAuditRecords:output_type -> google.api.HttpBody - 180, // [180:241] is the sub-list for method output_type - 119, // [119:180] is the sub-list for method input_type - 119, // [119:119] is the sub-list for extension type_name - 119, // [119:119] is the sub-list for extension extendee - 0, // [0:119] is the sub-list for field type_name + 154, // 32: raystack.frontier.v1beta1.UpdateWebhookResponse.webhook:type_name -> raystack.frontier.v1beta1.Webhook + 154, // 33: raystack.frontier.v1beta1.ListWebhooksResponse.webhooks:type_name -> raystack.frontier.v1beta1.Webhook + 155, // 34: raystack.frontier.v1beta1.SearchOrganizationsRequest.query:type_name -> raystack.frontier.v1beta1.RQLRequest + 156, // 35: raystack.frontier.v1beta1.SetOrganizationKycResponse.organization_kyc:type_name -> raystack.frontier.v1beta1.OrganizationKyc + 156, // 36: raystack.frontier.v1beta1.ListOrganizationsKycResponse.organizations_kyc:type_name -> raystack.frontier.v1beta1.OrganizationKyc + 120, // 37: raystack.frontier.v1beta1.SearchOrganizationsResponse.organizations:type_name -> raystack.frontier.v1beta1.SearchOrganizationsResponse.OrganizationResult + 157, // 38: raystack.frontier.v1beta1.SearchOrganizationsResponse.pagination:type_name -> raystack.frontier.v1beta1.RQLQueryPaginationResponse + 158, // 39: raystack.frontier.v1beta1.SearchOrganizationsResponse.group:type_name -> raystack.frontier.v1beta1.RQLQueryGroupResponse + 155, // 40: raystack.frontier.v1beta1.ListProspectsRequest.query:type_name -> raystack.frontier.v1beta1.RQLRequest + 159, // 41: raystack.frontier.v1beta1.ListProspectsResponse.prospects:type_name -> raystack.frontier.v1beta1.Prospect + 157, // 42: raystack.frontier.v1beta1.ListProspectsResponse.pagination:type_name -> raystack.frontier.v1beta1.RQLQueryPaginationResponse + 158, // 43: raystack.frontier.v1beta1.ListProspectsResponse.group:type_name -> raystack.frontier.v1beta1.RQLQueryGroupResponse + 159, // 44: raystack.frontier.v1beta1.GetProspectResponse.prospect:type_name -> raystack.frontier.v1beta1.Prospect + 160, // 45: raystack.frontier.v1beta1.UpdateProspectRequest.status:type_name -> raystack.frontier.v1beta1.Prospect.Status + 144, // 46: raystack.frontier.v1beta1.UpdateProspectRequest.metadata:type_name -> google.protobuf.Struct + 159, // 47: raystack.frontier.v1beta1.UpdateProspectResponse.prospect:type_name -> raystack.frontier.v1beta1.Prospect + 160, // 48: raystack.frontier.v1beta1.CreateProspectRequest.status:type_name -> raystack.frontier.v1beta1.Prospect.Status + 144, // 49: raystack.frontier.v1beta1.CreateProspectRequest.metadata:type_name -> google.protobuf.Struct + 159, // 50: raystack.frontier.v1beta1.CreateProspectResponse.prospect:type_name -> raystack.frontier.v1beta1.Prospect + 155, // 51: raystack.frontier.v1beta1.SearchOrganizationUsersRequest.query:type_name -> raystack.frontier.v1beta1.RQLRequest + 121, // 52: raystack.frontier.v1beta1.SearchOrganizationUsersResponse.org_users:type_name -> raystack.frontier.v1beta1.SearchOrganizationUsersResponse.OrganizationUser + 157, // 53: raystack.frontier.v1beta1.SearchOrganizationUsersResponse.pagination:type_name -> raystack.frontier.v1beta1.RQLQueryPaginationResponse + 158, // 54: raystack.frontier.v1beta1.SearchOrganizationUsersResponse.group:type_name -> raystack.frontier.v1beta1.RQLQueryGroupResponse + 155, // 55: raystack.frontier.v1beta1.SearchOrganizationProjectsRequest.query:type_name -> raystack.frontier.v1beta1.RQLRequest + 122, // 56: raystack.frontier.v1beta1.SearchOrganizationProjectsResponse.org_projects:type_name -> raystack.frontier.v1beta1.SearchOrganizationProjectsResponse.OrganizationProject + 157, // 57: raystack.frontier.v1beta1.SearchOrganizationProjectsResponse.pagination:type_name -> raystack.frontier.v1beta1.RQLQueryPaginationResponse + 158, // 58: raystack.frontier.v1beta1.SearchOrganizationProjectsResponse.group:type_name -> raystack.frontier.v1beta1.RQLQueryGroupResponse + 155, // 59: raystack.frontier.v1beta1.SearchProjectUsersRequest.query:type_name -> raystack.frontier.v1beta1.RQLRequest + 123, // 60: raystack.frontier.v1beta1.SearchProjectUsersResponse.project_users:type_name -> raystack.frontier.v1beta1.SearchProjectUsersResponse.ProjectUser + 157, // 61: raystack.frontier.v1beta1.SearchProjectUsersResponse.pagination:type_name -> raystack.frontier.v1beta1.RQLQueryPaginationResponse + 158, // 62: raystack.frontier.v1beta1.SearchProjectUsersResponse.group:type_name -> raystack.frontier.v1beta1.RQLQueryGroupResponse + 155, // 63: raystack.frontier.v1beta1.SearchOrganizationInvoicesRequest.query:type_name -> raystack.frontier.v1beta1.RQLRequest + 124, // 64: raystack.frontier.v1beta1.SearchOrganizationInvoicesResponse.organization_invoices:type_name -> raystack.frontier.v1beta1.SearchOrganizationInvoicesResponse.OrganizationInvoice + 157, // 65: raystack.frontier.v1beta1.SearchOrganizationInvoicesResponse.pagination:type_name -> raystack.frontier.v1beta1.RQLQueryPaginationResponse + 158, // 66: raystack.frontier.v1beta1.SearchOrganizationInvoicesResponse.group:type_name -> raystack.frontier.v1beta1.RQLQueryGroupResponse + 155, // 67: raystack.frontier.v1beta1.SearchOrganizationTokensRequest.query:type_name -> raystack.frontier.v1beta1.RQLRequest + 125, // 68: raystack.frontier.v1beta1.SearchOrganizationTokensResponse.organization_tokens:type_name -> raystack.frontier.v1beta1.SearchOrganizationTokensResponse.OrganizationToken + 157, // 69: raystack.frontier.v1beta1.SearchOrganizationTokensResponse.pagination:type_name -> raystack.frontier.v1beta1.RQLQueryPaginationResponse + 158, // 70: raystack.frontier.v1beta1.SearchOrganizationTokensResponse.group:type_name -> raystack.frontier.v1beta1.RQLQueryGroupResponse + 155, // 71: raystack.frontier.v1beta1.SearchOrganizationServiceUserCredentialsRequest.query:type_name -> raystack.frontier.v1beta1.RQLRequest + 126, // 72: raystack.frontier.v1beta1.SearchOrganizationServiceUserCredentialsResponse.organization_serviceuser_credentials:type_name -> raystack.frontier.v1beta1.SearchOrganizationServiceUserCredentialsResponse.OrganizationServiceUserCredential + 157, // 73: raystack.frontier.v1beta1.SearchOrganizationServiceUserCredentialsResponse.pagination:type_name -> raystack.frontier.v1beta1.RQLQueryPaginationResponse + 158, // 74: raystack.frontier.v1beta1.SearchOrganizationServiceUserCredentialsResponse.group:type_name -> raystack.frontier.v1beta1.RQLQueryGroupResponse + 155, // 75: raystack.frontier.v1beta1.SearchUsersRequest.query:type_name -> raystack.frontier.v1beta1.RQLRequest + 135, // 76: raystack.frontier.v1beta1.SearchUsersResponse.users:type_name -> raystack.frontier.v1beta1.User + 157, // 77: raystack.frontier.v1beta1.SearchUsersResponse.pagination:type_name -> raystack.frontier.v1beta1.RQLQueryPaginationResponse + 158, // 78: raystack.frontier.v1beta1.SearchUsersResponse.group:type_name -> raystack.frontier.v1beta1.RQLQueryGroupResponse + 155, // 79: raystack.frontier.v1beta1.SearchUserOrganizationsRequest.query:type_name -> raystack.frontier.v1beta1.RQLRequest + 127, // 80: raystack.frontier.v1beta1.SearchUserOrganizationsResponse.user_organizations:type_name -> raystack.frontier.v1beta1.SearchUserOrganizationsResponse.UserOrganization + 157, // 81: raystack.frontier.v1beta1.SearchUserOrganizationsResponse.pagination:type_name -> raystack.frontier.v1beta1.RQLQueryPaginationResponse + 158, // 82: raystack.frontier.v1beta1.SearchUserOrganizationsResponse.group:type_name -> raystack.frontier.v1beta1.RQLQueryGroupResponse + 155, // 83: raystack.frontier.v1beta1.SearchUserProjectsRequest.query:type_name -> raystack.frontier.v1beta1.RQLRequest + 128, // 84: raystack.frontier.v1beta1.SearchUserProjectsResponse.user_projects:type_name -> raystack.frontier.v1beta1.SearchUserProjectsResponse.UserProject + 157, // 85: raystack.frontier.v1beta1.SearchUserProjectsResponse.pagination:type_name -> raystack.frontier.v1beta1.RQLQueryPaginationResponse + 158, // 86: raystack.frontier.v1beta1.SearchUserProjectsResponse.group:type_name -> raystack.frontier.v1beta1.RQLQueryGroupResponse + 129, // 87: raystack.frontier.v1beta1.AdminCreateOrganizationRequest.body:type_name -> raystack.frontier.v1beta1.AdminCreateOrganizationRequest.OrganizationRequestBody + 138, // 88: raystack.frontier.v1beta1.AdminCreateOrganizationResponse.organization:type_name -> raystack.frontier.v1beta1.Organization + 155, // 89: raystack.frontier.v1beta1.SearchInvoicesRequest.query:type_name -> raystack.frontier.v1beta1.RQLRequest + 130, // 90: raystack.frontier.v1beta1.SearchInvoicesResponse.invoices:type_name -> raystack.frontier.v1beta1.SearchInvoicesResponse.Invoice + 157, // 91: raystack.frontier.v1beta1.SearchInvoicesResponse.pagination:type_name -> raystack.frontier.v1beta1.RQLQueryPaginationResponse + 158, // 92: raystack.frontier.v1beta1.SearchInvoicesResponse.group:type_name -> raystack.frontier.v1beta1.RQLQueryGroupResponse + 155, // 93: raystack.frontier.v1beta1.SearchOrganizationServiceUsersRequest.query:type_name -> raystack.frontier.v1beta1.RQLRequest + 132, // 94: raystack.frontier.v1beta1.SearchOrganizationServiceUsersResponse.organization_service_users:type_name -> raystack.frontier.v1beta1.SearchOrganizationServiceUsersResponse.OrganizationServiceUser + 157, // 95: raystack.frontier.v1beta1.SearchOrganizationServiceUsersResponse.pagination:type_name -> raystack.frontier.v1beta1.RQLQueryPaginationResponse + 158, // 96: raystack.frontier.v1beta1.SearchOrganizationServiceUsersResponse.group:type_name -> raystack.frontier.v1beta1.RQLQueryGroupResponse + 135, // 97: raystack.frontier.v1beta1.GetCurrentAdminUserResponse.user:type_name -> raystack.frontier.v1beta1.User + 136, // 98: raystack.frontier.v1beta1.GetCurrentAdminUserResponse.service_user:type_name -> raystack.frontier.v1beta1.ServiceUser + 161, // 99: raystack.frontier.v1beta1.ListUserSessionsResponse.sessions:type_name -> raystack.frontier.v1beta1.Session + 155, // 100: raystack.frontier.v1beta1.ListAuditRecordsRequest.query:type_name -> raystack.frontier.v1beta1.RQLRequest + 162, // 101: raystack.frontier.v1beta1.ExportAuditRecordsRequest.query:type_name -> raystack.frontier.v1beta1.RQLExportRequest + 163, // 102: raystack.frontier.v1beta1.ListAuditRecordsResponse.audit_records:type_name -> raystack.frontier.v1beta1.AuditRecord + 157, // 103: raystack.frontier.v1beta1.ListAuditRecordsResponse.pagination:type_name -> raystack.frontier.v1beta1.RQLQueryPaginationResponse + 158, // 104: raystack.frontier.v1beta1.ListAuditRecordsResponse.group:type_name -> raystack.frontier.v1beta1.RQLQueryGroupResponse + 155, // 105: raystack.frontier.v1beta1.SearchOrganizationPATsRequest.query:type_name -> raystack.frontier.v1beta1.RQLRequest + 134, // 106: raystack.frontier.v1beta1.SearchOrganizationPATsResponse.organization_pats:type_name -> raystack.frontier.v1beta1.SearchOrganizationPATsResponse.OrganizationPAT + 157, // 107: raystack.frontier.v1beta1.SearchOrganizationPATsResponse.pagination:type_name -> raystack.frontier.v1beta1.RQLQueryPaginationResponse + 164, // 108: raystack.frontier.v1beta1.SearchOrganizationsResponse.OrganizationResult.created_at:type_name -> google.protobuf.Timestamp + 164, // 109: raystack.frontier.v1beta1.SearchOrganizationsResponse.OrganizationResult.updated_at:type_name -> google.protobuf.Timestamp + 164, // 110: raystack.frontier.v1beta1.SearchOrganizationsResponse.OrganizationResult.subscription_cycle_end_at:type_name -> google.protobuf.Timestamp + 164, // 111: raystack.frontier.v1beta1.SearchOrganizationUsersResponse.OrganizationUser.org_joined_at:type_name -> google.protobuf.Timestamp + 164, // 112: raystack.frontier.v1beta1.SearchOrganizationProjectsResponse.OrganizationProject.created_at:type_name -> google.protobuf.Timestamp + 164, // 113: raystack.frontier.v1beta1.SearchOrganizationInvoicesResponse.OrganizationInvoice.created_at:type_name -> google.protobuf.Timestamp + 164, // 114: raystack.frontier.v1beta1.SearchOrganizationTokensResponse.OrganizationToken.created_at:type_name -> google.protobuf.Timestamp + 164, // 115: raystack.frontier.v1beta1.SearchOrganizationServiceUserCredentialsResponse.OrganizationServiceUserCredential.created_at:type_name -> google.protobuf.Timestamp + 164, // 116: raystack.frontier.v1beta1.SearchUserOrganizationsResponse.UserOrganization.org_joined_on:type_name -> google.protobuf.Timestamp + 164, // 117: raystack.frontier.v1beta1.SearchUserProjectsResponse.UserProject.project_created_on:type_name -> google.protobuf.Timestamp + 144, // 118: raystack.frontier.v1beta1.AdminCreateOrganizationRequest.OrganizationRequestBody.metadata:type_name -> google.protobuf.Struct + 164, // 119: raystack.frontier.v1beta1.SearchInvoicesResponse.Invoice.created_at:type_name -> google.protobuf.Timestamp + 131, // 120: raystack.frontier.v1beta1.SearchOrganizationServiceUsersResponse.OrganizationServiceUser.projects:type_name -> raystack.frontier.v1beta1.SearchOrganizationServiceUsersResponse.Project + 164, // 121: raystack.frontier.v1beta1.SearchOrganizationServiceUsersResponse.OrganizationServiceUser.created_at:type_name -> google.protobuf.Timestamp + 133, // 122: raystack.frontier.v1beta1.SearchOrganizationPATsResponse.OrganizationPAT.created_by:type_name -> raystack.frontier.v1beta1.SearchOrganizationPATsResponse.CreatedBy + 165, // 123: raystack.frontier.v1beta1.SearchOrganizationPATsResponse.OrganizationPAT.scopes:type_name -> raystack.frontier.v1beta1.PATScope + 164, // 124: raystack.frontier.v1beta1.SearchOrganizationPATsResponse.OrganizationPAT.created_at:type_name -> google.protobuf.Timestamp + 164, // 125: raystack.frontier.v1beta1.SearchOrganizationPATsResponse.OrganizationPAT.expires_at:type_name -> google.protobuf.Timestamp + 164, // 126: raystack.frontier.v1beta1.SearchOrganizationPATsResponse.OrganizationPAT.last_used_at:type_name -> google.protobuf.Timestamp + 0, // 127: raystack.frontier.v1beta1.AdminService.ListAllUsers:input_type -> raystack.frontier.v1beta1.ListAllUsersRequest + 2, // 128: raystack.frontier.v1beta1.AdminService.ListAllServiceUsers:input_type -> raystack.frontier.v1beta1.ListAllServiceUsersRequest + 4, // 129: raystack.frontier.v1beta1.AdminService.ListGroups:input_type -> raystack.frontier.v1beta1.ListGroupsRequest + 6, // 130: raystack.frontier.v1beta1.AdminService.ListAllOrganizations:input_type -> raystack.frontier.v1beta1.ListAllOrganizationsRequest + 102, // 131: raystack.frontier.v1beta1.AdminService.AdminCreateOrganization:input_type -> raystack.frontier.v1beta1.AdminCreateOrganizationRequest + 65, // 132: raystack.frontier.v1beta1.AdminService.SearchOrganizations:input_type -> raystack.frontier.v1beta1.SearchOrganizationsRequest + 80, // 133: raystack.frontier.v1beta1.AdminService.SearchOrganizationUsers:input_type -> raystack.frontier.v1beta1.SearchOrganizationUsersRequest + 86, // 134: raystack.frontier.v1beta1.AdminService.SearchProjectUsers:input_type -> raystack.frontier.v1beta1.SearchProjectUsersRequest + 83, // 135: raystack.frontier.v1beta1.AdminService.SearchOrganizationProjects:input_type -> raystack.frontier.v1beta1.SearchOrganizationProjectsRequest + 88, // 136: raystack.frontier.v1beta1.AdminService.SearchOrganizationInvoices:input_type -> raystack.frontier.v1beta1.SearchOrganizationInvoicesRequest + 90, // 137: raystack.frontier.v1beta1.AdminService.SearchOrganizationTokens:input_type -> raystack.frontier.v1beta1.SearchOrganizationTokensRequest + 93, // 138: raystack.frontier.v1beta1.AdminService.SearchOrganizationServiceUserCredentials:input_type -> raystack.frontier.v1beta1.SearchOrganizationServiceUserCredentialsRequest + 106, // 139: raystack.frontier.v1beta1.AdminService.SearchOrganizationServiceUsers:input_type -> raystack.frontier.v1beta1.SearchOrganizationServiceUsersRequest + 166, // 140: raystack.frontier.v1beta1.AdminService.ExportOrganizations:input_type -> raystack.frontier.v1beta1.ExportOrganizationsRequest + 82, // 141: raystack.frontier.v1beta1.AdminService.ExportOrganizationUsers:input_type -> raystack.frontier.v1beta1.ExportOrganizationUsersRequest + 85, // 142: raystack.frontier.v1beta1.AdminService.ExportOrganizationProjects:input_type -> raystack.frontier.v1beta1.ExportOrganizationProjectsRequest + 92, // 143: raystack.frontier.v1beta1.AdminService.ExportOrganizationTokens:input_type -> raystack.frontier.v1beta1.ExportOrganizationTokensRequest + 97, // 144: raystack.frontier.v1beta1.AdminService.ExportUsers:input_type -> raystack.frontier.v1beta1.ExportUsersRequest + 95, // 145: raystack.frontier.v1beta1.AdminService.SearchUsers:input_type -> raystack.frontier.v1beta1.SearchUsersRequest + 98, // 146: raystack.frontier.v1beta1.AdminService.SearchUserOrganizations:input_type -> raystack.frontier.v1beta1.SearchUserOrganizationsRequest + 100, // 147: raystack.frontier.v1beta1.AdminService.SearchUserProjects:input_type -> raystack.frontier.v1beta1.SearchUserProjectsRequest + 64, // 148: raystack.frontier.v1beta1.AdminService.SetOrganizationKyc:input_type -> raystack.frontier.v1beta1.SetOrganizationKycRequest + 67, // 149: raystack.frontier.v1beta1.AdminService.ListOrganizationsKyc:input_type -> raystack.frontier.v1beta1.ListOrganizationsKycRequest + 8, // 150: raystack.frontier.v1beta1.AdminService.ListProjects:input_type -> raystack.frontier.v1beta1.ListProjectsRequest + 10, // 151: raystack.frontier.v1beta1.AdminService.ListRelations:input_type -> raystack.frontier.v1beta1.ListRelationsRequest + 12, // 152: raystack.frontier.v1beta1.AdminService.ListResources:input_type -> raystack.frontier.v1beta1.ListResourcesRequest + 14, // 153: raystack.frontier.v1beta1.AdminService.CreateRole:input_type -> raystack.frontier.v1beta1.CreateRoleRequest + 16, // 154: raystack.frontier.v1beta1.AdminService.UpdateRole:input_type -> raystack.frontier.v1beta1.UpdateRoleRequest + 18, // 155: raystack.frontier.v1beta1.AdminService.DeleteRole:input_type -> raystack.frontier.v1beta1.DeleteRoleRequest + 21, // 156: raystack.frontier.v1beta1.AdminService.CreatePermission:input_type -> raystack.frontier.v1beta1.CreatePermissionRequest + 23, // 157: raystack.frontier.v1beta1.AdminService.UpdatePermission:input_type -> raystack.frontier.v1beta1.UpdatePermissionRequest + 25, // 158: raystack.frontier.v1beta1.AdminService.DeletePermission:input_type -> raystack.frontier.v1beta1.DeletePermissionRequest + 27, // 159: raystack.frontier.v1beta1.AdminService.ListPreferences:input_type -> raystack.frontier.v1beta1.ListPreferencesRequest + 29, // 160: raystack.frontier.v1beta1.AdminService.CreatePreferences:input_type -> raystack.frontier.v1beta1.CreatePreferencesRequest + 31, // 161: raystack.frontier.v1beta1.AdminService.CheckFederatedResourcePermission:input_type -> raystack.frontier.v1beta1.CheckFederatedResourcePermissionRequest + 33, // 162: raystack.frontier.v1beta1.AdminService.AddPlatformUser:input_type -> raystack.frontier.v1beta1.AddPlatformUserRequest + 35, // 163: raystack.frontier.v1beta1.AdminService.ListPlatformUsers:input_type -> raystack.frontier.v1beta1.ListPlatformUsersRequest + 37, // 164: raystack.frontier.v1beta1.AdminService.RemovePlatformUser:input_type -> raystack.frontier.v1beta1.RemovePlatformUserRequest + 39, // 165: raystack.frontier.v1beta1.AdminService.DelegatedCheckout:input_type -> raystack.frontier.v1beta1.DelegatedCheckoutRequest + 41, // 166: raystack.frontier.v1beta1.AdminService.ListAllInvoices:input_type -> raystack.frontier.v1beta1.ListAllInvoicesRequest + 43, // 167: raystack.frontier.v1beta1.AdminService.GenerateInvoices:input_type -> raystack.frontier.v1beta1.GenerateInvoicesRequest + 45, // 168: raystack.frontier.v1beta1.AdminService.ListAllBillingAccounts:input_type -> raystack.frontier.v1beta1.ListAllBillingAccountsRequest + 47, // 169: raystack.frontier.v1beta1.AdminService.RevertBillingUsage:input_type -> raystack.frontier.v1beta1.RevertBillingUsageRequest + 50, // 170: raystack.frontier.v1beta1.AdminService.CreateWebhook:input_type -> raystack.frontier.v1beta1.CreateWebhookRequest + 52, // 171: raystack.frontier.v1beta1.AdminService.UpdateWebhook:input_type -> raystack.frontier.v1beta1.UpdateWebhookRequest + 54, // 172: raystack.frontier.v1beta1.AdminService.DeleteWebhook:input_type -> raystack.frontier.v1beta1.DeleteWebhookRequest + 56, // 173: raystack.frontier.v1beta1.AdminService.ListWebhooks:input_type -> raystack.frontier.v1beta1.ListWebhooksRequest + 58, // 174: raystack.frontier.v1beta1.AdminService.UpdateBillingAccountLimits:input_type -> raystack.frontier.v1beta1.UpdateBillingAccountLimitsRequest + 60, // 175: raystack.frontier.v1beta1.AdminService.GetBillingAccountDetails:input_type -> raystack.frontier.v1beta1.GetBillingAccountDetailsRequest + 62, // 176: raystack.frontier.v1beta1.AdminService.UpdateBillingAccountDetails:input_type -> raystack.frontier.v1beta1.UpdateBillingAccountDetailsRequest + 78, // 177: raystack.frontier.v1beta1.AdminService.CreateProspect:input_type -> raystack.frontier.v1beta1.CreateProspectRequest + 70, // 178: raystack.frontier.v1beta1.AdminService.ListProspects:input_type -> raystack.frontier.v1beta1.ListProspectsRequest + 72, // 179: raystack.frontier.v1beta1.AdminService.GetProspect:input_type -> raystack.frontier.v1beta1.GetProspectRequest + 74, // 180: raystack.frontier.v1beta1.AdminService.UpdateProspect:input_type -> raystack.frontier.v1beta1.UpdateProspectRequest + 76, // 181: raystack.frontier.v1beta1.AdminService.DeleteProspect:input_type -> raystack.frontier.v1beta1.DeleteProspectRequest + 104, // 182: raystack.frontier.v1beta1.AdminService.SearchInvoices:input_type -> raystack.frontier.v1beta1.SearchInvoicesRequest + 108, // 183: raystack.frontier.v1beta1.AdminService.GetCurrentAdminUser:input_type -> raystack.frontier.v1beta1.GetCurrentAdminUserRequest + 110, // 184: raystack.frontier.v1beta1.AdminService.ListUserSessions:input_type -> raystack.frontier.v1beta1.ListUserSessionsRequest + 112, // 185: raystack.frontier.v1beta1.AdminService.RevokeUserSession:input_type -> raystack.frontier.v1beta1.RevokeUserSessionRequest + 114, // 186: raystack.frontier.v1beta1.AdminService.ListAuditRecords:input_type -> raystack.frontier.v1beta1.ListAuditRecordsRequest + 115, // 187: raystack.frontier.v1beta1.AdminService.ExportAuditRecords:input_type -> raystack.frontier.v1beta1.ExportAuditRecordsRequest + 117, // 188: raystack.frontier.v1beta1.AdminService.SearchOrganizationPATs:input_type -> raystack.frontier.v1beta1.SearchOrganizationPATsRequest + 1, // 189: raystack.frontier.v1beta1.AdminService.ListAllUsers:output_type -> raystack.frontier.v1beta1.ListAllUsersResponse + 3, // 190: raystack.frontier.v1beta1.AdminService.ListAllServiceUsers:output_type -> raystack.frontier.v1beta1.ListAllServiceUsersResponse + 5, // 191: raystack.frontier.v1beta1.AdminService.ListGroups:output_type -> raystack.frontier.v1beta1.ListGroupsResponse + 7, // 192: raystack.frontier.v1beta1.AdminService.ListAllOrganizations:output_type -> raystack.frontier.v1beta1.ListAllOrganizationsResponse + 103, // 193: raystack.frontier.v1beta1.AdminService.AdminCreateOrganization:output_type -> raystack.frontier.v1beta1.AdminCreateOrganizationResponse + 69, // 194: raystack.frontier.v1beta1.AdminService.SearchOrganizations:output_type -> raystack.frontier.v1beta1.SearchOrganizationsResponse + 81, // 195: raystack.frontier.v1beta1.AdminService.SearchOrganizationUsers:output_type -> raystack.frontier.v1beta1.SearchOrganizationUsersResponse + 87, // 196: raystack.frontier.v1beta1.AdminService.SearchProjectUsers:output_type -> raystack.frontier.v1beta1.SearchProjectUsersResponse + 84, // 197: raystack.frontier.v1beta1.AdminService.SearchOrganizationProjects:output_type -> raystack.frontier.v1beta1.SearchOrganizationProjectsResponse + 89, // 198: raystack.frontier.v1beta1.AdminService.SearchOrganizationInvoices:output_type -> raystack.frontier.v1beta1.SearchOrganizationInvoicesResponse + 91, // 199: raystack.frontier.v1beta1.AdminService.SearchOrganizationTokens:output_type -> raystack.frontier.v1beta1.SearchOrganizationTokensResponse + 94, // 200: raystack.frontier.v1beta1.AdminService.SearchOrganizationServiceUserCredentials:output_type -> raystack.frontier.v1beta1.SearchOrganizationServiceUserCredentialsResponse + 107, // 201: raystack.frontier.v1beta1.AdminService.SearchOrganizationServiceUsers:output_type -> raystack.frontier.v1beta1.SearchOrganizationServiceUsersResponse + 167, // 202: raystack.frontier.v1beta1.AdminService.ExportOrganizations:output_type -> google.api.HttpBody + 167, // 203: raystack.frontier.v1beta1.AdminService.ExportOrganizationUsers:output_type -> google.api.HttpBody + 167, // 204: raystack.frontier.v1beta1.AdminService.ExportOrganizationProjects:output_type -> google.api.HttpBody + 167, // 205: raystack.frontier.v1beta1.AdminService.ExportOrganizationTokens:output_type -> google.api.HttpBody + 167, // 206: raystack.frontier.v1beta1.AdminService.ExportUsers:output_type -> google.api.HttpBody + 96, // 207: raystack.frontier.v1beta1.AdminService.SearchUsers:output_type -> raystack.frontier.v1beta1.SearchUsersResponse + 99, // 208: raystack.frontier.v1beta1.AdminService.SearchUserOrganizations:output_type -> raystack.frontier.v1beta1.SearchUserOrganizationsResponse + 101, // 209: raystack.frontier.v1beta1.AdminService.SearchUserProjects:output_type -> raystack.frontier.v1beta1.SearchUserProjectsResponse + 66, // 210: raystack.frontier.v1beta1.AdminService.SetOrganizationKyc:output_type -> raystack.frontier.v1beta1.SetOrganizationKycResponse + 68, // 211: raystack.frontier.v1beta1.AdminService.ListOrganizationsKyc:output_type -> raystack.frontier.v1beta1.ListOrganizationsKycResponse + 9, // 212: raystack.frontier.v1beta1.AdminService.ListProjects:output_type -> raystack.frontier.v1beta1.ListProjectsResponse + 11, // 213: raystack.frontier.v1beta1.AdminService.ListRelations:output_type -> raystack.frontier.v1beta1.ListRelationsResponse + 13, // 214: raystack.frontier.v1beta1.AdminService.ListResources:output_type -> raystack.frontier.v1beta1.ListResourcesResponse + 15, // 215: raystack.frontier.v1beta1.AdminService.CreateRole:output_type -> raystack.frontier.v1beta1.CreateRoleResponse + 17, // 216: raystack.frontier.v1beta1.AdminService.UpdateRole:output_type -> raystack.frontier.v1beta1.UpdateRoleResponse + 19, // 217: raystack.frontier.v1beta1.AdminService.DeleteRole:output_type -> raystack.frontier.v1beta1.DeleteRoleResponse + 22, // 218: raystack.frontier.v1beta1.AdminService.CreatePermission:output_type -> raystack.frontier.v1beta1.CreatePermissionResponse + 24, // 219: raystack.frontier.v1beta1.AdminService.UpdatePermission:output_type -> raystack.frontier.v1beta1.UpdatePermissionResponse + 26, // 220: raystack.frontier.v1beta1.AdminService.DeletePermission:output_type -> raystack.frontier.v1beta1.DeletePermissionResponse + 28, // 221: raystack.frontier.v1beta1.AdminService.ListPreferences:output_type -> raystack.frontier.v1beta1.ListPreferencesResponse + 30, // 222: raystack.frontier.v1beta1.AdminService.CreatePreferences:output_type -> raystack.frontier.v1beta1.CreatePreferencesResponse + 32, // 223: raystack.frontier.v1beta1.AdminService.CheckFederatedResourcePermission:output_type -> raystack.frontier.v1beta1.CheckFederatedResourcePermissionResponse + 34, // 224: raystack.frontier.v1beta1.AdminService.AddPlatformUser:output_type -> raystack.frontier.v1beta1.AddPlatformUserResponse + 36, // 225: raystack.frontier.v1beta1.AdminService.ListPlatformUsers:output_type -> raystack.frontier.v1beta1.ListPlatformUsersResponse + 38, // 226: raystack.frontier.v1beta1.AdminService.RemovePlatformUser:output_type -> raystack.frontier.v1beta1.RemovePlatformUserResponse + 40, // 227: raystack.frontier.v1beta1.AdminService.DelegatedCheckout:output_type -> raystack.frontier.v1beta1.DelegatedCheckoutResponse + 42, // 228: raystack.frontier.v1beta1.AdminService.ListAllInvoices:output_type -> raystack.frontier.v1beta1.ListAllInvoicesResponse + 44, // 229: raystack.frontier.v1beta1.AdminService.GenerateInvoices:output_type -> raystack.frontier.v1beta1.GenerateInvoicesResponse + 46, // 230: raystack.frontier.v1beta1.AdminService.ListAllBillingAccounts:output_type -> raystack.frontier.v1beta1.ListAllBillingAccountsResponse + 48, // 231: raystack.frontier.v1beta1.AdminService.RevertBillingUsage:output_type -> raystack.frontier.v1beta1.RevertBillingUsageResponse + 51, // 232: raystack.frontier.v1beta1.AdminService.CreateWebhook:output_type -> raystack.frontier.v1beta1.CreateWebhookResponse + 53, // 233: raystack.frontier.v1beta1.AdminService.UpdateWebhook:output_type -> raystack.frontier.v1beta1.UpdateWebhookResponse + 55, // 234: raystack.frontier.v1beta1.AdminService.DeleteWebhook:output_type -> raystack.frontier.v1beta1.DeleteWebhookResponse + 57, // 235: raystack.frontier.v1beta1.AdminService.ListWebhooks:output_type -> raystack.frontier.v1beta1.ListWebhooksResponse + 59, // 236: raystack.frontier.v1beta1.AdminService.UpdateBillingAccountLimits:output_type -> raystack.frontier.v1beta1.UpdateBillingAccountLimitsResponse + 61, // 237: raystack.frontier.v1beta1.AdminService.GetBillingAccountDetails:output_type -> raystack.frontier.v1beta1.GetBillingAccountDetailsResponse + 63, // 238: raystack.frontier.v1beta1.AdminService.UpdateBillingAccountDetails:output_type -> raystack.frontier.v1beta1.UpdateBillingAccountDetailsResponse + 79, // 239: raystack.frontier.v1beta1.AdminService.CreateProspect:output_type -> raystack.frontier.v1beta1.CreateProspectResponse + 71, // 240: raystack.frontier.v1beta1.AdminService.ListProspects:output_type -> raystack.frontier.v1beta1.ListProspectsResponse + 73, // 241: raystack.frontier.v1beta1.AdminService.GetProspect:output_type -> raystack.frontier.v1beta1.GetProspectResponse + 75, // 242: raystack.frontier.v1beta1.AdminService.UpdateProspect:output_type -> raystack.frontier.v1beta1.UpdateProspectResponse + 77, // 243: raystack.frontier.v1beta1.AdminService.DeleteProspect:output_type -> raystack.frontier.v1beta1.DeleteProspectResponse + 105, // 244: raystack.frontier.v1beta1.AdminService.SearchInvoices:output_type -> raystack.frontier.v1beta1.SearchInvoicesResponse + 109, // 245: raystack.frontier.v1beta1.AdminService.GetCurrentAdminUser:output_type -> raystack.frontier.v1beta1.GetCurrentAdminUserResponse + 111, // 246: raystack.frontier.v1beta1.AdminService.ListUserSessions:output_type -> raystack.frontier.v1beta1.ListUserSessionsResponse + 113, // 247: raystack.frontier.v1beta1.AdminService.RevokeUserSession:output_type -> raystack.frontier.v1beta1.RevokeUserSessionResponse + 116, // 248: raystack.frontier.v1beta1.AdminService.ListAuditRecords:output_type -> raystack.frontier.v1beta1.ListAuditRecordsResponse + 167, // 249: raystack.frontier.v1beta1.AdminService.ExportAuditRecords:output_type -> google.api.HttpBody + 118, // 250: raystack.frontier.v1beta1.AdminService.SearchOrganizationPATs:output_type -> raystack.frontier.v1beta1.SearchOrganizationPATsResponse + 189, // [189:251] is the sub-list for method output_type + 127, // [127:189] is the sub-list for method input_type + 127, // [127:127] is the sub-list for extension type_name + 127, // [127:127] is the sub-list for extension extendee + 0, // [0:127] is the sub-list for field type_name } func init() { file_raystack_frontier_v1beta1_admin_proto_init() } @@ -11131,7 +11476,31 @@ func file_raystack_frontier_v1beta1_admin_proto_init() { return nil } } + file_raystack_frontier_v1beta1_admin_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SearchOrganizationPATsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } file_raystack_frontier_v1beta1_admin_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SearchOrganizationPATsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_raystack_frontier_v1beta1_admin_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SearchOrganizationsResponse_OrganizationResult); i { case 0: return &v.state @@ -11143,7 +11512,7 @@ func file_raystack_frontier_v1beta1_admin_proto_init() { return nil } } - file_raystack_frontier_v1beta1_admin_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { + file_raystack_frontier_v1beta1_admin_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SearchOrganizationUsersResponse_OrganizationUser); i { case 0: return &v.state @@ -11155,7 +11524,7 @@ func file_raystack_frontier_v1beta1_admin_proto_init() { return nil } } - file_raystack_frontier_v1beta1_admin_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { + file_raystack_frontier_v1beta1_admin_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SearchOrganizationProjectsResponse_OrganizationProject); i { case 0: return &v.state @@ -11167,7 +11536,7 @@ func file_raystack_frontier_v1beta1_admin_proto_init() { return nil } } - file_raystack_frontier_v1beta1_admin_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} { + file_raystack_frontier_v1beta1_admin_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SearchProjectUsersResponse_ProjectUser); i { case 0: return &v.state @@ -11179,7 +11548,7 @@ func file_raystack_frontier_v1beta1_admin_proto_init() { return nil } } - file_raystack_frontier_v1beta1_admin_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { + file_raystack_frontier_v1beta1_admin_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SearchOrganizationInvoicesResponse_OrganizationInvoice); i { case 0: return &v.state @@ -11191,7 +11560,7 @@ func file_raystack_frontier_v1beta1_admin_proto_init() { return nil } } - file_raystack_frontier_v1beta1_admin_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { + file_raystack_frontier_v1beta1_admin_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SearchOrganizationTokensResponse_OrganizationToken); i { case 0: return &v.state @@ -11203,7 +11572,7 @@ func file_raystack_frontier_v1beta1_admin_proto_init() { return nil } } - file_raystack_frontier_v1beta1_admin_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} { + file_raystack_frontier_v1beta1_admin_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SearchOrganizationServiceUserCredentialsResponse_OrganizationServiceUserCredential); i { case 0: return &v.state @@ -11215,7 +11584,7 @@ func file_raystack_frontier_v1beta1_admin_proto_init() { return nil } } - file_raystack_frontier_v1beta1_admin_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { + file_raystack_frontier_v1beta1_admin_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SearchUserOrganizationsResponse_UserOrganization); i { case 0: return &v.state @@ -11227,7 +11596,7 @@ func file_raystack_frontier_v1beta1_admin_proto_init() { return nil } } - file_raystack_frontier_v1beta1_admin_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} { + file_raystack_frontier_v1beta1_admin_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SearchUserProjectsResponse_UserProject); i { case 0: return &v.state @@ -11239,7 +11608,7 @@ func file_raystack_frontier_v1beta1_admin_proto_init() { return nil } } - file_raystack_frontier_v1beta1_admin_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} { + file_raystack_frontier_v1beta1_admin_proto_msgTypes[129].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AdminCreateOrganizationRequest_OrganizationRequestBody); i { case 0: return &v.state @@ -11251,7 +11620,7 @@ func file_raystack_frontier_v1beta1_admin_proto_init() { return nil } } - file_raystack_frontier_v1beta1_admin_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} { + file_raystack_frontier_v1beta1_admin_proto_msgTypes[130].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SearchInvoicesResponse_Invoice); i { case 0: return &v.state @@ -11263,7 +11632,7 @@ func file_raystack_frontier_v1beta1_admin_proto_init() { return nil } } - file_raystack_frontier_v1beta1_admin_proto_msgTypes[129].Exporter = func(v interface{}, i int) interface{} { + file_raystack_frontier_v1beta1_admin_proto_msgTypes[131].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SearchOrganizationServiceUsersResponse_Project); i { case 0: return &v.state @@ -11275,7 +11644,7 @@ func file_raystack_frontier_v1beta1_admin_proto_init() { return nil } } - file_raystack_frontier_v1beta1_admin_proto_msgTypes[130].Exporter = func(v interface{}, i int) interface{} { + file_raystack_frontier_v1beta1_admin_proto_msgTypes[132].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SearchOrganizationServiceUsersResponse_OrganizationServiceUser); i { case 0: return &v.state @@ -11287,6 +11656,30 @@ func file_raystack_frontier_v1beta1_admin_proto_init() { return nil } } + file_raystack_frontier_v1beta1_admin_proto_msgTypes[133].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SearchOrganizationPATsResponse_CreatedBy); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_raystack_frontier_v1beta1_admin_proto_msgTypes[134].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SearchOrganizationPATsResponse_OrganizationPAT); 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{ @@ -11294,7 +11687,7 @@ func file_raystack_frontier_v1beta1_admin_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_raystack_frontier_v1beta1_admin_proto_rawDesc, NumEnums: 0, - NumMessages: 131, + NumMessages: 135, NumExtensions: 0, NumServices: 1, }, diff --git a/proto/v1beta1/admin.pb.validate.go b/proto/v1beta1/admin.pb.validate.go index b2e787e6f..5981857ac 100644 --- a/proto/v1beta1/admin.pb.validate.go +++ b/proto/v1beta1/admin.pb.validate.go @@ -16279,6 +16279,324 @@ var _ interface { ErrorName() string } = ListAuditRecordsResponseValidationError{} +// Validate checks the field values on SearchOrganizationPATsRequest 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 *SearchOrganizationPATsRequest) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on SearchOrganizationPATsRequest 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 +// SearchOrganizationPATsRequestMultiError, or nil if none found. +func (m *SearchOrganizationPATsRequest) ValidateAll() error { + return m.validate(true) +} + +func (m *SearchOrganizationPATsRequest) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if err := m._validateUuid(m.GetOrgId()); err != nil { + err = SearchOrganizationPATsRequestValidationError{ + field: "OrgId", + reason: "value must be a valid UUID", + cause: err, + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetQuery()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, SearchOrganizationPATsRequestValidationError{ + field: "Query", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, SearchOrganizationPATsRequestValidationError{ + field: "Query", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetQuery()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return SearchOrganizationPATsRequestValidationError{ + field: "Query", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if len(errors) > 0 { + return SearchOrganizationPATsRequestMultiError(errors) + } + + return nil +} + +func (m *SearchOrganizationPATsRequest) _validateUuid(uuid string) error { + if matched := _admin_uuidPattern.MatchString(uuid); !matched { + return errors.New("invalid uuid format") + } + + return nil +} + +// SearchOrganizationPATsRequestMultiError is an error wrapping multiple +// validation errors returned by SearchOrganizationPATsRequest.ValidateAll() +// if the designated constraints aren't met. +type SearchOrganizationPATsRequestMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m SearchOrganizationPATsRequestMultiError) 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 SearchOrganizationPATsRequestMultiError) AllErrors() []error { return m } + +// SearchOrganizationPATsRequestValidationError is the validation error +// returned by SearchOrganizationPATsRequest.Validate if the designated +// constraints aren't met. +type SearchOrganizationPATsRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e SearchOrganizationPATsRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e SearchOrganizationPATsRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e SearchOrganizationPATsRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e SearchOrganizationPATsRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e SearchOrganizationPATsRequestValidationError) ErrorName() string { + return "SearchOrganizationPATsRequestValidationError" +} + +// Error satisfies the builtin error interface +func (e SearchOrganizationPATsRequestValidationError) 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 %sSearchOrganizationPATsRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = SearchOrganizationPATsRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = SearchOrganizationPATsRequestValidationError{} + +// Validate checks the field values on SearchOrganizationPATsResponse 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 *SearchOrganizationPATsResponse) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on SearchOrganizationPATsResponse 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 +// SearchOrganizationPATsResponseMultiError, or nil if none found. +func (m *SearchOrganizationPATsResponse) ValidateAll() error { + return m.validate(true) +} + +func (m *SearchOrganizationPATsResponse) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + for idx, item := range m.GetOrganizationPats() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, SearchOrganizationPATsResponseValidationError{ + field: fmt.Sprintf("OrganizationPats[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, SearchOrganizationPATsResponseValidationError{ + field: fmt.Sprintf("OrganizationPats[%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 SearchOrganizationPATsResponseValidationError{ + field: fmt.Sprintf("OrganizationPats[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + if all { + switch v := interface{}(m.GetPagination()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, SearchOrganizationPATsResponseValidationError{ + field: "Pagination", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, SearchOrganizationPATsResponseValidationError{ + field: "Pagination", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetPagination()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return SearchOrganizationPATsResponseValidationError{ + field: "Pagination", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if len(errors) > 0 { + return SearchOrganizationPATsResponseMultiError(errors) + } + + return nil +} + +// SearchOrganizationPATsResponseMultiError is an error wrapping multiple +// validation errors returned by SearchOrganizationPATsResponse.ValidateAll() +// if the designated constraints aren't met. +type SearchOrganizationPATsResponseMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m SearchOrganizationPATsResponseMultiError) 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 SearchOrganizationPATsResponseMultiError) AllErrors() []error { return m } + +// SearchOrganizationPATsResponseValidationError is the validation error +// returned by SearchOrganizationPATsResponse.Validate if the designated +// constraints aren't met. +type SearchOrganizationPATsResponseValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e SearchOrganizationPATsResponseValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e SearchOrganizationPATsResponseValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e SearchOrganizationPATsResponseValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e SearchOrganizationPATsResponseValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e SearchOrganizationPATsResponseValidationError) ErrorName() string { + return "SearchOrganizationPATsResponseValidationError" +} + +// Error satisfies the builtin error interface +func (e SearchOrganizationPATsResponseValidationError) 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 %sSearchOrganizationPATsResponse.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = SearchOrganizationPATsResponseValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = SearchOrganizationPATsResponseValidationError{} + // Validate checks the field values on // SearchOrganizationsResponse_OrganizationResult with the rules defined in // the proto definition for this message. If any rules are violated, the first @@ -18416,3 +18734,378 @@ var _ interface { Cause() error ErrorName() string } = SearchOrganizationServiceUsersResponse_OrganizationServiceUserValidationError{} + +// Validate checks the field values on SearchOrganizationPATsResponse_CreatedBy +// 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 *SearchOrganizationPATsResponse_CreatedBy) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on +// SearchOrganizationPATsResponse_CreatedBy 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 +// SearchOrganizationPATsResponse_CreatedByMultiError, or nil if none found. +func (m *SearchOrganizationPATsResponse_CreatedBy) ValidateAll() error { + return m.validate(true) +} + +func (m *SearchOrganizationPATsResponse_CreatedBy) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Id + + // no validation rules for Title + + // no validation rules for Email + + if len(errors) > 0 { + return SearchOrganizationPATsResponse_CreatedByMultiError(errors) + } + + return nil +} + +// SearchOrganizationPATsResponse_CreatedByMultiError is an error wrapping +// multiple validation errors returned by +// SearchOrganizationPATsResponse_CreatedBy.ValidateAll() if the designated +// constraints aren't met. +type SearchOrganizationPATsResponse_CreatedByMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m SearchOrganizationPATsResponse_CreatedByMultiError) 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 SearchOrganizationPATsResponse_CreatedByMultiError) AllErrors() []error { return m } + +// SearchOrganizationPATsResponse_CreatedByValidationError is the validation +// error returned by SearchOrganizationPATsResponse_CreatedBy.Validate if the +// designated constraints aren't met. +type SearchOrganizationPATsResponse_CreatedByValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e SearchOrganizationPATsResponse_CreatedByValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e SearchOrganizationPATsResponse_CreatedByValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e SearchOrganizationPATsResponse_CreatedByValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e SearchOrganizationPATsResponse_CreatedByValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e SearchOrganizationPATsResponse_CreatedByValidationError) ErrorName() string { + return "SearchOrganizationPATsResponse_CreatedByValidationError" +} + +// Error satisfies the builtin error interface +func (e SearchOrganizationPATsResponse_CreatedByValidationError) 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 %sSearchOrganizationPATsResponse_CreatedBy.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = SearchOrganizationPATsResponse_CreatedByValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = SearchOrganizationPATsResponse_CreatedByValidationError{} + +// Validate checks the field values on +// SearchOrganizationPATsResponse_OrganizationPAT 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 *SearchOrganizationPATsResponse_OrganizationPAT) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on +// SearchOrganizationPATsResponse_OrganizationPAT 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 +// SearchOrganizationPATsResponse_OrganizationPATMultiError, or nil if none found. +func (m *SearchOrganizationPATsResponse_OrganizationPAT) ValidateAll() error { + return m.validate(true) +} + +func (m *SearchOrganizationPATsResponse_OrganizationPAT) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Id + + // no validation rules for Title + + if all { + switch v := interface{}(m.GetCreatedBy()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, SearchOrganizationPATsResponse_OrganizationPATValidationError{ + field: "CreatedBy", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, SearchOrganizationPATsResponse_OrganizationPATValidationError{ + field: "CreatedBy", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetCreatedBy()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return SearchOrganizationPATsResponse_OrganizationPATValidationError{ + field: "CreatedBy", + reason: "embedded message failed validation", + cause: err, + } + } + } + + for idx, item := range m.GetScopes() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, SearchOrganizationPATsResponse_OrganizationPATValidationError{ + field: fmt.Sprintf("Scopes[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, SearchOrganizationPATsResponse_OrganizationPATValidationError{ + field: fmt.Sprintf("Scopes[%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 SearchOrganizationPATsResponse_OrganizationPATValidationError{ + field: fmt.Sprintf("Scopes[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + if all { + switch v := interface{}(m.GetCreatedAt()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, SearchOrganizationPATsResponse_OrganizationPATValidationError{ + field: "CreatedAt", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, SearchOrganizationPATsResponse_OrganizationPATValidationError{ + field: "CreatedAt", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetCreatedAt()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return SearchOrganizationPATsResponse_OrganizationPATValidationError{ + field: "CreatedAt", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if all { + switch v := interface{}(m.GetExpiresAt()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, SearchOrganizationPATsResponse_OrganizationPATValidationError{ + field: "ExpiresAt", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, SearchOrganizationPATsResponse_OrganizationPATValidationError{ + field: "ExpiresAt", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetExpiresAt()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return SearchOrganizationPATsResponse_OrganizationPATValidationError{ + field: "ExpiresAt", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if all { + switch v := interface{}(m.GetLastUsedAt()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, SearchOrganizationPATsResponse_OrganizationPATValidationError{ + field: "LastUsedAt", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, SearchOrganizationPATsResponse_OrganizationPATValidationError{ + field: "LastUsedAt", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetLastUsedAt()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return SearchOrganizationPATsResponse_OrganizationPATValidationError{ + field: "LastUsedAt", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if len(errors) > 0 { + return SearchOrganizationPATsResponse_OrganizationPATMultiError(errors) + } + + return nil +} + +// SearchOrganizationPATsResponse_OrganizationPATMultiError is an error +// wrapping multiple validation errors returned by +// SearchOrganizationPATsResponse_OrganizationPAT.ValidateAll() if the +// designated constraints aren't met. +type SearchOrganizationPATsResponse_OrganizationPATMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m SearchOrganizationPATsResponse_OrganizationPATMultiError) 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 SearchOrganizationPATsResponse_OrganizationPATMultiError) AllErrors() []error { return m } + +// SearchOrganizationPATsResponse_OrganizationPATValidationError is the +// validation error returned by +// SearchOrganizationPATsResponse_OrganizationPAT.Validate if the designated +// constraints aren't met. +type SearchOrganizationPATsResponse_OrganizationPATValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e SearchOrganizationPATsResponse_OrganizationPATValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e SearchOrganizationPATsResponse_OrganizationPATValidationError) Reason() string { + return e.reason +} + +// Cause function returns cause value. +func (e SearchOrganizationPATsResponse_OrganizationPATValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e SearchOrganizationPATsResponse_OrganizationPATValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e SearchOrganizationPATsResponse_OrganizationPATValidationError) ErrorName() string { + return "SearchOrganizationPATsResponse_OrganizationPATValidationError" +} + +// Error satisfies the builtin error interface +func (e SearchOrganizationPATsResponse_OrganizationPATValidationError) 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 %sSearchOrganizationPATsResponse_OrganizationPAT.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = SearchOrganizationPATsResponse_OrganizationPATValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = SearchOrganizationPATsResponse_OrganizationPATValidationError{} diff --git a/proto/v1beta1/frontierv1beta1connect/admin.connect.go b/proto/v1beta1/frontierv1beta1connect/admin.connect.go index 40107f91a..76907fc53 100644 --- a/proto/v1beta1/frontierv1beta1connect/admin.connect.go +++ b/proto/v1beta1/frontierv1beta1connect/admin.connect.go @@ -213,6 +213,9 @@ const ( // AdminServiceExportAuditRecordsProcedure is the fully-qualified name of the AdminService's // ExportAuditRecords RPC. AdminServiceExportAuditRecordsProcedure = "/raystack.frontier.v1beta1.AdminService/ExportAuditRecords" + // AdminServiceSearchOrganizationPATsProcedure is the fully-qualified name of the AdminService's + // SearchOrganizationPATs RPC. + AdminServiceSearchOrganizationPATsProcedure = "/raystack.frontier.v1beta1.AdminService/SearchOrganizationPATs" ) // AdminServiceClient is a client for the raystack.frontier.v1beta1.AdminService service. @@ -313,6 +316,7 @@ type AdminServiceClient interface { // buf:lint:ignore RPC_RESPONSE_STANDARD_NAME // buf:lint:ignore RPC_REQUEST_RESPONSE_UNIQUE ExportAuditRecords(context.Context, *connect.Request[v1beta1.ExportAuditRecordsRequest]) (*connect.ServerStreamForClient[httpbody.HttpBody], error) + SearchOrganizationPATs(context.Context, *connect.Request[v1beta1.SearchOrganizationPATsRequest]) (*connect.Response[v1beta1.SearchOrganizationPATsResponse], error) } // NewAdminServiceClient constructs a client for the raystack.frontier.v1beta1.AdminService service. @@ -692,6 +696,12 @@ func NewAdminServiceClient(httpClient connect.HTTPClient, baseURL string, opts . connect.WithSchema(adminServiceMethods.ByName("ExportAuditRecords")), connect.WithClientOptions(opts...), ), + searchOrganizationPATs: connect.NewClient[v1beta1.SearchOrganizationPATsRequest, v1beta1.SearchOrganizationPATsResponse]( + httpClient, + baseURL+AdminServiceSearchOrganizationPATsProcedure, + connect.WithSchema(adminServiceMethods.ByName("SearchOrganizationPATs")), + connect.WithClientOptions(opts...), + ), } } @@ -758,6 +768,7 @@ type adminServiceClient struct { revokeUserSession *connect.Client[v1beta1.RevokeUserSessionRequest, v1beta1.RevokeUserSessionResponse] listAuditRecords *connect.Client[v1beta1.ListAuditRecordsRequest, v1beta1.ListAuditRecordsResponse] exportAuditRecords *connect.Client[v1beta1.ExportAuditRecordsRequest, httpbody.HttpBody] + searchOrganizationPATs *connect.Client[v1beta1.SearchOrganizationPATsRequest, v1beta1.SearchOrganizationPATsResponse] } // ListAllUsers calls raystack.frontier.v1beta1.AdminService.ListAllUsers. @@ -1075,6 +1086,11 @@ func (c *adminServiceClient) ExportAuditRecords(ctx context.Context, req *connec return c.exportAuditRecords.CallServerStream(ctx, req) } +// SearchOrganizationPATs calls raystack.frontier.v1beta1.AdminService.SearchOrganizationPATs. +func (c *adminServiceClient) SearchOrganizationPATs(ctx context.Context, req *connect.Request[v1beta1.SearchOrganizationPATsRequest]) (*connect.Response[v1beta1.SearchOrganizationPATsResponse], error) { + return c.searchOrganizationPATs.CallUnary(ctx, req) +} + // AdminServiceHandler is an implementation of the raystack.frontier.v1beta1.AdminService service. type AdminServiceHandler interface { // Users @@ -1173,6 +1189,7 @@ type AdminServiceHandler interface { // buf:lint:ignore RPC_RESPONSE_STANDARD_NAME // buf:lint:ignore RPC_REQUEST_RESPONSE_UNIQUE ExportAuditRecords(context.Context, *connect.Request[v1beta1.ExportAuditRecordsRequest], *connect.ServerStream[httpbody.HttpBody]) error + SearchOrganizationPATs(context.Context, *connect.Request[v1beta1.SearchOrganizationPATsRequest]) (*connect.Response[v1beta1.SearchOrganizationPATsResponse], error) } // NewAdminServiceHandler builds an HTTP handler from the service implementation. It returns the @@ -1548,6 +1565,12 @@ func NewAdminServiceHandler(svc AdminServiceHandler, opts ...connect.HandlerOpti connect.WithSchema(adminServiceMethods.ByName("ExportAuditRecords")), connect.WithHandlerOptions(opts...), ) + adminServiceSearchOrganizationPATsHandler := connect.NewUnaryHandler( + AdminServiceSearchOrganizationPATsProcedure, + svc.SearchOrganizationPATs, + connect.WithSchema(adminServiceMethods.ByName("SearchOrganizationPATs")), + connect.WithHandlerOptions(opts...), + ) return "/raystack.frontier.v1beta1.AdminService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch r.URL.Path { case AdminServiceListAllUsersProcedure: @@ -1672,6 +1695,8 @@ func NewAdminServiceHandler(svc AdminServiceHandler, opts ...connect.HandlerOpti adminServiceListAuditRecordsHandler.ServeHTTP(w, r) case AdminServiceExportAuditRecordsProcedure: adminServiceExportAuditRecordsHandler.ServeHTTP(w, r) + case AdminServiceSearchOrganizationPATsProcedure: + adminServiceSearchOrganizationPATsHandler.ServeHTTP(w, r) default: http.NotFound(w, r) } @@ -1924,3 +1949,7 @@ func (UnimplementedAdminServiceHandler) ListAuditRecords(context.Context, *conne func (UnimplementedAdminServiceHandler) ExportAuditRecords(context.Context, *connect.Request[v1beta1.ExportAuditRecordsRequest], *connect.ServerStream[httpbody.HttpBody]) error { return connect.NewError(connect.CodeUnimplemented, errors.New("raystack.frontier.v1beta1.AdminService.ExportAuditRecords is not implemented")) } + +func (UnimplementedAdminServiceHandler) SearchOrganizationPATs(context.Context, *connect.Request[v1beta1.SearchOrganizationPATsRequest]) (*connect.Response[v1beta1.SearchOrganizationPATsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("raystack.frontier.v1beta1.AdminService.SearchOrganizationPATs is not implemented")) +}