diff --git a/components/dashboard/src/service/json-rpc-workspace-client.ts b/components/dashboard/src/service/json-rpc-workspace-client.ts index e789769ff0feb9..dd64dc740a305f 100644 --- a/components/dashboard/src/service/json-rpc-workspace-client.ts +++ b/components/dashboard/src/service/json-rpc-workspace-client.ts @@ -12,21 +12,69 @@ import { GetWorkspaceResponse, WatchWorkspaceStatusRequest, WatchWorkspaceStatusResponse, + ListWorkspacesRequest, + ListWorkspacesResponse, + WorkspaceScope, + ListWorkspacesRequest_OrderByField, + CreateAndStartWorkspaceRequest, + CreateAndStartWorkspaceResponse, + CreateWorkspaceSnapshotRequest, + CreateWorkspaceSnapshotResponse, + DeleteWorkspaceRequest, + DeleteWorkspaceResponse, + GetDefaultWorkspaceImageRequest, + GetDefaultWorkspaceImageResponse, + GetWorkspaceEditorCredentialsRequest, + GetWorkspaceEditorCredentialsResponse, + GetWorkspaceOwnerTokenRequest, + GetWorkspaceOwnerTokenResponse, + ListSupportedWorkspaceClassesRequest, + ListSupportedWorkspaceClassesResponse, + ListWorkspaceInstancesRequest, + ListWorkspaceInstancesResponse, + ListWorkspacePortsRequest, + ListWorkspacePortsResponse, + ListWorkspaceSnapshotsRequest, + ListWorkspaceSnapshotsResponse, + RestoreWorkspaceRequest, + RestoreWorkspaceResponse, + SendHeartBeatRequest, + SendHeartBeatResponse, + StartWorkspaceRequest, + StartWorkspaceResponse, + StopWorkspaceRequest, + StopWorkspaceResponse, + UpdateWorkspacePortRequest, + UpdateWorkspacePortResponse, + UpdateWorkspaceRequest, + UpdateWorkspaceResponse, + WaitWorkspaceSnapshotRequest, + WaitWorkspaceSnapshotResponse, + WatchWorkspaceImageBuildLogsRequest, + WatchWorkspaceImageBuildLogsResponse, } from "@gitpod/public-api/lib/gitpod/v1/workspace_pb"; import { converter } from "./public-api"; import { getGitpodService } from "./service"; +import { PaginationResponse } from "@gitpod/public-api/lib/gitpod/v1/pagination_pb"; import { generateAsyncGenerator } from "@gitpod/gitpod-protocol/lib/generate-async-generator"; -import { WorkspaceInstance } from "@gitpod/gitpod-protocol"; +import { + AdminGetWorkspacesRequest, + WorkspaceImageBuild, + WorkspaceInfo, + WorkspaceInstance, +} from "@gitpod/gitpod-protocol"; +import { parseOrderBy, parsePagination } from "@gitpod/gitpod-protocol/lib/public-api-utils"; +import { isWorkspaceRegion } from "@gitpod/gitpod-protocol/lib/workspace-cluster"; export class JsonRpcWorkspaceClient implements PromiseClient { async getWorkspace(request: PartialMessage): Promise { - if (!request.id) { - throw new ConnectError("id is required", Code.InvalidArgument); + if (!request.workspaceId) { + throw new ConnectError("workspace_id is required", Code.InvalidArgument); } - const info = await getGitpodService().server.getWorkspace(request.id); + const info = await getGitpodService().server.getWorkspace(request.workspaceId); const workspace = converter.toWorkspace(info); const result = new GetWorkspaceResponse(); - result.item = workspace; + result.workspace = workspace; return result; } @@ -38,11 +86,11 @@ export class JsonRpcWorkspaceClient implements PromiseClient, + _options?: CallOptions, + ): Promise { + const { offset, limit } = parsePagination(request.pagination, 50); + + let resultTotal = 0; + let results: WorkspaceInfo[] = []; + + request.scope = request.scope || WorkspaceScope.MY_WORKSPACES_IN_ORGANIZATION; + switch (request.scope) { + case WorkspaceScope.MY_WORKSPACES_IN_ORGANIZATION: { + results = await getGitpodService().server.getWorkspaces({ + limit, + // TODO: request.page + pinnedOnly: request.pinned, + searchString: request.searchTerm, + organizationId: request.organizationId, + }); + resultTotal = results.length; + break; + } + case WorkspaceScope.ALL_WORKSPACES_IN_INSTALLATION: { + const mappingFields: Record = { + [ListWorkspacesRequest_OrderByField.UNSPECIFIED]: "instanceCreationTime", + [ListWorkspacesRequest_OrderByField.CREATION_TIME]: "instanceCreationTime", + }; + const parsedOrderBy = parseOrderBy(request.orderBy, ListWorkspacesRequest_OrderByField, mappingFields); + + const opts: AdminGetWorkspacesRequest = { + limit, + offset, + ownerId: request.ownerId, + orderBy: "instanceCreationTime", + orderDir: "desc", + workspaceId: request.workspaceId, + }; + if (parsedOrderBy.length > 0) { + opts.orderBy = parsedOrderBy[0].field; + opts.orderDir = parsedOrderBy[0].order; + } + const data = await getGitpodService().server.adminGetWorkspaces(opts); + resultTotal = data.total; + break; + } + case WorkspaceScope.ALL_WORKSPACES_IN_ORGANIZATION: { + // TODO: implement + throw new ConnectError("not implemented", Code.Unimplemented); + } + } + const response = new ListWorkspacesResponse(); + response.workspaces = results.map((info) => converter.toWorkspace(info)); + response.pagination = new PaginationResponse(); + response.pagination.total = resultTotal; + return response; + } + + async createAndStartWorkspace( + request: PartialMessage, + _options?: CallOptions | undefined, + ): Promise { + if (!request.organizationId) { + throw new ConnectError("organization_id is required", Code.InvalidArgument); + } + if (!request.source?.contextUrl) { + throw new ConnectError("source.context_url is required", Code.InvalidArgument); + } + const region = request.spec?.region ?? ""; + const result = await getGitpodService().server.createWorkspace({ + workspaceClass: request.spec?.workspaceClass, + ideSettings: { + defaultIde: request.spec?.editor?.name, + useLatestVersion: request.spec?.editor?.version === "latest", + }, + contextUrl: request.source?.contextUrl, + organizationId: request.organizationId, + projectId: request.source?.repositoryId, + + ignoreRunningWorkspaceOnSameCommit: request.ignoreRunningWorkspaceOnSameCommit, + forceDefaultConfig: request.forceDefaultConfig, + region: isWorkspaceRegion(region) ? region : undefined, + }); + if (!result.createdWorkspaceId) { + throw new ConnectError("failed to create workspace", Code.Internal); + } + const response = new CreateAndStartWorkspaceResponse(); + response.workspaceId = result.createdWorkspaceId; + return response; + } + + async startWorkspace( + request: PartialMessage, + options?: CallOptions | undefined, + ): Promise { + throw new ConnectError("not implemented", Code.Unimplemented); + } + + async stopWorkspace( + request: PartialMessage, + options?: CallOptions | undefined, + ): Promise { + throw new ConnectError("not implemented", Code.Unimplemented); + } + + async deleteWorkspace( + request: PartialMessage, + options?: CallOptions | undefined, + ): Promise { + throw new ConnectError("not implemented", Code.Unimplemented); + } + + async updateWorkspace( + request: PartialMessage, + options?: CallOptions | undefined, + ): Promise { + throw new ConnectError("not implemented", Code.Unimplemented); + } + + async listSupportedWorkspaceClasses( + request: PartialMessage, + options?: CallOptions | undefined, + ): Promise { + throw new ConnectError("not implemented", Code.Unimplemented); + } + + async getDefaultWorkspaceImage( + request: PartialMessage, + options?: CallOptions | undefined, + ): Promise { + throw new ConnectError("not implemented", Code.Unimplemented); + } + + async sendHeartBeat( + request: PartialMessage, + options?: CallOptions | undefined, + ): Promise { + throw new ConnectError("not implemented", Code.Unimplemented); + } + + async getWorkspaceOwnerToken( + request: PartialMessage, + options?: CallOptions | undefined, + ): Promise { + throw new ConnectError("not implemented", Code.Unimplemented); + } + async getWorkspaceEditorCredentials( + request: PartialMessage, + options?: CallOptions | undefined, + ): Promise { + throw new ConnectError("not implemented", Code.Unimplemented); + } + + async *watchWorkspaceImageBuildLogs( + request: PartialMessage, + options?: CallOptions | undefined, + ): AsyncIterable { + if (!options?.signal) { + throw new ConnectError("signal is required", Code.InvalidArgument); + } + if (!request.workspaceId) { + throw new ConnectError("workspace_id is required", Code.InvalidArgument); + } + await getGitpodService().server.watchWorkspaceImageBuildLogs(request.workspaceId); + // TODO: Make it a global watcher and broadcast / emit events + const it = generateAsyncGenerator<{ + state: WorkspaceImageBuild.StateInfo; + log?: WorkspaceImageBuild.LogContent; + }>( + (queue) => { + getGitpodService().registerClient({ + onWorkspaceImageBuildLogs: (state, log) => { + queue.push({ state, log }); + }, + }); + }, + { signal: options?.signal }, + ); + for await (const log of it) { + const response = new WatchWorkspaceImageBuildLogsResponse(); + response.workspaceImageBuild = converter.toWorkspaceImageBuild(log.state, log.log); + yield response; + } + } + + async listWorkspacePorts( + request: PartialMessage, + options?: CallOptions | undefined, + ): Promise { + throw new ConnectError("not implemented", Code.Unimplemented); + } + + async updateWorkspacePort( + request: PartialMessage, + options?: CallOptions | undefined, + ): Promise { + throw new ConnectError("not implemented", Code.Unimplemented); + } + + async createWorkspaceSnapshot( + request: PartialMessage, + options?: CallOptions | undefined, + ): Promise { + throw new ConnectError("not implemented", Code.Unimplemented); + } + + async waitWorkspaceSnapshot( + request: PartialMessage, + options?: CallOptions | undefined, + ): Promise { + throw new ConnectError("not implemented", Code.Unimplemented); + } + + async listWorkspaceSnapshots( + request: PartialMessage, + options?: CallOptions | undefined, + ): Promise { + throw new ConnectError("not implemented", Code.Unimplemented); + } + + async listWorkspaceInstances( + request: PartialMessage, + options?: CallOptions | undefined, + ): Promise { + throw new ConnectError("not implemented", Code.Unimplemented); + } + + async restoreWorkspace( + request: PartialMessage, + options?: CallOptions | undefined, + ): Promise { + throw new ConnectError("not implemented", Code.Unimplemented); + } } diff --git a/components/gitpod-protocol/src/public-api-converter.ts b/components/gitpod-protocol/src/public-api-converter.ts index f7926cdb2a8864..0bb7aa570f1325 100644 --- a/components/gitpod-protocol/src/public-api-converter.ts +++ b/components/gitpod-protocol/src/public-api-converter.ts @@ -13,6 +13,9 @@ import { WorkspaceConditions, WorkspaceEnvironmentVariable, WorkspaceGitStatus, + WorkspaceImageBuild, + WorkspaceImageBuild_Log, + WorkspaceImageBuild_Phase, WorkspacePhase, WorkspacePhase_Phase, WorkspacePort, @@ -35,6 +38,7 @@ import { WorkspaceContext, WorkspaceInfo, Workspace as ProtocolWorkspace, + WorkspaceImageBuild as ProtocolWorkspaceImageBuild, } from "./protocol"; import { ConfigurationIdeConfig, @@ -376,4 +380,33 @@ export class PublicAPIConverter { result.defaultWorkspaceImage = settings.defaultWorkspaceImage || undefined; return result; } + + toWorkspaceImageBuild( + state: ProtocolWorkspaceImageBuild.StateInfo, + log?: ProtocolWorkspaceImageBuild.LogContent, + ): WorkspaceImageBuild { + const result = new WorkspaceImageBuild(); + result.phase = this.toWorkspaceImageBuildPhase(state.phase); + const logItem = new WorkspaceImageBuild_Log(); + if (log) { + logItem.message = log.text; + } + result.logs = [logItem]; + return result; + } + + toWorkspaceImageBuildPhase(phase: ProtocolWorkspaceImageBuild.Phase): WorkspaceImageBuild_Phase { + switch (phase) { + case "BaseImage": + return WorkspaceImageBuild_Phase.BASE_IMAGE; + case "GitpodLayer": + return WorkspaceImageBuild_Phase.GITPOD_LAYER; + case "Error": + return WorkspaceImageBuild_Phase.ERROR; + case "Done": + return WorkspaceImageBuild_Phase.DONE; + default: + return WorkspaceImageBuild_Phase.UNSPECIFIED; + } + } } diff --git a/components/gitpod-protocol/src/public-api-utils.ts b/components/gitpod-protocol/src/public-api-utils.ts new file mode 100644 index 00000000000000..b6ce226a16359b --- /dev/null +++ b/components/gitpod-protocol/src/public-api-utils.ts @@ -0,0 +1,71 @@ +/** + * Copyright (c) 2023 Gitpod GmbH. All rights reserved. + * Licensed under the GNU Affero General Public License (AGPL). + * See License.AGPL.txt in the project root for license information. + */ + +import { OrderBy } from "@gitpod/public-api/lib/gitpod/v1/order_by_pb"; +import { PaginationRequest } from "@gitpod/public-api/lib/gitpod/v1/pagination_pb"; + +export interface ParsedOrderByField { + field: T; + order: "asc" | "desc"; +} + +export function parseOrderBy( + orderByStr: Partial | undefined, + enumData: object, + mappingFields: Record, +): ParsedOrderByField[] { + if (!orderByStr || !orderByStr.orderBy) { + return []; + } + const uniqueFields = new Set(); + return orderByStr.orderBy + .split(",") + .map((fieldStr) => { + const [field, order] = fieldStr.trim().split(" "); + if (!(field in enumData)) { + // Invalid field, ignore it + return; + } + return { + field: mappingFields[field] ?? field, + order: order?.toUpperCase() === "desc" ? "desc" : "asc", + }; + }) + .filter((field) => { + if (!field) { + return false; + } + if (uniqueFields.has(field.field)) { + return false; + } + uniqueFields.add(field.field); + return true; + }) as ParsedOrderByField[]; +} + +export interface ParsedPagination { + offset: number; + limit: number; +} + +const MAX_PAGE_SIZE = 100; +export function parsePagination( + pagination: Partial | undefined, + defaultPageSize = 50, +): ParsedPagination { + let limit = pagination?.pageSize ?? defaultPageSize; + if (limit < 1) { + limit = defaultPageSize; + } + if (limit > MAX_PAGE_SIZE) { + limit = MAX_PAGE_SIZE; + } + const offset = (pagination?.page ?? 0) * limit; + return { + offset, + limit, + }; +} diff --git a/components/public-api/gitpod/v1/order_by.proto b/components/public-api/gitpod/v1/order_by.proto new file mode 100644 index 00000000000000..73aeedd37fcd8d --- /dev/null +++ b/components/public-api/gitpod/v1/order_by.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; + +package gitpod.v1; + +option go_package = "github.com/gitpod-io/gitpod/components/public-api/go/v1"; + +message OrderBy { + // order_by is the field to sort resources by. It follow SQL syntax: comma + // separated list of fields. For example: "foo,bar". The default sorting order + // is ascending. To specify descending order for a field, a suffix " desc" + // should be appended to the field name. For example: "foo desc,bar". + string order_by = 1; +} diff --git a/components/public-api/gitpod/v1/workspace.proto b/components/public-api/gitpod/v1/workspace.proto index 68139ce3a1ba3f..e061f29d27e179 100644 --- a/components/public-api/gitpod/v1/workspace.proto +++ b/components/public-api/gitpod/v1/workspace.proto @@ -5,6 +5,7 @@ package gitpod.v1; import "google/protobuf/timestamp.proto"; import "google/protobuf/duration.proto"; import "gitpod/v1/pagination.proto"; +import "gitpod/v1/order_by.proto"; option go_package = "github.com/gitpod-io/gitpod/components/public-api/go/v1"; @@ -18,13 +19,15 @@ service WorkspaceService { // WatchWorkspaceStatus watchs the workspaces status changes // // workspace_id +return NOT_FOUND Workspace does not exist - rpc WatchWorkspaceStatus(WatchWorkspaceStatusRequest) returns (stream WatchWorkspaceStatusResponse) {} + rpc WatchWorkspaceStatus(WatchWorkspaceStatusRequest) + returns (stream WatchWorkspaceStatusResponse) {} // ListWorkspaces returns a list of workspaces that match the query. rpc ListWorkspaces(ListWorkspacesRequest) returns (ListWorkspacesResponse) {} // CreateAndStartWorkspace creates a new workspace and starts it. - rpc CreateAndStartWorkspace(CreateAndStartWorkspaceRequest) returns (CreateAndStartWorkspaceResponse) {} + rpc CreateAndStartWorkspace(CreateAndStartWorkspaceRequest) + returns (CreateAndStartWorkspaceResponse) {} // StartWorkspace starts an existing workspace. rpc StartWorkspace(StartWorkspaceRequest) returns (StartWorkspaceResponse) {} @@ -35,49 +38,67 @@ service WorkspaceService { // DeleteWorkspace deletes a workspace. // When the workspace is running, it will be stopped as well. // Deleted workspaces cannot be started again. - rpc DeleteWorkspace(DeleteWorkspaceRequest) returns (DeleteWorkspaceResponse) {} + rpc DeleteWorkspace(DeleteWorkspaceRequest) + returns (DeleteWorkspaceResponse) {} // UpdateWorkspace updates the meta data of a workspace. - rpc UpdateWorkspace(UpdateWorkspaceRequest) returns (UpdateWorkspaceResponse) {} + rpc UpdateWorkspace(UpdateWorkspaceRequest) + returns (UpdateWorkspaceResponse) {} // ListSupportedWorkspaceClasses enumerates all available workspace classes. - rpc ListSupportedWorkspaceClasses(ListSupportedWorkspaceClassesRequest) returns (ListSupportedWorkspaceClassesResponse) {} + rpc ListSupportedWorkspaceClasses(ListSupportedWorkspaceClassesRequest) + returns (ListSupportedWorkspaceClassesResponse) {} - // GetDefaultWorkspaceImage returns the default workspace image of specified workspace. - rpc GetDefaultWorkspaceImage(GetDefaultWorkspaceImageRequest) returns (GetDefaultWorkspaceImageResponse) {} + // GetDefaultWorkspaceImage returns the default workspace image of specified + // workspace. + rpc GetDefaultWorkspaceImage(GetDefaultWorkspaceImageRequest) + returns (GetDefaultWorkspaceImageResponse) {} // SendHeartBeat sends a heartbeat to activate the workspace rpc SendHeartBeat(SendHeartBeatRequest) returns (SendHeartBeatResponse) {} // GetWorkspaceOwnerToken returns an owner token of workspace. - rpc GetWorkspaceOwnerToken(GetWorkspaceOwnerTokenRequest) returns (GetWorkspaceOwnerTokenResponse) {} + rpc GetWorkspaceOwnerToken(GetWorkspaceOwnerTokenRequest) + returns (GetWorkspaceOwnerTokenResponse) {} - // GetWorkspaceEditorCredentials returns an credentials that is used in editor to encrypt and decrypt secrets - rpc GetWorkspaceEditorCredentials(GetWorkspaceEditorCredentialsRequest) returns (GetWorkspaceEditorCredentialsResponse) {} + // GetWorkspaceEditorCredentials returns an credentials that is used in editor + // to encrypt and decrypt secrets + rpc GetWorkspaceEditorCredentials(GetWorkspaceEditorCredentialsRequest) + returns (GetWorkspaceEditorCredentialsResponse) {} - // WatchWorkpaceImageBuildLogs watches the image build logs of prebuild workspace. - rpc WatchWorkpaceImageBuildLogs(WatchWorkpaceImageBuildLogsRequest) returns (stream WatchWorkpaceImageBuildLogsResponse) {} + // WatchWorkspaceImageBuildLogs watches the image build logs of prebuild + // workspace. + rpc WatchWorkspaceImageBuildLogs(WatchWorkspaceImageBuildLogsRequest) + returns (stream WatchWorkspaceImageBuildLogsResponse) {} // ListWorkspacePorts lists workspace ports. - rpc ListWorkspacePorts(ListWorkspacePortsRequest) returns (ListWorkspacePortsResponse) {} + rpc ListWorkspacePorts(ListWorkspacePortsRequest) + returns (ListWorkspacePortsResponse) {} // UpdateWorkspacePort updates a workspace port. - rpc UpdateWorkspacePort(UpdateWorkspacePortRequest) returns (UpdateWorkspacePortResponse) {} + rpc UpdateWorkspacePort(UpdateWorkspacePortRequest) + returns (UpdateWorkspacePortResponse) {} - // CreateWorkspaceSnapshot creates a snapshot of the workspace that can be shared with others. - rpc CreateWorkspaceSnapshot(CreateWorkspaceSnapshotRequest) returns (CreateWorkspaceSnapshotResponse) {} + // CreateWorkspaceSnapshot creates a snapshot of the workspace that can be + // shared with others. + rpc CreateWorkspaceSnapshot(CreateWorkspaceSnapshotRequest) + returns (CreateWorkspaceSnapshotResponse) {} // WaitWorkspaceSnapshot waits for the snapshot to be available or failed. - rpc WaitWorkspaceSnapshot(WaitWorkspaceSnapshotRequest) returns (WaitWorkspaceSnapshotResponse) {} + rpc WaitWorkspaceSnapshot(WaitWorkspaceSnapshotRequest) + returns (WaitWorkspaceSnapshotResponse) {} // ListWorkspaceSnapshots lists the snapshots. - rpc ListWorkspaceSnapshots(ListWorkspaceSnapshotsRequest) returns (ListWorkspaceSnapshotsResponse) {} + rpc ListWorkspaceSnapshots(ListWorkspaceSnapshotsRequest) + returns (ListWorkspaceSnapshotsResponse) {} // ListWorkspaceInstances lists the instances of a workspace. - rpc ListWorkspaceInstances(ListWorkspaceInstancesRequest) returns (ListWorkspaceInstancesResponse) {} + rpc ListWorkspaceInstances(ListWorkspaceInstancesRequest) + returns (ListWorkspaceInstancesResponse) {} // RestoreWorkspace restores a workspace. - rpc RestoreWorkspace(RestoreWorkspaceRequest) returns (RestoreWorkspaceResponse) {} + rpc RestoreWorkspace(RestoreWorkspaceRequest) + returns (RestoreWorkspaceResponse) {} } message GetWorkspaceRequest { @@ -112,20 +133,34 @@ message WatchWorkspaceStatusResponse { } message ListWorkspacesRequest { + enum OrderByField { + ORDER_BY_FIELD_UNSPECIFIED = 0; + // ORDER_BY_FIELD_CREATION_TIME is the default sorting field, it sorts + // workspaces by (instances) creation time + ORDER_BY_FIELD_CREATION_TIME = 1; + } + // pagination contains the pagination options for listing workspaces PaginationRequest pagination = 1; + // order_by is the field to sort workspaces by, allowed values are OrderBy + OrderBy order_by = 2; + // scope of the workspaces - WorkspaceScope scope = 2; + WorkspaceScope scope = 3; // organization_id is the ID of the organization that contains the workspaces - string organization_id = 3; + string organization_id = 4; // pinned indicates whether to list only pinned workspaces - bool pinned = 4; + bool pinned = 5; // search_term is a search term to filter workspaces by name - string search_term = 5; + string search_term = 6; + + string workspace_id = 7; + + string owner_id = 8; } message ListWorkspacesResponse { @@ -137,28 +172,25 @@ message ListWorkspacesResponse { } message CreateAndStartWorkspaceRequest { - string organization_id = 1; + message Source { + string context_url = 1; + string repository_id = 2; + } - StartWorkspaceSpec spec = 2; + string organization_id = 1; - bool ignore_running_workspace_on_same_commit = 3; - bool ignore_running_prebuild = 4; - bool allow_using_previous_prebuilds = 5; - bool force_default_config = 6; + Source source = 2; + StartWorkspaceSpec spec = 3; - oneof source { - string context_url = 7; - string repository_id = 8; - } + bool ignore_running_workspace_on_same_commit = 4; + bool ignore_running_prebuild = 5; + bool allow_using_previous_prebuilds = 6; + bool force_default_config = 7; } -message CreateAndStartWorkspaceResponse { - string workspace_id = 1; -} +message CreateAndStartWorkspaceResponse { string workspace_id = 1; } -message StartWorkspaceRequest { - string workspace_id = 1; -} +message StartWorkspaceRequest { string workspace_id = 1; } message StartWorkspaceResponse {} @@ -171,9 +203,7 @@ message StopWorkspaceRequest { message StopWorkspaceResponse {} -message DeleteWorkspaceRequest { - string workspace_id = 1; -} +message DeleteWorkspaceRequest { string workspace_id = 1; } message UpdateWorkspaceRequest { @@ -182,9 +212,7 @@ message UpdateWorkspaceRequest { WorkspaceSpec spec = 2; } -message UpdateWorkspaceResponse { - Workspace workspace = 1; -} +message UpdateWorkspaceResponse { Workspace workspace = 1; } message DeleteWorkspaceResponse {} @@ -194,29 +222,17 @@ message ListSupportedWorkspaceClassesResponse { repeated WorkspaceClass result = 1; } -message GetDefaultWorkspaceImageRequest { - string workspace_id = 1; -} +message GetDefaultWorkspaceImageRequest { string workspace_id = 1; } -message GetDefaultWorkspaceImageResponse { - string default_workspace_image = 1; -} +message GetDefaultWorkspaceImageResponse { string default_workspace_image = 1; } -message GetWorkspaceOwnerTokenRequest { - string workspace_id = 1; -} +message GetWorkspaceOwnerTokenRequest { string workspace_id = 1; } -message GetWorkspaceOwnerTokenResponse { - string owner_token = 1; -} +message GetWorkspaceOwnerTokenResponse { string owner_token = 1; } -message GetWorkspaceEditorCredentialsRequest { - string workspace_id = 1; -} +message GetWorkspaceEditorCredentialsRequest { string workspace_id = 1; } -message GetWorkspaceEditorCredentialsResponse { - string editor_credentials = 1; -} +message GetWorkspaceEditorCredentialsResponse { string editor_credentials = 1; } message SendHeartBeatRequest { string workspace_id = 1; @@ -228,11 +244,9 @@ message SendHeartBeatRequest { message SendHeartBeatResponse {} -message WatchWorkpaceImageBuildLogsRequest { - string workspace_id = 1; -} +message WatchWorkspaceImageBuildLogsRequest { string workspace_id = 1; } -message WatchWorkpaceImageBuildLogsResponse { +message WatchWorkspaceImageBuildLogsResponse { WorkspaceImageBuild workspace_image_build = 1; } @@ -253,7 +267,7 @@ message WorkspaceImageBuild { Phase phase = 1; string message = 2; - Log log = 3; + repeated Log logs = 3; } message ListWorkspacePortsRequest { @@ -285,17 +299,11 @@ message CreateWorkspaceSnapshotRequest { bool wait = 2; } -message CreateWorkspaceSnapshotResponse { - WorkspaceSnapshot snapshot = 1; -} +message CreateWorkspaceSnapshotResponse { WorkspaceSnapshot snapshot = 1; } -message WaitWorkspaceSnapshotRequest { - string snapshot_id = 1; -} +message WaitWorkspaceSnapshotRequest { string snapshot_id = 1; } -message WaitWorkspaceSnapshotResponse { - WorkspaceSnapshot snapshot = 1; -} +message WaitWorkspaceSnapshotResponse { WorkspaceSnapshot snapshot = 1; } message ListWorkspaceSnapshotsRequest { string workspace_id = 1; @@ -347,9 +355,7 @@ message ListWorkspaceInstancesResponse { PaginationResponse pagination = 2; } -message RestoreWorkspaceRequest { - string workspace_id = 1; -} +message RestoreWorkspaceRequest { string workspace_id = 1; } message RestoreWorkspaceResponse {} @@ -587,13 +593,16 @@ message WorkspacePhase { enum WorkspaceScope { WORKSPACE_SCOPE_UNSPECIFIED = 0; - // WORKSPACE_SCOPE_MY_WORKSPACES_IN_ORGANIZATION scopes workspaces that is owned by current user in the organization + // WORKSPACE_SCOPE_MY_WORKSPACES_IN_ORGANIZATION scopes workspaces that is + // owned by current user in the organization WORKSPACE_SCOPE_MY_WORKSPACES_IN_ORGANIZATION = 1; - // WORKSPACE_SCOPE_ALL_WORKSPACES_IN_ORGANIZATION scopes all workspaces in the organization + // WORKSPACE_SCOPE_ALL_WORKSPACES_IN_ORGANIZATION scopes all workspaces in the + // organization WORKSPACE_SCOPE_ALL_WORKSPACES_IN_ORGANIZATION = 2; - // WORKSPACE_SCOPE_ALL_WORKSPACES_IN_INSTALLATION scopes all workspaces in the installation + // WORKSPACE_SCOPE_ALL_WORKSPACES_IN_INSTALLATION scopes all workspaces in the + // installation WORKSPACE_SCOPE_ALL_WORKSPACES_IN_INSTALLATION = 3; } @@ -629,8 +638,9 @@ message WorkspaceSpec { bool pinned = 3; - // timeout is the timeout duration to stop the workspace since the last activity - google.protobuf.Duration timeout = 4; + // timeout is the timeout duration to stop the workspace since the last + // activity +. google.protobuf.Duration timeout = 4; // git_status details the Git working copy status of the workspace. WorkspaceGitStatus git_status = 5; diff --git a/components/public-api/go/v1/order_by.pb.go b/components/public-api/go/v1/order_by.pb.go new file mode 100644 index 00000000000000..3ecbdf67b155cb --- /dev/null +++ b/components/public-api/go/v1/order_by.pb.go @@ -0,0 +1,153 @@ +// Copyright (c) 2023 Gitpod GmbH. All rights reserved. +// Licensed under the GNU Affero General Public License (AGPL). +// See License.AGPL.txt in the project root for license information. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc (unknown) +// source: gitpod/v1/order_by.proto + +package v1 + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type OrderBy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // order_by is the field to sort resources by. It follow SQL syntax: comma + // separated list of fields. For example: "foo,bar". The default sorting order + // is ascending. To specify descending order for a field, a suffix " desc" + // should be appended to the field name. For example: "foo desc,bar". + OrderBy string `protobuf:"bytes,1,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"` +} + +func (x *OrderBy) Reset() { + *x = OrderBy{} + if protoimpl.UnsafeEnabled { + mi := &file_gitpod_v1_order_by_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OrderBy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OrderBy) ProtoMessage() {} + +func (x *OrderBy) ProtoReflect() protoreflect.Message { + mi := &file_gitpod_v1_order_by_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OrderBy.ProtoReflect.Descriptor instead. +func (*OrderBy) Descriptor() ([]byte, []int) { + return file_gitpod_v1_order_by_proto_rawDescGZIP(), []int{0} +} + +func (x *OrderBy) GetOrderBy() string { + if x != nil { + return x.OrderBy + } + return "" +} + +var File_gitpod_v1_order_by_proto protoreflect.FileDescriptor + +var file_gitpod_v1_order_by_proto_rawDesc = []byte{ + 0x0a, 0x18, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x5f, 0x62, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x67, 0x69, 0x74, 0x70, + 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x22, 0x24, 0x0a, 0x07, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, + 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x42, 0x39, 0x5a, 0x37, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, + 0x2d, 0x69, 0x6f, 0x2f, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2d, 0x61, 0x70, 0x69, + 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_gitpod_v1_order_by_proto_rawDescOnce sync.Once + file_gitpod_v1_order_by_proto_rawDescData = file_gitpod_v1_order_by_proto_rawDesc +) + +func file_gitpod_v1_order_by_proto_rawDescGZIP() []byte { + file_gitpod_v1_order_by_proto_rawDescOnce.Do(func() { + file_gitpod_v1_order_by_proto_rawDescData = protoimpl.X.CompressGZIP(file_gitpod_v1_order_by_proto_rawDescData) + }) + return file_gitpod_v1_order_by_proto_rawDescData +} + +var file_gitpod_v1_order_by_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_gitpod_v1_order_by_proto_goTypes = []interface{}{ + (*OrderBy)(nil), // 0: gitpod.v1.OrderBy +} +var file_gitpod_v1_order_by_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_gitpod_v1_order_by_proto_init() } +func file_gitpod_v1_order_by_proto_init() { + if File_gitpod_v1_order_by_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_gitpod_v1_order_by_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OrderBy); 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{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_gitpod_v1_order_by_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_gitpod_v1_order_by_proto_goTypes, + DependencyIndexes: file_gitpod_v1_order_by_proto_depIdxs, + MessageInfos: file_gitpod_v1_order_by_proto_msgTypes, + }.Build() + File_gitpod_v1_order_by_proto = out.File + file_gitpod_v1_order_by_proto_rawDesc = nil + file_gitpod_v1_order_by_proto_goTypes = nil + file_gitpod_v1_order_by_proto_depIdxs = nil +} diff --git a/components/public-api/go/v1/v1connect/workspace.connect.go b/components/public-api/go/v1/v1connect/workspace.connect.go index 9192c3409d4fe4..87a75fe4abc00a 100644 --- a/components/public-api/go/v1/v1connect/workspace.connect.go +++ b/components/public-api/go/v1/v1connect/workspace.connect.go @@ -56,21 +56,25 @@ type WorkspaceServiceClient interface { UpdateWorkspace(context.Context, *connect_go.Request[v1.UpdateWorkspaceRequest]) (*connect_go.Response[v1.UpdateWorkspaceResponse], error) // ListSupportedWorkspaceClasses enumerates all available workspace classes. ListSupportedWorkspaceClasses(context.Context, *connect_go.Request[v1.ListSupportedWorkspaceClassesRequest]) (*connect_go.Response[v1.ListSupportedWorkspaceClassesResponse], error) - // GetDefaultWorkspaceImage returns the default workspace image of specified workspace. + // GetDefaultWorkspaceImage returns the default workspace image of specified + // workspace. GetDefaultWorkspaceImage(context.Context, *connect_go.Request[v1.GetDefaultWorkspaceImageRequest]) (*connect_go.Response[v1.GetDefaultWorkspaceImageResponse], error) // SendHeartBeat sends a heartbeat to activate the workspace SendHeartBeat(context.Context, *connect_go.Request[v1.SendHeartBeatRequest]) (*connect_go.Response[v1.SendHeartBeatResponse], error) // GetWorkspaceOwnerToken returns an owner token of workspace. GetWorkspaceOwnerToken(context.Context, *connect_go.Request[v1.GetWorkspaceOwnerTokenRequest]) (*connect_go.Response[v1.GetWorkspaceOwnerTokenResponse], error) - // GetWorkspaceEditorCredentials returns an credentials that is used in editor to encrypt and decrypt secrets + // GetWorkspaceEditorCredentials returns an credentials that is used in editor + // to encrypt and decrypt secrets GetWorkspaceEditorCredentials(context.Context, *connect_go.Request[v1.GetWorkspaceEditorCredentialsRequest]) (*connect_go.Response[v1.GetWorkspaceEditorCredentialsResponse], error) - // WatchWorkpaceImageBuildLogs watches the image build logs of prebuild workspace. - WatchWorkpaceImageBuildLogs(context.Context, *connect_go.Request[v1.WatchWorkpaceImageBuildLogsRequest]) (*connect_go.ServerStreamForClient[v1.WatchWorkpaceImageBuildLogsResponse], error) + // WatchWorkspaceImageBuildLogs watches the image build logs of prebuild + // workspace. + WatchWorkspaceImageBuildLogs(context.Context, *connect_go.Request[v1.WatchWorkspaceImageBuildLogsRequest]) (*connect_go.ServerStreamForClient[v1.WatchWorkspaceImageBuildLogsResponse], error) // ListWorkspacePorts lists workspace ports. ListWorkspacePorts(context.Context, *connect_go.Request[v1.ListWorkspacePortsRequest]) (*connect_go.Response[v1.ListWorkspacePortsResponse], error) // UpdateWorkspacePort updates a workspace port. UpdateWorkspacePort(context.Context, *connect_go.Request[v1.UpdateWorkspacePortRequest]) (*connect_go.Response[v1.UpdateWorkspacePortResponse], error) - // CreateWorkspaceSnapshot creates a snapshot of the workspace that can be shared with others. + // CreateWorkspaceSnapshot creates a snapshot of the workspace that can be + // shared with others. CreateWorkspaceSnapshot(context.Context, *connect_go.Request[v1.CreateWorkspaceSnapshotRequest]) (*connect_go.Response[v1.CreateWorkspaceSnapshotResponse], error) // WaitWorkspaceSnapshot waits for the snapshot to be available or failed. WaitWorkspaceSnapshot(context.Context, *connect_go.Request[v1.WaitWorkspaceSnapshotRequest]) (*connect_go.Response[v1.WaitWorkspaceSnapshotResponse], error) @@ -157,9 +161,9 @@ func NewWorkspaceServiceClient(httpClient connect_go.HTTPClient, baseURL string, baseURL+"/gitpod.v1.WorkspaceService/GetWorkspaceEditorCredentials", opts..., ), - watchWorkpaceImageBuildLogs: connect_go.NewClient[v1.WatchWorkpaceImageBuildLogsRequest, v1.WatchWorkpaceImageBuildLogsResponse]( + watchWorkspaceImageBuildLogs: connect_go.NewClient[v1.WatchWorkspaceImageBuildLogsRequest, v1.WatchWorkspaceImageBuildLogsResponse]( httpClient, - baseURL+"/gitpod.v1.WorkspaceService/WatchWorkpaceImageBuildLogs", + baseURL+"/gitpod.v1.WorkspaceService/WatchWorkspaceImageBuildLogs", opts..., ), listWorkspacePorts: connect_go.NewClient[v1.ListWorkspacePortsRequest, v1.ListWorkspacePortsResponse]( @@ -215,7 +219,7 @@ type workspaceServiceClient struct { sendHeartBeat *connect_go.Client[v1.SendHeartBeatRequest, v1.SendHeartBeatResponse] getWorkspaceOwnerToken *connect_go.Client[v1.GetWorkspaceOwnerTokenRequest, v1.GetWorkspaceOwnerTokenResponse] getWorkspaceEditorCredentials *connect_go.Client[v1.GetWorkspaceEditorCredentialsRequest, v1.GetWorkspaceEditorCredentialsResponse] - watchWorkpaceImageBuildLogs *connect_go.Client[v1.WatchWorkpaceImageBuildLogsRequest, v1.WatchWorkpaceImageBuildLogsResponse] + watchWorkspaceImageBuildLogs *connect_go.Client[v1.WatchWorkspaceImageBuildLogsRequest, v1.WatchWorkspaceImageBuildLogsResponse] listWorkspacePorts *connect_go.Client[v1.ListWorkspacePortsRequest, v1.ListWorkspacePortsResponse] updateWorkspacePort *connect_go.Client[v1.UpdateWorkspacePortRequest, v1.UpdateWorkspacePortResponse] createWorkspaceSnapshot *connect_go.Client[v1.CreateWorkspaceSnapshotRequest, v1.CreateWorkspaceSnapshotResponse] @@ -290,9 +294,9 @@ func (c *workspaceServiceClient) GetWorkspaceEditorCredentials(ctx context.Conte return c.getWorkspaceEditorCredentials.CallUnary(ctx, req) } -// WatchWorkpaceImageBuildLogs calls gitpod.v1.WorkspaceService.WatchWorkpaceImageBuildLogs. -func (c *workspaceServiceClient) WatchWorkpaceImageBuildLogs(ctx context.Context, req *connect_go.Request[v1.WatchWorkpaceImageBuildLogsRequest]) (*connect_go.ServerStreamForClient[v1.WatchWorkpaceImageBuildLogsResponse], error) { - return c.watchWorkpaceImageBuildLogs.CallServerStream(ctx, req) +// WatchWorkspaceImageBuildLogs calls gitpod.v1.WorkspaceService.WatchWorkspaceImageBuildLogs. +func (c *workspaceServiceClient) WatchWorkspaceImageBuildLogs(ctx context.Context, req *connect_go.Request[v1.WatchWorkspaceImageBuildLogsRequest]) (*connect_go.ServerStreamForClient[v1.WatchWorkspaceImageBuildLogsResponse], error) { + return c.watchWorkspaceImageBuildLogs.CallServerStream(ctx, req) } // ListWorkspacePorts calls gitpod.v1.WorkspaceService.ListWorkspacePorts. @@ -357,21 +361,25 @@ type WorkspaceServiceHandler interface { UpdateWorkspace(context.Context, *connect_go.Request[v1.UpdateWorkspaceRequest]) (*connect_go.Response[v1.UpdateWorkspaceResponse], error) // ListSupportedWorkspaceClasses enumerates all available workspace classes. ListSupportedWorkspaceClasses(context.Context, *connect_go.Request[v1.ListSupportedWorkspaceClassesRequest]) (*connect_go.Response[v1.ListSupportedWorkspaceClassesResponse], error) - // GetDefaultWorkspaceImage returns the default workspace image of specified workspace. + // GetDefaultWorkspaceImage returns the default workspace image of specified + // workspace. GetDefaultWorkspaceImage(context.Context, *connect_go.Request[v1.GetDefaultWorkspaceImageRequest]) (*connect_go.Response[v1.GetDefaultWorkspaceImageResponse], error) // SendHeartBeat sends a heartbeat to activate the workspace SendHeartBeat(context.Context, *connect_go.Request[v1.SendHeartBeatRequest]) (*connect_go.Response[v1.SendHeartBeatResponse], error) // GetWorkspaceOwnerToken returns an owner token of workspace. GetWorkspaceOwnerToken(context.Context, *connect_go.Request[v1.GetWorkspaceOwnerTokenRequest]) (*connect_go.Response[v1.GetWorkspaceOwnerTokenResponse], error) - // GetWorkspaceEditorCredentials returns an credentials that is used in editor to encrypt and decrypt secrets + // GetWorkspaceEditorCredentials returns an credentials that is used in editor + // to encrypt and decrypt secrets GetWorkspaceEditorCredentials(context.Context, *connect_go.Request[v1.GetWorkspaceEditorCredentialsRequest]) (*connect_go.Response[v1.GetWorkspaceEditorCredentialsResponse], error) - // WatchWorkpaceImageBuildLogs watches the image build logs of prebuild workspace. - WatchWorkpaceImageBuildLogs(context.Context, *connect_go.Request[v1.WatchWorkpaceImageBuildLogsRequest], *connect_go.ServerStream[v1.WatchWorkpaceImageBuildLogsResponse]) error + // WatchWorkspaceImageBuildLogs watches the image build logs of prebuild + // workspace. + WatchWorkspaceImageBuildLogs(context.Context, *connect_go.Request[v1.WatchWorkspaceImageBuildLogsRequest], *connect_go.ServerStream[v1.WatchWorkspaceImageBuildLogsResponse]) error // ListWorkspacePorts lists workspace ports. ListWorkspacePorts(context.Context, *connect_go.Request[v1.ListWorkspacePortsRequest]) (*connect_go.Response[v1.ListWorkspacePortsResponse], error) // UpdateWorkspacePort updates a workspace port. UpdateWorkspacePort(context.Context, *connect_go.Request[v1.UpdateWorkspacePortRequest]) (*connect_go.Response[v1.UpdateWorkspacePortResponse], error) - // CreateWorkspaceSnapshot creates a snapshot of the workspace that can be shared with others. + // CreateWorkspaceSnapshot creates a snapshot of the workspace that can be + // shared with others. CreateWorkspaceSnapshot(context.Context, *connect_go.Request[v1.CreateWorkspaceSnapshotRequest]) (*connect_go.Response[v1.CreateWorkspaceSnapshotResponse], error) // WaitWorkspaceSnapshot waits for the snapshot to be available or failed. WaitWorkspaceSnapshot(context.Context, *connect_go.Request[v1.WaitWorkspaceSnapshotRequest]) (*connect_go.Response[v1.WaitWorkspaceSnapshotResponse], error) @@ -455,9 +463,9 @@ func NewWorkspaceServiceHandler(svc WorkspaceServiceHandler, opts ...connect_go. svc.GetWorkspaceEditorCredentials, opts..., )) - mux.Handle("/gitpod.v1.WorkspaceService/WatchWorkpaceImageBuildLogs", connect_go.NewServerStreamHandler( - "/gitpod.v1.WorkspaceService/WatchWorkpaceImageBuildLogs", - svc.WatchWorkpaceImageBuildLogs, + mux.Handle("/gitpod.v1.WorkspaceService/WatchWorkspaceImageBuildLogs", connect_go.NewServerStreamHandler( + "/gitpod.v1.WorkspaceService/WatchWorkspaceImageBuildLogs", + svc.WatchWorkspaceImageBuildLogs, opts..., )) mux.Handle("/gitpod.v1.WorkspaceService/ListWorkspacePorts", connect_go.NewUnaryHandler( @@ -553,8 +561,8 @@ func (UnimplementedWorkspaceServiceHandler) GetWorkspaceEditorCredentials(contex return nil, connect_go.NewError(connect_go.CodeUnimplemented, errors.New("gitpod.v1.WorkspaceService.GetWorkspaceEditorCredentials is not implemented")) } -func (UnimplementedWorkspaceServiceHandler) WatchWorkpaceImageBuildLogs(context.Context, *connect_go.Request[v1.WatchWorkpaceImageBuildLogsRequest], *connect_go.ServerStream[v1.WatchWorkpaceImageBuildLogsResponse]) error { - return connect_go.NewError(connect_go.CodeUnimplemented, errors.New("gitpod.v1.WorkspaceService.WatchWorkpaceImageBuildLogs is not implemented")) +func (UnimplementedWorkspaceServiceHandler) WatchWorkspaceImageBuildLogs(context.Context, *connect_go.Request[v1.WatchWorkspaceImageBuildLogsRequest], *connect_go.ServerStream[v1.WatchWorkspaceImageBuildLogsResponse]) error { + return connect_go.NewError(connect_go.CodeUnimplemented, errors.New("gitpod.v1.WorkspaceService.WatchWorkspaceImageBuildLogs is not implemented")) } func (UnimplementedWorkspaceServiceHandler) ListWorkspacePorts(context.Context, *connect_go.Request[v1.ListWorkspacePortsRequest]) (*connect_go.Response[v1.ListWorkspacePortsResponse], error) { diff --git a/components/public-api/go/v1/workspace.pb.go b/components/public-api/go/v1/workspace.pb.go index 549599b196387a..9bc99046ecfcd2 100644 --- a/components/public-api/go/v1/workspace.pb.go +++ b/components/public-api/go/v1/workspace.pb.go @@ -84,11 +84,14 @@ type WorkspaceScope int32 const ( WorkspaceScope_WORKSPACE_SCOPE_UNSPECIFIED WorkspaceScope = 0 - // WORKSPACE_SCOPE_MY_WORKSPACES_IN_ORGANIZATION scopes workspaces that is owned by current user in the organization + // WORKSPACE_SCOPE_MY_WORKSPACES_IN_ORGANIZATION scopes workspaces that is + // owned by current user in the organization WorkspaceScope_WORKSPACE_SCOPE_MY_WORKSPACES_IN_ORGANIZATION WorkspaceScope = 1 - // WORKSPACE_SCOPE_ALL_WORKSPACES_IN_ORGANIZATION scopes all workspaces in the organization + // WORKSPACE_SCOPE_ALL_WORKSPACES_IN_ORGANIZATION scopes all workspaces in the + // organization WorkspaceScope_WORKSPACE_SCOPE_ALL_WORKSPACES_IN_ORGANIZATION WorkspaceScope = 2 - // WORKSPACE_SCOPE_ALL_WORKSPACES_IN_INSTALLATION scopes all workspaces in the installation + // WORKSPACE_SCOPE_ALL_WORKSPACES_IN_INSTALLATION scopes all workspaces in the + // installation WorkspaceScope_WORKSPACE_SCOPE_ALL_WORKSPACES_IN_INSTALLATION WorkspaceScope = 3 ) @@ -135,6 +138,54 @@ func (WorkspaceScope) EnumDescriptor() ([]byte, []int) { return file_gitpod_v1_workspace_proto_rawDescGZIP(), []int{1} } +type ListWorkspacesRequest_OrderByField int32 + +const ( + ListWorkspacesRequest_ORDER_BY_FIELD_UNSPECIFIED ListWorkspacesRequest_OrderByField = 0 + // ORDER_BY_FIELD_CREATION_TIME is the default sorting field, it sorts + // workspaces by (instances) creation time + ListWorkspacesRequest_ORDER_BY_FIELD_CREATION_TIME ListWorkspacesRequest_OrderByField = 1 +) + +// Enum value maps for ListWorkspacesRequest_OrderByField. +var ( + ListWorkspacesRequest_OrderByField_name = map[int32]string{ + 0: "ORDER_BY_FIELD_UNSPECIFIED", + 1: "ORDER_BY_FIELD_CREATION_TIME", + } + ListWorkspacesRequest_OrderByField_value = map[string]int32{ + "ORDER_BY_FIELD_UNSPECIFIED": 0, + "ORDER_BY_FIELD_CREATION_TIME": 1, + } +) + +func (x ListWorkspacesRequest_OrderByField) Enum() *ListWorkspacesRequest_OrderByField { + p := new(ListWorkspacesRequest_OrderByField) + *p = x + return p +} + +func (x ListWorkspacesRequest_OrderByField) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ListWorkspacesRequest_OrderByField) Descriptor() protoreflect.EnumDescriptor { + return file_gitpod_v1_workspace_proto_enumTypes[2].Descriptor() +} + +func (ListWorkspacesRequest_OrderByField) Type() protoreflect.EnumType { + return &file_gitpod_v1_workspace_proto_enumTypes[2] +} + +func (x ListWorkspacesRequest_OrderByField) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ListWorkspacesRequest_OrderByField.Descriptor instead. +func (ListWorkspacesRequest_OrderByField) EnumDescriptor() ([]byte, []int) { + return file_gitpod_v1_workspace_proto_rawDescGZIP(), []int{4, 0} +} + type WorkspaceImageBuild_Phase int32 const ( @@ -174,11 +225,11 @@ func (x WorkspaceImageBuild_Phase) String() string { } func (WorkspaceImageBuild_Phase) Descriptor() protoreflect.EnumDescriptor { - return file_gitpod_v1_workspace_proto_enumTypes[2].Descriptor() + return file_gitpod_v1_workspace_proto_enumTypes[3].Descriptor() } func (WorkspaceImageBuild_Phase) Type() protoreflect.EnumType { - return &file_gitpod_v1_workspace_proto_enumTypes[2] + return &file_gitpod_v1_workspace_proto_enumTypes[3] } func (x WorkspaceImageBuild_Phase) Number() protoreflect.EnumNumber { @@ -226,11 +277,11 @@ func (x WorkspaceSnapshot_State) String() string { } func (WorkspaceSnapshot_State) Descriptor() protoreflect.EnumDescriptor { - return file_gitpod_v1_workspace_proto_enumTypes[3].Descriptor() + return file_gitpod_v1_workspace_proto_enumTypes[4].Descriptor() } func (WorkspaceSnapshot_State) Type() protoreflect.EnumType { - return &file_gitpod_v1_workspace_proto_enumTypes[3] + return &file_gitpod_v1_workspace_proto_enumTypes[4] } func (x WorkspaceSnapshot_State) Number() protoreflect.EnumNumber { @@ -281,11 +332,11 @@ func (x WorkspacePort_Policy) String() string { } func (WorkspacePort_Policy) Descriptor() protoreflect.EnumDescriptor { - return file_gitpod_v1_workspace_proto_enumTypes[4].Descriptor() + return file_gitpod_v1_workspace_proto_enumTypes[5].Descriptor() } func (WorkspacePort_Policy) Type() protoreflect.EnumType { - return &file_gitpod_v1_workspace_proto_enumTypes[4] + return &file_gitpod_v1_workspace_proto_enumTypes[5] } func (x WorkspacePort_Policy) Number() protoreflect.EnumNumber { @@ -333,11 +384,11 @@ func (x WorkspacePort_Protocol) String() string { } func (WorkspacePort_Protocol) Descriptor() protoreflect.EnumDescriptor { - return file_gitpod_v1_workspace_proto_enumTypes[5].Descriptor() + return file_gitpod_v1_workspace_proto_enumTypes[6].Descriptor() } func (WorkspacePort_Protocol) Type() protoreflect.EnumType { - return &file_gitpod_v1_workspace_proto_enumTypes[5] + return &file_gitpod_v1_workspace_proto_enumTypes[6] } func (x WorkspacePort_Protocol) Number() protoreflect.EnumNumber { @@ -430,11 +481,11 @@ func (x WorkspacePhase_Phase) String() string { } func (WorkspacePhase_Phase) Descriptor() protoreflect.EnumDescriptor { - return file_gitpod_v1_workspace_proto_enumTypes[6].Descriptor() + return file_gitpod_v1_workspace_proto_enumTypes[7].Descriptor() } func (WorkspacePhase_Phase) Type() protoreflect.EnumType { - return &file_gitpod_v1_workspace_proto_enumTypes[6] + return &file_gitpod_v1_workspace_proto_enumTypes[7] } func (x WorkspacePhase_Phase) Number() protoreflect.EnumNumber { @@ -662,14 +713,18 @@ type ListWorkspacesRequest struct { // pagination contains the pagination options for listing workspaces Pagination *PaginationRequest `protobuf:"bytes,1,opt,name=pagination,proto3" json:"pagination,omitempty"` + // order_by is the field to sort workspaces by, allowed values are OrderBy + OrderBy *OrderBy `protobuf:"bytes,2,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"` // scope of the workspaces - Scope WorkspaceScope `protobuf:"varint,2,opt,name=scope,proto3,enum=gitpod.v1.WorkspaceScope" json:"scope,omitempty"` + Scope WorkspaceScope `protobuf:"varint,3,opt,name=scope,proto3,enum=gitpod.v1.WorkspaceScope" json:"scope,omitempty"` // organization_id is the ID of the organization that contains the workspaces - OrganizationId string `protobuf:"bytes,3,opt,name=organization_id,json=organizationId,proto3" json:"organization_id,omitempty"` + OrganizationId string `protobuf:"bytes,4,opt,name=organization_id,json=organizationId,proto3" json:"organization_id,omitempty"` // pinned indicates whether to list only pinned workspaces - Pinned bool `protobuf:"varint,4,opt,name=pinned,proto3" json:"pinned,omitempty"` + Pinned bool `protobuf:"varint,5,opt,name=pinned,proto3" json:"pinned,omitempty"` // search_term is a search term to filter workspaces by name - SearchTerm string `protobuf:"bytes,5,opt,name=search_term,json=searchTerm,proto3" json:"search_term,omitempty"` + SearchTerm string `protobuf:"bytes,6,opt,name=search_term,json=searchTerm,proto3" json:"search_term,omitempty"` + WorkspaceId string `protobuf:"bytes,7,opt,name=workspace_id,json=workspaceId,proto3" json:"workspace_id,omitempty"` + OwnerId string `protobuf:"bytes,8,opt,name=owner_id,json=ownerId,proto3" json:"owner_id,omitempty"` } func (x *ListWorkspacesRequest) Reset() { @@ -711,6 +766,13 @@ func (x *ListWorkspacesRequest) GetPagination() *PaginationRequest { return nil } +func (x *ListWorkspacesRequest) GetOrderBy() *OrderBy { + if x != nil { + return x.OrderBy + } + return nil +} + func (x *ListWorkspacesRequest) GetScope() WorkspaceScope { if x != nil { return x.Scope @@ -739,6 +801,20 @@ func (x *ListWorkspacesRequest) GetSearchTerm() string { return "" } +func (x *ListWorkspacesRequest) GetWorkspaceId() string { + if x != nil { + return x.WorkspaceId + } + return "" +} + +func (x *ListWorkspacesRequest) GetOwnerId() string { + if x != nil { + return x.OwnerId + } + return "" +} + type ListWorkspacesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -801,17 +877,13 @@ type CreateAndStartWorkspaceRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - OrganizationId string `protobuf:"bytes,1,opt,name=organization_id,json=organizationId,proto3" json:"organization_id,omitempty"` - Spec *StartWorkspaceSpec `protobuf:"bytes,2,opt,name=spec,proto3" json:"spec,omitempty"` - IgnoreRunningWorkspaceOnSameCommit bool `protobuf:"varint,3,opt,name=ignore_running_workspace_on_same_commit,json=ignoreRunningWorkspaceOnSameCommit,proto3" json:"ignore_running_workspace_on_same_commit,omitempty"` - IgnoreRunningPrebuild bool `protobuf:"varint,4,opt,name=ignore_running_prebuild,json=ignoreRunningPrebuild,proto3" json:"ignore_running_prebuild,omitempty"` - AllowUsingPreviousPrebuilds bool `protobuf:"varint,5,opt,name=allow_using_previous_prebuilds,json=allowUsingPreviousPrebuilds,proto3" json:"allow_using_previous_prebuilds,omitempty"` - ForceDefaultConfig bool `protobuf:"varint,6,opt,name=force_default_config,json=forceDefaultConfig,proto3" json:"force_default_config,omitempty"` - // Types that are assignable to Source: - // - // *CreateAndStartWorkspaceRequest_ContextUrl - // *CreateAndStartWorkspaceRequest_RepositoryId - Source isCreateAndStartWorkspaceRequest_Source `protobuf_oneof:"source"` + OrganizationId string `protobuf:"bytes,1,opt,name=organization_id,json=organizationId,proto3" json:"organization_id,omitempty"` + Source *CreateAndStartWorkspaceRequest_Source `protobuf:"bytes,2,opt,name=source,proto3" json:"source,omitempty"` + Spec *StartWorkspaceSpec `protobuf:"bytes,3,opt,name=spec,proto3" json:"spec,omitempty"` + IgnoreRunningWorkspaceOnSameCommit bool `protobuf:"varint,4,opt,name=ignore_running_workspace_on_same_commit,json=ignoreRunningWorkspaceOnSameCommit,proto3" json:"ignore_running_workspace_on_same_commit,omitempty"` + IgnoreRunningPrebuild bool `protobuf:"varint,5,opt,name=ignore_running_prebuild,json=ignoreRunningPrebuild,proto3" json:"ignore_running_prebuild,omitempty"` + AllowUsingPreviousPrebuilds bool `protobuf:"varint,6,opt,name=allow_using_previous_prebuilds,json=allowUsingPreviousPrebuilds,proto3" json:"allow_using_previous_prebuilds,omitempty"` + ForceDefaultConfig bool `protobuf:"varint,7,opt,name=force_default_config,json=forceDefaultConfig,proto3" json:"force_default_config,omitempty"` } func (x *CreateAndStartWorkspaceRequest) Reset() { @@ -853,6 +925,13 @@ func (x *CreateAndStartWorkspaceRequest) GetOrganizationId() string { return "" } +func (x *CreateAndStartWorkspaceRequest) GetSource() *CreateAndStartWorkspaceRequest_Source { + if x != nil { + return x.Source + } + return nil +} + func (x *CreateAndStartWorkspaceRequest) GetSpec() *StartWorkspaceSpec { if x != nil { return x.Spec @@ -888,43 +967,6 @@ func (x *CreateAndStartWorkspaceRequest) GetForceDefaultConfig() bool { return false } -func (m *CreateAndStartWorkspaceRequest) GetSource() isCreateAndStartWorkspaceRequest_Source { - if m != nil { - return m.Source - } - return nil -} - -func (x *CreateAndStartWorkspaceRequest) GetContextUrl() string { - if x, ok := x.GetSource().(*CreateAndStartWorkspaceRequest_ContextUrl); ok { - return x.ContextUrl - } - return "" -} - -func (x *CreateAndStartWorkspaceRequest) GetRepositoryId() string { - if x, ok := x.GetSource().(*CreateAndStartWorkspaceRequest_RepositoryId); ok { - return x.RepositoryId - } - return "" -} - -type isCreateAndStartWorkspaceRequest_Source interface { - isCreateAndStartWorkspaceRequest_Source() -} - -type CreateAndStartWorkspaceRequest_ContextUrl struct { - ContextUrl string `protobuf:"bytes,7,opt,name=context_url,json=contextUrl,proto3,oneof"` -} - -type CreateAndStartWorkspaceRequest_RepositoryId struct { - RepositoryId string `protobuf:"bytes,8,opt,name=repository_id,json=repositoryId,proto3,oneof"` -} - -func (*CreateAndStartWorkspaceRequest_ContextUrl) isCreateAndStartWorkspaceRequest_Source() {} - -func (*CreateAndStartWorkspaceRequest_RepositoryId) isCreateAndStartWorkspaceRequest_Source() {} - type CreateAndStartWorkspaceResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1800,7 +1842,7 @@ func (*SendHeartBeatResponse) Descriptor() ([]byte, []int) { return file_gitpod_v1_workspace_proto_rawDescGZIP(), []int{25} } -type WatchWorkpaceImageBuildLogsRequest struct { +type WatchWorkspaceImageBuildLogsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -1808,8 +1850,8 @@ type WatchWorkpaceImageBuildLogsRequest struct { WorkspaceId string `protobuf:"bytes,1,opt,name=workspace_id,json=workspaceId,proto3" json:"workspace_id,omitempty"` } -func (x *WatchWorkpaceImageBuildLogsRequest) Reset() { - *x = WatchWorkpaceImageBuildLogsRequest{} +func (x *WatchWorkspaceImageBuildLogsRequest) Reset() { + *x = WatchWorkspaceImageBuildLogsRequest{} if protoimpl.UnsafeEnabled { mi := &file_gitpod_v1_workspace_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1817,13 +1859,13 @@ func (x *WatchWorkpaceImageBuildLogsRequest) Reset() { } } -func (x *WatchWorkpaceImageBuildLogsRequest) String() string { +func (x *WatchWorkspaceImageBuildLogsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WatchWorkpaceImageBuildLogsRequest) ProtoMessage() {} +func (*WatchWorkspaceImageBuildLogsRequest) ProtoMessage() {} -func (x *WatchWorkpaceImageBuildLogsRequest) ProtoReflect() protoreflect.Message { +func (x *WatchWorkspaceImageBuildLogsRequest) ProtoReflect() protoreflect.Message { mi := &file_gitpod_v1_workspace_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1835,19 +1877,19 @@ func (x *WatchWorkpaceImageBuildLogsRequest) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use WatchWorkpaceImageBuildLogsRequest.ProtoReflect.Descriptor instead. -func (*WatchWorkpaceImageBuildLogsRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use WatchWorkspaceImageBuildLogsRequest.ProtoReflect.Descriptor instead. +func (*WatchWorkspaceImageBuildLogsRequest) Descriptor() ([]byte, []int) { return file_gitpod_v1_workspace_proto_rawDescGZIP(), []int{26} } -func (x *WatchWorkpaceImageBuildLogsRequest) GetWorkspaceId() string { +func (x *WatchWorkspaceImageBuildLogsRequest) GetWorkspaceId() string { if x != nil { return x.WorkspaceId } return "" } -type WatchWorkpaceImageBuildLogsResponse struct { +type WatchWorkspaceImageBuildLogsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -1855,8 +1897,8 @@ type WatchWorkpaceImageBuildLogsResponse struct { WorkspaceImageBuild *WorkspaceImageBuild `protobuf:"bytes,1,opt,name=workspace_image_build,json=workspaceImageBuild,proto3" json:"workspace_image_build,omitempty"` } -func (x *WatchWorkpaceImageBuildLogsResponse) Reset() { - *x = WatchWorkpaceImageBuildLogsResponse{} +func (x *WatchWorkspaceImageBuildLogsResponse) Reset() { + *x = WatchWorkspaceImageBuildLogsResponse{} if protoimpl.UnsafeEnabled { mi := &file_gitpod_v1_workspace_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1864,13 +1906,13 @@ func (x *WatchWorkpaceImageBuildLogsResponse) Reset() { } } -func (x *WatchWorkpaceImageBuildLogsResponse) String() string { +func (x *WatchWorkspaceImageBuildLogsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WatchWorkpaceImageBuildLogsResponse) ProtoMessage() {} +func (*WatchWorkspaceImageBuildLogsResponse) ProtoMessage() {} -func (x *WatchWorkpaceImageBuildLogsResponse) ProtoReflect() protoreflect.Message { +func (x *WatchWorkspaceImageBuildLogsResponse) ProtoReflect() protoreflect.Message { mi := &file_gitpod_v1_workspace_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1882,12 +1924,12 @@ func (x *WatchWorkpaceImageBuildLogsResponse) ProtoReflect() protoreflect.Messag return mi.MessageOf(x) } -// Deprecated: Use WatchWorkpaceImageBuildLogsResponse.ProtoReflect.Descriptor instead. -func (*WatchWorkpaceImageBuildLogsResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use WatchWorkspaceImageBuildLogsResponse.ProtoReflect.Descriptor instead. +func (*WatchWorkspaceImageBuildLogsResponse) Descriptor() ([]byte, []int) { return file_gitpod_v1_workspace_proto_rawDescGZIP(), []int{27} } -func (x *WatchWorkpaceImageBuildLogsResponse) GetWorkspaceImageBuild() *WorkspaceImageBuild { +func (x *WatchWorkspaceImageBuildLogsResponse) GetWorkspaceImageBuild() *WorkspaceImageBuild { if x != nil { return x.WorkspaceImageBuild } @@ -1899,9 +1941,9 @@ type WorkspaceImageBuild struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Phase WorkspaceImageBuild_Phase `protobuf:"varint,1,opt,name=phase,proto3,enum=gitpod.v1.WorkspaceImageBuild_Phase" json:"phase,omitempty"` - Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` - Log *WorkspaceImageBuild_Log `protobuf:"bytes,3,opt,name=log,proto3" json:"log,omitempty"` + Phase WorkspaceImageBuild_Phase `protobuf:"varint,1,opt,name=phase,proto3,enum=gitpod.v1.WorkspaceImageBuild_Phase" json:"phase,omitempty"` + Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` + Logs []*WorkspaceImageBuild_Log `protobuf:"bytes,3,rep,name=logs,proto3" json:"logs,omitempty"` } func (x *WorkspaceImageBuild) Reset() { @@ -1950,9 +1992,9 @@ func (x *WorkspaceImageBuild) GetMessage() string { return "" } -func (x *WorkspaceImageBuild) GetLog() *WorkspaceImageBuild_Log { +func (x *WorkspaceImageBuild) GetLogs() []*WorkspaceImageBuild_Log { if x != nil { - return x.Log + return x.Logs } return nil } @@ -3542,7 +3584,8 @@ type WorkspaceSpec struct { // Admission describes who can access a workspace instance and its ports. Admission AdmissionLevel `protobuf:"varint,2,opt,name=admission,proto3,enum=gitpod.v1.AdmissionLevel" json:"admission,omitempty"` Pinned bool `protobuf:"varint,3,opt,name=pinned,proto3" json:"pinned,omitempty"` - // timeout is the timeout duration to stop the workspace since the last activity + // timeout is the timeout duration to stop the workspace since the last + // activity Timeout *durationpb.Duration `protobuf:"bytes,4,opt,name=timeout,proto3" json:"timeout,omitempty"` // git_status details the Git working copy status of the workspace. GitStatus *WorkspaceGitStatus `protobuf:"bytes,5,opt,name=git_status,json=gitStatus,proto3" json:"git_status,omitempty"` @@ -3824,6 +3867,61 @@ func (x *WorkspaceInstance) GetConditions() *WorkspaceConditions { return nil } +type CreateAndStartWorkspaceRequest_Source struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ContextUrl string `protobuf:"bytes,1,opt,name=context_url,json=contextUrl,proto3" json:"context_url,omitempty"` + RepositoryId string `protobuf:"bytes,2,opt,name=repository_id,json=repositoryId,proto3" json:"repository_id,omitempty"` +} + +func (x *CreateAndStartWorkspaceRequest_Source) Reset() { + *x = CreateAndStartWorkspaceRequest_Source{} + if protoimpl.UnsafeEnabled { + mi := &file_gitpod_v1_workspace_proto_msgTypes[57] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateAndStartWorkspaceRequest_Source) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateAndStartWorkspaceRequest_Source) ProtoMessage() {} + +func (x *CreateAndStartWorkspaceRequest_Source) ProtoReflect() protoreflect.Message { + mi := &file_gitpod_v1_workspace_proto_msgTypes[57] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateAndStartWorkspaceRequest_Source.ProtoReflect.Descriptor instead. +func (*CreateAndStartWorkspaceRequest_Source) Descriptor() ([]byte, []int) { + return file_gitpod_v1_workspace_proto_rawDescGZIP(), []int{6, 0} +} + +func (x *CreateAndStartWorkspaceRequest_Source) GetContextUrl() string { + if x != nil { + return x.ContextUrl + } + return "" +} + +func (x *CreateAndStartWorkspaceRequest_Source) GetRepositoryId() string { + if x != nil { + return x.RepositoryId + } + return "" +} + type WorkspaceImageBuild_Log struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3837,7 +3935,7 @@ type WorkspaceImageBuild_Log struct { func (x *WorkspaceImageBuild_Log) Reset() { *x = WorkspaceImageBuild_Log{} if protoimpl.UnsafeEnabled { - mi := &file_gitpod_v1_workspace_proto_msgTypes[57] + mi := &file_gitpod_v1_workspace_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3850,7 +3948,7 @@ func (x *WorkspaceImageBuild_Log) String() string { func (*WorkspaceImageBuild_Log) ProtoMessage() {} func (x *WorkspaceImageBuild_Log) ProtoReflect() protoreflect.Message { - mi := &file_gitpod_v1_workspace_proto_msgTypes[57] + mi := &file_gitpod_v1_workspace_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3899,7 +3997,7 @@ type WorkspaceSnapshot_Source struct { func (x *WorkspaceSnapshot_Source) Reset() { *x = WorkspaceSnapshot_Source{} if protoimpl.UnsafeEnabled { - mi := &file_gitpod_v1_workspace_proto_msgTypes[58] + mi := &file_gitpod_v1_workspace_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3912,7 +4010,7 @@ func (x *WorkspaceSnapshot_Source) String() string { func (*WorkspaceSnapshot_Source) ProtoMessage() {} func (x *WorkspaceSnapshot_Source) ProtoReflect() protoreflect.Message { - mi := &file_gitpod_v1_workspace_proto_msgTypes[58] + mi := &file_gitpod_v1_workspace_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3953,685 +4051,703 @@ var file_gitpod_v1_workspace_proto_rawDesc = []byte{ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x22, 0x73, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x05, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x67, 0x69, 0x74, 0x70, - 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, - 0x63, 0x6f, 0x70, 0x65, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x77, - 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x4a, 0x04, - 0x08, 0x01, 0x10, 0x02, 0x52, 0x02, 0x69, 0x64, 0x22, 0x56, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x32, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, - 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x52, 0x04, 0x69, 0x74, 0x65, 0x6d, - 0x22, 0x56, 0x0a, 0x1b, 0x57, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x26, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x77, 0x6f, 0x72, 0x6b, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x22, 0x75, 0x0a, 0x1c, 0x57, 0x61, 0x74, 0x63, - 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x69, - 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, - 0xe8, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0a, 0x70, 0x61, 0x67, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x6f, 0x74, 0x6f, 0x1a, 0x18, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2f, 0x76, 0x31, 0x2f, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x73, 0x0a, + 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x52, 0x05, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x52, 0x02, + 0x69, 0x64, 0x22, 0x56, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x09, 0x77, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4a, 0x04, + 0x08, 0x01, 0x10, 0x02, 0x52, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x22, 0x56, 0x0a, 0x1b, 0x57, 0x61, + 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0c, 0x77, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x88, 0x01, + 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x22, 0x75, 0x0a, 0x1c, 0x57, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, + 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xa7, 0x03, 0x0a, 0x15, 0x4c, 0x69, + 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x2d, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, + 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, + 0x12, 0x2f, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x19, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x69, + 0x6e, 0x6e, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x69, 0x6e, 0x6e, + 0x65, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x74, 0x65, 0x72, + 0x6d, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, + 0x65, 0x72, 0x6d, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x49, + 0x64, 0x22, 0x50, 0x0a, 0x0c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x12, 0x1e, 0x0a, 0x1a, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x42, 0x59, 0x5f, 0x46, 0x49, + 0x45, 0x4c, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x20, 0x0a, 0x1c, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x42, 0x59, 0x5f, 0x46, 0x49, + 0x45, 0x4c, 0x44, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x49, 0x4d, + 0x45, 0x10, 0x01, 0x22, 0x8d, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, + 0x0a, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, + 0x64, 0x2e, 0x76, 0x31, 0x2e, 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, 0x22, 0x9a, 0x04, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x6e, + 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, + 0x48, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x30, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x41, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x31, 0x0a, 0x04, 0x73, 0x70, 0x65, + 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x53, 0x0a, 0x27, + 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x77, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6f, 0x6e, 0x5f, 0x73, 0x61, 0x6d, 0x65, + 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x22, 0x69, + 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x57, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x6e, 0x53, 0x61, 0x6d, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x12, 0x36, 0x0a, 0x17, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x72, 0x75, 0x6e, 0x6e, + 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x15, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0x50, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x43, 0x0a, 0x1e, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x5f, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, + 0x73, 0x5f, 0x70, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x1b, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x55, 0x73, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x65, + 0x76, 0x69, 0x6f, 0x75, 0x73, 0x50, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x30, + 0x0a, 0x14, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x1a, 0x4e, 0x0a, 0x06, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x55, 0x72, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x72, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x49, 0x64, + 0x22, 0x44, 0x0a, 0x1f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x6e, 0x64, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x22, 0x3a, 0x0a, 0x15, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x49, 0x64, 0x22, 0x18, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6a, 0x0a, 0x14, + 0x53, 0x74, 0x6f, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x63, 0x6f, 0x70, - 0x65, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, - 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x06, 0x70, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x72, 0x6d, 0x22, 0x8d, 0x01, 0x0a, 0x16, 0x4c, - 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x69, 0x74, 0x70, - 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, - 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x0a, 0x70, - 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 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, 0x22, 0xd4, 0x03, 0x0a, 0x1e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, - 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, - 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, - 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x53, 0x0a, 0x27, 0x69, 0x67, 0x6e, - 0x6f, 0x72, 0x65, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x77, 0x6f, 0x72, 0x6b, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6f, 0x6e, 0x5f, 0x73, 0x61, 0x6d, 0x65, 0x5f, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x22, 0x69, 0x67, 0x6e, 0x6f, - 0x72, 0x65, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x4f, 0x6e, 0x53, 0x61, 0x6d, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x36, - 0x0a, 0x17, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, - 0x5f, 0x70, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x15, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x72, - 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x43, 0x0a, 0x1e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, - 0x75, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x70, - 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1b, - 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x55, 0x73, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x65, 0x76, 0x69, 0x6f, - 0x75, 0x73, 0x50, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x66, - 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x66, 0x6f, 0x72, 0x63, 0x65, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x21, 0x0a, - 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x55, 0x72, 0x6c, - 0x12, 0x25, 0x0a, 0x0d, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x69, - 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x6f, 0x72, 0x79, 0x49, 0x64, 0x42, 0x08, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x22, 0x44, 0x0a, 0x1f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x6e, 0x64, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x22, 0x3a, 0x0a, 0x15, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x49, 0x64, 0x22, 0x18, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6a, 0x0a, - 0x14, 0x53, 0x74, 0x6f, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, - 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x63, 0x6f, - 0x70, 0x65, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x53, 0x74, 0x6f, - 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x3b, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, - 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x22, - 0x69, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x04, - 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x69, 0x74, - 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x4d, 0x0a, 0x17, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, - 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x09, - 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x70, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, - 0x61, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5a, 0x0a, 0x25, - 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x57, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, - 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, - 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x44, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, - 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x77, + 0x65, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x53, 0x74, 0x6f, 0x70, + 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x3b, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x22, 0x5a, - 0x0a, 0x20, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x77, 0x6f, - 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x15, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x22, 0x42, 0x0a, 0x1d, 0x47, 0x65, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x77, + 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x22, 0x69, + 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x04, 0x73, + 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x69, 0x74, 0x70, + 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, + 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x4d, 0x0a, 0x17, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, + 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x09, 0x77, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x26, 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x70, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, + 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5a, 0x0a, 0x25, 0x4c, + 0x69, 0x73, 0x74, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x52, + 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x44, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x22, 0x5a, 0x0a, + 0x20, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x77, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x15, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x22, 0x42, 0x0a, 0x1d, 0x47, 0x65, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x22, 0x41, 0x0a, + 0x1e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x77, 0x6e, + 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1f, 0x0a, 0x0b, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x22, 0x49, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x22, 0x56, 0x0a, 0x25, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x45, 0x64, 0x69, 0x74, 0x6f, + 0x72, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x63, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x11, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x73, 0x22, 0x5e, 0x0a, 0x14, 0x53, 0x65, 0x6e, 0x64, 0x48, 0x65, 0x61, 0x72, 0x74, + 0x42, 0x65, 0x61, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x22, 0x41, - 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x77, - 0x6e, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x22, 0x49, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, - 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x22, 0x56, 0x0a, 0x25, - 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x45, 0x64, 0x69, 0x74, - 0x6f, 0x72, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x5f, - 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x11, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x61, 0x6c, 0x73, 0x22, 0x5e, 0x0a, 0x14, 0x53, 0x65, 0x6e, 0x64, 0x48, 0x65, 0x61, 0x72, - 0x74, 0x42, 0x65, 0x61, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, - 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, - 0x23, 0x0a, 0x0d, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x43, 0x6c, - 0x6f, 0x73, 0x65, 0x64, 0x22, 0x17, 0x0a, 0x15, 0x53, 0x65, 0x6e, 0x64, 0x48, 0x65, 0x61, 0x72, - 0x74, 0x42, 0x65, 0x61, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x47, 0x0a, - 0x22, 0x57, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x70, 0x61, 0x63, 0x65, 0x49, 0x6d, + 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, + 0x0a, 0x0d, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x43, 0x6c, 0x6f, + 0x73, 0x65, 0x64, 0x22, 0x17, 0x0a, 0x15, 0x53, 0x65, 0x6e, 0x64, 0x48, 0x65, 0x61, 0x72, 0x74, + 0x42, 0x65, 0x61, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x48, 0x0a, 0x23, + 0x57, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x22, 0x79, 0x0a, 0x23, 0x57, 0x61, 0x74, 0x63, 0x68, 0x57, - 0x6f, 0x72, 0x6b, 0x70, 0x61, 0x63, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, - 0x15, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, - 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, - 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x13, 0x77, 0x6f, - 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x22, 0xde, 0x02, 0x0a, 0x13, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, - 0x6d, 0x61, 0x67, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x3a, 0x0a, 0x05, 0x70, 0x68, 0x61, - 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, - 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x6d, - 0x61, 0x67, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x50, 0x68, 0x61, 0x73, 0x65, 0x52, 0x05, - 0x70, 0x68, 0x61, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, - 0x34, 0x0a, 0x03, 0x6c, 0x6f, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, - 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x4c, 0x6f, 0x67, - 0x52, 0x03, 0x6c, 0x6f, 0x67, 0x1a, 0x4c, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x17, 0x0a, 0x07, - 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x22, 0x6d, 0x0a, 0x05, 0x50, 0x68, 0x61, 0x73, 0x65, 0x12, 0x15, 0x0a, 0x11, - 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x42, 0x41, 0x53, - 0x45, 0x5f, 0x49, 0x4d, 0x41, 0x47, 0x45, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x50, 0x48, 0x41, - 0x53, 0x45, 0x5f, 0x47, 0x49, 0x54, 0x50, 0x4f, 0x44, 0x5f, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x10, - 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, - 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x44, 0x4f, 0x4e, 0x45, - 0x10, 0x04, 0x22, 0x7c, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x49, 0x64, 0x12, 0x3c, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0x8b, 0x01, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x2e, 0x0a, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, + 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x22, 0x7a, 0x0a, 0x24, 0x57, 0x61, 0x74, 0x63, 0x68, 0x57, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x75, 0x69, + 0x6c, 0x64, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, + 0x0a, 0x15, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, + 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x13, 0x77, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x75, 0x69, + 0x6c, 0x64, 0x22, 0xe0, 0x02, 0x0a, 0x13, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x49, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x3a, 0x0a, 0x05, 0x70, 0x68, + 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x67, 0x69, 0x74, 0x70, + 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, + 0x6d, 0x61, 0x67, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x50, 0x68, 0x61, 0x73, 0x65, 0x52, + 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x12, 0x36, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, - 0x3d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, - 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, 0x22, 0x7c, - 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, - 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, - 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x70, - 0x6f, 0x72, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, - 0x72, 0x74, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x1d, 0x0a, 0x1b, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, - 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x57, 0x0a, 0x1e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, - 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x77, 0x61, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, - 0x77, 0x61, 0x69, 0x74, 0x22, 0x5b, 0x0a, 0x1f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, - 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x70, - 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, - 0x74, 0x22, 0x3f, 0x0a, 0x1c, 0x57, 0x61, 0x69, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x49, 0x64, 0x22, 0x59, 0x0a, 0x1d, 0x57, 0x61, 0x69, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, - 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x52, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x80, 0x01, - 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x70, 0x61, 0x63, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x4c, + 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x1a, 0x4c, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, + 0x17, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x12, 0x18, 0x0a, 0x07, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x6d, 0x0a, 0x05, 0x50, 0x68, 0x61, 0x73, 0x65, 0x12, + 0x15, 0x0a, 0x11, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, + 0x42, 0x41, 0x53, 0x45, 0x5f, 0x49, 0x4d, 0x41, 0x47, 0x45, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, + 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x47, 0x49, 0x54, 0x50, 0x4f, 0x44, 0x5f, 0x4c, 0x41, 0x59, + 0x45, 0x52, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x45, 0x52, + 0x52, 0x4f, 0x52, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x44, + 0x4f, 0x4e, 0x45, 0x10, 0x04, 0x22, 0x7c, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x3c, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x70, + 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x8b, 0x01, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x70, 0x6f, 0x72, + 0x74, 0x73, 0x12, 0x3d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, + 0x76, 0x31, 0x2e, 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, 0x22, 0x7c, 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x49, 0x64, 0x12, 0x3c, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0x9b, 0x01, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x09, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, - 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x52, 0x09, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, - 0x3d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, - 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, 0x22, 0xa7, - 0x03, 0x0a, 0x11, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x06, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, + 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, + 0x1d, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x57, + 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x77, 0x61, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x04, 0x77, 0x61, 0x69, 0x74, 0x22, 0x5b, 0x0a, 0x1f, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x08, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x38, 0x0a, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, + 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x08, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x22, 0x3f, 0x0a, 0x1c, 0x57, 0x61, 0x69, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x49, 0x64, 0x22, 0x59, 0x0a, 0x1d, 0x57, 0x61, 0x69, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x50, 0x0a, - 0x06, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, - 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x49, 0x64, 0x22, - 0x57, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x54, 0x41, 0x54, - 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, - 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, - 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x56, 0x41, 0x49, - 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x54, 0x41, 0x54, 0x45, - 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x22, 0x80, 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x22, 0x80, 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x3c, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x70, + 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x9b, 0x01, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x09, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x70, + 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x09, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x73, 0x12, 0x3d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, + 0x76, 0x31, 0x2e, 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, 0x22, 0xa7, 0x03, 0x0a, 0x11, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, + 0x3b, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x38, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x67, 0x69, + 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x1a, 0x50, 0x0a, 0x06, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x3c, 0x0a, - 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, - 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, - 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9b, 0x01, 0x0a, 0x1e, + 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, + 0x0d, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, + 0x49, 0x64, 0x22, 0x57, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x53, + 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, + 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x41, + 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x54, + 0x41, 0x54, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x22, 0x80, 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, - 0x0a, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, - 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, - 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x0a, 0x70, 0x61, - 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 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, 0x22, 0x3c, 0x0a, 0x17, 0x52, 0x65, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x22, 0x1a, 0x0a, 0x18, 0x52, 0x65, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0xb8, 0x04, 0x0a, 0x09, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x08, 0x70, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x27, 0x0a, - 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x69, - 0x6e, 0x6e, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x69, 0x6e, 0x6e, - 0x65, 0x64, 0x12, 0x32, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x71, 0x0a, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x27, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x1e, 0x61, 0x64, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x72, 0x65, 0x67, - 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x72, 0x65, 0x67, - 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x0f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x01, 0x52, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, - 0x73, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x06, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, - 0x2e, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x48, 0x02, 0x52, 0x06, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, - 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x55, 0x72, 0x6c, 0x12, 0x24, - 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x49, - 0x64, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x42, - 0x12, 0x0a, 0x10, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x42, 0x0e, - 0x0a, 0x0c, 0x5f, 0x70, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x22, 0x9a, - 0x03, 0x0a, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x2f, 0x0a, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, - 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x68, 0x61, 0x73, 0x65, 0x52, 0x05, 0x70, 0x68, - 0x61, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, - 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, - 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x3c, 0x0a, 0x0a, 0x67, 0x69, 0x74, 0x5f, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x69, - 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x47, 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x09, 0x67, 0x69, 0x74, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2e, 0x0a, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, - 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, - 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x37, 0x0a, 0x09, 0x61, 0x64, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, - 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x65, - 0x76, 0x65, 0x6c, 0x52, 0x09, 0x61, 0x64, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, - 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, - 0x3e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, - 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, - 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x68, 0x0a, 0x13, 0x57, - 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, - 0x1d, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x01, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x88, 0x01, 0x01, 0x42, 0x09, - 0x0a, 0x07, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xc3, 0x02, 0x0a, 0x0d, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x37, 0x0a, 0x06, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x67, 0x69, - 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x50, 0x6f, 0x72, 0x74, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x3d, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, - 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x6f, - 0x72, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x22, 0x47, 0x0a, 0x06, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, - 0x16, 0x0a, 0x12, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x4f, 0x4c, 0x49, 0x43, - 0x59, 0x5f, 0x50, 0x52, 0x49, 0x56, 0x41, 0x54, 0x45, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x50, - 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x10, 0x02, 0x22, 0x4b, - 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x52, - 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, - 0x45, 0x44, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, - 0x5f, 0x48, 0x54, 0x54, 0x50, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x52, 0x4f, 0x54, 0x4f, - 0x43, 0x4f, 0x4c, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x53, 0x10, 0x02, 0x22, 0x8d, 0x03, 0x0a, 0x12, - 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x55, 0x72, 0x6c, 0x12, - 0x16, 0x0a, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x29, 0x0a, 0x10, - 0x75, 0x6e, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x75, 0x6e, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x5f, 0x75, 0x6e, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, - 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x55, 0x6e, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x27, 0x0a, - 0x0f, 0x75, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, - 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x75, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x65, - 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, - 0x75, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x55, 0x6e, 0x74, 0x72, - 0x61, 0x63, 0x6b, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x75, 0x6e, - 0x70, 0x75, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x08, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x75, 0x6e, 0x70, 0x75, 0x73, 0x68, 0x65, 0x64, 0x43, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x75, - 0x6e, 0x70, 0x75, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x55, 0x6e, 0x70, 0x75, - 0x73, 0x68, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x22, 0xef, 0x02, 0x0a, 0x0e, - 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x68, 0x61, 0x73, 0x65, 0x12, 0x33, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x67, - 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x50, 0x68, 0x61, 0x73, 0x65, 0x2e, 0x50, 0x68, 0x61, 0x73, 0x65, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x4c, 0x0a, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x12, 0x6c, - 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, - 0x65, 0x22, 0xd9, 0x01, 0x0a, 0x05, 0x50, 0x68, 0x61, 0x73, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x50, - 0x48, 0x41, 0x53, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x50, 0x52, 0x45, 0x50, - 0x41, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x50, 0x48, 0x41, 0x53, 0x45, - 0x5f, 0x49, 0x4d, 0x41, 0x47, 0x45, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x10, 0x02, 0x12, 0x11, 0x0a, - 0x0d, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x03, - 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x49, - 0x4e, 0x47, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x49, 0x4e, - 0x49, 0x54, 0x49, 0x41, 0x4c, 0x49, 0x5a, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x11, 0x0a, 0x0d, - 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, - 0x15, 0x0a, 0x11, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x52, 0x55, - 0x50, 0x54, 0x45, 0x44, 0x10, 0x07, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, - 0x53, 0x54, 0x4f, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x10, 0x08, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x48, - 0x41, 0x53, 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x09, 0x22, 0x3f, 0x0a, - 0x0f, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x57, - 0x0a, 0x1c, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, - 0x06, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x0e, 0x57, 0x6f, 0x72, 0x6b, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, - 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0xe7, - 0x01, 0x0a, 0x0d, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x09, 0x61, 0x64, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, - 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x65, 0x76, - 0x65, 0x6c, 0x52, 0x09, 0x61, 0x64, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, - 0x06, 0x70, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, - 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x3c, 0x0a, 0x0a, 0x67, 0x69, - 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, + 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, + 0x12, 0x3c, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9b, + 0x01, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x3a, 0x0a, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x52, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x3d, 0x0a, + 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 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, 0x22, 0x3c, 0x0a, 0x17, + 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x22, 0x1a, 0x0a, 0x18, 0x52, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb8, 0x04, 0x0a, 0x09, 0x57, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x70, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, + 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x70, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, + 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, + 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x71, 0x0a, 0x20, 0x61, 0x64, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x1e, 0x61, 0x64, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x06, + 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, + 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x0f, 0x77, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x01, 0x52, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, + 0x6c, 0x61, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x06, 0x65, 0x64, 0x69, 0x74, 0x6f, + 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, + 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x48, 0x02, 0x52, 0x06, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, + 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x55, 0x72, + 0x6c, 0x12, 0x24, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x62, 0x75, 0x69, + 0x6c, 0x64, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x72, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x64, 0x69, 0x74, 0x6f, + 0x72, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, + 0x64, 0x22, 0x9a, 0x03, 0x0a, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2f, 0x0a, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x68, 0x61, 0x73, 0x65, 0x52, + 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x3c, 0x0a, 0x0a, 0x67, 0x69, + 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x09, 0x67, - 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x89, 0x01, 0x0a, 0x12, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, - 0x27, 0x0a, 0x0f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x63, 0x6c, 0x61, - 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x32, 0x0a, 0x06, 0x65, 0x64, 0x69, 0x74, - 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, - 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, - 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, - 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x82, 0x01, 0x0a, 0x08, 0x50, 0x6f, 0x72, 0x74, 0x53, 0x70, 0x65, - 0x63, 0x12, 0x37, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, - 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x2e, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x3d, 0x0a, 0x08, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x67, - 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, - 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x22, 0x9b, 0x02, 0x0a, 0x11, 0x57, 0x6f, - 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, - 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x68, 0x61, 0x73, 0x65, 0x52, 0x05, 0x70, - 0x68, 0x61, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x88, 0x01, - 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, - 0x12, 0x3e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, - 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x42, 0x0a, 0x0a, 0x08, 0x5f, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2a, 0x6f, 0x0a, 0x0e, 0x41, 0x64, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x44, 0x4d, - 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x55, 0x4e, 0x53, - 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x41, 0x44, - 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x4f, 0x57, - 0x4e, 0x45, 0x52, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x41, 0x44, - 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x45, 0x56, - 0x45, 0x52, 0x59, 0x4f, 0x4e, 0x45, 0x10, 0x02, 0x2a, 0xcc, 0x01, 0x0a, 0x0e, 0x57, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x1b, 0x57, - 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x55, - 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x31, 0x0a, 0x2d, - 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, - 0x4d, 0x59, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x53, 0x5f, 0x49, 0x4e, - 0x5f, 0x4f, 0x52, 0x47, 0x41, 0x4e, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, - 0x32, 0x0a, 0x2e, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x43, 0x4f, - 0x50, 0x45, 0x5f, 0x41, 0x4c, 0x4c, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, - 0x53, 0x5f, 0x49, 0x4e, 0x5f, 0x4f, 0x52, 0x47, 0x41, 0x4e, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x10, 0x02, 0x12, 0x32, 0x0a, 0x2e, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, - 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x41, 0x4c, 0x4c, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x53, - 0x50, 0x41, 0x43, 0x45, 0x53, 0x5f, 0x49, 0x4e, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4c, 0x4c, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x32, 0xc5, 0x11, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x51, 0x0a, 0x0c, - 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1e, 0x2e, 0x67, - 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, - 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x6b, 0x0a, 0x14, 0x57, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x26, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, - 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x27, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, 0x74, 0x63, - 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x57, 0x0a, 0x0e, - 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x20, - 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, - 0x6e, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x29, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x41, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, 0x69, - 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x6e, - 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x20, 0x2e, 0x67, 0x69, - 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, - 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, + 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2e, 0x0a, 0x05, 0x70, 0x6f, 0x72, 0x74, + 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, + 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x6f, 0x72, + 0x74, 0x52, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x37, 0x0a, 0x09, 0x61, 0x64, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x67, 0x69, + 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x09, 0x61, 0x64, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, + 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x68, + 0x0a, 0x13, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x88, + 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x88, 0x01, + 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x42, 0x0a, 0x0a, 0x08, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xc3, 0x02, 0x0a, 0x0d, 0x57, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, + 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x37, + 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, + 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, + 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x3d, 0x0a, 0x08, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x67, 0x69, + 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x50, 0x6f, 0x72, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x22, 0x47, 0x0a, 0x06, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x12, 0x16, 0x0a, 0x12, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x55, 0x4e, 0x53, + 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x4f, + 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x50, 0x52, 0x49, 0x56, 0x41, 0x54, 0x45, 0x10, 0x01, 0x12, 0x11, + 0x0a, 0x0d, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x10, + 0x02, 0x22, 0x4b, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x18, 0x0a, + 0x14, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x52, 0x4f, 0x54, 0x4f, + 0x43, 0x4f, 0x4c, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x52, + 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x53, 0x10, 0x02, 0x22, 0x8d, + 0x03, 0x0a, 0x12, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x69, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x5f, 0x75, + 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x55, + 0x72, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, + 0x29, 0x0a, 0x10, 0x75, 0x6e, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x69, + 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x75, 0x6e, 0x63, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x5f, 0x75, 0x6e, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x5f, 0x66, + 0x69, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x12, 0x27, 0x0a, 0x0f, 0x75, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x66, 0x69, + 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x75, 0x6e, 0x74, 0x72, 0x61, + 0x63, 0x6b, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x5f, 0x75, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x66, 0x69, 0x6c, + 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x55, + 0x6e, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, + 0x10, 0x75, 0x6e, 0x70, 0x75, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x75, 0x6e, 0x70, 0x75, 0x73, 0x68, 0x65, + 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x5f, 0x75, 0x6e, 0x70, 0x75, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x55, + 0x6e, 0x70, 0x75, 0x73, 0x68, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x22, 0xef, + 0x02, 0x0a, 0x0e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x68, 0x61, 0x73, + 0x65, 0x12, 0x33, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x68, 0x61, 0x73, 0x65, 0x2e, 0x50, 0x68, 0x61, 0x73, 0x65, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4c, 0x0a, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x69, 0x6d, 0x65, 0x22, 0xd9, 0x01, 0x0a, 0x05, 0x50, 0x68, 0x61, 0x73, 0x65, 0x12, 0x15, + 0x0a, 0x11, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, + 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x50, + 0x52, 0x45, 0x50, 0x41, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x50, 0x48, + 0x41, 0x53, 0x45, 0x5f, 0x49, 0x4d, 0x41, 0x47, 0x45, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x10, 0x02, + 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, + 0x47, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x43, 0x52, 0x45, + 0x41, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x50, 0x48, 0x41, 0x53, 0x45, + 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, 0x49, 0x5a, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, + 0x11, 0x0a, 0x0d, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, + 0x10, 0x06, 0x12, 0x15, 0x0a, 0x11, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x45, + 0x52, 0x52, 0x55, 0x50, 0x54, 0x45, 0x44, 0x10, 0x07, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x48, 0x41, + 0x53, 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x10, 0x08, 0x12, 0x11, 0x0a, + 0x0d, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x09, + 0x22, 0x3f, 0x0a, 0x0f, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x57, 0x0a, 0x1c, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x88, 0x01, 0x01, + 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x0e, 0x57, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x21, 0x0a, + 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x22, 0xe7, 0x01, 0x0a, 0x0d, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, + 0x70, 0x65, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x09, 0x61, 0x64, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x67, 0x69, 0x74, + 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x09, 0x61, 0x64, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x16, 0x0a, 0x06, 0x70, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x70, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x3c, 0x0a, + 0x0a, 0x67, 0x69, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x09, 0x67, 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x89, 0x01, 0x0a, 0x12, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x70, + 0x65, 0x63, 0x12, 0x27, 0x0a, 0x0f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x77, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x32, 0x0a, 0x06, 0x65, + 0x64, 0x69, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x69, + 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x52, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x12, + 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x82, 0x01, 0x0a, 0x08, 0x50, 0x6f, 0x72, 0x74, + 0x53, 0x70, 0x65, 0x63, 0x12, 0x37, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x2e, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x3d, 0x0a, + 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x21, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x22, 0x9b, 0x02, 0x0a, + 0x11, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, + 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x68, 0x61, 0x73, 0x65, + 0x52, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, + 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, + 0x6e, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, + 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x42, 0x0a, + 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2a, 0x6f, 0x0a, 0x0e, 0x41, 0x64, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x1f, 0x0a, 0x1b, + 0x41, 0x44, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, + 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1e, 0x0a, + 0x1a, 0x41, 0x44, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, + 0x5f, 0x4f, 0x57, 0x4e, 0x45, 0x52, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x01, 0x12, 0x1c, 0x0a, + 0x18, 0x41, 0x44, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, + 0x5f, 0x45, 0x56, 0x45, 0x52, 0x59, 0x4f, 0x4e, 0x45, 0x10, 0x02, 0x2a, 0xcc, 0x01, 0x0a, 0x0e, + 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x1f, + 0x0a, 0x1b, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x43, 0x4f, 0x50, + 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x31, 0x0a, 0x2d, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x43, 0x4f, + 0x50, 0x45, 0x5f, 0x4d, 0x59, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x53, + 0x5f, 0x49, 0x4e, 0x5f, 0x4f, 0x52, 0x47, 0x41, 0x4e, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x10, 0x01, 0x12, 0x32, 0x0a, 0x2e, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, + 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x41, 0x4c, 0x4c, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, + 0x41, 0x43, 0x45, 0x53, 0x5f, 0x49, 0x4e, 0x5f, 0x4f, 0x52, 0x47, 0x41, 0x4e, 0x49, 0x5a, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x32, 0x0a, 0x2e, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, + 0x41, 0x43, 0x45, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x41, 0x4c, 0x4c, 0x5f, 0x57, 0x4f, + 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x53, 0x5f, 0x49, 0x4e, 0x5f, 0x49, 0x4e, 0x53, 0x54, + 0x41, 0x4c, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x32, 0xc8, 0x11, 0x0a, 0x10, 0x57, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x51, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x1e, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x53, 0x74, 0x6f, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x74, 0x6f, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, - 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x69, - 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, - 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x14, 0x57, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x26, 0x2e, 0x67, 0x69, 0x74, + 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, + 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, + 0x57, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x73, 0x12, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x41, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, + 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x41, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x20, + 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x53, 0x74, 0x6f, 0x70, 0x57, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, - 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, - 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x67, 0x69, 0x74, + 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x84, 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, - 0x65, 0x73, 0x12, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x57, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x6d, - 0x61, 0x67, 0x65, 0x12, 0x2a, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2b, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, - 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, - 0x0a, 0x0d, 0x53, 0x65, 0x6e, 0x64, 0x48, 0x65, 0x61, 0x72, 0x74, 0x42, 0x65, 0x61, 0x74, 0x12, - 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, - 0x48, 0x65, 0x61, 0x72, 0x74, 0x42, 0x65, 0x61, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, - 0x64, 0x48, 0x65, 0x61, 0x72, 0x74, 0x42, 0x65, 0x61, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x28, - 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, + 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x84, 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x70, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, + 0x61, 0x73, 0x73, 0x65, 0x73, 0x12, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x57, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, + 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x18, 0x47, 0x65, + 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x53, 0x65, 0x6e, 0x64, 0x48, 0x65, 0x61, 0x72, 0x74, 0x42, 0x65, + 0x61, 0x74, 0x12, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x65, 0x6e, 0x64, 0x48, 0x65, 0x61, 0x72, 0x74, 0x42, 0x65, 0x61, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x65, 0x6e, 0x64, 0x48, 0x65, 0x61, 0x72, 0x74, 0x42, 0x65, 0x61, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, - 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x84, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x43, 0x72, 0x65, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, - 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, - 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x80, 0x01, 0x0a, - 0x1b, 0x57, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x70, 0x61, 0x63, 0x65, 0x49, 0x6d, - 0x61, 0x67, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x2d, 0x2e, 0x67, - 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, - 0x72, 0x6b, 0x70, 0x61, 0x63, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x67, 0x69, - 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, - 0x6b, 0x70, 0x61, 0x63, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4c, - 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x63, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, - 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, - 0x6f, 0x72, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x69, + 0x6e, 0x12, 0x28, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x69, + 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x84, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x43, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x2f, 0x2e, 0x67, 0x69, 0x74, + 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x67, 0x69, + 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x83, 0x01, 0x0a, 0x1c, 0x57, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4c, 0x6f, 0x67, 0x73, + 0x12, 0x2e, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, 0x74, + 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, + 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, 0x74, + 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, + 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x63, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, - 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x25, 0x2e, 0x67, 0x69, - 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, - 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x6f, - 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x29, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x6c, 0x0a, 0x15, 0x57, 0x61, 0x69, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x27, 0x2e, 0x67, 0x69, 0x74, 0x70, - 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, - 0x61, 0x69, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, - 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, 0x28, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x6f, 0x72, + 0x74, 0x12, 0x25, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x6f, 0x72, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, + 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x29, 0x2e, + 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, + 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x15, 0x57, 0x61, 0x69, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, + 0x27, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, 0x69, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, + 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, 0x28, + 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x6f, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x67, 0x69, 0x74, 0x70, + 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, + 0x28, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x5d, 0x0a, 0x10, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, - 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, - 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x6f, 0x72, 0x6b, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, - 0x39, 0x5a, 0x37, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x69, - 0x74, 0x70, 0x6f, 0x64, 0x2d, 0x69, 0x6f, 0x2f, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2f, 0x63, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, - 0x2d, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x61, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x22, 0x2e, 0x67, 0x69, 0x74, + 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, + 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x39, 0x5a, 0x37, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2d, 0x69, 0x6f, 0x2f, 0x67, 0x69, + 0x74, 0x70, 0x6f, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2d, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x31, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4646,177 +4762,182 @@ func file_gitpod_v1_workspace_proto_rawDescGZIP() []byte { return file_gitpod_v1_workspace_proto_rawDescData } -var file_gitpod_v1_workspace_proto_enumTypes = make([]protoimpl.EnumInfo, 7) -var file_gitpod_v1_workspace_proto_msgTypes = make([]protoimpl.MessageInfo, 59) +var file_gitpod_v1_workspace_proto_enumTypes = make([]protoimpl.EnumInfo, 8) +var file_gitpod_v1_workspace_proto_msgTypes = make([]protoimpl.MessageInfo, 60) var file_gitpod_v1_workspace_proto_goTypes = []interface{}{ (AdmissionLevel)(0), // 0: gitpod.v1.AdmissionLevel (WorkspaceScope)(0), // 1: gitpod.v1.WorkspaceScope - (WorkspaceImageBuild_Phase)(0), // 2: gitpod.v1.WorkspaceImageBuild.Phase - (WorkspaceSnapshot_State)(0), // 3: gitpod.v1.WorkspaceSnapshot.State - (WorkspacePort_Policy)(0), // 4: gitpod.v1.WorkspacePort.Policy - (WorkspacePort_Protocol)(0), // 5: gitpod.v1.WorkspacePort.Protocol - (WorkspacePhase_Phase)(0), // 6: gitpod.v1.WorkspacePhase.Phase - (*GetWorkspaceRequest)(nil), // 7: gitpod.v1.GetWorkspaceRequest - (*GetWorkspaceResponse)(nil), // 8: gitpod.v1.GetWorkspaceResponse - (*WatchWorkspaceStatusRequest)(nil), // 9: gitpod.v1.WatchWorkspaceStatusRequest - (*WatchWorkspaceStatusResponse)(nil), // 10: gitpod.v1.WatchWorkspaceStatusResponse - (*ListWorkspacesRequest)(nil), // 11: gitpod.v1.ListWorkspacesRequest - (*ListWorkspacesResponse)(nil), // 12: gitpod.v1.ListWorkspacesResponse - (*CreateAndStartWorkspaceRequest)(nil), // 13: gitpod.v1.CreateAndStartWorkspaceRequest - (*CreateAndStartWorkspaceResponse)(nil), // 14: gitpod.v1.CreateAndStartWorkspaceResponse - (*StartWorkspaceRequest)(nil), // 15: gitpod.v1.StartWorkspaceRequest - (*StartWorkspaceResponse)(nil), // 16: gitpod.v1.StartWorkspaceResponse - (*StopWorkspaceRequest)(nil), // 17: gitpod.v1.StopWorkspaceRequest - (*StopWorkspaceResponse)(nil), // 18: gitpod.v1.StopWorkspaceResponse - (*DeleteWorkspaceRequest)(nil), // 19: gitpod.v1.DeleteWorkspaceRequest - (*UpdateWorkspaceRequest)(nil), // 20: gitpod.v1.UpdateWorkspaceRequest - (*UpdateWorkspaceResponse)(nil), // 21: gitpod.v1.UpdateWorkspaceResponse - (*DeleteWorkspaceResponse)(nil), // 22: gitpod.v1.DeleteWorkspaceResponse - (*ListSupportedWorkspaceClassesRequest)(nil), // 23: gitpod.v1.ListSupportedWorkspaceClassesRequest - (*ListSupportedWorkspaceClassesResponse)(nil), // 24: gitpod.v1.ListSupportedWorkspaceClassesResponse - (*GetDefaultWorkspaceImageRequest)(nil), // 25: gitpod.v1.GetDefaultWorkspaceImageRequest - (*GetDefaultWorkspaceImageResponse)(nil), // 26: gitpod.v1.GetDefaultWorkspaceImageResponse - (*GetWorkspaceOwnerTokenRequest)(nil), // 27: gitpod.v1.GetWorkspaceOwnerTokenRequest - (*GetWorkspaceOwnerTokenResponse)(nil), // 28: gitpod.v1.GetWorkspaceOwnerTokenResponse - (*GetWorkspaceEditorCredentialsRequest)(nil), // 29: gitpod.v1.GetWorkspaceEditorCredentialsRequest - (*GetWorkspaceEditorCredentialsResponse)(nil), // 30: gitpod.v1.GetWorkspaceEditorCredentialsResponse - (*SendHeartBeatRequest)(nil), // 31: gitpod.v1.SendHeartBeatRequest - (*SendHeartBeatResponse)(nil), // 32: gitpod.v1.SendHeartBeatResponse - (*WatchWorkpaceImageBuildLogsRequest)(nil), // 33: gitpod.v1.WatchWorkpaceImageBuildLogsRequest - (*WatchWorkpaceImageBuildLogsResponse)(nil), // 34: gitpod.v1.WatchWorkpaceImageBuildLogsResponse - (*WorkspaceImageBuild)(nil), // 35: gitpod.v1.WorkspaceImageBuild - (*ListWorkspacePortsRequest)(nil), // 36: gitpod.v1.ListWorkspacePortsRequest - (*ListWorkspacePortsResponse)(nil), // 37: gitpod.v1.ListWorkspacePortsResponse - (*UpdateWorkspacePortRequest)(nil), // 38: gitpod.v1.UpdateWorkspacePortRequest - (*UpdateWorkspacePortResponse)(nil), // 39: gitpod.v1.UpdateWorkspacePortResponse - (*CreateWorkspaceSnapshotRequest)(nil), // 40: gitpod.v1.CreateWorkspaceSnapshotRequest - (*CreateWorkspaceSnapshotResponse)(nil), // 41: gitpod.v1.CreateWorkspaceSnapshotResponse - (*WaitWorkspaceSnapshotRequest)(nil), // 42: gitpod.v1.WaitWorkspaceSnapshotRequest - (*WaitWorkspaceSnapshotResponse)(nil), // 43: gitpod.v1.WaitWorkspaceSnapshotResponse - (*ListWorkspaceSnapshotsRequest)(nil), // 44: gitpod.v1.ListWorkspaceSnapshotsRequest - (*ListWorkspaceSnapshotsResponse)(nil), // 45: gitpod.v1.ListWorkspaceSnapshotsResponse - (*WorkspaceSnapshot)(nil), // 46: gitpod.v1.WorkspaceSnapshot - (*ListWorkspaceInstancesRequest)(nil), // 47: gitpod.v1.ListWorkspaceInstancesRequest - (*ListWorkspaceInstancesResponse)(nil), // 48: gitpod.v1.ListWorkspaceInstancesResponse - (*RestoreWorkspaceRequest)(nil), // 49: gitpod.v1.RestoreWorkspaceRequest - (*RestoreWorkspaceResponse)(nil), // 50: gitpod.v1.RestoreWorkspaceResponse - (*Workspace)(nil), // 51: gitpod.v1.Workspace - (*WorkspaceStatus)(nil), // 52: gitpod.v1.WorkspaceStatus - (*WorkspaceConditions)(nil), // 53: gitpod.v1.WorkspaceConditions - (*WorkspacePort)(nil), // 54: gitpod.v1.WorkspacePort - (*WorkspaceGitStatus)(nil), // 55: gitpod.v1.WorkspaceGitStatus - (*WorkspacePhase)(nil), // 56: gitpod.v1.WorkspacePhase - (*EditorReference)(nil), // 57: gitpod.v1.EditorReference - (*WorkspaceEnvironmentVariable)(nil), // 58: gitpod.v1.WorkspaceEnvironmentVariable - (*WorkspaceClass)(nil), // 59: gitpod.v1.WorkspaceClass - (*WorkspaceSpec)(nil), // 60: gitpod.v1.WorkspaceSpec - (*StartWorkspaceSpec)(nil), // 61: gitpod.v1.StartWorkspaceSpec - (*PortSpec)(nil), // 62: gitpod.v1.PortSpec - (*WorkspaceInstance)(nil), // 63: gitpod.v1.WorkspaceInstance - (*WorkspaceImageBuild_Log)(nil), // 64: gitpod.v1.WorkspaceImageBuild.Log - (*WorkspaceSnapshot_Source)(nil), // 65: gitpod.v1.WorkspaceSnapshot.Source - (*PaginationRequest)(nil), // 66: gitpod.v1.PaginationRequest - (*PaginationResponse)(nil), // 67: gitpod.v1.PaginationResponse - (*timestamppb.Timestamp)(nil), // 68: google.protobuf.Timestamp - (*durationpb.Duration)(nil), // 69: google.protobuf.Duration + (ListWorkspacesRequest_OrderByField)(0), // 2: gitpod.v1.ListWorkspacesRequest.OrderByField + (WorkspaceImageBuild_Phase)(0), // 3: gitpod.v1.WorkspaceImageBuild.Phase + (WorkspaceSnapshot_State)(0), // 4: gitpod.v1.WorkspaceSnapshot.State + (WorkspacePort_Policy)(0), // 5: gitpod.v1.WorkspacePort.Policy + (WorkspacePort_Protocol)(0), // 6: gitpod.v1.WorkspacePort.Protocol + (WorkspacePhase_Phase)(0), // 7: gitpod.v1.WorkspacePhase.Phase + (*GetWorkspaceRequest)(nil), // 8: gitpod.v1.GetWorkspaceRequest + (*GetWorkspaceResponse)(nil), // 9: gitpod.v1.GetWorkspaceResponse + (*WatchWorkspaceStatusRequest)(nil), // 10: gitpod.v1.WatchWorkspaceStatusRequest + (*WatchWorkspaceStatusResponse)(nil), // 11: gitpod.v1.WatchWorkspaceStatusResponse + (*ListWorkspacesRequest)(nil), // 12: gitpod.v1.ListWorkspacesRequest + (*ListWorkspacesResponse)(nil), // 13: gitpod.v1.ListWorkspacesResponse + (*CreateAndStartWorkspaceRequest)(nil), // 14: gitpod.v1.CreateAndStartWorkspaceRequest + (*CreateAndStartWorkspaceResponse)(nil), // 15: gitpod.v1.CreateAndStartWorkspaceResponse + (*StartWorkspaceRequest)(nil), // 16: gitpod.v1.StartWorkspaceRequest + (*StartWorkspaceResponse)(nil), // 17: gitpod.v1.StartWorkspaceResponse + (*StopWorkspaceRequest)(nil), // 18: gitpod.v1.StopWorkspaceRequest + (*StopWorkspaceResponse)(nil), // 19: gitpod.v1.StopWorkspaceResponse + (*DeleteWorkspaceRequest)(nil), // 20: gitpod.v1.DeleteWorkspaceRequest + (*UpdateWorkspaceRequest)(nil), // 21: gitpod.v1.UpdateWorkspaceRequest + (*UpdateWorkspaceResponse)(nil), // 22: gitpod.v1.UpdateWorkspaceResponse + (*DeleteWorkspaceResponse)(nil), // 23: gitpod.v1.DeleteWorkspaceResponse + (*ListSupportedWorkspaceClassesRequest)(nil), // 24: gitpod.v1.ListSupportedWorkspaceClassesRequest + (*ListSupportedWorkspaceClassesResponse)(nil), // 25: gitpod.v1.ListSupportedWorkspaceClassesResponse + (*GetDefaultWorkspaceImageRequest)(nil), // 26: gitpod.v1.GetDefaultWorkspaceImageRequest + (*GetDefaultWorkspaceImageResponse)(nil), // 27: gitpod.v1.GetDefaultWorkspaceImageResponse + (*GetWorkspaceOwnerTokenRequest)(nil), // 28: gitpod.v1.GetWorkspaceOwnerTokenRequest + (*GetWorkspaceOwnerTokenResponse)(nil), // 29: gitpod.v1.GetWorkspaceOwnerTokenResponse + (*GetWorkspaceEditorCredentialsRequest)(nil), // 30: gitpod.v1.GetWorkspaceEditorCredentialsRequest + (*GetWorkspaceEditorCredentialsResponse)(nil), // 31: gitpod.v1.GetWorkspaceEditorCredentialsResponse + (*SendHeartBeatRequest)(nil), // 32: gitpod.v1.SendHeartBeatRequest + (*SendHeartBeatResponse)(nil), // 33: gitpod.v1.SendHeartBeatResponse + (*WatchWorkspaceImageBuildLogsRequest)(nil), // 34: gitpod.v1.WatchWorkspaceImageBuildLogsRequest + (*WatchWorkspaceImageBuildLogsResponse)(nil), // 35: gitpod.v1.WatchWorkspaceImageBuildLogsResponse + (*WorkspaceImageBuild)(nil), // 36: gitpod.v1.WorkspaceImageBuild + (*ListWorkspacePortsRequest)(nil), // 37: gitpod.v1.ListWorkspacePortsRequest + (*ListWorkspacePortsResponse)(nil), // 38: gitpod.v1.ListWorkspacePortsResponse + (*UpdateWorkspacePortRequest)(nil), // 39: gitpod.v1.UpdateWorkspacePortRequest + (*UpdateWorkspacePortResponse)(nil), // 40: gitpod.v1.UpdateWorkspacePortResponse + (*CreateWorkspaceSnapshotRequest)(nil), // 41: gitpod.v1.CreateWorkspaceSnapshotRequest + (*CreateWorkspaceSnapshotResponse)(nil), // 42: gitpod.v1.CreateWorkspaceSnapshotResponse + (*WaitWorkspaceSnapshotRequest)(nil), // 43: gitpod.v1.WaitWorkspaceSnapshotRequest + (*WaitWorkspaceSnapshotResponse)(nil), // 44: gitpod.v1.WaitWorkspaceSnapshotResponse + (*ListWorkspaceSnapshotsRequest)(nil), // 45: gitpod.v1.ListWorkspaceSnapshotsRequest + (*ListWorkspaceSnapshotsResponse)(nil), // 46: gitpod.v1.ListWorkspaceSnapshotsResponse + (*WorkspaceSnapshot)(nil), // 47: gitpod.v1.WorkspaceSnapshot + (*ListWorkspaceInstancesRequest)(nil), // 48: gitpod.v1.ListWorkspaceInstancesRequest + (*ListWorkspaceInstancesResponse)(nil), // 49: gitpod.v1.ListWorkspaceInstancesResponse + (*RestoreWorkspaceRequest)(nil), // 50: gitpod.v1.RestoreWorkspaceRequest + (*RestoreWorkspaceResponse)(nil), // 51: gitpod.v1.RestoreWorkspaceResponse + (*Workspace)(nil), // 52: gitpod.v1.Workspace + (*WorkspaceStatus)(nil), // 53: gitpod.v1.WorkspaceStatus + (*WorkspaceConditions)(nil), // 54: gitpod.v1.WorkspaceConditions + (*WorkspacePort)(nil), // 55: gitpod.v1.WorkspacePort + (*WorkspaceGitStatus)(nil), // 56: gitpod.v1.WorkspaceGitStatus + (*WorkspacePhase)(nil), // 57: gitpod.v1.WorkspacePhase + (*EditorReference)(nil), // 58: gitpod.v1.EditorReference + (*WorkspaceEnvironmentVariable)(nil), // 59: gitpod.v1.WorkspaceEnvironmentVariable + (*WorkspaceClass)(nil), // 60: gitpod.v1.WorkspaceClass + (*WorkspaceSpec)(nil), // 61: gitpod.v1.WorkspaceSpec + (*StartWorkspaceSpec)(nil), // 62: gitpod.v1.StartWorkspaceSpec + (*PortSpec)(nil), // 63: gitpod.v1.PortSpec + (*WorkspaceInstance)(nil), // 64: gitpod.v1.WorkspaceInstance + (*CreateAndStartWorkspaceRequest_Source)(nil), // 65: gitpod.v1.CreateAndStartWorkspaceRequest.Source + (*WorkspaceImageBuild_Log)(nil), // 66: gitpod.v1.WorkspaceImageBuild.Log + (*WorkspaceSnapshot_Source)(nil), // 67: gitpod.v1.WorkspaceSnapshot.Source + (*PaginationRequest)(nil), // 68: gitpod.v1.PaginationRequest + (*OrderBy)(nil), // 69: gitpod.v1.OrderBy + (*PaginationResponse)(nil), // 70: gitpod.v1.PaginationResponse + (*timestamppb.Timestamp)(nil), // 71: google.protobuf.Timestamp + (*durationpb.Duration)(nil), // 72: google.protobuf.Duration } var file_gitpod_v1_workspace_proto_depIdxs = []int32{ 1, // 0: gitpod.v1.GetWorkspaceRequest.scope:type_name -> gitpod.v1.WorkspaceScope - 51, // 1: gitpod.v1.GetWorkspaceResponse.workspace:type_name -> gitpod.v1.Workspace - 52, // 2: gitpod.v1.WatchWorkspaceStatusResponse.status:type_name -> gitpod.v1.WorkspaceStatus - 66, // 3: gitpod.v1.ListWorkspacesRequest.pagination:type_name -> gitpod.v1.PaginationRequest - 1, // 4: gitpod.v1.ListWorkspacesRequest.scope:type_name -> gitpod.v1.WorkspaceScope - 51, // 5: gitpod.v1.ListWorkspacesResponse.workspaces:type_name -> gitpod.v1.Workspace - 67, // 6: gitpod.v1.ListWorkspacesResponse.pagination:type_name -> gitpod.v1.PaginationResponse - 61, // 7: gitpod.v1.CreateAndStartWorkspaceRequest.spec:type_name -> gitpod.v1.StartWorkspaceSpec - 1, // 8: gitpod.v1.StopWorkspaceRequest.scope:type_name -> gitpod.v1.WorkspaceScope - 60, // 9: gitpod.v1.UpdateWorkspaceRequest.spec:type_name -> gitpod.v1.WorkspaceSpec - 51, // 10: gitpod.v1.UpdateWorkspaceResponse.workspace:type_name -> gitpod.v1.Workspace - 59, // 11: gitpod.v1.ListSupportedWorkspaceClassesResponse.result:type_name -> gitpod.v1.WorkspaceClass - 35, // 12: gitpod.v1.WatchWorkpaceImageBuildLogsResponse.workspace_image_build:type_name -> gitpod.v1.WorkspaceImageBuild - 2, // 13: gitpod.v1.WorkspaceImageBuild.phase:type_name -> gitpod.v1.WorkspaceImageBuild.Phase - 64, // 14: gitpod.v1.WorkspaceImageBuild.log:type_name -> gitpod.v1.WorkspaceImageBuild.Log - 66, // 15: gitpod.v1.ListWorkspacePortsRequest.pagination:type_name -> gitpod.v1.PaginationRequest - 54, // 16: gitpod.v1.ListWorkspacePortsResponse.ports:type_name -> gitpod.v1.WorkspacePort - 67, // 17: gitpod.v1.ListWorkspacePortsResponse.pagination:type_name -> gitpod.v1.PaginationResponse - 62, // 18: gitpod.v1.UpdateWorkspacePortRequest.spec:type_name -> gitpod.v1.PortSpec - 46, // 19: gitpod.v1.CreateWorkspaceSnapshotResponse.snapshot:type_name -> gitpod.v1.WorkspaceSnapshot - 46, // 20: gitpod.v1.WaitWorkspaceSnapshotResponse.snapshot:type_name -> gitpod.v1.WorkspaceSnapshot - 66, // 21: gitpod.v1.ListWorkspaceSnapshotsRequest.pagination:type_name -> gitpod.v1.PaginationRequest - 46, // 22: gitpod.v1.ListWorkspaceSnapshotsResponse.snapshots:type_name -> gitpod.v1.WorkspaceSnapshot - 67, // 23: gitpod.v1.ListWorkspaceSnapshotsResponse.pagination:type_name -> gitpod.v1.PaginationResponse - 65, // 24: gitpod.v1.WorkspaceSnapshot.source:type_name -> gitpod.v1.WorkspaceSnapshot.Source - 3, // 25: gitpod.v1.WorkspaceSnapshot.state:type_name -> gitpod.v1.WorkspaceSnapshot.State - 66, // 26: gitpod.v1.ListWorkspaceInstancesRequest.pagination:type_name -> gitpod.v1.PaginationRequest - 63, // 27: gitpod.v1.ListWorkspaceInstancesResponse.instances:type_name -> gitpod.v1.WorkspaceInstance - 67, // 28: gitpod.v1.ListWorkspaceInstancesResponse.pagination:type_name -> gitpod.v1.PaginationResponse - 52, // 29: gitpod.v1.Workspace.status:type_name -> gitpod.v1.WorkspaceStatus - 58, // 30: gitpod.v1.Workspace.additional_environment_variables:type_name -> gitpod.v1.WorkspaceEnvironmentVariable - 57, // 31: gitpod.v1.Workspace.editor:type_name -> gitpod.v1.EditorReference - 56, // 32: gitpod.v1.WorkspaceStatus.phase:type_name -> gitpod.v1.WorkspacePhase - 55, // 33: gitpod.v1.WorkspaceStatus.git_status:type_name -> gitpod.v1.WorkspaceGitStatus - 54, // 34: gitpod.v1.WorkspaceStatus.ports:type_name -> gitpod.v1.WorkspacePort - 0, // 35: gitpod.v1.WorkspaceStatus.admission:type_name -> gitpod.v1.AdmissionLevel - 53, // 36: gitpod.v1.WorkspaceStatus.conditions:type_name -> gitpod.v1.WorkspaceConditions - 4, // 37: gitpod.v1.WorkspacePort.policy:type_name -> gitpod.v1.WorkspacePort.Policy - 5, // 38: gitpod.v1.WorkspacePort.protocol:type_name -> gitpod.v1.WorkspacePort.Protocol - 6, // 39: gitpod.v1.WorkspacePhase.name:type_name -> gitpod.v1.WorkspacePhase.Phase - 68, // 40: gitpod.v1.WorkspacePhase.last_transition_time:type_name -> google.protobuf.Timestamp - 0, // 41: gitpod.v1.WorkspaceSpec.admission:type_name -> gitpod.v1.AdmissionLevel - 69, // 42: gitpod.v1.WorkspaceSpec.timeout:type_name -> google.protobuf.Duration - 55, // 43: gitpod.v1.WorkspaceSpec.git_status:type_name -> gitpod.v1.WorkspaceGitStatus - 57, // 44: gitpod.v1.StartWorkspaceSpec.editor:type_name -> gitpod.v1.EditorReference - 4, // 45: gitpod.v1.PortSpec.policy:type_name -> gitpod.v1.WorkspacePort.Policy - 5, // 46: gitpod.v1.PortSpec.protocol:type_name -> gitpod.v1.WorkspacePort.Protocol - 56, // 47: gitpod.v1.WorkspaceInstance.phase:type_name -> gitpod.v1.WorkspacePhase - 53, // 48: gitpod.v1.WorkspaceInstance.conditions:type_name -> gitpod.v1.WorkspaceConditions - 7, // 49: gitpod.v1.WorkspaceService.GetWorkspace:input_type -> gitpod.v1.GetWorkspaceRequest - 9, // 50: gitpod.v1.WorkspaceService.WatchWorkspaceStatus:input_type -> gitpod.v1.WatchWorkspaceStatusRequest - 11, // 51: gitpod.v1.WorkspaceService.ListWorkspaces:input_type -> gitpod.v1.ListWorkspacesRequest - 13, // 52: gitpod.v1.WorkspaceService.CreateAndStartWorkspace:input_type -> gitpod.v1.CreateAndStartWorkspaceRequest - 15, // 53: gitpod.v1.WorkspaceService.StartWorkspace:input_type -> gitpod.v1.StartWorkspaceRequest - 17, // 54: gitpod.v1.WorkspaceService.StopWorkspace:input_type -> gitpod.v1.StopWorkspaceRequest - 19, // 55: gitpod.v1.WorkspaceService.DeleteWorkspace:input_type -> gitpod.v1.DeleteWorkspaceRequest - 20, // 56: gitpod.v1.WorkspaceService.UpdateWorkspace:input_type -> gitpod.v1.UpdateWorkspaceRequest - 23, // 57: gitpod.v1.WorkspaceService.ListSupportedWorkspaceClasses:input_type -> gitpod.v1.ListSupportedWorkspaceClassesRequest - 25, // 58: gitpod.v1.WorkspaceService.GetDefaultWorkspaceImage:input_type -> gitpod.v1.GetDefaultWorkspaceImageRequest - 31, // 59: gitpod.v1.WorkspaceService.SendHeartBeat:input_type -> gitpod.v1.SendHeartBeatRequest - 27, // 60: gitpod.v1.WorkspaceService.GetWorkspaceOwnerToken:input_type -> gitpod.v1.GetWorkspaceOwnerTokenRequest - 29, // 61: gitpod.v1.WorkspaceService.GetWorkspaceEditorCredentials:input_type -> gitpod.v1.GetWorkspaceEditorCredentialsRequest - 33, // 62: gitpod.v1.WorkspaceService.WatchWorkpaceImageBuildLogs:input_type -> gitpod.v1.WatchWorkpaceImageBuildLogsRequest - 36, // 63: gitpod.v1.WorkspaceService.ListWorkspacePorts:input_type -> gitpod.v1.ListWorkspacePortsRequest - 38, // 64: gitpod.v1.WorkspaceService.UpdateWorkspacePort:input_type -> gitpod.v1.UpdateWorkspacePortRequest - 40, // 65: gitpod.v1.WorkspaceService.CreateWorkspaceSnapshot:input_type -> gitpod.v1.CreateWorkspaceSnapshotRequest - 42, // 66: gitpod.v1.WorkspaceService.WaitWorkspaceSnapshot:input_type -> gitpod.v1.WaitWorkspaceSnapshotRequest - 44, // 67: gitpod.v1.WorkspaceService.ListWorkspaceSnapshots:input_type -> gitpod.v1.ListWorkspaceSnapshotsRequest - 47, // 68: gitpod.v1.WorkspaceService.ListWorkspaceInstances:input_type -> gitpod.v1.ListWorkspaceInstancesRequest - 49, // 69: gitpod.v1.WorkspaceService.RestoreWorkspace:input_type -> gitpod.v1.RestoreWorkspaceRequest - 8, // 70: gitpod.v1.WorkspaceService.GetWorkspace:output_type -> gitpod.v1.GetWorkspaceResponse - 10, // 71: gitpod.v1.WorkspaceService.WatchWorkspaceStatus:output_type -> gitpod.v1.WatchWorkspaceStatusResponse - 12, // 72: gitpod.v1.WorkspaceService.ListWorkspaces:output_type -> gitpod.v1.ListWorkspacesResponse - 14, // 73: gitpod.v1.WorkspaceService.CreateAndStartWorkspace:output_type -> gitpod.v1.CreateAndStartWorkspaceResponse - 16, // 74: gitpod.v1.WorkspaceService.StartWorkspace:output_type -> gitpod.v1.StartWorkspaceResponse - 18, // 75: gitpod.v1.WorkspaceService.StopWorkspace:output_type -> gitpod.v1.StopWorkspaceResponse - 22, // 76: gitpod.v1.WorkspaceService.DeleteWorkspace:output_type -> gitpod.v1.DeleteWorkspaceResponse - 21, // 77: gitpod.v1.WorkspaceService.UpdateWorkspace:output_type -> gitpod.v1.UpdateWorkspaceResponse - 24, // 78: gitpod.v1.WorkspaceService.ListSupportedWorkspaceClasses:output_type -> gitpod.v1.ListSupportedWorkspaceClassesResponse - 26, // 79: gitpod.v1.WorkspaceService.GetDefaultWorkspaceImage:output_type -> gitpod.v1.GetDefaultWorkspaceImageResponse - 32, // 80: gitpod.v1.WorkspaceService.SendHeartBeat:output_type -> gitpod.v1.SendHeartBeatResponse - 28, // 81: gitpod.v1.WorkspaceService.GetWorkspaceOwnerToken:output_type -> gitpod.v1.GetWorkspaceOwnerTokenResponse - 30, // 82: gitpod.v1.WorkspaceService.GetWorkspaceEditorCredentials:output_type -> gitpod.v1.GetWorkspaceEditorCredentialsResponse - 34, // 83: gitpod.v1.WorkspaceService.WatchWorkpaceImageBuildLogs:output_type -> gitpod.v1.WatchWorkpaceImageBuildLogsResponse - 37, // 84: gitpod.v1.WorkspaceService.ListWorkspacePorts:output_type -> gitpod.v1.ListWorkspacePortsResponse - 39, // 85: gitpod.v1.WorkspaceService.UpdateWorkspacePort:output_type -> gitpod.v1.UpdateWorkspacePortResponse - 41, // 86: gitpod.v1.WorkspaceService.CreateWorkspaceSnapshot:output_type -> gitpod.v1.CreateWorkspaceSnapshotResponse - 43, // 87: gitpod.v1.WorkspaceService.WaitWorkspaceSnapshot:output_type -> gitpod.v1.WaitWorkspaceSnapshotResponse - 45, // 88: gitpod.v1.WorkspaceService.ListWorkspaceSnapshots:output_type -> gitpod.v1.ListWorkspaceSnapshotsResponse - 48, // 89: gitpod.v1.WorkspaceService.ListWorkspaceInstances:output_type -> gitpod.v1.ListWorkspaceInstancesResponse - 50, // 90: gitpod.v1.WorkspaceService.RestoreWorkspace:output_type -> gitpod.v1.RestoreWorkspaceResponse - 70, // [70:91] is the sub-list for method output_type - 49, // [49:70] is the sub-list for method input_type - 49, // [49:49] is the sub-list for extension type_name - 49, // [49:49] is the sub-list for extension extendee - 0, // [0:49] is the sub-list for field type_name + 52, // 1: gitpod.v1.GetWorkspaceResponse.workspace:type_name -> gitpod.v1.Workspace + 53, // 2: gitpod.v1.WatchWorkspaceStatusResponse.status:type_name -> gitpod.v1.WorkspaceStatus + 68, // 3: gitpod.v1.ListWorkspacesRequest.pagination:type_name -> gitpod.v1.PaginationRequest + 69, // 4: gitpod.v1.ListWorkspacesRequest.order_by:type_name -> gitpod.v1.OrderBy + 1, // 5: gitpod.v1.ListWorkspacesRequest.scope:type_name -> gitpod.v1.WorkspaceScope + 52, // 6: gitpod.v1.ListWorkspacesResponse.workspaces:type_name -> gitpod.v1.Workspace + 70, // 7: gitpod.v1.ListWorkspacesResponse.pagination:type_name -> gitpod.v1.PaginationResponse + 65, // 8: gitpod.v1.CreateAndStartWorkspaceRequest.source:type_name -> gitpod.v1.CreateAndStartWorkspaceRequest.Source + 62, // 9: gitpod.v1.CreateAndStartWorkspaceRequest.spec:type_name -> gitpod.v1.StartWorkspaceSpec + 1, // 10: gitpod.v1.StopWorkspaceRequest.scope:type_name -> gitpod.v1.WorkspaceScope + 61, // 11: gitpod.v1.UpdateWorkspaceRequest.spec:type_name -> gitpod.v1.WorkspaceSpec + 52, // 12: gitpod.v1.UpdateWorkspaceResponse.workspace:type_name -> gitpod.v1.Workspace + 60, // 13: gitpod.v1.ListSupportedWorkspaceClassesResponse.result:type_name -> gitpod.v1.WorkspaceClass + 36, // 14: gitpod.v1.WatchWorkspaceImageBuildLogsResponse.workspace_image_build:type_name -> gitpod.v1.WorkspaceImageBuild + 3, // 15: gitpod.v1.WorkspaceImageBuild.phase:type_name -> gitpod.v1.WorkspaceImageBuild.Phase + 66, // 16: gitpod.v1.WorkspaceImageBuild.logs:type_name -> gitpod.v1.WorkspaceImageBuild.Log + 68, // 17: gitpod.v1.ListWorkspacePortsRequest.pagination:type_name -> gitpod.v1.PaginationRequest + 55, // 18: gitpod.v1.ListWorkspacePortsResponse.ports:type_name -> gitpod.v1.WorkspacePort + 70, // 19: gitpod.v1.ListWorkspacePortsResponse.pagination:type_name -> gitpod.v1.PaginationResponse + 63, // 20: gitpod.v1.UpdateWorkspacePortRequest.spec:type_name -> gitpod.v1.PortSpec + 47, // 21: gitpod.v1.CreateWorkspaceSnapshotResponse.snapshot:type_name -> gitpod.v1.WorkspaceSnapshot + 47, // 22: gitpod.v1.WaitWorkspaceSnapshotResponse.snapshot:type_name -> gitpod.v1.WorkspaceSnapshot + 68, // 23: gitpod.v1.ListWorkspaceSnapshotsRequest.pagination:type_name -> gitpod.v1.PaginationRequest + 47, // 24: gitpod.v1.ListWorkspaceSnapshotsResponse.snapshots:type_name -> gitpod.v1.WorkspaceSnapshot + 70, // 25: gitpod.v1.ListWorkspaceSnapshotsResponse.pagination:type_name -> gitpod.v1.PaginationResponse + 67, // 26: gitpod.v1.WorkspaceSnapshot.source:type_name -> gitpod.v1.WorkspaceSnapshot.Source + 4, // 27: gitpod.v1.WorkspaceSnapshot.state:type_name -> gitpod.v1.WorkspaceSnapshot.State + 68, // 28: gitpod.v1.ListWorkspaceInstancesRequest.pagination:type_name -> gitpod.v1.PaginationRequest + 64, // 29: gitpod.v1.ListWorkspaceInstancesResponse.instances:type_name -> gitpod.v1.WorkspaceInstance + 70, // 30: gitpod.v1.ListWorkspaceInstancesResponse.pagination:type_name -> gitpod.v1.PaginationResponse + 53, // 31: gitpod.v1.Workspace.status:type_name -> gitpod.v1.WorkspaceStatus + 59, // 32: gitpod.v1.Workspace.additional_environment_variables:type_name -> gitpod.v1.WorkspaceEnvironmentVariable + 58, // 33: gitpod.v1.Workspace.editor:type_name -> gitpod.v1.EditorReference + 57, // 34: gitpod.v1.WorkspaceStatus.phase:type_name -> gitpod.v1.WorkspacePhase + 56, // 35: gitpod.v1.WorkspaceStatus.git_status:type_name -> gitpod.v1.WorkspaceGitStatus + 55, // 36: gitpod.v1.WorkspaceStatus.ports:type_name -> gitpod.v1.WorkspacePort + 0, // 37: gitpod.v1.WorkspaceStatus.admission:type_name -> gitpod.v1.AdmissionLevel + 54, // 38: gitpod.v1.WorkspaceStatus.conditions:type_name -> gitpod.v1.WorkspaceConditions + 5, // 39: gitpod.v1.WorkspacePort.policy:type_name -> gitpod.v1.WorkspacePort.Policy + 6, // 40: gitpod.v1.WorkspacePort.protocol:type_name -> gitpod.v1.WorkspacePort.Protocol + 7, // 41: gitpod.v1.WorkspacePhase.name:type_name -> gitpod.v1.WorkspacePhase.Phase + 71, // 42: gitpod.v1.WorkspacePhase.last_transition_time:type_name -> google.protobuf.Timestamp + 0, // 43: gitpod.v1.WorkspaceSpec.admission:type_name -> gitpod.v1.AdmissionLevel + 72, // 44: gitpod.v1.WorkspaceSpec.timeout:type_name -> google.protobuf.Duration + 56, // 45: gitpod.v1.WorkspaceSpec.git_status:type_name -> gitpod.v1.WorkspaceGitStatus + 58, // 46: gitpod.v1.StartWorkspaceSpec.editor:type_name -> gitpod.v1.EditorReference + 5, // 47: gitpod.v1.PortSpec.policy:type_name -> gitpod.v1.WorkspacePort.Policy + 6, // 48: gitpod.v1.PortSpec.protocol:type_name -> gitpod.v1.WorkspacePort.Protocol + 57, // 49: gitpod.v1.WorkspaceInstance.phase:type_name -> gitpod.v1.WorkspacePhase + 54, // 50: gitpod.v1.WorkspaceInstance.conditions:type_name -> gitpod.v1.WorkspaceConditions + 8, // 51: gitpod.v1.WorkspaceService.GetWorkspace:input_type -> gitpod.v1.GetWorkspaceRequest + 10, // 52: gitpod.v1.WorkspaceService.WatchWorkspaceStatus:input_type -> gitpod.v1.WatchWorkspaceStatusRequest + 12, // 53: gitpod.v1.WorkspaceService.ListWorkspaces:input_type -> gitpod.v1.ListWorkspacesRequest + 14, // 54: gitpod.v1.WorkspaceService.CreateAndStartWorkspace:input_type -> gitpod.v1.CreateAndStartWorkspaceRequest + 16, // 55: gitpod.v1.WorkspaceService.StartWorkspace:input_type -> gitpod.v1.StartWorkspaceRequest + 18, // 56: gitpod.v1.WorkspaceService.StopWorkspace:input_type -> gitpod.v1.StopWorkspaceRequest + 20, // 57: gitpod.v1.WorkspaceService.DeleteWorkspace:input_type -> gitpod.v1.DeleteWorkspaceRequest + 21, // 58: gitpod.v1.WorkspaceService.UpdateWorkspace:input_type -> gitpod.v1.UpdateWorkspaceRequest + 24, // 59: gitpod.v1.WorkspaceService.ListSupportedWorkspaceClasses:input_type -> gitpod.v1.ListSupportedWorkspaceClassesRequest + 26, // 60: gitpod.v1.WorkspaceService.GetDefaultWorkspaceImage:input_type -> gitpod.v1.GetDefaultWorkspaceImageRequest + 32, // 61: gitpod.v1.WorkspaceService.SendHeartBeat:input_type -> gitpod.v1.SendHeartBeatRequest + 28, // 62: gitpod.v1.WorkspaceService.GetWorkspaceOwnerToken:input_type -> gitpod.v1.GetWorkspaceOwnerTokenRequest + 30, // 63: gitpod.v1.WorkspaceService.GetWorkspaceEditorCredentials:input_type -> gitpod.v1.GetWorkspaceEditorCredentialsRequest + 34, // 64: gitpod.v1.WorkspaceService.WatchWorkspaceImageBuildLogs:input_type -> gitpod.v1.WatchWorkspaceImageBuildLogsRequest + 37, // 65: gitpod.v1.WorkspaceService.ListWorkspacePorts:input_type -> gitpod.v1.ListWorkspacePortsRequest + 39, // 66: gitpod.v1.WorkspaceService.UpdateWorkspacePort:input_type -> gitpod.v1.UpdateWorkspacePortRequest + 41, // 67: gitpod.v1.WorkspaceService.CreateWorkspaceSnapshot:input_type -> gitpod.v1.CreateWorkspaceSnapshotRequest + 43, // 68: gitpod.v1.WorkspaceService.WaitWorkspaceSnapshot:input_type -> gitpod.v1.WaitWorkspaceSnapshotRequest + 45, // 69: gitpod.v1.WorkspaceService.ListWorkspaceSnapshots:input_type -> gitpod.v1.ListWorkspaceSnapshotsRequest + 48, // 70: gitpod.v1.WorkspaceService.ListWorkspaceInstances:input_type -> gitpod.v1.ListWorkspaceInstancesRequest + 50, // 71: gitpod.v1.WorkspaceService.RestoreWorkspace:input_type -> gitpod.v1.RestoreWorkspaceRequest + 9, // 72: gitpod.v1.WorkspaceService.GetWorkspace:output_type -> gitpod.v1.GetWorkspaceResponse + 11, // 73: gitpod.v1.WorkspaceService.WatchWorkspaceStatus:output_type -> gitpod.v1.WatchWorkspaceStatusResponse + 13, // 74: gitpod.v1.WorkspaceService.ListWorkspaces:output_type -> gitpod.v1.ListWorkspacesResponse + 15, // 75: gitpod.v1.WorkspaceService.CreateAndStartWorkspace:output_type -> gitpod.v1.CreateAndStartWorkspaceResponse + 17, // 76: gitpod.v1.WorkspaceService.StartWorkspace:output_type -> gitpod.v1.StartWorkspaceResponse + 19, // 77: gitpod.v1.WorkspaceService.StopWorkspace:output_type -> gitpod.v1.StopWorkspaceResponse + 23, // 78: gitpod.v1.WorkspaceService.DeleteWorkspace:output_type -> gitpod.v1.DeleteWorkspaceResponse + 22, // 79: gitpod.v1.WorkspaceService.UpdateWorkspace:output_type -> gitpod.v1.UpdateWorkspaceResponse + 25, // 80: gitpod.v1.WorkspaceService.ListSupportedWorkspaceClasses:output_type -> gitpod.v1.ListSupportedWorkspaceClassesResponse + 27, // 81: gitpod.v1.WorkspaceService.GetDefaultWorkspaceImage:output_type -> gitpod.v1.GetDefaultWorkspaceImageResponse + 33, // 82: gitpod.v1.WorkspaceService.SendHeartBeat:output_type -> gitpod.v1.SendHeartBeatResponse + 29, // 83: gitpod.v1.WorkspaceService.GetWorkspaceOwnerToken:output_type -> gitpod.v1.GetWorkspaceOwnerTokenResponse + 31, // 84: gitpod.v1.WorkspaceService.GetWorkspaceEditorCredentials:output_type -> gitpod.v1.GetWorkspaceEditorCredentialsResponse + 35, // 85: gitpod.v1.WorkspaceService.WatchWorkspaceImageBuildLogs:output_type -> gitpod.v1.WatchWorkspaceImageBuildLogsResponse + 38, // 86: gitpod.v1.WorkspaceService.ListWorkspacePorts:output_type -> gitpod.v1.ListWorkspacePortsResponse + 40, // 87: gitpod.v1.WorkspaceService.UpdateWorkspacePort:output_type -> gitpod.v1.UpdateWorkspacePortResponse + 42, // 88: gitpod.v1.WorkspaceService.CreateWorkspaceSnapshot:output_type -> gitpod.v1.CreateWorkspaceSnapshotResponse + 44, // 89: gitpod.v1.WorkspaceService.WaitWorkspaceSnapshot:output_type -> gitpod.v1.WaitWorkspaceSnapshotResponse + 46, // 90: gitpod.v1.WorkspaceService.ListWorkspaceSnapshots:output_type -> gitpod.v1.ListWorkspaceSnapshotsResponse + 49, // 91: gitpod.v1.WorkspaceService.ListWorkspaceInstances:output_type -> gitpod.v1.ListWorkspaceInstancesResponse + 51, // 92: gitpod.v1.WorkspaceService.RestoreWorkspace:output_type -> gitpod.v1.RestoreWorkspaceResponse + 72, // [72:93] is the sub-list for method output_type + 51, // [51:72] is the sub-list for method input_type + 51, // [51:51] is the sub-list for extension type_name + 51, // [51:51] is the sub-list for extension extendee + 0, // [0:51] is the sub-list for field type_name } func init() { file_gitpod_v1_workspace_proto_init() } @@ -4825,6 +4946,7 @@ func file_gitpod_v1_workspace_proto_init() { return } file_gitpod_v1_pagination_proto_init() + file_gitpod_v1_order_by_proto_init() if !protoimpl.UnsafeEnabled { file_gitpod_v1_workspace_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetWorkspaceRequest); i { @@ -5139,7 +5261,7 @@ func file_gitpod_v1_workspace_proto_init() { } } file_gitpod_v1_workspace_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WatchWorkpaceImageBuildLogsRequest); i { + switch v := v.(*WatchWorkspaceImageBuildLogsRequest); i { case 0: return &v.state case 1: @@ -5151,7 +5273,7 @@ func file_gitpod_v1_workspace_proto_init() { } } file_gitpod_v1_workspace_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WatchWorkpaceImageBuildLogsResponse); i { + switch v := v.(*WatchWorkspaceImageBuildLogsResponse); i { case 0: return &v.state case 1: @@ -5511,7 +5633,7 @@ func file_gitpod_v1_workspace_proto_init() { } } file_gitpod_v1_workspace_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkspaceImageBuild_Log); i { + switch v := v.(*CreateAndStartWorkspaceRequest_Source); i { case 0: return &v.state case 1: @@ -5523,6 +5645,18 @@ func file_gitpod_v1_workspace_proto_init() { } } file_gitpod_v1_workspace_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkspaceImageBuild_Log); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gitpod_v1_workspace_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WorkspaceSnapshot_Source); i { case 0: return &v.state @@ -5536,10 +5670,6 @@ func file_gitpod_v1_workspace_proto_init() { } } file_gitpod_v1_workspace_proto_msgTypes[2].OneofWrappers = []interface{}{} - file_gitpod_v1_workspace_proto_msgTypes[6].OneofWrappers = []interface{}{ - (*CreateAndStartWorkspaceRequest_ContextUrl)(nil), - (*CreateAndStartWorkspaceRequest_RepositoryId)(nil), - } file_gitpod_v1_workspace_proto_msgTypes[44].OneofWrappers = []interface{}{} file_gitpod_v1_workspace_proto_msgTypes[45].OneofWrappers = []interface{}{} file_gitpod_v1_workspace_proto_msgTypes[46].OneofWrappers = []interface{}{} @@ -5550,8 +5680,8 @@ func file_gitpod_v1_workspace_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_gitpod_v1_workspace_proto_rawDesc, - NumEnums: 7, - NumMessages: 59, + NumEnums: 8, + NumMessages: 60, NumExtensions: 0, NumServices: 1, }, diff --git a/components/public-api/go/v1/workspace_grpc.pb.go b/components/public-api/go/v1/workspace_grpc.pb.go index 5ab845744b0453..4c491413348f9d 100644 --- a/components/public-api/go/v1/workspace_grpc.pb.go +++ b/components/public-api/go/v1/workspace_grpc.pb.go @@ -51,21 +51,25 @@ type WorkspaceServiceClient interface { UpdateWorkspace(ctx context.Context, in *UpdateWorkspaceRequest, opts ...grpc.CallOption) (*UpdateWorkspaceResponse, error) // ListSupportedWorkspaceClasses enumerates all available workspace classes. ListSupportedWorkspaceClasses(ctx context.Context, in *ListSupportedWorkspaceClassesRequest, opts ...grpc.CallOption) (*ListSupportedWorkspaceClassesResponse, error) - // GetDefaultWorkspaceImage returns the default workspace image of specified workspace. + // GetDefaultWorkspaceImage returns the default workspace image of specified + // workspace. GetDefaultWorkspaceImage(ctx context.Context, in *GetDefaultWorkspaceImageRequest, opts ...grpc.CallOption) (*GetDefaultWorkspaceImageResponse, error) // SendHeartBeat sends a heartbeat to activate the workspace SendHeartBeat(ctx context.Context, in *SendHeartBeatRequest, opts ...grpc.CallOption) (*SendHeartBeatResponse, error) // GetWorkspaceOwnerToken returns an owner token of workspace. GetWorkspaceOwnerToken(ctx context.Context, in *GetWorkspaceOwnerTokenRequest, opts ...grpc.CallOption) (*GetWorkspaceOwnerTokenResponse, error) - // GetWorkspaceEditorCredentials returns an credentials that is used in editor to encrypt and decrypt secrets + // GetWorkspaceEditorCredentials returns an credentials that is used in editor + // to encrypt and decrypt secrets GetWorkspaceEditorCredentials(ctx context.Context, in *GetWorkspaceEditorCredentialsRequest, opts ...grpc.CallOption) (*GetWorkspaceEditorCredentialsResponse, error) - // WatchWorkpaceImageBuildLogs watches the image build logs of prebuild workspace. - WatchWorkpaceImageBuildLogs(ctx context.Context, in *WatchWorkpaceImageBuildLogsRequest, opts ...grpc.CallOption) (WorkspaceService_WatchWorkpaceImageBuildLogsClient, error) + // WatchWorkspaceImageBuildLogs watches the image build logs of prebuild + // workspace. + WatchWorkspaceImageBuildLogs(ctx context.Context, in *WatchWorkspaceImageBuildLogsRequest, opts ...grpc.CallOption) (WorkspaceService_WatchWorkspaceImageBuildLogsClient, error) // ListWorkspacePorts lists workspace ports. ListWorkspacePorts(ctx context.Context, in *ListWorkspacePortsRequest, opts ...grpc.CallOption) (*ListWorkspacePortsResponse, error) // UpdateWorkspacePort updates a workspace port. UpdateWorkspacePort(ctx context.Context, in *UpdateWorkspacePortRequest, opts ...grpc.CallOption) (*UpdateWorkspacePortResponse, error) - // CreateWorkspaceSnapshot creates a snapshot of the workspace that can be shared with others. + // CreateWorkspaceSnapshot creates a snapshot of the workspace that can be + // shared with others. CreateWorkspaceSnapshot(ctx context.Context, in *CreateWorkspaceSnapshotRequest, opts ...grpc.CallOption) (*CreateWorkspaceSnapshotResponse, error) // WaitWorkspaceSnapshot waits for the snapshot to be available or failed. WaitWorkspaceSnapshot(ctx context.Context, in *WaitWorkspaceSnapshotRequest, opts ...grpc.CallOption) (*WaitWorkspaceSnapshotResponse, error) @@ -225,12 +229,12 @@ func (c *workspaceServiceClient) GetWorkspaceEditorCredentials(ctx context.Conte return out, nil } -func (c *workspaceServiceClient) WatchWorkpaceImageBuildLogs(ctx context.Context, in *WatchWorkpaceImageBuildLogsRequest, opts ...grpc.CallOption) (WorkspaceService_WatchWorkpaceImageBuildLogsClient, error) { - stream, err := c.cc.NewStream(ctx, &WorkspaceService_ServiceDesc.Streams[1], "/gitpod.v1.WorkspaceService/WatchWorkpaceImageBuildLogs", opts...) +func (c *workspaceServiceClient) WatchWorkspaceImageBuildLogs(ctx context.Context, in *WatchWorkspaceImageBuildLogsRequest, opts ...grpc.CallOption) (WorkspaceService_WatchWorkspaceImageBuildLogsClient, error) { + stream, err := c.cc.NewStream(ctx, &WorkspaceService_ServiceDesc.Streams[1], "/gitpod.v1.WorkspaceService/WatchWorkspaceImageBuildLogs", opts...) if err != nil { return nil, err } - x := &workspaceServiceWatchWorkpaceImageBuildLogsClient{stream} + x := &workspaceServiceWatchWorkspaceImageBuildLogsClient{stream} if err := x.ClientStream.SendMsg(in); err != nil { return nil, err } @@ -240,17 +244,17 @@ func (c *workspaceServiceClient) WatchWorkpaceImageBuildLogs(ctx context.Context return x, nil } -type WorkspaceService_WatchWorkpaceImageBuildLogsClient interface { - Recv() (*WatchWorkpaceImageBuildLogsResponse, error) +type WorkspaceService_WatchWorkspaceImageBuildLogsClient interface { + Recv() (*WatchWorkspaceImageBuildLogsResponse, error) grpc.ClientStream } -type workspaceServiceWatchWorkpaceImageBuildLogsClient struct { +type workspaceServiceWatchWorkspaceImageBuildLogsClient struct { grpc.ClientStream } -func (x *workspaceServiceWatchWorkpaceImageBuildLogsClient) Recv() (*WatchWorkpaceImageBuildLogsResponse, error) { - m := new(WatchWorkpaceImageBuildLogsResponse) +func (x *workspaceServiceWatchWorkspaceImageBuildLogsClient) Recv() (*WatchWorkspaceImageBuildLogsResponse, error) { + m := new(WatchWorkspaceImageBuildLogsResponse) if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err } @@ -349,21 +353,25 @@ type WorkspaceServiceServer interface { UpdateWorkspace(context.Context, *UpdateWorkspaceRequest) (*UpdateWorkspaceResponse, error) // ListSupportedWorkspaceClasses enumerates all available workspace classes. ListSupportedWorkspaceClasses(context.Context, *ListSupportedWorkspaceClassesRequest) (*ListSupportedWorkspaceClassesResponse, error) - // GetDefaultWorkspaceImage returns the default workspace image of specified workspace. + // GetDefaultWorkspaceImage returns the default workspace image of specified + // workspace. GetDefaultWorkspaceImage(context.Context, *GetDefaultWorkspaceImageRequest) (*GetDefaultWorkspaceImageResponse, error) // SendHeartBeat sends a heartbeat to activate the workspace SendHeartBeat(context.Context, *SendHeartBeatRequest) (*SendHeartBeatResponse, error) // GetWorkspaceOwnerToken returns an owner token of workspace. GetWorkspaceOwnerToken(context.Context, *GetWorkspaceOwnerTokenRequest) (*GetWorkspaceOwnerTokenResponse, error) - // GetWorkspaceEditorCredentials returns an credentials that is used in editor to encrypt and decrypt secrets + // GetWorkspaceEditorCredentials returns an credentials that is used in editor + // to encrypt and decrypt secrets GetWorkspaceEditorCredentials(context.Context, *GetWorkspaceEditorCredentialsRequest) (*GetWorkspaceEditorCredentialsResponse, error) - // WatchWorkpaceImageBuildLogs watches the image build logs of prebuild workspace. - WatchWorkpaceImageBuildLogs(*WatchWorkpaceImageBuildLogsRequest, WorkspaceService_WatchWorkpaceImageBuildLogsServer) error + // WatchWorkspaceImageBuildLogs watches the image build logs of prebuild + // workspace. + WatchWorkspaceImageBuildLogs(*WatchWorkspaceImageBuildLogsRequest, WorkspaceService_WatchWorkspaceImageBuildLogsServer) error // ListWorkspacePorts lists workspace ports. ListWorkspacePorts(context.Context, *ListWorkspacePortsRequest) (*ListWorkspacePortsResponse, error) // UpdateWorkspacePort updates a workspace port. UpdateWorkspacePort(context.Context, *UpdateWorkspacePortRequest) (*UpdateWorkspacePortResponse, error) - // CreateWorkspaceSnapshot creates a snapshot of the workspace that can be shared with others. + // CreateWorkspaceSnapshot creates a snapshot of the workspace that can be + // shared with others. CreateWorkspaceSnapshot(context.Context, *CreateWorkspaceSnapshotRequest) (*CreateWorkspaceSnapshotResponse, error) // WaitWorkspaceSnapshot waits for the snapshot to be available or failed. WaitWorkspaceSnapshot(context.Context, *WaitWorkspaceSnapshotRequest) (*WaitWorkspaceSnapshotResponse, error) @@ -419,8 +427,8 @@ func (UnimplementedWorkspaceServiceServer) GetWorkspaceOwnerToken(context.Contex func (UnimplementedWorkspaceServiceServer) GetWorkspaceEditorCredentials(context.Context, *GetWorkspaceEditorCredentialsRequest) (*GetWorkspaceEditorCredentialsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetWorkspaceEditorCredentials not implemented") } -func (UnimplementedWorkspaceServiceServer) WatchWorkpaceImageBuildLogs(*WatchWorkpaceImageBuildLogsRequest, WorkspaceService_WatchWorkpaceImageBuildLogsServer) error { - return status.Errorf(codes.Unimplemented, "method WatchWorkpaceImageBuildLogs not implemented") +func (UnimplementedWorkspaceServiceServer) WatchWorkspaceImageBuildLogs(*WatchWorkspaceImageBuildLogsRequest, WorkspaceService_WatchWorkspaceImageBuildLogsServer) error { + return status.Errorf(codes.Unimplemented, "method WatchWorkspaceImageBuildLogs not implemented") } func (UnimplementedWorkspaceServiceServer) ListWorkspacePorts(context.Context, *ListWorkspacePortsRequest) (*ListWorkspacePortsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListWorkspacePorts not implemented") @@ -693,24 +701,24 @@ func _WorkspaceService_GetWorkspaceEditorCredentials_Handler(srv interface{}, ct return interceptor(ctx, in, info, handler) } -func _WorkspaceService_WatchWorkpaceImageBuildLogs_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(WatchWorkpaceImageBuildLogsRequest) +func _WorkspaceService_WatchWorkspaceImageBuildLogs_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(WatchWorkspaceImageBuildLogsRequest) if err := stream.RecvMsg(m); err != nil { return err } - return srv.(WorkspaceServiceServer).WatchWorkpaceImageBuildLogs(m, &workspaceServiceWatchWorkpaceImageBuildLogsServer{stream}) + return srv.(WorkspaceServiceServer).WatchWorkspaceImageBuildLogs(m, &workspaceServiceWatchWorkspaceImageBuildLogsServer{stream}) } -type WorkspaceService_WatchWorkpaceImageBuildLogsServer interface { - Send(*WatchWorkpaceImageBuildLogsResponse) error +type WorkspaceService_WatchWorkspaceImageBuildLogsServer interface { + Send(*WatchWorkspaceImageBuildLogsResponse) error grpc.ServerStream } -type workspaceServiceWatchWorkpaceImageBuildLogsServer struct { +type workspaceServiceWatchWorkspaceImageBuildLogsServer struct { grpc.ServerStream } -func (x *workspaceServiceWatchWorkpaceImageBuildLogsServer) Send(m *WatchWorkpaceImageBuildLogsResponse) error { +func (x *workspaceServiceWatchWorkspaceImageBuildLogsServer) Send(m *WatchWorkspaceImageBuildLogsResponse) error { return x.ServerStream.SendMsg(m) } @@ -931,8 +939,8 @@ var WorkspaceService_ServiceDesc = grpc.ServiceDesc{ ServerStreams: true, }, { - StreamName: "WatchWorkpaceImageBuildLogs", - Handler: _WorkspaceService_WatchWorkpaceImageBuildLogs_Handler, + StreamName: "WatchWorkspaceImageBuildLogs", + Handler: _WorkspaceService_WatchWorkspaceImageBuildLogs_Handler, ServerStreams: true, }, }, diff --git a/components/public-api/typescript/src/gitpod/v1/order_by_pb.ts b/components/public-api/typescript/src/gitpod/v1/order_by_pb.ts new file mode 100644 index 00000000000000..b7cd5ded1b0719 --- /dev/null +++ b/components/public-api/typescript/src/gitpod/v1/order_by_pb.ts @@ -0,0 +1,55 @@ +/** + * Copyright (c) 2023 Gitpod GmbH. All rights reserved. + * Licensed under the GNU Affero General Public License (AGPL). + * See License.AGPL.txt in the project root for license information. + */ + +// @generated by protoc-gen-es v1.3.3 with parameter "target=ts" +// @generated from file gitpod/v1/order_by.proto (package gitpod.v1, syntax proto3) +/* eslint-disable */ +// @ts-nocheck + +import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf"; +import { Message, proto3 } from "@bufbuild/protobuf"; + +/** + * @generated from message gitpod.v1.OrderBy + */ +export class OrderBy extends Message { + /** + * order_by is the field to sort resources by. It follow SQL syntax: comma + * separated list of fields. For example: "foo,bar". The default sorting order + * is ascending. To specify descending order for a field, a suffix " desc" + * should be appended to the field name. For example: "foo desc,bar". + * + * @generated from field: string order_by = 1; + */ + orderBy = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "gitpod.v1.OrderBy"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "order_by", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): OrderBy { + return new OrderBy().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): OrderBy { + return new OrderBy().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): OrderBy { + return new OrderBy().fromJsonString(jsonString, options); + } + + static equals(a: OrderBy | PlainMessage | undefined, b: OrderBy | PlainMessage | undefined): boolean { + return proto3.util.equals(OrderBy, a, b); + } +} diff --git a/components/public-api/typescript/src/gitpod/v1/workspace_connect.ts b/components/public-api/typescript/src/gitpod/v1/workspace_connect.ts index c316e58bf00d66..e85bca992b0522 100644 --- a/components/public-api/typescript/src/gitpod/v1/workspace_connect.ts +++ b/components/public-api/typescript/src/gitpod/v1/workspace_connect.ts @@ -9,7 +9,7 @@ /* eslint-disable */ // @ts-nocheck -import { CreateAndStartWorkspaceRequest, CreateAndStartWorkspaceResponse, CreateWorkspaceSnapshotRequest, CreateWorkspaceSnapshotResponse, DeleteWorkspaceRequest, DeleteWorkspaceResponse, GetDefaultWorkspaceImageRequest, GetDefaultWorkspaceImageResponse, GetWorkspaceEditorCredentialsRequest, GetWorkspaceEditorCredentialsResponse, GetWorkspaceOwnerTokenRequest, GetWorkspaceOwnerTokenResponse, GetWorkspaceRequest, GetWorkspaceResponse, ListSupportedWorkspaceClassesRequest, ListSupportedWorkspaceClassesResponse, ListWorkspaceInstancesRequest, ListWorkspaceInstancesResponse, ListWorkspacePortsRequest, ListWorkspacePortsResponse, ListWorkspaceSnapshotsRequest, ListWorkspaceSnapshotsResponse, ListWorkspacesRequest, ListWorkspacesResponse, RestoreWorkspaceRequest, RestoreWorkspaceResponse, SendHeartBeatRequest, SendHeartBeatResponse, StartWorkspaceRequest, StartWorkspaceResponse, StopWorkspaceRequest, StopWorkspaceResponse, UpdateWorkspacePortRequest, UpdateWorkspacePortResponse, UpdateWorkspaceRequest, UpdateWorkspaceResponse, WaitWorkspaceSnapshotRequest, WaitWorkspaceSnapshotResponse, WatchWorkpaceImageBuildLogsRequest, WatchWorkpaceImageBuildLogsResponse, WatchWorkspaceStatusRequest, WatchWorkspaceStatusResponse } from "./workspace_pb.js"; +import { CreateAndStartWorkspaceRequest, CreateAndStartWorkspaceResponse, CreateWorkspaceSnapshotRequest, CreateWorkspaceSnapshotResponse, DeleteWorkspaceRequest, DeleteWorkspaceResponse, GetDefaultWorkspaceImageRequest, GetDefaultWorkspaceImageResponse, GetWorkspaceEditorCredentialsRequest, GetWorkspaceEditorCredentialsResponse, GetWorkspaceOwnerTokenRequest, GetWorkspaceOwnerTokenResponse, GetWorkspaceRequest, GetWorkspaceResponse, ListSupportedWorkspaceClassesRequest, ListSupportedWorkspaceClassesResponse, ListWorkspaceInstancesRequest, ListWorkspaceInstancesResponse, ListWorkspacePortsRequest, ListWorkspacePortsResponse, ListWorkspaceSnapshotsRequest, ListWorkspaceSnapshotsResponse, ListWorkspacesRequest, ListWorkspacesResponse, RestoreWorkspaceRequest, RestoreWorkspaceResponse, SendHeartBeatRequest, SendHeartBeatResponse, StartWorkspaceRequest, StartWorkspaceResponse, StopWorkspaceRequest, StopWorkspaceResponse, UpdateWorkspacePortRequest, UpdateWorkspacePortResponse, UpdateWorkspaceRequest, UpdateWorkspaceResponse, WaitWorkspaceSnapshotRequest, WaitWorkspaceSnapshotResponse, WatchWorkspaceImageBuildLogsRequest, WatchWorkspaceImageBuildLogsResponse, WatchWorkspaceStatusRequest, WatchWorkspaceStatusResponse } from "./workspace_pb.js"; import { MethodKind } from "@bufbuild/protobuf"; /** @@ -125,7 +125,8 @@ export const WorkspaceService = { kind: MethodKind.Unary, }, /** - * GetDefaultWorkspaceImage returns the default workspace image of specified workspace. + * GetDefaultWorkspaceImage returns the default workspace image of specified + * workspace. * * @generated from rpc gitpod.v1.WorkspaceService.GetDefaultWorkspaceImage */ @@ -158,7 +159,8 @@ export const WorkspaceService = { kind: MethodKind.Unary, }, /** - * GetWorkspaceEditorCredentials returns an credentials that is used in editor to encrypt and decrypt secrets + * GetWorkspaceEditorCredentials returns an credentials that is used in editor + * to encrypt and decrypt secrets * * @generated from rpc gitpod.v1.WorkspaceService.GetWorkspaceEditorCredentials */ @@ -169,14 +171,15 @@ export const WorkspaceService = { kind: MethodKind.Unary, }, /** - * WatchWorkpaceImageBuildLogs watches the image build logs of prebuild workspace. + * WatchWorkspaceImageBuildLogs watches the image build logs of prebuild + * workspace. * - * @generated from rpc gitpod.v1.WorkspaceService.WatchWorkpaceImageBuildLogs + * @generated from rpc gitpod.v1.WorkspaceService.WatchWorkspaceImageBuildLogs */ - watchWorkpaceImageBuildLogs: { - name: "WatchWorkpaceImageBuildLogs", - I: WatchWorkpaceImageBuildLogsRequest, - O: WatchWorkpaceImageBuildLogsResponse, + watchWorkspaceImageBuildLogs: { + name: "WatchWorkspaceImageBuildLogs", + I: WatchWorkspaceImageBuildLogsRequest, + O: WatchWorkspaceImageBuildLogsResponse, kind: MethodKind.ServerStreaming, }, /** @@ -202,7 +205,8 @@ export const WorkspaceService = { kind: MethodKind.Unary, }, /** - * CreateWorkspaceSnapshot creates a snapshot of the workspace that can be shared with others. + * CreateWorkspaceSnapshot creates a snapshot of the workspace that can be + * shared with others. * * @generated from rpc gitpod.v1.WorkspaceService.CreateWorkspaceSnapshot */ diff --git a/components/public-api/typescript/src/gitpod/v1/workspace_pb.ts b/components/public-api/typescript/src/gitpod/v1/workspace_pb.ts index 05e2d1c4ec8fc4..176e3a4b1704ab 100644 --- a/components/public-api/typescript/src/gitpod/v1/workspace_pb.ts +++ b/components/public-api/typescript/src/gitpod/v1/workspace_pb.ts @@ -12,6 +12,7 @@ import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf"; import { Duration, Message, proto3, protoInt64, Timestamp } from "@bufbuild/protobuf"; import { PaginationRequest, PaginationResponse } from "./pagination_pb.js"; +import { OrderBy } from "./order_by_pb.js"; /** * Admission level describes who can access a workspace instance and its ports. @@ -57,21 +58,24 @@ export enum WorkspaceScope { UNSPECIFIED = 0, /** - * WORKSPACE_SCOPE_MY_WORKSPACES_IN_ORGANIZATION scopes workspaces that is owned by current user in the organization + * WORKSPACE_SCOPE_MY_WORKSPACES_IN_ORGANIZATION scopes workspaces that is + * owned by current user in the organization * * @generated from enum value: WORKSPACE_SCOPE_MY_WORKSPACES_IN_ORGANIZATION = 1; */ MY_WORKSPACES_IN_ORGANIZATION = 1, /** - * WORKSPACE_SCOPE_ALL_WORKSPACES_IN_ORGANIZATION scopes all workspaces in the organization + * WORKSPACE_SCOPE_ALL_WORKSPACES_IN_ORGANIZATION scopes all workspaces in the + * organization * * @generated from enum value: WORKSPACE_SCOPE_ALL_WORKSPACES_IN_ORGANIZATION = 2; */ ALL_WORKSPACES_IN_ORGANIZATION = 2, /** - * WORKSPACE_SCOPE_ALL_WORKSPACES_IN_INSTALLATION scopes all workspaces in the installation + * WORKSPACE_SCOPE_ALL_WORKSPACES_IN_INSTALLATION scopes all workspaces in the + * installation * * @generated from enum value: WORKSPACE_SCOPE_ALL_WORKSPACES_IN_INSTALLATION = 3; */ @@ -264,34 +268,51 @@ export class ListWorkspacesRequest extends Message { */ pagination?: PaginationRequest; + /** + * order_by is the field to sort workspaces by, allowed values are OrderBy + * + * @generated from field: gitpod.v1.OrderBy order_by = 2; + */ + orderBy?: OrderBy; + /** * scope of the workspaces * - * @generated from field: gitpod.v1.WorkspaceScope scope = 2; + * @generated from field: gitpod.v1.WorkspaceScope scope = 3; */ scope = WorkspaceScope.UNSPECIFIED; /** * organization_id is the ID of the organization that contains the workspaces * - * @generated from field: string organization_id = 3; + * @generated from field: string organization_id = 4; */ organizationId = ""; /** * pinned indicates whether to list only pinned workspaces * - * @generated from field: bool pinned = 4; + * @generated from field: bool pinned = 5; */ pinned = false; /** * search_term is a search term to filter workspaces by name * - * @generated from field: string search_term = 5; + * @generated from field: string search_term = 6; */ searchTerm = ""; + /** + * @generated from field: string workspace_id = 7; + */ + workspaceId = ""; + + /** + * @generated from field: string owner_id = 8; + */ + ownerId = ""; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -301,10 +322,13 @@ export class ListWorkspacesRequest extends Message { static readonly typeName = "gitpod.v1.ListWorkspacesRequest"; static readonly fields: FieldList = proto3.util.newFieldList(() => [ { no: 1, name: "pagination", kind: "message", T: PaginationRequest }, - { no: 2, name: "scope", kind: "enum", T: proto3.getEnumType(WorkspaceScope) }, - { no: 3, name: "organization_id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 4, name: "pinned", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 5, name: "search_term", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "order_by", kind: "message", T: OrderBy }, + { no: 3, name: "scope", kind: "enum", T: proto3.getEnumType(WorkspaceScope) }, + { no: 4, name: "organization_id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 5, name: "pinned", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, + { no: 6, name: "search_term", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 7, name: "workspace_id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 8, name: "owner_id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): ListWorkspacesRequest { @@ -324,6 +348,29 @@ export class ListWorkspacesRequest extends Message { } } +/** + * @generated from enum gitpod.v1.ListWorkspacesRequest.OrderByField + */ +export enum ListWorkspacesRequest_OrderByField { + /** + * @generated from enum value: ORDER_BY_FIELD_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * ORDER_BY_FIELD_CREATION_TIME is the default sorting field, it sorts + * workspaces by (instances) creation time + * + * @generated from enum value: ORDER_BY_FIELD_CREATION_TIME = 1; + */ + CREATION_TIME = 1, +} +// Retrieve enum metadata with: proto3.getEnumType(ListWorkspacesRequest_OrderByField) +proto3.util.setEnumType(ListWorkspacesRequest_OrderByField, "gitpod.v1.ListWorkspacesRequest.OrderByField", [ + { no: 0, name: "ORDER_BY_FIELD_UNSPECIFIED" }, + { no: 1, name: "ORDER_BY_FIELD_CREATION_TIME" }, +]); + /** * @generated from message gitpod.v1.ListWorkspacesResponse */ @@ -381,47 +428,35 @@ export class CreateAndStartWorkspaceRequest extends Message) { super(); proto3.util.initPartial(data, this); @@ -431,13 +466,12 @@ export class CreateAndStartWorkspaceRequest extends Message [ { no: 1, name: "organization_id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "spec", kind: "message", T: StartWorkspaceSpec }, - { no: 3, name: "ignore_running_workspace_on_same_commit", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 4, name: "ignore_running_prebuild", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 5, name: "allow_using_previous_prebuilds", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 6, name: "force_default_config", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 7, name: "context_url", kind: "scalar", T: 9 /* ScalarType.STRING */, oneof: "source" }, - { no: 8, name: "repository_id", kind: "scalar", T: 9 /* ScalarType.STRING */, oneof: "source" }, + { no: 2, name: "source", kind: "message", T: CreateAndStartWorkspaceRequest_Source }, + { no: 3, name: "spec", kind: "message", T: StartWorkspaceSpec }, + { no: 4, name: "ignore_running_workspace_on_same_commit", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, + { no: 5, name: "ignore_running_prebuild", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, + { no: 6, name: "allow_using_previous_prebuilds", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, + { no: 7, name: "force_default_config", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): CreateAndStartWorkspaceRequest { @@ -457,6 +491,49 @@ export class CreateAndStartWorkspaceRequest extends Message { + /** + * @generated from field: string context_url = 1; + */ + contextUrl = ""; + + /** + * @generated from field: string repository_id = 2; + */ + repositoryId = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "gitpod.v1.CreateAndStartWorkspaceRequest.Source"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "context_url", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "repository_id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): CreateAndStartWorkspaceRequest_Source { + return new CreateAndStartWorkspaceRequest_Source().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): CreateAndStartWorkspaceRequest_Source { + return new CreateAndStartWorkspaceRequest_Source().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): CreateAndStartWorkspaceRequest_Source { + return new CreateAndStartWorkspaceRequest_Source().fromJsonString(jsonString, options); + } + + static equals(a: CreateAndStartWorkspaceRequest_Source | PlainMessage | undefined, b: CreateAndStartWorkspaceRequest_Source | PlainMessage | undefined): boolean { + return proto3.util.equals(CreateAndStartWorkspaceRequest_Source, a, b); + } +} + /** * @generated from message gitpod.v1.CreateAndStartWorkspaceResponse */ @@ -1154,76 +1231,76 @@ export class SendHeartBeatResponse extends Message { } /** - * @generated from message gitpod.v1.WatchWorkpaceImageBuildLogsRequest + * @generated from message gitpod.v1.WatchWorkspaceImageBuildLogsRequest */ -export class WatchWorkpaceImageBuildLogsRequest extends Message { +export class WatchWorkspaceImageBuildLogsRequest extends Message { /** * @generated from field: string workspace_id = 1; */ workspaceId = ""; - constructor(data?: PartialMessage) { + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); } static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "gitpod.v1.WatchWorkpaceImageBuildLogsRequest"; + static readonly typeName = "gitpod.v1.WatchWorkspaceImageBuildLogsRequest"; static readonly fields: FieldList = proto3.util.newFieldList(() => [ { no: 1, name: "workspace_id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, ]); - static fromBinary(bytes: Uint8Array, options?: Partial): WatchWorkpaceImageBuildLogsRequest { - return new WatchWorkpaceImageBuildLogsRequest().fromBinary(bytes, options); + static fromBinary(bytes: Uint8Array, options?: Partial): WatchWorkspaceImageBuildLogsRequest { + return new WatchWorkspaceImageBuildLogsRequest().fromBinary(bytes, options); } - static fromJson(jsonValue: JsonValue, options?: Partial): WatchWorkpaceImageBuildLogsRequest { - return new WatchWorkpaceImageBuildLogsRequest().fromJson(jsonValue, options); + static fromJson(jsonValue: JsonValue, options?: Partial): WatchWorkspaceImageBuildLogsRequest { + return new WatchWorkspaceImageBuildLogsRequest().fromJson(jsonValue, options); } - static fromJsonString(jsonString: string, options?: Partial): WatchWorkpaceImageBuildLogsRequest { - return new WatchWorkpaceImageBuildLogsRequest().fromJsonString(jsonString, options); + static fromJsonString(jsonString: string, options?: Partial): WatchWorkspaceImageBuildLogsRequest { + return new WatchWorkspaceImageBuildLogsRequest().fromJsonString(jsonString, options); } - static equals(a: WatchWorkpaceImageBuildLogsRequest | PlainMessage | undefined, b: WatchWorkpaceImageBuildLogsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(WatchWorkpaceImageBuildLogsRequest, a, b); + static equals(a: WatchWorkspaceImageBuildLogsRequest | PlainMessage | undefined, b: WatchWorkspaceImageBuildLogsRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(WatchWorkspaceImageBuildLogsRequest, a, b); } } /** - * @generated from message gitpod.v1.WatchWorkpaceImageBuildLogsResponse + * @generated from message gitpod.v1.WatchWorkspaceImageBuildLogsResponse */ -export class WatchWorkpaceImageBuildLogsResponse extends Message { +export class WatchWorkspaceImageBuildLogsResponse extends Message { /** * @generated from field: gitpod.v1.WorkspaceImageBuild workspace_image_build = 1; */ workspaceImageBuild?: WorkspaceImageBuild; - constructor(data?: PartialMessage) { + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); } static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "gitpod.v1.WatchWorkpaceImageBuildLogsResponse"; + static readonly typeName = "gitpod.v1.WatchWorkspaceImageBuildLogsResponse"; static readonly fields: FieldList = proto3.util.newFieldList(() => [ { no: 1, name: "workspace_image_build", kind: "message", T: WorkspaceImageBuild }, ]); - static fromBinary(bytes: Uint8Array, options?: Partial): WatchWorkpaceImageBuildLogsResponse { - return new WatchWorkpaceImageBuildLogsResponse().fromBinary(bytes, options); + static fromBinary(bytes: Uint8Array, options?: Partial): WatchWorkspaceImageBuildLogsResponse { + return new WatchWorkspaceImageBuildLogsResponse().fromBinary(bytes, options); } - static fromJson(jsonValue: JsonValue, options?: Partial): WatchWorkpaceImageBuildLogsResponse { - return new WatchWorkpaceImageBuildLogsResponse().fromJson(jsonValue, options); + static fromJson(jsonValue: JsonValue, options?: Partial): WatchWorkspaceImageBuildLogsResponse { + return new WatchWorkspaceImageBuildLogsResponse().fromJson(jsonValue, options); } - static fromJsonString(jsonString: string, options?: Partial): WatchWorkpaceImageBuildLogsResponse { - return new WatchWorkpaceImageBuildLogsResponse().fromJsonString(jsonString, options); + static fromJsonString(jsonString: string, options?: Partial): WatchWorkspaceImageBuildLogsResponse { + return new WatchWorkspaceImageBuildLogsResponse().fromJsonString(jsonString, options); } - static equals(a: WatchWorkpaceImageBuildLogsResponse | PlainMessage | undefined, b: WatchWorkpaceImageBuildLogsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(WatchWorkpaceImageBuildLogsResponse, a, b); + static equals(a: WatchWorkspaceImageBuildLogsResponse | PlainMessage | undefined, b: WatchWorkspaceImageBuildLogsResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(WatchWorkspaceImageBuildLogsResponse, a, b); } } @@ -1242,9 +1319,9 @@ export class WorkspaceImageBuild extends Message { message = ""; /** - * @generated from field: gitpod.v1.WorkspaceImageBuild.Log log = 3; + * @generated from field: repeated gitpod.v1.WorkspaceImageBuild.Log logs = 3; */ - log?: WorkspaceImageBuild_Log; + logs: WorkspaceImageBuild_Log[] = []; constructor(data?: PartialMessage) { super(); @@ -1256,7 +1333,7 @@ export class WorkspaceImageBuild extends Message { static readonly fields: FieldList = proto3.util.newFieldList(() => [ { no: 1, name: "phase", kind: "enum", T: proto3.getEnumType(WorkspaceImageBuild_Phase) }, { no: 2, name: "message", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "log", kind: "message", T: WorkspaceImageBuild_Log }, + { no: 3, name: "logs", kind: "message", T: WorkspaceImageBuild_Log, repeated: true }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): WorkspaceImageBuild { @@ -2910,7 +2987,8 @@ export class WorkspaceSpec extends Message { pinned = false; /** - * timeout is the timeout duration to stop the workspace since the last activity + * timeout is the timeout duration to stop the workspace since the last + * activity * * @generated from field: google.protobuf.Duration timeout = 4; */ diff --git a/components/server/src/api/workspace-service-api.ts b/components/server/src/api/workspace-service-api.ts index df0cf114208a62..7fd4df3c06d7ad 100644 --- a/components/server/src/api/workspace-service-api.ts +++ b/components/server/src/api/workspace-service-api.ts @@ -11,10 +11,57 @@ import { GetWorkspaceResponse, WatchWorkspaceStatusRequest, WatchWorkspaceStatusResponse, + ListWorkspacesRequest, + WorkspaceScope, + ListWorkspacesResponse, + CreateAndStartWorkspaceRequest, + CreateAndStartWorkspaceResponse, + CreateWorkspaceSnapshotRequest, + CreateWorkspaceSnapshotResponse, + DeleteWorkspaceRequest, + DeleteWorkspaceResponse, + GetDefaultWorkspaceImageRequest, + GetDefaultWorkspaceImageResponse, + GetWorkspaceEditorCredentialsRequest, + GetWorkspaceEditorCredentialsResponse, + GetWorkspaceOwnerTokenRequest, + GetWorkspaceOwnerTokenResponse, + ListSupportedWorkspaceClassesRequest, + ListSupportedWorkspaceClassesResponse, + ListWorkspaceInstancesRequest, + ListWorkspaceInstancesResponse, + ListWorkspacePortsRequest, + ListWorkspacePortsResponse, + ListWorkspaceSnapshotsRequest, + ListWorkspaceSnapshotsResponse, + RestoreWorkspaceRequest, + RestoreWorkspaceResponse, + SendHeartBeatRequest, + SendHeartBeatResponse, + StartWorkspaceRequest, + StartWorkspaceResponse, + StopWorkspaceRequest, + StopWorkspaceResponse, + UpdateWorkspacePortRequest, + UpdateWorkspacePortResponse, + UpdateWorkspaceRequest, + UpdateWorkspaceResponse, + WaitWorkspaceSnapshotRequest, + WaitWorkspaceSnapshotResponse, + WatchWorkspaceImageBuildLogsRequest, + WatchWorkspaceImageBuildLogsResponse, } from "@gitpod/public-api/lib/gitpod/v1/workspace_pb"; import { inject, injectable } from "inversify"; import { WorkspaceService } from "../workspace/workspace-service"; import { PublicAPIConverter } from "@gitpod/gitpod-protocol/lib/public-api-converter"; +import { parsePagination } from "@gitpod/gitpod-protocol/lib/public-api-utils"; +import { PaginationResponse } from "@gitpod/public-api/lib/gitpod/v1/pagination_pb"; +import { ApplicationError, ErrorCodes } from "@gitpod/gitpod-protocol/lib/messaging/error"; +import { WorkspaceInfo, WorkspaceImageBuild as ProtocolWorkspaceImageBuild } from "@gitpod/gitpod-protocol"; +import { GitpodServerImpl } from "../workspace/gitpod-server-impl"; +import { isWorkspaceRegion } from "@gitpod/gitpod-protocol/lib/workspace-cluster"; +import { TraceContext } from "@gitpod/gitpod-protocol/lib/util/tracing"; +import { generateAsyncGenerator } from "@gitpod/gitpod-protocol/lib/generate-async-generator"; @injectable() export class WorkspaceServiceAPI implements ServiceImpl { @@ -24,10 +71,13 @@ export class WorkspaceServiceAPI implements ServiceImpl { - const info = await this.workspaceService.getWorkspace(context.user.id, req.id); + const info = await this.workspaceService.getWorkspace(context.user.id, req.workspaceId); const response = new GetWorkspaceResponse(); - response.item = this.apiConverter.toWorkspace(info); + response.workspace = this.apiConverter.toWorkspace(info); return response; } @@ -63,4 +113,205 @@ export class WorkspaceServiceAPI implements ServiceImpl { + const { limit } = parsePagination(req.pagination, 50); + // TODO: offset + let resultTotal = 0; + let results: WorkspaceInfo[] = []; + + req.scope = req.scope || WorkspaceScope.MY_WORKSPACES_IN_ORGANIZATION; + switch (req.scope) { + case WorkspaceScope.MY_WORKSPACES_IN_ORGANIZATION: { + results = await this.workspaceService.getWorkspaces(context.user.id, { + organizationId: req.organizationId, + limit, + pinnedOnly: req.pinned, + searchString: req.searchTerm, + }); + resultTotal = results.length; + break; + } + case WorkspaceScope.ALL_WORKSPACES_IN_ORGANIZATION: { + // TODO: implement + throw new ApplicationError(ErrorCodes.NOT_IMPLEMENTED, "not implemented"); + } + case WorkspaceScope.ALL_WORKSPACES_IN_INSTALLATION: { + // TODO: move admin code to service + throw new ApplicationError(ErrorCodes.NOT_IMPLEMENTED, "not implemented"); + } + } + const response = new ListWorkspacesResponse(); + response.workspaces = results.map((workspace) => this.apiConverter.toWorkspace(workspace)); + response.pagination = new PaginationResponse(); + response.pagination.total = resultTotal; + return response; + } + + async createAndStartWorkspace( + req: CreateAndStartWorkspaceRequest, + _context: HandlerContext, + ): Promise { + if (!req.organizationId) { + throw new ApplicationError(ErrorCodes.BAD_REQUEST, "organization_id is required"); + } + if (!req.source?.contextUrl) { + throw new ApplicationError(ErrorCodes.BAD_REQUEST, "source.context_url is required"); + } + const region = req.spec?.region ?? ""; + const result = await this.gitpodServer.createWorkspace({} as any as TraceContext, { + workspaceClass: req.spec?.workspaceClass, + ideSettings: { + defaultIde: req.spec?.editor?.name, + useLatestVersion: req.spec?.editor?.version === "latest", + }, + contextUrl: req.source?.contextUrl, + organizationId: req.organizationId, + projectId: req.source?.repositoryId, + + ignoreRunningWorkspaceOnSameCommit: req.ignoreRunningWorkspaceOnSameCommit, + forceDefaultConfig: req.forceDefaultConfig, + region: isWorkspaceRegion(region) ? region : undefined, + }); + if (!result.createdWorkspaceId) { + throw new ApplicationError(ErrorCodes.INTERNAL_SERVER_ERROR, "failed to create workspace"); + } + const response = new CreateAndStartWorkspaceResponse(); + response.workspaceId = result.createdWorkspaceId; + return response; + } + + async startWorkspace(req: StartWorkspaceRequest, context: HandlerContext): Promise { + throw new ApplicationError(ErrorCodes.NOT_IMPLEMENTED, "not implemented"); + } + + async stopWorkspace(req: StopWorkspaceRequest, context: HandlerContext): Promise { + throw new ApplicationError(ErrorCodes.NOT_IMPLEMENTED, "not implemented"); + } + + async deleteWorkspace(req: DeleteWorkspaceRequest, context: HandlerContext): Promise { + throw new ApplicationError(ErrorCodes.NOT_IMPLEMENTED, "not implemented"); + } + + async updateWorkspace(req: UpdateWorkspaceRequest, context: HandlerContext): Promise { + throw new ApplicationError(ErrorCodes.NOT_IMPLEMENTED, "not implemented"); + } + + async listSupportedWorkspaceClasses( + req: ListSupportedWorkspaceClassesRequest, + context: HandlerContext, + ): Promise { + throw new ApplicationError(ErrorCodes.NOT_IMPLEMENTED, "not implemented"); + } + + async getDefaultWorkspaceImage( + req: GetDefaultWorkspaceImageRequest, + context: HandlerContext, + ): Promise { + throw new ApplicationError(ErrorCodes.NOT_IMPLEMENTED, "not implemented"); + } + + async sendHeartBeat(req: SendHeartBeatRequest, context: HandlerContext): Promise { + throw new ApplicationError(ErrorCodes.NOT_IMPLEMENTED, "not implemented"); + } + + async getWorkspaceOwnerToken( + req: GetWorkspaceOwnerTokenRequest, + context: HandlerContext, + ): Promise { + throw new ApplicationError(ErrorCodes.NOT_IMPLEMENTED, "not implemented"); + } + + async getWorkspaceEditorCredentials( + req: GetWorkspaceEditorCredentialsRequest, + context: HandlerContext, + ): Promise { + throw new ApplicationError(ErrorCodes.NOT_IMPLEMENTED, "not implemented"); + } + + async *watchWorkspaceImageBuildLogs( + req: WatchWorkspaceImageBuildLogsRequest, + context: HandlerContext, + ): AsyncIterable { + if (!req.workspaceId) { + throw new ApplicationError(ErrorCodes.BAD_REQUEST, "workspace_id is required"); + } + const it = generateAsyncGenerator<{ + state: ProtocolWorkspaceImageBuild.StateInfo; + log?: ProtocolWorkspaceImageBuild.LogContent; + }>( + (sink) => { + this.workspaceService + .watchWorkspaceImageBuildLogs( + context.user.id, + req.workspaceId as string, + { + onWorkspaceImageBuildLogs: (state, log) => { + sink.push({ state, log }); + }, + }, + context.signal, + ) + .then(() => { + sink.stop(); + }) + .catch((e) => { + sink.fail(new Error(String(e) || "unknown")); + }); + }, + { signal: context.signal }, + ); + + for await (const log of it) { + const response = new WatchWorkspaceImageBuildLogsResponse(); + response.workspaceImageBuild = this.apiConverter.toWorkspaceImageBuild(log.state, log.log); + yield response; + } + } + + async listWorkspacePorts( + req: ListWorkspacePortsRequest, + context: HandlerContext, + ): Promise { + throw new ApplicationError(ErrorCodes.NOT_IMPLEMENTED, "not implemented"); + } + + async updateWorkspacePort( + req: UpdateWorkspacePortRequest, + context: HandlerContext, + ): Promise { + throw new ApplicationError(ErrorCodes.NOT_IMPLEMENTED, "not implemented"); + } + + async createWorkspaceSnapshot( + req: CreateWorkspaceSnapshotRequest, + context: HandlerContext, + ): Promise { + throw new ApplicationError(ErrorCodes.NOT_IMPLEMENTED, "not implemented"); + } + + async waitWorkspaceSnapshot( + req: WaitWorkspaceSnapshotRequest, + context: HandlerContext, + ): Promise { + throw new ApplicationError(ErrorCodes.NOT_IMPLEMENTED, "not implemented"); + } + + async listWorkspaceSnapshots( + req: ListWorkspaceSnapshotsRequest, + context: HandlerContext, + ): Promise { + throw new ApplicationError(ErrorCodes.NOT_IMPLEMENTED, "not implemented"); + } + + async listWorkspaceInstances( + req: ListWorkspaceInstancesRequest, + context: HandlerContext, + ): Promise { + throw new ApplicationError(ErrorCodes.NOT_IMPLEMENTED, "not implemented"); + } + + async restoreWorkspace(req: RestoreWorkspaceRequest, context: HandlerContext): Promise { + throw new ApplicationError(ErrorCodes.NOT_IMPLEMENTED, "not implemented"); + } } diff --git a/components/server/src/workspace/workspace-service.ts b/components/server/src/workspace/workspace-service.ts index 76d7f3ffe5d458..4aba5bf4d53f48 100644 --- a/components/server/src/workspace/workspace-service.ts +++ b/components/server/src/workspace/workspace-service.ts @@ -758,6 +758,7 @@ export class WorkspaceService { userId: string, workspaceId: string, client: Pick, + signal?: AbortSignal, ): Promise { // check access await this.getWorkspace(userId, workspaceId); @@ -797,6 +798,9 @@ export class WorkspaceService { } const aborted = new Deferred(); + signal?.addEventListener("abort", () => { + aborted.resolve(true); + }); try { const logEndpoint: HeadlessLogEndpoint = { url: logInfo.url,