Merge "Pin the Java version to 11" into main
diff --git a/.bazelrc b/.bazelrc
new file mode 100644
index 0000000..936a7e8
--- /dev/null
+++ b/.bazelrc
@@ -0,0 +1,2 @@
+# Include comments in generated code for godoc.
+build --experimental_proto_descriptor_sets_include_source_info
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
new file mode 100644
index 0000000..87cbcde
--- /dev/null
+++ b/.github/workflows/main.yml
@@ -0,0 +1,26 @@
+name: CI
+
+on:
+  push:
+    branches: [ master ]
+  pull_request:
+    branches: [ master ]
+
+jobs:
+  build:
+    runs-on: ubuntu-latest
+
+    steps:
+    - uses: actions/checkout@v2
+
+    - name: Install bazelisk
+      run: |
+        curl -LO https://github.com/bazelbuild/bazelisk/releases/download/v1.7.4/bazelisk-linux-amd64
+        mkdir -p "${HOME}/bin"
+        mv bazelisk-linux-amd64 "${HOME}/bin/bazel"
+        chmod +x "${HOME}/bin/bazel"
+
+    - name: Check bindings generation
+      run: |
+        set -e
+        PATH=${HOME}/bin:$PATH ./hooks/pre-commit
diff --git a/BUILD.bazel b/BUILD.bazel
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/BUILD.bazel
diff --git a/METADATA b/METADATA
index 21373cc..ca6c758 100644
--- a/METADATA
+++ b/METADATA
@@ -1,13 +1,19 @@
-name: "remote-apis"
-description:
-    "An API for caching and execution of actions on a remote system."
+# This project was upgraded with external_updater.
+# Usage: tools/external_updater/updater.sh update external/bazelbuild-remote-apis
+# For more info, check https://cs.android.com/android/platform/superproject/+/main:tools/external_updater/README.md
 
+name: "remote-apis"
+description: "An API for caching and execution of actions on a remote system."
 third_party {
-  url {
-    type: GIT
-    value: "https://github.com/bazelbuild/remote-apis"
-  }
-  version: "6a5a17b77bca5e70417746fd0616db3849731619"
-  last_upgrade_date { year: 2019 month: 4 day: 9 }
   license_type: NOTICE
+  last_upgrade_date {
+    year: 2024
+    month: 4
+    day: 29
+  }
+  identifier {
+    type: "Git"
+    value: "https://github.com/bazelbuild/remote-apis"
+    version: "1f36c310b28d762b258ea577ed08e8203274efae"
+  }
 }
diff --git a/README.md b/README.md
index 1c99ce6..7542a4b 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,38 @@
-# Remote Execution API
+# remote-apis
 
-The Remote Execution API is an API that, at its most general, allows clients to
-request execution of binaries on a remote system. It is intended primarily for
-use by build systems, such as [Bazel](bazel.build), to distribute build and test
-actions through a worker pool, and also provide a central cache of build
-results. This allows builds to execute faster, both by reusing results already
-built by other clients and by allowing many actions to be executed in parallel,
-in excess of the resource limits of the machine running the build.
+This repository contains a collection of APIs which work together to enable
+large scale distributed execution and caching on source code and other inputs.
+It describes how to upload inputs, request the execution, monitor for results,
+and cache those results. It's overall aim is to enable large scale parallel executions
+that wouldn't be feasible on a single system, while minimizing the amount of uploads
+and executions needed by storing data in a content-addressable format and caching results.
+
+### [Remote Execution API](build/bazel/remote/execution/v2/remote_execution.proto)
+
+The Remote Execution API is an API that, at its most general, allows clients to request
+execution of binaries on a remote system. It is intended primarily for use by build systems,
+such as [Bazel](bazel.build), to distribute build and test actions through a worker pool,
+and also provide a central cache of build results. This allows builds to execute
+faster, both by reusing results already built by other clients and by allowing many
+actions to be executed in parallel, in excess of the resource limits of the machine
+running the build.
+
+### [Remote Asset API](build/bazel/remote/asset/v1/remote_asset.proto)
+
+The Remote Asset API is an API to associate Qualifiers and URIs to Digests stored in
+Content Addressable Storage. It is primary intended to allow clients to use semantically
+relevant identifiers, such as a git repository or tarball location, to get the corresponding
+Digest. This mapping may be pushed by a client directly, or dynamically resolved and added
+to CAS by the asset server when fetched by a client.
+
+### [Remote Logstream API](build/bazel/remote/logstream/v1/remote_logstream.proto)
+
+The Remote Logstream API is an API supporting ordered reads and writes of `LogStream`
+resources. It is intented primarily for streaming the stdout and stderr of ongoing Action
+executions, enabling clients to view them while the Action is executing instead of waiting
+for it's completion.
+
+## API users
 
 There are a number of clients and services using these APIs, they are listed
 below.
@@ -15,20 +41,60 @@
 These tools use the Remote Execution API to distribute builds to workers.
 
 * [Bazel](https://bazel.build)
+* [Buck2](https://github.com/facebook/buck2)
 * [BuildStream](https://buildstream.build/)
+* [Goma Server](https://chromium.googlesource.com/infra/goma/server/)
+* [Justbuild](https://github.com/just-buildsystem/justbuild) (via `--compatible`)
 * [Pants](https://www.pantsbuild.org)
+* [Please](https://please.build)
 * [Recc](https://gitlab.com/bloomberg/recc)
+* [Reclient](https://github.com/bazelbuild/reclient)
+* [Siso](https://chromium.googlesource.com/infra/infra/+/refs/heads/main/go/src/infra/build/siso/)
 
 ### Servers
-These applications implement the Remote Execution API to server build requests
-from the clients above. These are then distributed to workers; some of these 
-workers implement the Remote Worker API.
+These applications implement the Remote Execution API to serve build requests
+from the clients above.
 
-* [Buildbarn](https://github.com/EdSchouten/bazel-buildbarn)
-* [Buildfarm](https://github.com/bazelbuild/bazel-buildfarm)
-* [BuildGrid](https://buildgrid.build/)
-* [Remote Build Execution (Alpha)](https://blog.bazel.build/2018/10/05/remote-build-execution.html)
-* [Scoot](https://github.com/twitter/scoot)
+* [bazel-remote](https://github.com/buchgr/bazel-remote) (open source, cache only)
+* [Buildbarn](https://github.com/buildbarn) (open source)
+* [BuildBuddy](https://www.buildbuddy.io/) (commercial & open source)
+* [Buildfarm](https://github.com/bazelbuild/bazel-buildfarm) (open source)
+* [BuildGrid](https://buildgrid.build/) (open source)
+* [EngFlow](https://www.engflow.com/) (commercial)
+* [Flare Build Execution](https://flare.build/products/flare-build-execution) (commercial)
+* [Justbuild](https://github.com/just-buildsystem/justbuild/blob/master/doc/tutorial/just-execute.org) (via `--compatible`, open source)
+* [Kajiya](https://chromium.googlesource.com/infra/infra/+/refs/heads/main/go/src/infra/build/kajiya/) (open source)
+* [NativeLink](https://github.com/TraceMachina/nativelink) (open source)
+* [Scoot](https://github.com/twitter/scoot) (open source)
+
+### Workers
+Servers generally distribute work to a fleet of workers.
+The [Remote Worker API](https://docs.google.com/document/d/1s_AzRRD2mdyktKUj2HWBn99rMg_3tcPvdjx3MPbFidU)
+defines a generic protocol for worker and server communication, although, 
+this API is considered too heavyweight for most use-cases. Because of that, 
+many implementations have designed their own protocols. Links to these APIs
+are provided as a reference below.
+*Adhering to any one of these protocols is not a requirement.*
+
+* [Buildfarm Operation Queues](https://bazelbuild.github.io/bazel-buildfarm/docs/architecture/queues/)
+  * Uses sets of queues for managing different payload requirements.
+* [Buildbarn Remote Worker](https://github.com/buildbarn/bb-remote-execution/blob/master/pkg/proto/remoteworker/remoteworker.proto)
+  * Uses a custom protocol for workers to connect to a scheduler and receive instructions.
+* [BuildGrid Bots](https://buildgrid.build/developer/data_model.html#rwapi)
+  * A server implementation of the Remote Workers API.
+* [Buildbox Worker](https://gitlab.com/BuildGrid/buildbox/buildbox-worker)
+  * A worker implementation of the Remote Workers API.
+
+## API Community
+
+The [Remote Execution APIs
+group](https://groups.google.com/forum/#!forum/remote-execution-apis) hosts
+discussions related to the APIs in this repository.
+
+Interested parties meet monthly via VC to discuss issues related to the APIs,
+and several contributors have organized occasional meetups, hack-a-thons, and
+summits. Joining the email discussion group will automatically add you to the
+Google Calendar invite for the monthly meeting.
 
 ## Dependencies
 
@@ -48,3 +114,28 @@
 
 Other build systems will have to run protoc on the protobuf files, and link in
 the googleapis and well-known proto types, manually.
+
+### Go (for non-Bazel build systems)
+
+This repository contains the generated Go code for interacting with the API via
+gRPC. Get it with:
+
+```
+go get github.com/bazelbuild/remote-apis
+```
+
+Import it with, for example:
+
+```
+repb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
+```
+
+## Development
+
+Enable the git hooks to automatically generate Go proto code on commit:
+
+```
+git config core.hooksPath hooks/
+```
+
+This is a local setting, so applies only to this repository.
diff --git a/WORKSPACE b/WORKSPACE
index 4bd4dfa..391d0c2 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -2,49 +2,81 @@
 
 load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
 
-# Needed for protobuf.
 http_archive(
     name = "bazel_skylib",
-    # Commit f83cb8dd6f5658bc574ccd873e25197055265d1c of 2018-11-26
-    sha256 = "ba5d15ca230efca96320085d8e4d58da826d1f81b444ef8afccd8b23e0799b52",
-    strip_prefix = "bazel-skylib-f83cb8dd6f5658bc574ccd873e25197055265d1c",
+    sha256 = "66ffd9315665bfaafc96b52278f57c7e2dd09f5ede279ea6d39b2be471e7e3aa",
     urls = [
-        "https://github.com/bazelbuild/bazel-skylib/archive/f83cb8dd6f5658bc574ccd873e25197055265d1c.tar.gz",
+        "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.4.2/bazel-skylib-1.4.2.tar.gz",
+        "https://github.com/bazelbuild/bazel-skylib/releases/download/1.4.2/bazel-skylib-1.4.2.tar.gz",
     ],
 )
 
-# Needed for "well-known protos" and protoc.
+load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace")
+
+bazel_skylib_workspace()
+
+# Pull in go rules, which we need in order to selectively pull in Go dependencies.
 http_archive(
-    name = "com_google_protobuf",
-    sha256 = "3e933375ecc58d01e52705479b82f155aea2d02cc55d833f8773213e74f88363",
-    strip_prefix = "protobuf-3.7.0",
-    urls = ["https://github.com/protocolbuffers/protobuf/releases/download/v3.7.0/protobuf-all-3.7.0.tar.gz"],
+    name = "io_bazel_rules_go",
+    sha256 = "d6ab6b57e48c09523e93050f13698f708428cfd5e619252e369d377af6597707",
+    urls = [
+        "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.43.0/rules_go-v0.43.0.zip",
+        "https://github.com/bazelbuild/rules_go/releases/download/v0.43.0/rules_go-v0.43.0.zip",
+    ],
 )
 
-# Needed for the googleapis protos.
+# Gazelle, which we need in order to selectively pull in Gazelle dependencies for Go.
 http_archive(
-    name = "googleapis",
-    build_file = "BUILD.googleapis",
-    sha256 = "7b6ea252f0b8fb5cd722f45feb83e115b689909bbb6a393a873b6cbad4ceae1d",
-    strip_prefix = "googleapis-143084a2624b6591ee1f9d23e7f5241856642f4d",
-    urls = ["https://github.com/googleapis/googleapis/archive/143084a2624b6591ee1f9d23e7f5241856642f4d.zip"],
+    name = "bazel_gazelle",
+    sha256 = "b7387f72efb59f876e4daae42f1d3912d0d45563eac7cb23d1de0b094ab588cf",
+    urls = [
+        "https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.34.0/bazel-gazelle-v0.34.0.tar.gz",
+        "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.34.0/bazel-gazelle-v0.34.0.tar.gz",
+    ],
 )
 
+# Needed for protobuf.
+http_archive(
+    name = "com_google_protobuf",
+    sha256 = "535fbf566d372ccf3a097c374b26896fa044bf4232aef9cab37bd1cc1ba4e850",
+    strip_prefix = "protobuf-3.15.0",
+    urls = ["https://github.com/protocolbuffers/protobuf/archive/v3.15.0.zip"],
+)
+
+load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps")
+
+protobuf_deps()
+
 # Needed for C++ gRPC.
 http_archive(
     name = "com_github_grpc_grpc",
-    strip_prefix = "grpc-1.17.2",
-    urls = [
-        "https://github.com/grpc/grpc/archive/v1.17.2.tar.gz",
-        "https://mirror.bazel.build/github.com/grpc/grpc/archive/v1.17.2.tar.gz",
-    ],
-    sha256 = "34ed95b727e7c6fcbf85e5eb422e962788e21707b712fdb4caf931553c2c6dbc",
+    sha256 = "b391a327429279f6f29b9ae7e5317cd80d5e9d49cc100e6d682221af73d984a6",
+    strip_prefix = "grpc-93e8830070e9afcbaa992c75817009ee3f4b63a0",  # v1.24.3 with fixes
+    urls = ["https://github.com/grpc/grpc/archive/93e8830070e9afcbaa992c75817009ee3f4b63a0.zip"],
 )
 
 # Pull in all gRPC dependencies.
 load("@com_github_grpc_grpc//bazel:grpc_deps.bzl", "grpc_deps")
+
 grpc_deps()
 
+# More gRPC dependencies. grpc_extra_deps does not work out of the box.
+load("@upb//bazel:workspace_deps.bzl", "upb_deps")
+load("@build_bazel_rules_apple//apple:repositories.bzl", "apple_rules_dependencies")
+load("@build_bazel_apple_support//lib:repositories.bzl", "apple_support_dependencies")
+
+upb_deps()
+
+apple_rules_dependencies()
+
+apple_support_dependencies()
+
+load("@upb//bazel:repository_defs.bzl", "bazel_version_repository")
+
+bazel_version_repository(
+    name = "bazel_version",
+)
+
 bind(
     name = "grpc_cpp_plugin",
     actual = "@com_github_grpc_grpc//:grpc_cpp_plugin",
@@ -54,3 +86,21 @@
     name = "grpc_lib",
     actual = "@com_github_grpc_grpc//:grpc++",
 )
+
+load("//:remote_apis_deps.bzl", "remote_apis_go_deps")
+
+remote_apis_go_deps()
+
+# Needed for the googleapis protos.
+http_archive(
+    name = "googleapis",
+    sha256 = "b28c13e99001664eac5f1fb81b44d912d19fbc041e30772263251da131f6573c",
+    strip_prefix = "googleapis-bb964feba5980ed70c9fb8f84fe6e86694df65b0",
+    urls = ["https://github.com/googleapis/googleapis/archive/bb964feba5980ed70c9fb8f84fe6e86694df65b0.zip"],
+)
+
+load("@googleapis//:repository_rules.bzl", "switched_rules_by_language")
+
+switched_rules_by_language(
+    name = "com_google_googleapis_imports",
+)
diff --git a/build/bazel/remote/asset/v1/BUILD b/build/bazel/remote/asset/v1/BUILD
new file mode 100644
index 0000000..f360b4f
--- /dev/null
+++ b/build/bazel/remote/asset/v1/BUILD
@@ -0,0 +1,38 @@
+package(default_visibility = ["//visibility:public"])
+
+load("@rules_proto//proto:defs.bzl", "proto_library")
+
+licenses(["notice"])
+
+proto_library(
+    name = "remote_asset_proto",
+    srcs = ["remote_asset.proto"],
+    deps = [
+        "//build/bazel/remote/execution/v2:remote_execution_proto",
+        "@com_google_protobuf//:duration_proto",
+        "@com_google_protobuf//:timestamp_proto",
+        "@googleapis//google/api:annotations_proto",
+        "@googleapis//google/api:http_proto",
+        "@googleapis//google/rpc:status_proto",
+    ],
+)
+
+alias(
+    name = "remote_asset_java_proto",
+    actual = "//build/bazel/remote/asset/v1/java:remote_asset_java_proto",
+)
+
+alias(
+    name = "remote_asset_cc_proto",
+    actual = "//build/bazel/remote/asset/v1/cc:remote_asset_cc_grpc",
+)
+
+alias(
+    name = "remote_asset_go_proto",
+    actual = "//build/bazel/remote/asset/v1/go:remote_asset_go_proto",
+)
+
+alias(
+    name = "go_default_library",
+    actual = "//build/bazel/remote/asset/v1/go:go_default_library",
+)
diff --git a/build/bazel/remote/asset/v1/cc/BUILD b/build/bazel/remote/asset/v1/cc/BUILD
new file mode 100644
index 0000000..f4bcddb
--- /dev/null
+++ b/build/bazel/remote/asset/v1/cc/BUILD
@@ -0,0 +1,25 @@
+package(default_visibility = ["//build/bazel/remote/asset/v1:__pkg__"])
+
+load("//internal:cc_grpc_library.bzl", "cc_grpc_codegen")
+
+cc_proto_library(
+    name = "remote_asset_cc_proto",
+    deps = ["//build/bazel/remote/asset/v1:remote_asset_proto"],
+)
+
+cc_grpc_codegen(
+    name = "remote_asset_cc_grpc_codegen",
+    proto = "//build/bazel/remote/asset/v1:remote_asset_proto",
+)
+
+cc_library(
+    name = "remote_asset_cc_grpc",
+    srcs = [":remote_asset_cc_grpc_codegen"],
+    hdrs = [":remote_asset_cc_grpc_codegen"],
+    include_prefix = "build/bazel/remote/asset/v1",
+    strip_include_prefix = "/" + package_name(),
+    deps = [
+        ":remote_asset_cc_proto",
+        "@com_github_grpc_grpc//:grpc++_codegen_proto",
+    ],
+)
diff --git a/build/bazel/remote/asset/v1/go/BUILD b/build/bazel/remote/asset/v1/go/BUILD
new file mode 100644
index 0000000..f1b1d26
--- /dev/null
+++ b/build/bazel/remote/asset/v1/go/BUILD
@@ -0,0 +1,22 @@
+package(default_visibility = ["//build/bazel/remote/asset/v1:__pkg__"])
+
+load("@io_bazel_rules_go//go:def.bzl", "go_library")
+load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library")
+
+go_proto_library(
+    name = "remote_asset_go_proto",
+    compilers = ["@io_bazel_rules_go//proto:go_grpc"],
+    importpath = "github.com/bazelbuild/remote-apis/build/bazel/remote/asset/v1",
+    proto = "//build/bazel/remote/asset/v1:remote_asset_proto",
+    deps = [
+        "//build/bazel/remote/execution/v2:remote_execution_go_proto",
+        "@org_golang_google_genproto//googleapis/api/annotations",
+        "@org_golang_google_genproto//googleapis/rpc/status",
+    ],
+)
+
+go_library(
+    name = "go_default_library",
+    embed = [":remote_asset_go_proto"],
+    importpath = "github.com/bazelbuild/remote-apis/build/bazel/remote/asset/v1",
+)
diff --git a/build/bazel/remote/asset/v1/java/BUILD b/build/bazel/remote/asset/v1/java/BUILD
new file mode 100644
index 0000000..6346656
--- /dev/null
+++ b/build/bazel/remote/asset/v1/java/BUILD
@@ -0,0 +1,6 @@
+package(default_visibility = ["//build/bazel/remote/asset/v1:__pkg__"])
+
+java_proto_library(
+    name = "remote_asset_java_proto",
+    deps = ["//build/bazel/remote/asset/v1:remote_asset_proto"],
+)
diff --git a/build/bazel/remote/asset/v1/qualifiers.md b/build/bazel/remote/asset/v1/qualifiers.md
new file mode 100644
index 0000000..65fb655
--- /dev/null
+++ b/build/bazel/remote/asset/v1/qualifiers.md
@@ -0,0 +1,104 @@
+# Qualifier Lexicon
+
+This lexicon defines standard qualifier names that servers
+**MAY** support in the `Qualifier` message to facilitate interoperability.
+
+The following standard qualifier `name`s are defined:
+
+* `resource_type`: This describes the type of resource.
+
+  File assests should use an existing [media type](https://www.iana.org/assignments/media-types/media-types.xhtml).
+
+  Git repositories should use `application/x-git`.
+  
+  Example:
+  ```json
+  // (FetchDirectoryRequest proto)
+  {
+    "uris": [
+      "https://github.com/bazelbuild/remote-apis.git"
+    ],
+    "qualifiers": [
+      {
+        "name": "resource_type",
+        "value": "application/x-git"
+      }
+    ]
+  }
+  ```   
+
+* `checksum.sri`: The value represents a [Subresource Integrity](https://www.w3.org/TR/SRI/)
+  checksum of the content.
+
+  Example:
+  ```json
+  // (FetchBlobRequest proto)
+  {
+    "uris": [
+      "https://github.com/bazelbuild/remote-apis/archive/v2.0.0.tar.gz"
+    ],
+    "qualifiers": [
+      {
+        "name": "checksum.sri",
+        "value": "sha384-G9d9sKLNRfeFfGn1mnVXeJzXSbkCsYt11kl5hJnHpdzfVuLIuruIDnrs/lZyB4Gs"
+      }
+    ]
+  }
+  ```
+
+* `directory`: This is the relative path of a subdirectory of the resource.  There should
+  be no trailing `/`.
+
+  Example:
+  ```json
+  // (FetchDirectoryRequest proto)
+  {
+    "uris": [
+      "https://github.com/bazelbuild/remote-apis.git"
+    ],
+    "qualifiers": [
+      {
+        "name": "directory",
+        "value": "build/bazel/remote/execution/v2"
+      }
+    ]
+  }
+  ```
+
+* `vcs.branch`: This is the name of the branch under source control management
+
+  Example:
+  ```json
+  // (FetchDirectoryRequest proto)
+  {
+    "uris": [
+      "https://github.com/bazelbuild/remote-apis.git"
+    ],
+    "qualifiers": [
+      {
+        "name": "vcs.branch",
+        "value": "master"
+      }
+    ]
+  }
+  ```
+
+* `vcs.commit`: The value is the identity of a specific version of the content
+  under source control management.  For git this is a commit-ish, for subversion
+  this is a revision, for example.
+
+  Example:
+  ```json
+  // (FetchDirectoryRequest proto)
+  {
+    "uris": [
+      "https://github.com/bazelbuild/remote-apis.git"
+    ],
+    "qualifiers": [
+      {
+        "name": "vcs.commit",
+        "value": "b5123b1bb2853393c7b9aa43236db924d7e32d61"
+      }
+    ]
+  }
+  ```
diff --git a/build/bazel/remote/asset/v1/remote_asset.pb.go b/build/bazel/remote/asset/v1/remote_asset.pb.go
new file mode 100644
index 0000000..8c0c360
--- /dev/null
+++ b/build/bazel/remote/asset/v1/remote_asset.pb.go
@@ -0,0 +1,1689 @@
+// Copyright 2020 The Bazel Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.31.0
+// 	protoc        v3.15.0
+// source: build/bazel/remote/asset/v1/remote_asset.proto
+
+package remoteasset
+
+import (
+	context "context"
+	v2 "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	durationpb "google.golang.org/protobuf/types/known/durationpb"
+	timestamppb "google.golang.org/protobuf/types/known/timestamppb"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// Qualifiers are used to disambiguate or sub-select content that shares a URI.
+// This may include specifying a particular commit or branch, in the case of
+// URIs referencing a repository; they could also be used to specify a
+// particular subdirectory of a repository or tarball. Qualifiers may also be
+// used to ensure content matches what the client expects, even when there is
+// no ambiguity to be had - for example, a qualifier specifying a checksum
+// value.
+//
+// In cases where the semantics of the request are not immediately clear from
+// the URL and/or qualifiers - e.g. dictated by URL scheme - it is recommended
+// to use an additional qualifier to remove the ambiguity. The `resource_type`
+// qualifier is recommended for this purpose.
+//
+// Qualifiers may be supplied in any order.
+type Qualifier struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The "name" of the qualifier, for example "resource_type".
+	// No separation is made between 'standard' and 'nonstandard'
+	// qualifiers, in accordance with https://tools.ietf.org/html/rfc6648,
+	// however implementers *SHOULD* take care to avoid ambiguity.
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	// The "value" of the qualifier. Semantics will be dictated by the name.
+	Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
+}
+
+func (x *Qualifier) Reset() {
+	*x = Qualifier{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Qualifier) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Qualifier) ProtoMessage() {}
+
+func (x *Qualifier) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_asset_v1_remote_asset_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 Qualifier.ProtoReflect.Descriptor instead.
+func (*Qualifier) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_asset_v1_remote_asset_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Qualifier) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *Qualifier) GetValue() string {
+	if x != nil {
+		return x.Value
+	}
+	return ""
+}
+
+// A request message for
+// [Fetch.FetchBlob][build.bazel.remote.asset.v1.Fetch.FetchBlob].
+type FetchBlobRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The instance of the execution system to operate against. A server may
+	// support multiple instances of the execution system (with their own workers,
+	// storage, caches, etc.). The server MAY require use of this field to select
+	// between them in an implementation-defined fashion, otherwise it can be
+	// omitted.
+	InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"`
+	// The timeout for the underlying fetch, if content needs to be retrieved from
+	// origin.
+	//
+	// If unset, the server *MAY* apply an implementation-defined timeout.
+	//
+	// If set, and the user-provided timeout exceeds the RPC deadline, the server
+	// *SHOULD* keep the fetch going after the RPC completes, to be made
+	// available for future Fetch calls. The server may also enforce (via clamping
+	// and/or an INVALID_ARGUMENT error) implementation-defined minimum and
+	// maximum timeout values.
+	//
+	// If this timeout is exceeded on an attempt to retrieve content from origin
+	// the client will receive DEADLINE_EXCEEDED in [FetchBlobResponse.status].
+	Timeout *durationpb.Duration `protobuf:"bytes,2,opt,name=timeout,proto3" json:"timeout,omitempty"`
+	// The oldest content the client is willing to accept, as measured from the
+	// time it was Push'd or when the underlying retrieval from origin was
+	// started.
+	// Upon retries of Fetch requests that cannot be completed within a single
+	// RPC, clients *SHOULD* provide the same value for subsequent requests as the
+	// original, to simplify combining the request with the previous attempt.
+	//
+	// If unset, the client *SHOULD* accept content of any age.
+	OldestContentAccepted *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=oldest_content_accepted,json=oldestContentAccepted,proto3" json:"oldest_content_accepted,omitempty"`
+	// The URI(s) of the content to fetch. These may be resources that the server
+	// can directly fetch from origin, in which case multiple URIs *SHOULD*
+	// represent the same content available at different locations (such as an
+	// origin and secondary mirrors). These may also be URIs for content known to
+	// the server through other mechanisms, e.g. pushed via the [Push][build.bazel.remote.asset.v1.Push]
+	// service.
+	//
+	// Clients *MUST* supply at least one URI. Servers *MAY* match any one of the
+	// supplied URIs.
+	Uris []string `protobuf:"bytes,4,rep,name=uris,proto3" json:"uris,omitempty"`
+	// Qualifiers sub-specifying the content to fetch - see comments on
+	// [Qualifier][build.bazel.remote.asset.v1.Qualifier].
+	// The same qualifiers apply to all URIs.
+	//
+	// Specified qualifier names *MUST* be unique.
+	Qualifiers []*Qualifier `protobuf:"bytes,5,rep,name=qualifiers,proto3" json:"qualifiers,omitempty"`
+}
+
+func (x *FetchBlobRequest) Reset() {
+	*x = FetchBlobRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *FetchBlobRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FetchBlobRequest) ProtoMessage() {}
+
+func (x *FetchBlobRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use FetchBlobRequest.ProtoReflect.Descriptor instead.
+func (*FetchBlobRequest) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_asset_v1_remote_asset_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *FetchBlobRequest) GetInstanceName() string {
+	if x != nil {
+		return x.InstanceName
+	}
+	return ""
+}
+
+func (x *FetchBlobRequest) GetTimeout() *durationpb.Duration {
+	if x != nil {
+		return x.Timeout
+	}
+	return nil
+}
+
+func (x *FetchBlobRequest) GetOldestContentAccepted() *timestamppb.Timestamp {
+	if x != nil {
+		return x.OldestContentAccepted
+	}
+	return nil
+}
+
+func (x *FetchBlobRequest) GetUris() []string {
+	if x != nil {
+		return x.Uris
+	}
+	return nil
+}
+
+func (x *FetchBlobRequest) GetQualifiers() []*Qualifier {
+	if x != nil {
+		return x.Qualifiers
+	}
+	return nil
+}
+
+// A response message for
+// [Fetch.FetchBlob][build.bazel.remote.asset.v1.Fetch.FetchBlob].
+type FetchBlobResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// If the status has a code other than `OK`, it indicates that the operation
+	// was unable to be completed for reasons outside the servers' control.
+	// The possible fetch errors include:
+	//   - `DEADLINE_EXCEEDED`: The operation could not be completed within the
+	//     specified timeout.
+	//   - `NOT_FOUND`: The requested asset was not found at the specified location.
+	//   - `PERMISSION_DENIED`: The request was rejected by a remote server, or
+	//     requested an asset from a disallowed origin.
+	//   - `ABORTED`: The operation could not be completed, typically due to a
+	//     failed consistency check.
+	//   - `RESOURCE_EXHAUSTED`: There is insufficient quota of some resource to
+	//     perform the requested operation. The client may retry after a delay.
+	Status *status.Status `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"`
+	// The uri from the request that resulted in a successful retrieval, or from
+	// which the error indicated in `status` was obtained.
+	Uri string `protobuf:"bytes,2,opt,name=uri,proto3" json:"uri,omitempty"`
+	// Any qualifiers known to the server and of interest to clients.
+	Qualifiers []*Qualifier `protobuf:"bytes,3,rep,name=qualifiers,proto3" json:"qualifiers,omitempty"`
+	// A minimum timestamp the content is expected to be available through.
+	// Servers *MAY* omit this field, if not known with confidence.
+	ExpiresAt *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=expires_at,json=expiresAt,proto3" json:"expires_at,omitempty"`
+	// The result of the fetch, if the status had code `OK`.
+	// The digest of the file's contents, available for download through the CAS.
+	BlobDigest *v2.Digest `protobuf:"bytes,5,opt,name=blob_digest,json=blobDigest,proto3" json:"blob_digest,omitempty"`
+}
+
+func (x *FetchBlobResponse) Reset() {
+	*x = FetchBlobResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *FetchBlobResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FetchBlobResponse) ProtoMessage() {}
+
+func (x *FetchBlobResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use FetchBlobResponse.ProtoReflect.Descriptor instead.
+func (*FetchBlobResponse) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_asset_v1_remote_asset_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *FetchBlobResponse) GetStatus() *status.Status {
+	if x != nil {
+		return x.Status
+	}
+	return nil
+}
+
+func (x *FetchBlobResponse) GetUri() string {
+	if x != nil {
+		return x.Uri
+	}
+	return ""
+}
+
+func (x *FetchBlobResponse) GetQualifiers() []*Qualifier {
+	if x != nil {
+		return x.Qualifiers
+	}
+	return nil
+}
+
+func (x *FetchBlobResponse) GetExpiresAt() *timestamppb.Timestamp {
+	if x != nil {
+		return x.ExpiresAt
+	}
+	return nil
+}
+
+func (x *FetchBlobResponse) GetBlobDigest() *v2.Digest {
+	if x != nil {
+		return x.BlobDigest
+	}
+	return nil
+}
+
+// A request message for
+// [Fetch.FetchDirectory][build.bazel.remote.asset.v1.Fetch.FetchDirectory].
+type FetchDirectoryRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The instance of the execution system to operate against. A server may
+	// support multiple instances of the execution system (with their own workers,
+	// storage, caches, etc.). The server MAY require use of this field to select
+	// between them in an implementation-defined fashion, otherwise it can be
+	// omitted.
+	InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"`
+	// The timeout for the underlying fetch, if content needs to be retrieved from
+	// origin. This value is allowed to exceed the RPC deadline, in which case the
+	// server *SHOULD* keep the fetch going after the RPC completes, to be made
+	// available for future Fetch calls.
+	//
+	// If this timeout is exceeded on an attempt to retrieve content from origin
+	// the client will receive DEADLINE_EXCEEDED in [FetchDirectoryResponse.status].
+	Timeout *durationpb.Duration `protobuf:"bytes,2,opt,name=timeout,proto3" json:"timeout,omitempty"`
+	// The oldest content the client is willing to accept, as measured from the
+	// time it was Push'd or when the underlying retrieval from origin was
+	// started.
+	// Upon retries of Fetch requests that cannot be completed within a single
+	// RPC, clients *SHOULD* provide the same value for subsequent requests as the
+	// original, to simplify combining the request with the previous attempt.
+	//
+	// If unset, the client *SHOULD* accept content of any age.
+	OldestContentAccepted *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=oldest_content_accepted,json=oldestContentAccepted,proto3" json:"oldest_content_accepted,omitempty"`
+	// The URI(s) of the content to fetch. These may be resources that the server
+	// can directly fetch from origin, in which case multiple URIs *SHOULD*
+	// represent the same content available at different locations (such as an
+	// origin and secondary mirrors). These may also be URIs for content known to
+	// the server through other mechanisms, e.g. pushed via the [Push][build.bazel.remote.asset.v1.Push]
+	// service.
+	//
+	// Clients *MUST* supply at least one URI. Servers *MAY* match any one of the
+	// supplied URIs.
+	Uris []string `protobuf:"bytes,4,rep,name=uris,proto3" json:"uris,omitempty"`
+	// Qualifiers sub-specifying the content to fetch - see comments on
+	// [Qualifier][build.bazel.remote.asset.v1.Qualifier].
+	// The same qualifiers apply to all URIs.
+	//
+	// Specified qualifier names *MUST* be unique.
+	Qualifiers []*Qualifier `protobuf:"bytes,5,rep,name=qualifiers,proto3" json:"qualifiers,omitempty"`
+}
+
+func (x *FetchDirectoryRequest) Reset() {
+	*x = FetchDirectoryRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *FetchDirectoryRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FetchDirectoryRequest) ProtoMessage() {}
+
+func (x *FetchDirectoryRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use FetchDirectoryRequest.ProtoReflect.Descriptor instead.
+func (*FetchDirectoryRequest) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_asset_v1_remote_asset_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *FetchDirectoryRequest) GetInstanceName() string {
+	if x != nil {
+		return x.InstanceName
+	}
+	return ""
+}
+
+func (x *FetchDirectoryRequest) GetTimeout() *durationpb.Duration {
+	if x != nil {
+		return x.Timeout
+	}
+	return nil
+}
+
+func (x *FetchDirectoryRequest) GetOldestContentAccepted() *timestamppb.Timestamp {
+	if x != nil {
+		return x.OldestContentAccepted
+	}
+	return nil
+}
+
+func (x *FetchDirectoryRequest) GetUris() []string {
+	if x != nil {
+		return x.Uris
+	}
+	return nil
+}
+
+func (x *FetchDirectoryRequest) GetQualifiers() []*Qualifier {
+	if x != nil {
+		return x.Qualifiers
+	}
+	return nil
+}
+
+// A response message for
+// [Fetch.FetchDirectory][build.bazel.remote.asset.v1.Fetch.FetchDirectory].
+type FetchDirectoryResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// If the status has a code other than `OK`, it indicates that the operation
+	// was unable to be completed for reasons outside the servers' control.
+	// The possible fetch errors include:
+	//   - `DEADLINE_EXCEEDED`: The operation could not be completed within the
+	//     specified timeout.
+	//   - `NOT_FOUND`: The requested asset was not found at the specified location.
+	//   - `PERMISSION_DENIED`: The request was rejected by a remote server, or
+	//     requested an asset from a disallowed origin.
+	//   - `ABORTED`: The operation could not be completed, typically due to a
+	//     failed consistency check.
+	//   - `RESOURCE_EXHAUSTED`: There is insufficient quota of some resource to
+	//     perform the requested operation. The client may retry after a delay.
+	Status *status.Status `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"`
+	// The uri from the request that resulted in a successful retrieval, or from
+	// which the error indicated in `status` was obtained.
+	Uri string `protobuf:"bytes,2,opt,name=uri,proto3" json:"uri,omitempty"`
+	// Any qualifiers known to the server and of interest to clients.
+	Qualifiers []*Qualifier `protobuf:"bytes,3,rep,name=qualifiers,proto3" json:"qualifiers,omitempty"`
+	// A minimum timestamp the content is expected to be available through.
+	// Servers *MAY* omit this field, if not known with confidence.
+	ExpiresAt *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=expires_at,json=expiresAt,proto3" json:"expires_at,omitempty"`
+	// The result of the fetch, if the status had code `OK`.
+	// the root digest of a directory tree, suitable for fetching via
+	// [ContentAddressableStorage.GetTree].
+	RootDirectoryDigest *v2.Digest `protobuf:"bytes,5,opt,name=root_directory_digest,json=rootDirectoryDigest,proto3" json:"root_directory_digest,omitempty"`
+}
+
+func (x *FetchDirectoryResponse) Reset() {
+	*x = FetchDirectoryResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *FetchDirectoryResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FetchDirectoryResponse) ProtoMessage() {}
+
+func (x *FetchDirectoryResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use FetchDirectoryResponse.ProtoReflect.Descriptor instead.
+func (*FetchDirectoryResponse) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_asset_v1_remote_asset_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *FetchDirectoryResponse) GetStatus() *status.Status {
+	if x != nil {
+		return x.Status
+	}
+	return nil
+}
+
+func (x *FetchDirectoryResponse) GetUri() string {
+	if x != nil {
+		return x.Uri
+	}
+	return ""
+}
+
+func (x *FetchDirectoryResponse) GetQualifiers() []*Qualifier {
+	if x != nil {
+		return x.Qualifiers
+	}
+	return nil
+}
+
+func (x *FetchDirectoryResponse) GetExpiresAt() *timestamppb.Timestamp {
+	if x != nil {
+		return x.ExpiresAt
+	}
+	return nil
+}
+
+func (x *FetchDirectoryResponse) GetRootDirectoryDigest() *v2.Digest {
+	if x != nil {
+		return x.RootDirectoryDigest
+	}
+	return nil
+}
+
+// A request message for
+// [Push.PushBlob][build.bazel.remote.asset.v1.Push.PushBlob].
+type PushBlobRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The instance of the execution system to operate against. A server may
+	// support multiple instances of the execution system (with their own workers,
+	// storage, caches, etc.). The server MAY require use of this field to select
+	// between them in an implementation-defined fashion, otherwise it can be
+	// omitted.
+	InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"`
+	// The URI(s) of the content to associate. If multiple URIs are specified, the
+	// pushed content will be available to fetch by specifying any of them.
+	Uris []string `protobuf:"bytes,2,rep,name=uris,proto3" json:"uris,omitempty"`
+	// Qualifiers sub-specifying the content that is being pushed - see comments
+	// on [Qualifier][build.bazel.remote.asset.v1.Qualifier].
+	// The same qualifiers apply to all URIs.
+	Qualifiers []*Qualifier `protobuf:"bytes,3,rep,name=qualifiers,proto3" json:"qualifiers,omitempty"`
+	// A time after which this content should stop being returned via [FetchBlob][build.bazel.remote.asset.v1.Fetch.FetchBlob].
+	// Servers *MAY* expire content early, e.g. due to storage pressure.
+	ExpireAt *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=expire_at,json=expireAt,proto3" json:"expire_at,omitempty"`
+	// The blob to associate.
+	BlobDigest *v2.Digest `protobuf:"bytes,5,opt,name=blob_digest,json=blobDigest,proto3" json:"blob_digest,omitempty"`
+	// Referenced blobs or directories that need to not expire before expiration
+	// of this association, in addition to `blob_digest` itself.
+	// These fields are hints - clients *MAY* omit them, and servers *SHOULD*
+	// respect them, at the risk of increased incidents of Fetch responses
+	// indirectly referencing unavailable blobs.
+	ReferencesBlobs       []*v2.Digest `protobuf:"bytes,6,rep,name=references_blobs,json=referencesBlobs,proto3" json:"references_blobs,omitempty"`
+	ReferencesDirectories []*v2.Digest `protobuf:"bytes,7,rep,name=references_directories,json=referencesDirectories,proto3" json:"references_directories,omitempty"`
+}
+
+func (x *PushBlobRequest) Reset() {
+	*x = PushBlobRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *PushBlobRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PushBlobRequest) ProtoMessage() {}
+
+func (x *PushBlobRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use PushBlobRequest.ProtoReflect.Descriptor instead.
+func (*PushBlobRequest) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_asset_v1_remote_asset_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *PushBlobRequest) GetInstanceName() string {
+	if x != nil {
+		return x.InstanceName
+	}
+	return ""
+}
+
+func (x *PushBlobRequest) GetUris() []string {
+	if x != nil {
+		return x.Uris
+	}
+	return nil
+}
+
+func (x *PushBlobRequest) GetQualifiers() []*Qualifier {
+	if x != nil {
+		return x.Qualifiers
+	}
+	return nil
+}
+
+func (x *PushBlobRequest) GetExpireAt() *timestamppb.Timestamp {
+	if x != nil {
+		return x.ExpireAt
+	}
+	return nil
+}
+
+func (x *PushBlobRequest) GetBlobDigest() *v2.Digest {
+	if x != nil {
+		return x.BlobDigest
+	}
+	return nil
+}
+
+func (x *PushBlobRequest) GetReferencesBlobs() []*v2.Digest {
+	if x != nil {
+		return x.ReferencesBlobs
+	}
+	return nil
+}
+
+func (x *PushBlobRequest) GetReferencesDirectories() []*v2.Digest {
+	if x != nil {
+		return x.ReferencesDirectories
+	}
+	return nil
+}
+
+// A response message for
+// [Push.PushBlob][build.bazel.remote.asset.v1.Push.PushBlob].
+type PushBlobResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *PushBlobResponse) Reset() {
+	*x = PushBlobResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *PushBlobResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PushBlobResponse) ProtoMessage() {}
+
+func (x *PushBlobResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use PushBlobResponse.ProtoReflect.Descriptor instead.
+func (*PushBlobResponse) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_asset_v1_remote_asset_proto_rawDescGZIP(), []int{6}
+}
+
+// A request message for
+// [Push.PushDirectory][build.bazel.remote.asset.v1.Push.PushDirectory].
+type PushDirectoryRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The instance of the execution system to operate against. A server may
+	// support multiple instances of the execution system (with their own workers,
+	// storage, caches, etc.). The server MAY require use of this field to select
+	// between them in an implementation-defined fashion, otherwise it can be
+	// omitted.
+	InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"`
+	// The URI(s) of the content to associate. If multiple URIs are specified, the
+	// pushed content will be available to fetch by specifying any of them.
+	Uris []string `protobuf:"bytes,2,rep,name=uris,proto3" json:"uris,omitempty"`
+	// Qualifiers sub-specifying the content that is being pushed - see comments
+	// on [Qualifier][build.bazel.remote.asset.v1.Qualifier].
+	// The same qualifiers apply to all URIs.
+	Qualifiers []*Qualifier `protobuf:"bytes,3,rep,name=qualifiers,proto3" json:"qualifiers,omitempty"`
+	// A time after which this content should stop being returned via
+	// [FetchDirectory][build.bazel.remote.asset.v1.Fetch.FetchDirectory].
+	// Servers *MAY* expire content early, e.g. due to storage pressure.
+	ExpireAt *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=expire_at,json=expireAt,proto3" json:"expire_at,omitempty"`
+	// Directory to associate
+	RootDirectoryDigest *v2.Digest `protobuf:"bytes,5,opt,name=root_directory_digest,json=rootDirectoryDigest,proto3" json:"root_directory_digest,omitempty"`
+	// Referenced blobs or directories that need to not expire before expiration
+	// of this association, in addition to `root_directory_digest` itself.
+	// These fields are hints - clients *MAY* omit them, and servers *SHOULD*
+	// respect them, at the risk of increased incidents of Fetch responses
+	// indirectly referencing unavailable blobs.
+	ReferencesBlobs       []*v2.Digest `protobuf:"bytes,6,rep,name=references_blobs,json=referencesBlobs,proto3" json:"references_blobs,omitempty"`
+	ReferencesDirectories []*v2.Digest `protobuf:"bytes,7,rep,name=references_directories,json=referencesDirectories,proto3" json:"references_directories,omitempty"`
+}
+
+func (x *PushDirectoryRequest) Reset() {
+	*x = PushDirectoryRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *PushDirectoryRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PushDirectoryRequest) ProtoMessage() {}
+
+func (x *PushDirectoryRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use PushDirectoryRequest.ProtoReflect.Descriptor instead.
+func (*PushDirectoryRequest) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_asset_v1_remote_asset_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *PushDirectoryRequest) GetInstanceName() string {
+	if x != nil {
+		return x.InstanceName
+	}
+	return ""
+}
+
+func (x *PushDirectoryRequest) GetUris() []string {
+	if x != nil {
+		return x.Uris
+	}
+	return nil
+}
+
+func (x *PushDirectoryRequest) GetQualifiers() []*Qualifier {
+	if x != nil {
+		return x.Qualifiers
+	}
+	return nil
+}
+
+func (x *PushDirectoryRequest) GetExpireAt() *timestamppb.Timestamp {
+	if x != nil {
+		return x.ExpireAt
+	}
+	return nil
+}
+
+func (x *PushDirectoryRequest) GetRootDirectoryDigest() *v2.Digest {
+	if x != nil {
+		return x.RootDirectoryDigest
+	}
+	return nil
+}
+
+func (x *PushDirectoryRequest) GetReferencesBlobs() []*v2.Digest {
+	if x != nil {
+		return x.ReferencesBlobs
+	}
+	return nil
+}
+
+func (x *PushDirectoryRequest) GetReferencesDirectories() []*v2.Digest {
+	if x != nil {
+		return x.ReferencesDirectories
+	}
+	return nil
+}
+
+// A response message for
+// [Push.PushDirectory][build.bazel.remote.asset.v1.Push.PushDirectory].
+type PushDirectoryResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *PushDirectoryResponse) Reset() {
+	*x = PushDirectoryResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *PushDirectoryResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PushDirectoryResponse) ProtoMessage() {}
+
+func (x *PushDirectoryResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use PushDirectoryResponse.ProtoReflect.Descriptor instead.
+func (*PushDirectoryResponse) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_asset_v1_remote_asset_proto_rawDescGZIP(), []int{8}
+}
+
+var File_build_bazel_remote_asset_v1_remote_asset_proto protoreflect.FileDescriptor
+
+var file_build_bazel_remote_asset_v1_remote_asset_proto_rawDesc = []byte{
+	0x0a, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2f, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2f, 0x72, 0x65,
+	0x6d, 0x6f, 0x74, 0x65, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65,
+	0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x12, 0x1b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65,
+	0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x1a, 0x36, 0x62,
+	0x75, 0x69, 0x6c, 0x64, 0x2f, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2f, 0x72, 0x65, 0x6d, 0x6f, 0x74,
+	0x65, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x32, 0x2f, 0x72,
+	0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70,
+	0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63,
+	0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x35, 0x0a,
+	0x09, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,
+	0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14,
+	0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76,
+	0x61, 0x6c, 0x75, 0x65, 0x22, 0x9c, 0x02, 0x0a, 0x10, 0x46, 0x65, 0x74, 0x63, 0x68, 0x42, 0x6c,
+	0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73,
+	0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x33,
+	0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x02, 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, 0x52, 0x0a, 0x17, 0x6f, 0x6c, 0x64, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x6f,
+	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x18, 0x03,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
+	0x52, 0x15, 0x6f, 0x6c, 0x64, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x41,
+	0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x72, 0x69, 0x73, 0x18,
+	0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x75, 0x72, 0x69, 0x73, 0x12, 0x46, 0x0a, 0x0a, 0x71,
+	0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32,
+	0x26, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65,
+	0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75,
+	0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x0a, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69,
+	0x65, 0x72, 0x73, 0x22, 0x9e, 0x02, 0x0a, 0x11, 0x46, 0x65, 0x74, 0x63, 0x68, 0x42, 0x6c, 0x6f,
+	0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61,
+	0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73,
+	0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x69, 0x12, 0x46, 0x0a, 0x0a, 0x71, 0x75, 0x61, 0x6c, 0x69,
+	0x66, 0x69, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x62, 0x75,
+	0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65,
+	0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x66,
+	0x69, 0x65, 0x72, 0x52, 0x0a, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12,
+	0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52,
+	0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x12, 0x48, 0x0a, 0x0b, 0x62, 0x6c,
+	0x6f, 0x62, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65,
+	0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76,
+	0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x62, 0x6c, 0x6f, 0x62, 0x44, 0x69,
+	0x67, 0x65, 0x73, 0x74, 0x22, 0xa1, 0x02, 0x0a, 0x15, 0x46, 0x65, 0x74, 0x63, 0x68, 0x44, 0x69,
+	0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23,
+	0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e,
+	0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x02,
+	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, 0x52, 0x0a, 0x17, 0x6f, 0x6c, 0x64, 0x65,
+	0x73, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x70,
+	0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65,
+	0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x15, 0x6f, 0x6c, 0x64, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e,
+	0x74, 0x65, 0x6e, 0x74, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04,
+	0x75, 0x72, 0x69, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x75, 0x72, 0x69, 0x73,
+	0x12, 0x46, 0x0a, 0x0a, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, 0x05,
+	0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a,
+	0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e,
+	0x76, 0x31, 0x2e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x0a, 0x71, 0x75,
+	0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x22, 0xb6, 0x02, 0x0a, 0x16, 0x46, 0x65, 0x74,
+	0x63, 0x68, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63,
+	0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12,
+	0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72,
+	0x69, 0x12, 0x46, 0x0a, 0x0a, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18,
+	0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61,
+	0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74,
+	0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x0a, 0x71,
+	0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70,
+	0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+	0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72,
+	0x65, 0x73, 0x41, 0x74, 0x12, 0x5b, 0x0a, 0x15, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x64, 0x69, 0x72,
+	0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x05, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65,
+	0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69,
+	0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x13, 0x72, 0x6f,
+	0x6f, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x44, 0x69, 0x67, 0x65, 0x73,
+	0x74, 0x22, 0xc9, 0x03, 0x0a, 0x0f, 0x50, 0x75, 0x73, 0x68, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63,
+	0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e,
+	0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x72,
+	0x69, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x75, 0x72, 0x69, 0x73, 0x12, 0x46,
+	0x0a, 0x0a, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03,
+	0x28, 0x0b, 0x32, 0x26, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c,
+	0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31,
+	0x2e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x0a, 0x71, 0x75, 0x61, 0x6c,
+	0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x37, 0x0a, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65,
+	0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65,
+	0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x41, 0x74, 0x12,
+	0x48, 0x0a, 0x0b, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x05,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a,
+	0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74,
+	0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x62,
+	0x6c, 0x6f, 0x62, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x52, 0x0a, 0x10, 0x72, 0x65, 0x66,
+	0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x73, 0x18, 0x06, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65,
+	0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69,
+	0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x0f, 0x72, 0x65,
+	0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x12, 0x5e, 0x0a,
+	0x16, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x5f, 0x64, 0x69, 0x72, 0x65,
+	0x63, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e,
+	0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f,
+	0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e,
+	0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x15, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+	0x65, 0x73, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x22, 0x12, 0x0a,
+	0x10, 0x50, 0x75, 0x73, 0x68, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x22, 0xe1, 0x03, 0x0a, 0x14, 0x50, 0x75, 0x73, 0x68, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74,
+	0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e,
+	0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12,
+	0x12, 0x0a, 0x04, 0x75, 0x72, 0x69, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x75,
+	0x72, 0x69, 0x73, 0x12, 0x46, 0x0a, 0x0a, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72,
+	0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e,
+	0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x61, 0x73, 0x73,
+	0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52,
+	0x0a, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x37, 0x0a, 0x09, 0x65,
+	0x78, 0x70, 0x69, 0x72, 0x65, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a,
+	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
+	0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x65, 0x78, 0x70, 0x69,
+	0x72, 0x65, 0x41, 0x74, 0x12, 0x5b, 0x0a, 0x15, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x64, 0x69, 0x72,
+	0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x05, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65,
+	0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69,
+	0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x13, 0x72, 0x6f,
+	0x6f, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x44, 0x69, 0x67, 0x65, 0x73,
+	0x74, 0x12, 0x52, 0x0a, 0x10, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x5f,
+	0x62, 0x6c, 0x6f, 0x62, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75,
+	0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65,
+	0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69,
+	0x67, 0x65, 0x73, 0x74, 0x52, 0x0f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73,
+	0x42, 0x6c, 0x6f, 0x62, 0x73, 0x12, 0x5e, 0x0a, 0x16, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,
+	0x63, 0x65, 0x73, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18,
+	0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61,
+	0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75,
+	0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x15,
+	0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74,
+	0x6f, 0x72, 0x69, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x50, 0x75, 0x73, 0x68, 0x44, 0x69, 0x72,
+	0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xdd,
+	0x02, 0x0a, 0x05, 0x46, 0x65, 0x74, 0x63, 0x68, 0x12, 0x9e, 0x01, 0x0a, 0x09, 0x46, 0x65, 0x74,
+	0x63, 0x68, 0x42, 0x6c, 0x6f, 0x62, 0x12, 0x2d, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62,
+	0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65,
+	0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61,
+	0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74,
+	0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x3a, 0x01, 0x2a,
+	0x22, 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f,
+	0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x3a,
+	0x66, 0x65, 0x74, 0x63, 0x68, 0x42, 0x6c, 0x6f, 0x62, 0x12, 0xb2, 0x01, 0x0a, 0x0e, 0x46, 0x65,
+	0x74, 0x63, 0x68, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x32, 0x2e, 0x62,
+	0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74,
+	0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68,
+	0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x33, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72,
+	0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46,
+	0x65, 0x74, 0x63, 0x68, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x37, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x31, 0x3a, 0x01, 0x2a,
+	0x22, 0x2c, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f,
+	0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x3a,
+	0x66, 0x65, 0x74, 0x63, 0x68, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x32, 0xd4,
+	0x02, 0x0a, 0x04, 0x50, 0x75, 0x73, 0x68, 0x12, 0x9a, 0x01, 0x0a, 0x08, 0x50, 0x75, 0x73, 0x68,
+	0x42, 0x6c, 0x6f, 0x62, 0x12, 0x2c, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a,
+	0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e,
+	0x76, 0x31, 0x2e, 0x50, 0x75, 0x73, 0x68, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c,
+	0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31,
+	0x2e, 0x50, 0x75, 0x73, 0x68, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x3a, 0x01, 0x2a, 0x22, 0x26, 0x2f, 0x76,
+	0x31, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
+	0x3d, 0x2a, 0x2a, 0x7d, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x3a, 0x70, 0x75, 0x73, 0x68,
+	0x42, 0x6c, 0x6f, 0x62, 0x12, 0xae, 0x01, 0x0a, 0x0d, 0x50, 0x75, 0x73, 0x68, 0x44, 0x69, 0x72,
+	0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x31, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62,
+	0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65,
+	0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x73, 0x68, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f,
+	0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x62, 0x75, 0x69, 0x6c,
+	0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x61,
+	0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x73, 0x68, 0x44, 0x69, 0x72, 0x65,
+	0x63, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x36, 0x82,
+	0xd3, 0xe4, 0x93, 0x02, 0x30, 0x3a, 0x01, 0x2a, 0x22, 0x2b, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x69,
+	0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x2a, 0x2a, 0x7d,
+	0x2f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x3a, 0x70, 0x75, 0x73, 0x68, 0x44, 0x69, 0x72, 0x65,
+	0x63, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x9f, 0x01, 0x0a, 0x1b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e,
+	0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x61, 0x73, 0x73,
+	0x65, 0x74, 0x2e, 0x76, 0x31, 0x42, 0x10, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x73, 0x73,
+	0x65, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x49, 0x67, 0x69, 0x74, 0x68, 0x75,
+	0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x62, 0x75, 0x69, 0x6c, 0x64,
+	0x2f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2d, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x62, 0x75, 0x69,
+	0x6c, 0x64, 0x2f, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2f,
+	0x61, 0x73, 0x73, 0x65, 0x74, 0x2f, 0x76, 0x31, 0x3b, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x61,
+	0x73, 0x73, 0x65, 0x74, 0xa2, 0x02, 0x02, 0x52, 0x41, 0xaa, 0x02, 0x1b, 0x42, 0x75, 0x69, 0x6c,
+	0x64, 0x2e, 0x42, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x41,
+	0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_build_bazel_remote_asset_v1_remote_asset_proto_rawDescOnce sync.Once
+	file_build_bazel_remote_asset_v1_remote_asset_proto_rawDescData = file_build_bazel_remote_asset_v1_remote_asset_proto_rawDesc
+)
+
+func file_build_bazel_remote_asset_v1_remote_asset_proto_rawDescGZIP() []byte {
+	file_build_bazel_remote_asset_v1_remote_asset_proto_rawDescOnce.Do(func() {
+		file_build_bazel_remote_asset_v1_remote_asset_proto_rawDescData = protoimpl.X.CompressGZIP(file_build_bazel_remote_asset_v1_remote_asset_proto_rawDescData)
+	})
+	return file_build_bazel_remote_asset_v1_remote_asset_proto_rawDescData
+}
+
+var file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes = make([]protoimpl.MessageInfo, 9)
+var file_build_bazel_remote_asset_v1_remote_asset_proto_goTypes = []interface{}{
+	(*Qualifier)(nil),              // 0: build.bazel.remote.asset.v1.Qualifier
+	(*FetchBlobRequest)(nil),       // 1: build.bazel.remote.asset.v1.FetchBlobRequest
+	(*FetchBlobResponse)(nil),      // 2: build.bazel.remote.asset.v1.FetchBlobResponse
+	(*FetchDirectoryRequest)(nil),  // 3: build.bazel.remote.asset.v1.FetchDirectoryRequest
+	(*FetchDirectoryResponse)(nil), // 4: build.bazel.remote.asset.v1.FetchDirectoryResponse
+	(*PushBlobRequest)(nil),        // 5: build.bazel.remote.asset.v1.PushBlobRequest
+	(*PushBlobResponse)(nil),       // 6: build.bazel.remote.asset.v1.PushBlobResponse
+	(*PushDirectoryRequest)(nil),   // 7: build.bazel.remote.asset.v1.PushDirectoryRequest
+	(*PushDirectoryResponse)(nil),  // 8: build.bazel.remote.asset.v1.PushDirectoryResponse
+	(*durationpb.Duration)(nil),    // 9: google.protobuf.Duration
+	(*timestamppb.Timestamp)(nil),  // 10: google.protobuf.Timestamp
+	(*status.Status)(nil),          // 11: google.rpc.Status
+	(*v2.Digest)(nil),              // 12: build.bazel.remote.execution.v2.Digest
+}
+var file_build_bazel_remote_asset_v1_remote_asset_proto_depIdxs = []int32{
+	9,  // 0: build.bazel.remote.asset.v1.FetchBlobRequest.timeout:type_name -> google.protobuf.Duration
+	10, // 1: build.bazel.remote.asset.v1.FetchBlobRequest.oldest_content_accepted:type_name -> google.protobuf.Timestamp
+	0,  // 2: build.bazel.remote.asset.v1.FetchBlobRequest.qualifiers:type_name -> build.bazel.remote.asset.v1.Qualifier
+	11, // 3: build.bazel.remote.asset.v1.FetchBlobResponse.status:type_name -> google.rpc.Status
+	0,  // 4: build.bazel.remote.asset.v1.FetchBlobResponse.qualifiers:type_name -> build.bazel.remote.asset.v1.Qualifier
+	10, // 5: build.bazel.remote.asset.v1.FetchBlobResponse.expires_at:type_name -> google.protobuf.Timestamp
+	12, // 6: build.bazel.remote.asset.v1.FetchBlobResponse.blob_digest:type_name -> build.bazel.remote.execution.v2.Digest
+	9,  // 7: build.bazel.remote.asset.v1.FetchDirectoryRequest.timeout:type_name -> google.protobuf.Duration
+	10, // 8: build.bazel.remote.asset.v1.FetchDirectoryRequest.oldest_content_accepted:type_name -> google.protobuf.Timestamp
+	0,  // 9: build.bazel.remote.asset.v1.FetchDirectoryRequest.qualifiers:type_name -> build.bazel.remote.asset.v1.Qualifier
+	11, // 10: build.bazel.remote.asset.v1.FetchDirectoryResponse.status:type_name -> google.rpc.Status
+	0,  // 11: build.bazel.remote.asset.v1.FetchDirectoryResponse.qualifiers:type_name -> build.bazel.remote.asset.v1.Qualifier
+	10, // 12: build.bazel.remote.asset.v1.FetchDirectoryResponse.expires_at:type_name -> google.protobuf.Timestamp
+	12, // 13: build.bazel.remote.asset.v1.FetchDirectoryResponse.root_directory_digest:type_name -> build.bazel.remote.execution.v2.Digest
+	0,  // 14: build.bazel.remote.asset.v1.PushBlobRequest.qualifiers:type_name -> build.bazel.remote.asset.v1.Qualifier
+	10, // 15: build.bazel.remote.asset.v1.PushBlobRequest.expire_at:type_name -> google.protobuf.Timestamp
+	12, // 16: build.bazel.remote.asset.v1.PushBlobRequest.blob_digest:type_name -> build.bazel.remote.execution.v2.Digest
+	12, // 17: build.bazel.remote.asset.v1.PushBlobRequest.references_blobs:type_name -> build.bazel.remote.execution.v2.Digest
+	12, // 18: build.bazel.remote.asset.v1.PushBlobRequest.references_directories:type_name -> build.bazel.remote.execution.v2.Digest
+	0,  // 19: build.bazel.remote.asset.v1.PushDirectoryRequest.qualifiers:type_name -> build.bazel.remote.asset.v1.Qualifier
+	10, // 20: build.bazel.remote.asset.v1.PushDirectoryRequest.expire_at:type_name -> google.protobuf.Timestamp
+	12, // 21: build.bazel.remote.asset.v1.PushDirectoryRequest.root_directory_digest:type_name -> build.bazel.remote.execution.v2.Digest
+	12, // 22: build.bazel.remote.asset.v1.PushDirectoryRequest.references_blobs:type_name -> build.bazel.remote.execution.v2.Digest
+	12, // 23: build.bazel.remote.asset.v1.PushDirectoryRequest.references_directories:type_name -> build.bazel.remote.execution.v2.Digest
+	1,  // 24: build.bazel.remote.asset.v1.Fetch.FetchBlob:input_type -> build.bazel.remote.asset.v1.FetchBlobRequest
+	3,  // 25: build.bazel.remote.asset.v1.Fetch.FetchDirectory:input_type -> build.bazel.remote.asset.v1.FetchDirectoryRequest
+	5,  // 26: build.bazel.remote.asset.v1.Push.PushBlob:input_type -> build.bazel.remote.asset.v1.PushBlobRequest
+	7,  // 27: build.bazel.remote.asset.v1.Push.PushDirectory:input_type -> build.bazel.remote.asset.v1.PushDirectoryRequest
+	2,  // 28: build.bazel.remote.asset.v1.Fetch.FetchBlob:output_type -> build.bazel.remote.asset.v1.FetchBlobResponse
+	4,  // 29: build.bazel.remote.asset.v1.Fetch.FetchDirectory:output_type -> build.bazel.remote.asset.v1.FetchDirectoryResponse
+	6,  // 30: build.bazel.remote.asset.v1.Push.PushBlob:output_type -> build.bazel.remote.asset.v1.PushBlobResponse
+	8,  // 31: build.bazel.remote.asset.v1.Push.PushDirectory:output_type -> build.bazel.remote.asset.v1.PushDirectoryResponse
+	28, // [28:32] is the sub-list for method output_type
+	24, // [24:28] is the sub-list for method input_type
+	24, // [24:24] is the sub-list for extension type_name
+	24, // [24:24] is the sub-list for extension extendee
+	0,  // [0:24] is the sub-list for field type_name
+}
+
+func init() { file_build_bazel_remote_asset_v1_remote_asset_proto_init() }
+func file_build_bazel_remote_asset_v1_remote_asset_proto_init() {
+	if File_build_bazel_remote_asset_v1_remote_asset_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Qualifier); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*FetchBlobRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*FetchBlobResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*FetchDirectoryRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*FetchDirectoryResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*PushBlobRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*PushBlobResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*PushDirectoryRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*PushDirectoryResponse); 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_build_bazel_remote_asset_v1_remote_asset_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   9,
+			NumExtensions: 0,
+			NumServices:   2,
+		},
+		GoTypes:           file_build_bazel_remote_asset_v1_remote_asset_proto_goTypes,
+		DependencyIndexes: file_build_bazel_remote_asset_v1_remote_asset_proto_depIdxs,
+		MessageInfos:      file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes,
+	}.Build()
+	File_build_bazel_remote_asset_v1_remote_asset_proto = out.File
+	file_build_bazel_remote_asset_v1_remote_asset_proto_rawDesc = nil
+	file_build_bazel_remote_asset_v1_remote_asset_proto_goTypes = nil
+	file_build_bazel_remote_asset_v1_remote_asset_proto_depIdxs = nil
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// FetchClient is the client API for Fetch service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type FetchClient interface {
+	// Resolve or fetch referenced assets, making them available to the caller and
+	// other consumers in the [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
+	//
+	// Servers *MAY* fetch content that they do not already have cached, for any
+	// URLs they support.
+	//
+	// Servers *SHOULD* ensure that referenced files are present in the CAS at the
+	// time of the response, and (if supported) that they will remain available
+	// for a reasonable period of time. The lifetimes of the referenced blobs *SHOULD*
+	// be increased if necessary and applicable.
+	// In the event that a client receives a reference to content that is no
+	// longer present, it *MAY* re-issue the request with
+	// `oldest_content_accepted` set to a more recent timestamp than the original
+	// attempt, to induce a re-fetch from origin.
+	//
+	// Servers *MAY* cache fetched content and reuse it for subsequent requests,
+	// subject to `oldest_content_accepted`.
+	//
+	// Servers *MAY* support the complementary [Push][build.bazel.remote.asset.v1.Push]
+	// API and allow content to be directly inserted for use in future fetch
+	// responses.
+	//
+	// Servers *MUST* ensure Fetch'd content matches all the specified
+	// qualifiers except in the case of previously Push'd resources, for which
+	// the server *MAY* trust the pushing client to have set the qualifiers
+	// correctly, without validation.
+	//
+	// Servers not implementing the complementary [Push][build.bazel.remote.asset.v1.Push]
+	// API *MUST* reject requests containing qualifiers it does not support.
+	//
+	// Servers *MAY* transform assets as part of the fetch. For example a
+	// tarball fetched by [FetchDirectory][build.bazel.remote.asset.v1.Fetch.FetchDirectory]
+	// might be unpacked, or a Git repository
+	// fetched by [FetchBlob][build.bazel.remote.asset.v1.Fetch.FetchBlob]
+	// might be passed through `git-archive`.
+	//
+	// Errors handling the requested assets will be returned as gRPC Status errors
+	// here; errors outside the server's control will be returned inline in the
+	// `status` field of the response (see comment there for details).
+	// The possible RPC errors include:
+	//   - `INVALID_ARGUMENT`: One or more arguments were invalid, such as a
+	//     qualifier that is not supported by the server.
+	//   - `RESOURCE_EXHAUSTED`: There is insufficient quota of some resource to
+	//     perform the requested operation. The client may retry after a delay.
+	//   - `UNAVAILABLE`: Due to a transient condition the operation could not be
+	//     completed. The client should retry.
+	//   - `INTERNAL`: An internal error occurred while performing the operation.
+	//     The client should retry.
+	//   - `DEADLINE_EXCEEDED`: The fetch could not be completed within the given
+	//     RPC deadline. The client should retry for at least as long as the value
+	//     provided in `timeout` field of the request.
+	//
+	// In the case of unsupported qualifiers, the server *SHOULD* additionally
+	// send a [BadRequest][google.rpc.BadRequest] error detail where, for each
+	// unsupported qualifier, there is a `FieldViolation` with a `field` of
+	// `qualifiers.name` and a `description` of `"{qualifier}" not supported`
+	// indicating the name of the unsupported qualifier.
+	FetchBlob(ctx context.Context, in *FetchBlobRequest, opts ...grpc.CallOption) (*FetchBlobResponse, error)
+	FetchDirectory(ctx context.Context, in *FetchDirectoryRequest, opts ...grpc.CallOption) (*FetchDirectoryResponse, error)
+}
+
+type fetchClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewFetchClient(cc grpc.ClientConnInterface) FetchClient {
+	return &fetchClient{cc}
+}
+
+func (c *fetchClient) FetchBlob(ctx context.Context, in *FetchBlobRequest, opts ...grpc.CallOption) (*FetchBlobResponse, error) {
+	out := new(FetchBlobResponse)
+	err := c.cc.Invoke(ctx, "/build.bazel.remote.asset.v1.Fetch/FetchBlob", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *fetchClient) FetchDirectory(ctx context.Context, in *FetchDirectoryRequest, opts ...grpc.CallOption) (*FetchDirectoryResponse, error) {
+	out := new(FetchDirectoryResponse)
+	err := c.cc.Invoke(ctx, "/build.bazel.remote.asset.v1.Fetch/FetchDirectory", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// FetchServer is the server API for Fetch service.
+type FetchServer interface {
+	// Resolve or fetch referenced assets, making them available to the caller and
+	// other consumers in the [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
+	//
+	// Servers *MAY* fetch content that they do not already have cached, for any
+	// URLs they support.
+	//
+	// Servers *SHOULD* ensure that referenced files are present in the CAS at the
+	// time of the response, and (if supported) that they will remain available
+	// for a reasonable period of time. The lifetimes of the referenced blobs *SHOULD*
+	// be increased if necessary and applicable.
+	// In the event that a client receives a reference to content that is no
+	// longer present, it *MAY* re-issue the request with
+	// `oldest_content_accepted` set to a more recent timestamp than the original
+	// attempt, to induce a re-fetch from origin.
+	//
+	// Servers *MAY* cache fetched content and reuse it for subsequent requests,
+	// subject to `oldest_content_accepted`.
+	//
+	// Servers *MAY* support the complementary [Push][build.bazel.remote.asset.v1.Push]
+	// API and allow content to be directly inserted for use in future fetch
+	// responses.
+	//
+	// Servers *MUST* ensure Fetch'd content matches all the specified
+	// qualifiers except in the case of previously Push'd resources, for which
+	// the server *MAY* trust the pushing client to have set the qualifiers
+	// correctly, without validation.
+	//
+	// Servers not implementing the complementary [Push][build.bazel.remote.asset.v1.Push]
+	// API *MUST* reject requests containing qualifiers it does not support.
+	//
+	// Servers *MAY* transform assets as part of the fetch. For example a
+	// tarball fetched by [FetchDirectory][build.bazel.remote.asset.v1.Fetch.FetchDirectory]
+	// might be unpacked, or a Git repository
+	// fetched by [FetchBlob][build.bazel.remote.asset.v1.Fetch.FetchBlob]
+	// might be passed through `git-archive`.
+	//
+	// Errors handling the requested assets will be returned as gRPC Status errors
+	// here; errors outside the server's control will be returned inline in the
+	// `status` field of the response (see comment there for details).
+	// The possible RPC errors include:
+	//   - `INVALID_ARGUMENT`: One or more arguments were invalid, such as a
+	//     qualifier that is not supported by the server.
+	//   - `RESOURCE_EXHAUSTED`: There is insufficient quota of some resource to
+	//     perform the requested operation. The client may retry after a delay.
+	//   - `UNAVAILABLE`: Due to a transient condition the operation could not be
+	//     completed. The client should retry.
+	//   - `INTERNAL`: An internal error occurred while performing the operation.
+	//     The client should retry.
+	//   - `DEADLINE_EXCEEDED`: The fetch could not be completed within the given
+	//     RPC deadline. The client should retry for at least as long as the value
+	//     provided in `timeout` field of the request.
+	//
+	// In the case of unsupported qualifiers, the server *SHOULD* additionally
+	// send a [BadRequest][google.rpc.BadRequest] error detail where, for each
+	// unsupported qualifier, there is a `FieldViolation` with a `field` of
+	// `qualifiers.name` and a `description` of `"{qualifier}" not supported`
+	// indicating the name of the unsupported qualifier.
+	FetchBlob(context.Context, *FetchBlobRequest) (*FetchBlobResponse, error)
+	FetchDirectory(context.Context, *FetchDirectoryRequest) (*FetchDirectoryResponse, error)
+}
+
+// UnimplementedFetchServer can be embedded to have forward compatible implementations.
+type UnimplementedFetchServer struct {
+}
+
+func (*UnimplementedFetchServer) FetchBlob(context.Context, *FetchBlobRequest) (*FetchBlobResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method FetchBlob not implemented")
+}
+func (*UnimplementedFetchServer) FetchDirectory(context.Context, *FetchDirectoryRequest) (*FetchDirectoryResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method FetchDirectory not implemented")
+}
+
+func RegisterFetchServer(s *grpc.Server, srv FetchServer) {
+	s.RegisterService(&_Fetch_serviceDesc, srv)
+}
+
+func _Fetch_FetchBlob_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(FetchBlobRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(FetchServer).FetchBlob(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/build.bazel.remote.asset.v1.Fetch/FetchBlob",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(FetchServer).FetchBlob(ctx, req.(*FetchBlobRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _Fetch_FetchDirectory_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(FetchDirectoryRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(FetchServer).FetchDirectory(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/build.bazel.remote.asset.v1.Fetch/FetchDirectory",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(FetchServer).FetchDirectory(ctx, req.(*FetchDirectoryRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _Fetch_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "build.bazel.remote.asset.v1.Fetch",
+	HandlerType: (*FetchServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "FetchBlob",
+			Handler:    _Fetch_FetchBlob_Handler,
+		},
+		{
+			MethodName: "FetchDirectory",
+			Handler:    _Fetch_FetchDirectory_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "build/bazel/remote/asset/v1/remote_asset.proto",
+}
+
+// PushClient is the client API for Push service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type PushClient interface {
+	// These APIs associate the identifying information of a resource, as
+	// indicated by URI and optionally Qualifiers, with content available in the
+	// CAS. For example, associating a repository url and a commit id with a
+	// Directory Digest.
+	//
+	// Servers *SHOULD* only allow trusted clients to associate content, and *MAY*
+	// only allow certain URIs to be pushed.
+	//
+	// Clients *MUST* ensure associated content is available in CAS prior to
+	// pushing.
+	//
+	// Clients *MUST* ensure the Qualifiers listed correctly match the contents,
+	// and Servers *MAY* trust these values without validation.
+	// Fetch servers *MAY* require exact match of all qualifiers when returning
+	// content previously pushed, or allow fetching content with only a subset of
+	// the qualifiers specified on Push.
+	//
+	// Clients can specify expiration information that the server *SHOULD*
+	// respect. Subsequent requests can be used to alter the expiration time.
+	//
+	// A minimal compliant Fetch implementation may support only Push'd content
+	// and return `NOT_FOUND` for any resource that was not pushed first.
+	// Alternatively, a compliant implementation may choose to not support Push
+	// and only return resources that can be Fetch'd from origin.
+	//
+	// Errors will be returned as gRPC Status errors.
+	// The possible RPC errors include:
+	//   - `INVALID_ARGUMENT`: One or more arguments to the RPC were invalid.
+	//   - `RESOURCE_EXHAUSTED`: There is insufficient quota of some resource to
+	//     perform the requested operation. The client may retry after a delay.
+	//   - `UNAVAILABLE`: Due to a transient condition the operation could not be
+	//     completed. The client should retry.
+	//   - `INTERNAL`: An internal error occurred while performing the operation.
+	//     The client should retry.
+	PushBlob(ctx context.Context, in *PushBlobRequest, opts ...grpc.CallOption) (*PushBlobResponse, error)
+	PushDirectory(ctx context.Context, in *PushDirectoryRequest, opts ...grpc.CallOption) (*PushDirectoryResponse, error)
+}
+
+type pushClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewPushClient(cc grpc.ClientConnInterface) PushClient {
+	return &pushClient{cc}
+}
+
+func (c *pushClient) PushBlob(ctx context.Context, in *PushBlobRequest, opts ...grpc.CallOption) (*PushBlobResponse, error) {
+	out := new(PushBlobResponse)
+	err := c.cc.Invoke(ctx, "/build.bazel.remote.asset.v1.Push/PushBlob", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *pushClient) PushDirectory(ctx context.Context, in *PushDirectoryRequest, opts ...grpc.CallOption) (*PushDirectoryResponse, error) {
+	out := new(PushDirectoryResponse)
+	err := c.cc.Invoke(ctx, "/build.bazel.remote.asset.v1.Push/PushDirectory", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// PushServer is the server API for Push service.
+type PushServer interface {
+	// These APIs associate the identifying information of a resource, as
+	// indicated by URI and optionally Qualifiers, with content available in the
+	// CAS. For example, associating a repository url and a commit id with a
+	// Directory Digest.
+	//
+	// Servers *SHOULD* only allow trusted clients to associate content, and *MAY*
+	// only allow certain URIs to be pushed.
+	//
+	// Clients *MUST* ensure associated content is available in CAS prior to
+	// pushing.
+	//
+	// Clients *MUST* ensure the Qualifiers listed correctly match the contents,
+	// and Servers *MAY* trust these values without validation.
+	// Fetch servers *MAY* require exact match of all qualifiers when returning
+	// content previously pushed, or allow fetching content with only a subset of
+	// the qualifiers specified on Push.
+	//
+	// Clients can specify expiration information that the server *SHOULD*
+	// respect. Subsequent requests can be used to alter the expiration time.
+	//
+	// A minimal compliant Fetch implementation may support only Push'd content
+	// and return `NOT_FOUND` for any resource that was not pushed first.
+	// Alternatively, a compliant implementation may choose to not support Push
+	// and only return resources that can be Fetch'd from origin.
+	//
+	// Errors will be returned as gRPC Status errors.
+	// The possible RPC errors include:
+	//   - `INVALID_ARGUMENT`: One or more arguments to the RPC were invalid.
+	//   - `RESOURCE_EXHAUSTED`: There is insufficient quota of some resource to
+	//     perform the requested operation. The client may retry after a delay.
+	//   - `UNAVAILABLE`: Due to a transient condition the operation could not be
+	//     completed. The client should retry.
+	//   - `INTERNAL`: An internal error occurred while performing the operation.
+	//     The client should retry.
+	PushBlob(context.Context, *PushBlobRequest) (*PushBlobResponse, error)
+	PushDirectory(context.Context, *PushDirectoryRequest) (*PushDirectoryResponse, error)
+}
+
+// UnimplementedPushServer can be embedded to have forward compatible implementations.
+type UnimplementedPushServer struct {
+}
+
+func (*UnimplementedPushServer) PushBlob(context.Context, *PushBlobRequest) (*PushBlobResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method PushBlob not implemented")
+}
+func (*UnimplementedPushServer) PushDirectory(context.Context, *PushDirectoryRequest) (*PushDirectoryResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method PushDirectory not implemented")
+}
+
+func RegisterPushServer(s *grpc.Server, srv PushServer) {
+	s.RegisterService(&_Push_serviceDesc, srv)
+}
+
+func _Push_PushBlob_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(PushBlobRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(PushServer).PushBlob(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/build.bazel.remote.asset.v1.Push/PushBlob",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(PushServer).PushBlob(ctx, req.(*PushBlobRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _Push_PushDirectory_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(PushDirectoryRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(PushServer).PushDirectory(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/build.bazel.remote.asset.v1.Push/PushDirectory",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(PushServer).PushDirectory(ctx, req.(*PushDirectoryRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _Push_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "build.bazel.remote.asset.v1.Push",
+	HandlerType: (*PushServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "PushBlob",
+			Handler:    _Push_PushBlob_Handler,
+		},
+		{
+			MethodName: "PushDirectory",
+			Handler:    _Push_PushDirectory_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "build/bazel/remote/asset/v1/remote_asset.proto",
+}
diff --git a/build/bazel/remote/asset/v1/remote_asset.proto b/build/bazel/remote/asset/v1/remote_asset.proto
new file mode 100644
index 0000000..c896ec4
--- /dev/null
+++ b/build/bazel/remote/asset/v1/remote_asset.proto
@@ -0,0 +1,495 @@
+// Copyright 2020 The Bazel Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto3";
+
+package build.bazel.remote.asset.v1;
+
+import "build/bazel/remote/execution/v2/remote_execution.proto";
+import "google/api/annotations.proto";
+import "google/protobuf/duration.proto";
+import "google/protobuf/timestamp.proto";
+import "google/rpc/status.proto";
+
+option csharp_namespace = "Build.Bazel.Remote.Asset.v1";
+option go_package = "github.com/bazelbuild/remote-apis/build/bazel/remote/asset/v1;remoteasset";
+option java_multiple_files = true;
+option java_outer_classname = "RemoteAssetProto";
+option java_package = "build.bazel.remote.asset.v1";
+option objc_class_prefix = "RA";
+
+// The Remote Asset API provides a mapping from a URI and Qualifiers to
+// Digests.  
+//
+// Multiple URIs may be used to refer to the same content.  For example, the
+// same tarball may exist at multiple mirrors and thus be retrievable from
+// multiple URLs.  When URLs are used, these should refer to actual content as
+// Fetch service implementations may choose to fetch the content directly
+// from the origin.  For example, the HEAD of a git repository's active branch
+// can be referred to as:
+//
+//     uri: https://github.com/bazelbuild/remote-apis.git
+//
+// URNs may be used to strongly identify content, for instance by using the
+// uuid namespace identifier: urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6.
+// This is most applicable to named content that is Push'd, where the URN
+// serves as an agreed-upon key, but carries no other inherent meaning.
+//
+// Service implementations may choose to support only URLs, only URNs for
+// Push'd content, only other URIs for which the server and client agree upon
+// semantics of, or any mixture of the above.
+
+// Qualifiers are used to disambiguate or sub-select content that shares a URI.
+// This may include specifying a particular commit or branch, in the case of
+// URIs referencing a repository; they could also be used to specify a
+// particular subdirectory of a repository or tarball. Qualifiers may also be
+// used to ensure content matches what the client expects, even when there is
+// no ambiguity to be had - for example, a qualifier specifying a checksum
+// value.
+//
+// In cases where the semantics of the request are not immediately clear from
+// the URL and/or qualifiers - e.g. dictated by URL scheme - it is recommended
+// to use an additional qualifier to remove the ambiguity. The `resource_type`
+// qualifier is recommended for this purpose.
+//
+// Qualifiers may be supplied in any order.
+message Qualifier {
+  // The "name" of the qualifier, for example "resource_type".
+  // No separation is made between 'standard' and 'nonstandard'
+  // qualifiers, in accordance with https://tools.ietf.org/html/rfc6648,
+  // however implementers *SHOULD* take care to avoid ambiguity.
+  string name = 1;
+
+  // The "value" of the qualifier. Semantics will be dictated by the name.
+  string value = 2;
+}
+
+// The Fetch service resolves or fetches assets referenced by URI and
+// Qualifiers, returning a Digest for the content in 
+// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
+//
+// As with other services in the Remote Execution API, any call may return an
+// error with a [RetryInfo][google.rpc.RetryInfo] error detail providing
+// information about when the client should retry the request; clients SHOULD
+// respect the information provided.
+service Fetch {
+  // Resolve or fetch referenced assets, making them available to the caller and
+  // other consumers in the [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
+  //
+  // Servers *MAY* fetch content that they do not already have cached, for any
+  // URLs they support.
+  //
+  // Servers *SHOULD* ensure that referenced files are present in the CAS at the
+  // time of the response, and (if supported) that they will remain available
+  // for a reasonable period of time. The lifetimes of the referenced blobs *SHOULD*
+  // be increased if necessary and applicable.
+  // In the event that a client receives a reference to content that is no
+  // longer present, it *MAY* re-issue the request with
+  // `oldest_content_accepted` set to a more recent timestamp than the original
+  // attempt, to induce a re-fetch from origin.
+  //
+  // Servers *MAY* cache fetched content and reuse it for subsequent requests,
+  // subject to `oldest_content_accepted`.
+  //
+  // Servers *MAY* support the complementary [Push][build.bazel.remote.asset.v1.Push]
+  // API and allow content to be directly inserted for use in future fetch
+  // responses.
+  //
+  // Servers *MUST* ensure Fetch'd content matches all the specified
+  // qualifiers except in the case of previously Push'd resources, for which
+  // the server *MAY* trust the pushing client to have set the qualifiers
+  // correctly, without validation.
+  //
+  // Servers not implementing the complementary [Push][build.bazel.remote.asset.v1.Push]
+  // API *MUST* reject requests containing qualifiers it does not support.
+  //
+  // Servers *MAY* transform assets as part of the fetch. For example a
+  // tarball fetched by [FetchDirectory][build.bazel.remote.asset.v1.Fetch.FetchDirectory]
+  // might be unpacked, or a Git repository
+  // fetched by [FetchBlob][build.bazel.remote.asset.v1.Fetch.FetchBlob]
+  // might be passed through `git-archive`.
+  //
+  // Errors handling the requested assets will be returned as gRPC Status errors
+  // here; errors outside the server's control will be returned inline in the
+  // `status` field of the response (see comment there for details).
+  // The possible RPC errors include:
+  // * `INVALID_ARGUMENT`: One or more arguments were invalid, such as a
+  //   qualifier that is not supported by the server.
+  // * `RESOURCE_EXHAUSTED`: There is insufficient quota of some resource to
+  //   perform the requested operation. The client may retry after a delay.
+  // * `UNAVAILABLE`: Due to a transient condition the operation could not be
+  //   completed. The client should retry.
+  // * `INTERNAL`: An internal error occurred while performing the operation.
+  //   The client should retry.
+  // * `DEADLINE_EXCEEDED`: The fetch could not be completed within the given
+  //   RPC deadline. The client should retry for at least as long as the value
+  //   provided in `timeout` field of the request.
+  //
+  // In the case of unsupported qualifiers, the server *SHOULD* additionally
+  // send a [BadRequest][google.rpc.BadRequest] error detail where, for each
+  // unsupported qualifier, there is a `FieldViolation` with a `field` of
+  // `qualifiers.name` and a `description` of `"{qualifier}" not supported`
+  // indicating the name of the unsupported qualifier.
+  rpc FetchBlob(FetchBlobRequest) returns (FetchBlobResponse) {
+    option (google.api.http) = { post: "/v1/{instance_name=**}/assets:fetchBlob" body: "*" };
+  }
+  rpc FetchDirectory(FetchDirectoryRequest) returns (FetchDirectoryResponse) {
+    option (google.api.http) = { post: "/v1/{instance_name=**}/assets:fetchDirectory" body: "*" };
+  }
+}
+
+// A request message for
+// [Fetch.FetchBlob][build.bazel.remote.asset.v1.Fetch.FetchBlob].
+message FetchBlobRequest {
+  // The instance of the execution system to operate against. A server may
+  // support multiple instances of the execution system (with their own workers,
+  // storage, caches, etc.). The server MAY require use of this field to select
+  // between them in an implementation-defined fashion, otherwise it can be
+  // omitted.
+  string instance_name = 1;
+
+  // The timeout for the underlying fetch, if content needs to be retrieved from
+  // origin.
+  //
+  // If unset, the server *MAY* apply an implementation-defined timeout.
+  //
+  // If set, and the user-provided timeout exceeds the RPC deadline, the server
+  // *SHOULD* keep the fetch going after the RPC completes, to be made
+  // available for future Fetch calls. The server may also enforce (via clamping
+  // and/or an INVALID_ARGUMENT error) implementation-defined minimum and
+  // maximum timeout values.
+  //
+  // If this timeout is exceeded on an attempt to retrieve content from origin
+  // the client will receive DEADLINE_EXCEEDED in [FetchBlobResponse.status].
+  google.protobuf.Duration timeout = 2;
+
+  // The oldest content the client is willing to accept, as measured from the
+  // time it was Push'd or when the underlying retrieval from origin was 
+  // started.
+  // Upon retries of Fetch requests that cannot be completed within a single
+  // RPC, clients *SHOULD* provide the same value for subsequent requests as the
+  // original, to simplify combining the request with the previous attempt.
+  //
+  // If unset, the client *SHOULD* accept content of any age.
+  google.protobuf.Timestamp oldest_content_accepted = 3;
+
+  // The URI(s) of the content to fetch. These may be resources that the server
+  // can directly fetch from origin, in which case multiple URIs *SHOULD*
+  // represent the same content available at different locations (such as an
+  // origin and secondary mirrors). These may also be URIs for content known to
+  // the server through other mechanisms, e.g. pushed via the [Push][build.bazel.remote.asset.v1.Push]
+  // service.
+  //
+  // Clients *MUST* supply at least one URI. Servers *MAY* match any one of the
+  // supplied URIs.
+  repeated string uris = 4;
+
+  // Qualifiers sub-specifying the content to fetch - see comments on
+  // [Qualifier][build.bazel.remote.asset.v1.Qualifier].
+  // The same qualifiers apply to all URIs.
+  //
+  // Specified qualifier names *MUST* be unique.
+  repeated Qualifier qualifiers = 5;
+
+  // The digest function the server must use to compute the digest.
+  //
+  // If unset, the server SHOULD default to SHA256.
+  build.bazel.remote.execution.v2.DigestFunction.Value digest_function = 6;
+}
+
+// A response message for
+// [Fetch.FetchBlob][build.bazel.remote.asset.v1.Fetch.FetchBlob].
+message FetchBlobResponse {
+  // If the status has a code other than `OK`, it indicates that the operation
+  // was unable to be completed for reasons outside the servers' control.
+  // The possible fetch errors include:
+  // * `DEADLINE_EXCEEDED`: The operation could not be completed within the
+  //   specified timeout.
+  // * `NOT_FOUND`: The requested asset was not found at the specified location.
+  // * `PERMISSION_DENIED`: The request was rejected by a remote server, or
+  //   requested an asset from a disallowed origin.
+  // * `ABORTED`: The operation could not be completed, typically due to a
+  //   failed consistency check.
+  // * `RESOURCE_EXHAUSTED`: There is insufficient quota of some resource to
+  //   perform the requested operation. The client may retry after a delay.
+  google.rpc.Status status = 1;
+
+  // The uri from the request that resulted in a successful retrieval, or from
+  // which the error indicated in `status` was obtained.
+  string uri = 2;
+
+  // Any qualifiers known to the server and of interest to clients.
+  repeated Qualifier qualifiers = 3;
+
+  // A minimum timestamp the content is expected to be available through.
+  // Servers *MAY* omit this field, if not known with confidence.
+  google.protobuf.Timestamp expires_at = 4;
+
+  // The result of the fetch, if the status had code `OK`.
+  // The digest of the file's contents, available for download through the CAS.
+  build.bazel.remote.execution.v2.Digest blob_digest = 5;
+
+  // This field SHOULD be set to the digest function that was used by the server
+  // to compute [FetchBlobResponse.blob_digest].
+  // Clients could use this to determine whether the server honors
+  // [FetchBlobRequest.digest_function] that was set in the request.
+  //
+  // If unset, clients SHOULD default to use SHA256 regardless of the requested
+  // [FetchBlobRequest.digest_function].
+  build.bazel.remote.execution.v2.DigestFunction.Value digest_function = 6;
+}
+
+// A request message for
+// [Fetch.FetchDirectory][build.bazel.remote.asset.v1.Fetch.FetchDirectory].
+message FetchDirectoryRequest {
+  // The instance of the execution system to operate against. A server may
+  // support multiple instances of the execution system (with their own workers,
+  // storage, caches, etc.). The server MAY require use of this field to select
+  // between them in an implementation-defined fashion, otherwise it can be
+  // omitted.
+  string instance_name = 1;
+
+  // The timeout for the underlying fetch, if content needs to be retrieved from
+  // origin. This value is allowed to exceed the RPC deadline, in which case the
+  // server *SHOULD* keep the fetch going after the RPC completes, to be made
+  // available for future Fetch calls.
+  //
+  // If this timeout is exceeded on an attempt to retrieve content from origin
+  // the client will receive DEADLINE_EXCEEDED in [FetchDirectoryResponse.status].
+  google.protobuf.Duration timeout = 2;
+
+  // The oldest content the client is willing to accept, as measured from the
+  // time it was Push'd or when the underlying retrieval from origin was
+  // started.
+  // Upon retries of Fetch requests that cannot be completed within a single
+  // RPC, clients *SHOULD* provide the same value for subsequent requests as the
+  // original, to simplify combining the request with the previous attempt.
+  //
+  // If unset, the client *SHOULD* accept content of any age.
+  google.protobuf.Timestamp oldest_content_accepted = 3;
+
+  // The URI(s) of the content to fetch. These may be resources that the server
+  // can directly fetch from origin, in which case multiple URIs *SHOULD*
+  // represent the same content available at different locations (such as an
+  // origin and secondary mirrors). These may also be URIs for content known to
+  // the server through other mechanisms, e.g. pushed via the [Push][build.bazel.remote.asset.v1.Push]
+  // service.
+  //
+  // Clients *MUST* supply at least one URI. Servers *MAY* match any one of the
+  // supplied URIs.
+  repeated string uris = 4;
+
+  // Qualifiers sub-specifying the content to fetch - see comments on
+  // [Qualifier][build.bazel.remote.asset.v1.Qualifier].
+  // The same qualifiers apply to all URIs.
+  //
+  // Specified qualifier names *MUST* be unique.
+  repeated Qualifier qualifiers = 5;
+
+  // The digest function the server must use to compute the digest.
+  //
+  // If unset, the server SHOULD default to SHA256.
+  build.bazel.remote.execution.v2.DigestFunction.Value digest_function = 6;
+}
+
+// A response message for
+// [Fetch.FetchDirectory][build.bazel.remote.asset.v1.Fetch.FetchDirectory].
+message FetchDirectoryResponse {
+  // If the status has a code other than `OK`, it indicates that the operation
+  // was unable to be completed for reasons outside the servers' control.
+  // The possible fetch errors include:
+  // * `DEADLINE_EXCEEDED`: The operation could not be completed within the
+  //   specified timeout.
+  // * `NOT_FOUND`: The requested asset was not found at the specified location.
+  // * `PERMISSION_DENIED`: The request was rejected by a remote server, or
+  //   requested an asset from a disallowed origin.
+  // * `ABORTED`: The operation could not be completed, typically due to a
+  //   failed consistency check.
+  // * `RESOURCE_EXHAUSTED`: There is insufficient quota of some resource to
+  //   perform the requested operation. The client may retry after a delay.
+  google.rpc.Status status = 1;
+
+  // The uri from the request that resulted in a successful retrieval, or from
+  // which the error indicated in `status` was obtained.
+  string uri = 2;
+
+  // Any qualifiers known to the server and of interest to clients.
+  repeated Qualifier qualifiers = 3;
+
+  // A minimum timestamp the content is expected to be available through.
+  // Servers *MAY* omit this field, if not known with confidence.
+  google.protobuf.Timestamp expires_at = 4;
+
+  // The result of the fetch, if the status had code `OK`.
+  // the root digest of a directory tree, suitable for fetching via
+  // [ContentAddressableStorage.GetTree].
+  build.bazel.remote.execution.v2.Digest root_directory_digest = 5;
+
+  // This field SHOULD be set to the digest function that was used by the server
+  // to compute [FetchBlobResponse.root_directory_digest].
+  // Clients could use this to determine whether the server honors
+  // [FetchDirectoryRequest.digest_function] that was set in the request.
+  //
+  // If unset, clients SHOULD default to use SHA256 regardless of the requested
+  // [FetchDirectoryRequest.digest_function].
+  build.bazel.remote.execution.v2.DigestFunction.Value digest_function = 6;
+}
+
+// The Push service is complementary to the Fetch, and allows for
+// associating contents of URLs to be returned in future Fetch API calls.
+//
+// As with other services in the Remote Execution API, any call may return an
+// error with a [RetryInfo][google.rpc.RetryInfo] error detail providing
+// information about when the client should retry the request; clients SHOULD
+// respect the information provided.
+service Push {
+  // These APIs associate the identifying information of a resource, as
+  // indicated by URI and optionally Qualifiers, with content available in the
+  // CAS. For example, associating a repository url and a commit id with a
+  // Directory Digest.
+  //
+  // Servers *SHOULD* only allow trusted clients to associate content, and *MAY*
+  // only allow certain URIs to be pushed.
+  //
+  // Clients *MUST* ensure associated content is available in CAS prior to
+  // pushing.
+  //
+  // Clients *MUST* ensure the Qualifiers listed correctly match the contents,
+  // and Servers *MAY* trust these values without validation.
+  // Fetch servers *MAY* require exact match of all qualifiers when returning
+  // content previously pushed, or allow fetching content with only a subset of
+  // the qualifiers specified on Push.
+  //
+  // Clients can specify expiration information that the server *SHOULD*
+  // respect. Subsequent requests can be used to alter the expiration time.
+  //
+  // A minimal compliant Fetch implementation may support only Push'd content
+  // and return `NOT_FOUND` for any resource that was not pushed first.
+  // Alternatively, a compliant implementation may choose to not support Push
+  // and only return resources that can be Fetch'd from origin.
+  //
+  // Errors will be returned as gRPC Status errors.
+  // The possible RPC errors include:
+  // * `INVALID_ARGUMENT`: One or more arguments to the RPC were invalid.
+  // * `RESOURCE_EXHAUSTED`: There is insufficient quota of some resource to
+  //   perform the requested operation. The client may retry after a delay.
+  // * `UNAVAILABLE`: Due to a transient condition the operation could not be
+  //   completed. The client should retry.
+  // * `INTERNAL`: An internal error occurred while performing the operation.
+  //   The client should retry.
+  rpc PushBlob(PushBlobRequest) returns (PushBlobResponse) {
+    option (google.api.http) = { post: "/v1/{instance_name=**}/assets:pushBlob" body: "*" };
+  }
+
+  rpc PushDirectory(PushDirectoryRequest) returns (PushDirectoryResponse) {
+    option (google.api.http) = { post: "/v1/{instance_name=**}/assets:pushDirectory" body: "*" };
+  }
+}
+
+// A request message for
+// [Push.PushBlob][build.bazel.remote.asset.v1.Push.PushBlob].
+message PushBlobRequest {
+  // The instance of the execution system to operate against. A server may
+  // support multiple instances of the execution system (with their own workers,
+  // storage, caches, etc.). The server MAY require use of this field to select
+  // between them in an implementation-defined fashion, otherwise it can be
+  // omitted.
+  string instance_name = 1;
+
+  // The URI(s) of the content to associate. If multiple URIs are specified, the
+  // pushed content will be available to fetch by specifying any of them.
+  repeated string uris = 2;
+
+  // Qualifiers sub-specifying the content that is being pushed - see comments
+  // on [Qualifier][build.bazel.remote.asset.v1.Qualifier].
+  // The same qualifiers apply to all URIs.
+  repeated Qualifier qualifiers = 3;
+
+  // A time after which this content should stop being returned via [FetchBlob][build.bazel.remote.asset.v1.Fetch.FetchBlob].
+  // Servers *MAY* expire content early, e.g. due to storage pressure.
+  google.protobuf.Timestamp expire_at = 4;
+
+  // The blob to associate.
+  build.bazel.remote.execution.v2.Digest blob_digest = 5;
+
+  // Referenced blobs or directories that need to not expire before expiration
+  // of this association, in addition to `blob_digest` itself.
+  // These fields are hints - clients *MAY* omit them, and servers *SHOULD*
+  // respect them, at the risk of increased incidents of Fetch responses
+  // indirectly referencing unavailable blobs.
+  repeated build.bazel.remote.execution.v2.Digest references_blobs = 6;
+  repeated build.bazel.remote.execution.v2.Digest references_directories = 7;
+
+  // The digest function that was used to compute the blob digest.
+  //
+  // If the digest function used is one of MD5, MURMUR3, SHA1, SHA256,
+  // SHA384, SHA512, or VSO, the client MAY leave this field unset. In
+  // that case the server SHOULD infer the digest function using the
+  // length of the action digest hash and the digest functions announced
+  // in the server's capabilities.
+  build.bazel.remote.execution.v2.DigestFunction.Value digest_function = 8;
+}
+
+// A response message for
+// [Push.PushBlob][build.bazel.remote.asset.v1.Push.PushBlob].
+message PushBlobResponse { /* empty */ }
+
+// A request message for
+// [Push.PushDirectory][build.bazel.remote.asset.v1.Push.PushDirectory].
+message PushDirectoryRequest {
+  // The instance of the execution system to operate against. A server may
+  // support multiple instances of the execution system (with their own workers,
+  // storage, caches, etc.). The server MAY require use of this field to select
+  // between them in an implementation-defined fashion, otherwise it can be
+  // omitted.
+  string instance_name = 1;
+
+  // The URI(s) of the content to associate. If multiple URIs are specified, the
+  // pushed content will be available to fetch by specifying any of them.
+  repeated string uris = 2;
+
+  // Qualifiers sub-specifying the content that is being pushed - see comments
+  // on [Qualifier][build.bazel.remote.asset.v1.Qualifier].
+  // The same qualifiers apply to all URIs.
+  repeated Qualifier qualifiers = 3;
+
+  // A time after which this content should stop being returned via
+  // [FetchDirectory][build.bazel.remote.asset.v1.Fetch.FetchDirectory].
+  // Servers *MAY* expire content early, e.g. due to storage pressure.
+  google.protobuf.Timestamp expire_at = 4;
+
+  // Directory to associate
+  build.bazel.remote.execution.v2.Digest root_directory_digest = 5;
+
+  // Referenced blobs or directories that need to not expire before expiration
+  // of this association, in addition to `root_directory_digest` itself.
+  // These fields are hints - clients *MAY* omit them, and servers *SHOULD*
+  // respect them, at the risk of increased incidents of Fetch responses
+  // indirectly referencing unavailable blobs.
+  repeated build.bazel.remote.execution.v2.Digest references_blobs = 6;
+  repeated build.bazel.remote.execution.v2.Digest references_directories = 7;
+
+  // The digest function that was used to compute blob digests.
+  //
+  // If the digest function used is one of MD5, MURMUR3, SHA1, SHA256,
+  // SHA384, SHA512, or VSO, the client MAY leave this field unset. In
+  // that case the server SHOULD infer the digest function using the
+  // length of the action digest hash and the digest functions announced
+  // in the server's capabilities.
+  build.bazel.remote.execution.v2.DigestFunction.Value digest_function = 8;
+}
+
+// A response message for
+// [Push.PushDirectory][build.bazel.remote.asset.v1.Push.PushDirectory].
+message PushDirectoryResponse { /* empty */ }
diff --git a/build/bazel/remote/execution/v2/BUILD b/build/bazel/remote/execution/v2/BUILD
index 34a509c..e8edcf0 100644
--- a/build/bazel/remote/execution/v2/BUILD
+++ b/build/bazel/remote/execution/v2/BUILD
@@ -1,5 +1,6 @@
 package(default_visibility = ["//visibility:public"])
-load("@com_github_grpc_grpc//bazel:cc_grpc_library.bzl", "cc_grpc_library")
+
+load("@rules_proto//proto:defs.bzl", "proto_library")
 
 licenses(["notice"])
 
@@ -8,32 +9,33 @@
     srcs = ["remote_execution.proto"],
     deps = [
         "//build/bazel/semver:semver_proto",
+        "@com_google_protobuf//:any_proto",
         "@com_google_protobuf//:duration_proto",
         "@com_google_protobuf//:timestamp_proto",
-        "@googleapis//:google_api_annotations_proto",
-        "@googleapis//:google_api_http_proto",
-        "@googleapis//:google_longrunning_operations_proto",
-        "@googleapis//:google_rpc_status_proto",
+        "@com_google_protobuf//:wrappers_proto",
+        "@googleapis//google/api:annotations_proto",
+        "@googleapis//google/api:http_proto",
+        "@googleapis//google/longrunning:operations_proto",
+        "@googleapis//google/rpc:status_proto",
     ],
 )
 
-java_proto_library(
+alias(
     name = "remote_execution_java_proto",
-    deps = [":remote_execution_proto"],
+    actual = "//build/bazel/remote/execution/v2/java:remote_execution_java_proto",
 )
 
-cc_grpc_library(
+alias(
     name = "remote_execution_cc_proto",
-    srcs = ["remote_execution.proto"],
-    deps = [
-        "//build/bazel/semver:semver_cc_proto",
-        "@googleapis//:google_api_annotations_cc_proto",
-        "@googleapis//:google_api_http_cc_proto",
-        "@googleapis//:google_longrunning_operations_cc_proto",
-        "@googleapis//:google_rpc_status_cc_proto",
-    ],
-    proto_only = False,
-    well_known_protos = True,
-    use_external = False,
+    actual = "//build/bazel/remote/execution/v2/cc:remote_execution_cc_grpc",
 )
 
+alias(
+    name = "remote_execution_go_proto",
+    actual = "//build/bazel/remote/execution/v2/go:remote_execution_go_proto",
+)
+
+alias(
+    name = "go_default_library",
+    actual = "//build/bazel/remote/execution/v2/go:go_default_library",
+)
diff --git a/build/bazel/remote/execution/v2/cc/BUILD b/build/bazel/remote/execution/v2/cc/BUILD
new file mode 100644
index 0000000..541b645
--- /dev/null
+++ b/build/bazel/remote/execution/v2/cc/BUILD
@@ -0,0 +1,25 @@
+package(default_visibility = ["//build/bazel/remote/execution/v2:__pkg__"])
+
+load("//internal:cc_grpc_library.bzl", "cc_grpc_codegen")
+
+cc_proto_library(
+    name = "remote_execution_cc_proto",
+    deps = ["//build/bazel/remote/execution/v2:remote_execution_proto"],
+)
+
+cc_grpc_codegen(
+    name = "remote_execution_cc_grpc_codegen",
+    proto = "//build/bazel/remote/execution/v2:remote_execution_proto",
+)
+
+cc_library(
+    name = "remote_execution_cc_grpc",
+    srcs = [":remote_execution_cc_grpc_codegen"],
+    hdrs = [":remote_execution_cc_grpc_codegen"],
+    include_prefix = "build/bazel/remote/execution/v2",
+    strip_include_prefix = "/" + package_name(),
+    deps = [
+        ":remote_execution_cc_proto",
+        "@com_github_grpc_grpc//:grpc++_codegen_proto",
+    ],
+)
diff --git a/build/bazel/remote/execution/v2/go/BUILD b/build/bazel/remote/execution/v2/go/BUILD
new file mode 100644
index 0000000..24cc7a0
--- /dev/null
+++ b/build/bazel/remote/execution/v2/go/BUILD
@@ -0,0 +1,23 @@
+package(default_visibility = ["//build/bazel/remote/execution/v2:__pkg__"])
+
+load("@io_bazel_rules_go//go:def.bzl", "go_library")
+load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library")
+
+go_proto_library(
+    name = "remote_execution_go_proto",
+    compilers = ["@io_bazel_rules_go//proto:go_grpc"],
+    importpath = "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2",
+    proto = "//build/bazel/remote/execution/v2:remote_execution_proto",
+    deps = [
+        "//build/bazel/semver:semver_go_proto",
+        "@org_golang_google_genproto//googleapis/api/annotations",
+        "@org_golang_google_genproto//googleapis/longrunning",
+        "@org_golang_google_genproto//googleapis/rpc/status",
+    ],
+)
+
+go_library(
+    name = "go_default_library",
+    embed = [":remote_execution_go_proto"],
+    importpath = "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2",
+)
diff --git a/build/bazel/remote/execution/v2/java/BUILD b/build/bazel/remote/execution/v2/java/BUILD
new file mode 100644
index 0000000..e6bb022
--- /dev/null
+++ b/build/bazel/remote/execution/v2/java/BUILD
@@ -0,0 +1,6 @@
+package(default_visibility = ["//build/bazel/remote/execution/v2:__pkg__"])
+
+java_proto_library(
+    name = "remote_execution_java_proto",
+    deps = ["//build/bazel/remote/execution/v2:remote_execution_proto"],
+)
diff --git a/build/bazel/remote/execution/v2/platform.md b/build/bazel/remote/execution/v2/platform.md
new file mode 100644
index 0000000..56a11af
--- /dev/null
+++ b/build/bazel/remote/execution/v2/platform.md
@@ -0,0 +1,126 @@
+# Platform Lexicon
+
+This lexicon defines standard platform property names and values that servers
+MAY support in the `Platform` message to facilitate interoperability. New
+values can be added by submitting a PR against this repository, which requires
+signing the [Google CLA](https://opensource.google/documentation/reference/cla).
+If signing the Google CLA is undesirable, you may submit an issue instead.
+
+The following standard property `name`s are defined:
+
+* `OSFamily`: This describes the operating system family. Multiple values
+  are not allowed and an exact match is required.
+
+  The following standard values are defined:
+
+    - `aix`
+    - `freebsd`
+    - `linux`
+    - `macos`
+    - `sunos`
+    - `windows`
+
+  Additional values may be defined by the server. For other POSIX systems
+  the recommendation is to use the output of `uname -s` in lower case.
+
+* `ISA`: This describes the instruction set architecture including
+  instruction set extensions and versions. Multiple values are allowed. If
+  multiple values are specified, they are AND-ed together: the worker is
+  required to support all of the listed values.
+
+  The following standard instruction set architecture values are defined:
+
+    - `arm-a32` (little endian)
+    - `arm-a32-be` (big endian)
+    - `arm-a64` (little endian)
+    - `arm-a64-be` (big endian)
+    - `arm-t32` (little endian)
+    - `arm-t32-be` (big endian)
+    - `la64v100` (little endian)
+    - `power-isa-be` (big endian)
+    - `power-isa-le` (little endian)
+    - `rv32g` (little endian)
+    - `rv64g` (little endian)
+    - `sparc-v9` (big endian)
+    - `x86-32`
+    - `x86-64`
+
+  The following standard instruction set extension and version values are
+  defined:
+
+    - `arm-neon`
+    - `arm-sve`
+    - `arm-vfpv3`
+    - `arm-vfpv4`
+    - `armv6`
+    - `armv7`
+    - `armv8`
+    - `x86-avx`
+    - `x86-avx2`
+    - `x86-avx-512`
+    - `x86-sse4.1`
+    - `x86-sse4.2`
+
+  Additional values may be defined by the server. Vendor-neutral names are
+  recommended.
+
+  Clients SHOULD NOT request instruction set extensions or versions without
+  requesting an instruction set architecture.
+
+  Examples with multiple values:
+
+  ```json
+  // (Platform proto)
+  {
+    "properties": [
+      {
+        "name": "ISA",
+        "value": "x86-64"
+      },
+      {
+        "name": "ISA",
+        "value": "x86-avx2"
+      }
+    ]
+  }
+  ```
+
+  ```json
+  // (Platform proto)
+  {
+    "properties": [
+      {
+        "name": "ISA",
+        "value": "arm-a64"
+      },
+      {
+        "name": "ISA",
+        "value": "armv8"
+      },
+      {
+        "name": "ISA",
+        "value": "arm-sve"
+      }
+    ]
+  }
+  ```
+
+  ```json
+  // (Platform proto)
+  {
+    "properties": [
+      {
+        "name": "ISA",
+        "value": "arm-a32"
+      },
+      {
+        "name": "ISA",
+        "value": "armv7"
+      },
+      {
+        "name": "ISA",
+        "value": "arm-vfpv4"
+      }
+    ]
+  }
+  ```
diff --git a/build/bazel/remote/execution/v2/remote_execution.pb.go b/build/bazel/remote/execution/v2/remote_execution.pb.go
new file mode 100755
index 0000000..3dad0e1
--- /dev/null
+++ b/build/bazel/remote/execution/v2/remote_execution.pb.go
@@ -0,0 +1,7560 @@
+// Copyright 2018 The Bazel Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.31.0
+// 	protoc        v3.15.0
+// source: build/bazel/remote/execution/v2/remote_execution.proto
+
+package remoteexecution
+
+import (
+	context "context"
+	semver "github.com/bazelbuild/remote-apis/build/bazel/semver"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	longrunning "google.golang.org/genproto/googleapis/longrunning"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	anypb "google.golang.org/protobuf/types/known/anypb"
+	durationpb "google.golang.org/protobuf/types/known/durationpb"
+	timestamppb "google.golang.org/protobuf/types/known/timestamppb"
+	wrapperspb "google.golang.org/protobuf/types/known/wrapperspb"
+	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 Command_OutputDirectoryFormat int32
+
+const (
+	// The client is only interested in receiving output directories in
+	// the form of a single Tree object, using the `tree_digest` field.
+	Command_TREE_ONLY Command_OutputDirectoryFormat = 0
+	// The client is only interested in receiving output directories in
+	// the form of a hierarchy of separately stored Directory objects,
+	// using the `root_directory_digest` field.
+	Command_DIRECTORY_ONLY Command_OutputDirectoryFormat = 1
+	// The client is interested in receiving output directories both in
+	// the form of a single Tree object and a hierarchy of separately
+	// stored Directory objects, using both the `tree_digest` and
+	// `root_directory_digest` fields.
+	Command_TREE_AND_DIRECTORY Command_OutputDirectoryFormat = 2
+)
+
+// Enum value maps for Command_OutputDirectoryFormat.
+var (
+	Command_OutputDirectoryFormat_name = map[int32]string{
+		0: "TREE_ONLY",
+		1: "DIRECTORY_ONLY",
+		2: "TREE_AND_DIRECTORY",
+	}
+	Command_OutputDirectoryFormat_value = map[string]int32{
+		"TREE_ONLY":          0,
+		"DIRECTORY_ONLY":     1,
+		"TREE_AND_DIRECTORY": 2,
+	}
+)
+
+func (x Command_OutputDirectoryFormat) Enum() *Command_OutputDirectoryFormat {
+	p := new(Command_OutputDirectoryFormat)
+	*p = x
+	return p
+}
+
+func (x Command_OutputDirectoryFormat) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Command_OutputDirectoryFormat) Descriptor() protoreflect.EnumDescriptor {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_enumTypes[0].Descriptor()
+}
+
+func (Command_OutputDirectoryFormat) Type() protoreflect.EnumType {
+	return &file_build_bazel_remote_execution_v2_remote_execution_proto_enumTypes[0]
+}
+
+func (x Command_OutputDirectoryFormat) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Command_OutputDirectoryFormat.Descriptor instead.
+func (Command_OutputDirectoryFormat) EnumDescriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{1, 0}
+}
+
+type ExecutionStage_Value int32
+
+const (
+	// Invalid value.
+	ExecutionStage_UNKNOWN ExecutionStage_Value = 0
+	// Checking the result against the cache.
+	ExecutionStage_CACHE_CHECK ExecutionStage_Value = 1
+	// Currently idle, awaiting a free machine to execute.
+	ExecutionStage_QUEUED ExecutionStage_Value = 2
+	// Currently being executed by a worker.
+	ExecutionStage_EXECUTING ExecutionStage_Value = 3
+	// Finished execution.
+	ExecutionStage_COMPLETED ExecutionStage_Value = 4
+)
+
+// Enum value maps for ExecutionStage_Value.
+var (
+	ExecutionStage_Value_name = map[int32]string{
+		0: "UNKNOWN",
+		1: "CACHE_CHECK",
+		2: "QUEUED",
+		3: "EXECUTING",
+		4: "COMPLETED",
+	}
+	ExecutionStage_Value_value = map[string]int32{
+		"UNKNOWN":     0,
+		"CACHE_CHECK": 1,
+		"QUEUED":      2,
+		"EXECUTING":   3,
+		"COMPLETED":   4,
+	}
+)
+
+func (x ExecutionStage_Value) Enum() *ExecutionStage_Value {
+	p := new(ExecutionStage_Value)
+	*p = x
+	return p
+}
+
+func (x ExecutionStage_Value) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (ExecutionStage_Value) Descriptor() protoreflect.EnumDescriptor {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_enumTypes[1].Descriptor()
+}
+
+func (ExecutionStage_Value) Type() protoreflect.EnumType {
+	return &file_build_bazel_remote_execution_v2_remote_execution_proto_enumTypes[1]
+}
+
+func (x ExecutionStage_Value) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use ExecutionStage_Value.Descriptor instead.
+func (ExecutionStage_Value) EnumDescriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{21, 0}
+}
+
+type DigestFunction_Value int32
+
+const (
+	// It is an error for the server to return this value.
+	DigestFunction_UNKNOWN DigestFunction_Value = 0
+	// The SHA-256 digest function.
+	DigestFunction_SHA256 DigestFunction_Value = 1
+	// The SHA-1 digest function.
+	DigestFunction_SHA1 DigestFunction_Value = 2
+	// The MD5 digest function.
+	DigestFunction_MD5 DigestFunction_Value = 3
+	// The Microsoft "VSO-Hash" paged SHA256 digest function.
+	// See https://github.com/microsoft/BuildXL/blob/master/Documentation/Specs/PagedHash.md .
+	DigestFunction_VSO DigestFunction_Value = 4
+	// The SHA-384 digest function.
+	DigestFunction_SHA384 DigestFunction_Value = 5
+	// The SHA-512 digest function.
+	DigestFunction_SHA512 DigestFunction_Value = 6
+	// Murmur3 128-bit digest function, x64 variant. Note that this is not a
+	// cryptographic hash function and its collision properties are not strongly guaranteed.
+	// See https://github.com/aappleby/smhasher/wiki/MurmurHash3 .
+	DigestFunction_MURMUR3 DigestFunction_Value = 7
+	// The SHA-256 digest function, modified to use a Merkle tree for
+	// large objects. This permits implementations to store large blobs
+	// as a decomposed sequence of 2^j sized chunks, where j >= 10,
+	// while being able to validate integrity at the chunk level.
+	//
+	// Furthermore, on systems that do not offer dedicated instructions
+	// for computing SHA-256 hashes (e.g., the Intel SHA and ARMv8
+	// cryptographic extensions), SHA256TREE hashes can be computed more
+	// efficiently than plain SHA-256 hashes by using generic SIMD
+	// extensions, such as Intel AVX2 or ARM NEON.
+	//
+	// SHA256TREE hashes are computed as follows:
+	//
+	//   - For blobs that are 1024 bytes or smaller, the hash is computed
+	//     using the regular SHA-256 digest function.
+	//
+	//   - For blobs that are more than 1024 bytes in size, the hash is
+	//     computed as follows:
+	//
+	//     1. The blob is partitioned into a left (leading) and right
+	//     (trailing) blob. These blobs have lengths m and n
+	//     respectively, where m = 2^k and 0 < n <= m.
+	//
+	//     2. Hashes of the left and right blob, Hash(left) and
+	//     Hash(right) respectively, are computed by recursively
+	//     applying the SHA256TREE algorithm.
+	//
+	//     3. A single invocation is made to the SHA-256 block cipher with
+	//     the following parameters:
+	//
+	//     M = Hash(left) || Hash(right)
+	//     H = {
+	//     0xcbbb9d5d, 0x629a292a, 0x9159015a, 0x152fecd8,
+	//     0x67332667, 0x8eb44a87, 0xdb0c2e0d, 0x47b5481d,
+	//     }
+	//
+	//     The values of H are the leading fractional parts of the
+	//     square roots of the 9th to the 16th prime number (23 to 53).
+	//     This differs from plain SHA-256, where the first eight prime
+	//     numbers (2 to 19) are used, thereby preventing trivial hash
+	//     collisions between small and large objects.
+	//
+	//     4. The hash of the full blob can then be obtained by
+	//     concatenating the outputs of the block cipher:
+	//
+	//     Hash(blob) = a || b || c || d || e || f || g || h
+	//
+	//     Addition of the original values of H, as normally done
+	//     through the use of the Davies-Meyer structure, is not
+	//     performed. This isn't necessary, as the block cipher is only
+	//     invoked once.
+	//
+	// Test vectors of this digest function can be found in the
+	// accompanying sha256tree_test_vectors.txt file.
+	DigestFunction_SHA256TREE DigestFunction_Value = 8
+	// The BLAKE3 hash function.
+	// See https://github.com/BLAKE3-team/BLAKE3.
+	DigestFunction_BLAKE3 DigestFunction_Value = 9
+)
+
+// Enum value maps for DigestFunction_Value.
+var (
+	DigestFunction_Value_name = map[int32]string{
+		0: "UNKNOWN",
+		1: "SHA256",
+		2: "SHA1",
+		3: "MD5",
+		4: "VSO",
+		5: "SHA384",
+		6: "SHA512",
+		7: "MURMUR3",
+		8: "SHA256TREE",
+		9: "BLAKE3",
+	}
+	DigestFunction_Value_value = map[string]int32{
+		"UNKNOWN":    0,
+		"SHA256":     1,
+		"SHA1":       2,
+		"MD5":        3,
+		"VSO":        4,
+		"SHA384":     5,
+		"SHA512":     6,
+		"MURMUR3":    7,
+		"SHA256TREE": 8,
+		"BLAKE3":     9,
+	}
+)
+
+func (x DigestFunction_Value) Enum() *DigestFunction_Value {
+	p := new(DigestFunction_Value)
+	*p = x
+	return p
+}
+
+func (x DigestFunction_Value) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (DigestFunction_Value) Descriptor() protoreflect.EnumDescriptor {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_enumTypes[2].Descriptor()
+}
+
+func (DigestFunction_Value) Type() protoreflect.EnumType {
+	return &file_build_bazel_remote_execution_v2_remote_execution_proto_enumTypes[2]
+}
+
+func (x DigestFunction_Value) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use DigestFunction_Value.Descriptor instead.
+func (DigestFunction_Value) EnumDescriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{36, 0}
+}
+
+type SymlinkAbsolutePathStrategy_Value int32
+
+const (
+	// Invalid value.
+	SymlinkAbsolutePathStrategy_UNKNOWN SymlinkAbsolutePathStrategy_Value = 0
+	// Server will return an `INVALID_ARGUMENT` on input symlinks with absolute
+	// targets.
+	// If an action tries to create an output symlink with an absolute target, a
+	// `FAILED_PRECONDITION` will be returned.
+	SymlinkAbsolutePathStrategy_DISALLOWED SymlinkAbsolutePathStrategy_Value = 1
+	// Server will allow symlink targets to escape the input root tree, possibly
+	// resulting in non-hermetic builds.
+	SymlinkAbsolutePathStrategy_ALLOWED SymlinkAbsolutePathStrategy_Value = 2
+)
+
+// Enum value maps for SymlinkAbsolutePathStrategy_Value.
+var (
+	SymlinkAbsolutePathStrategy_Value_name = map[int32]string{
+		0: "UNKNOWN",
+		1: "DISALLOWED",
+		2: "ALLOWED",
+	}
+	SymlinkAbsolutePathStrategy_Value_value = map[string]int32{
+		"UNKNOWN":    0,
+		"DISALLOWED": 1,
+		"ALLOWED":    2,
+	}
+)
+
+func (x SymlinkAbsolutePathStrategy_Value) Enum() *SymlinkAbsolutePathStrategy_Value {
+	p := new(SymlinkAbsolutePathStrategy_Value)
+	*p = x
+	return p
+}
+
+func (x SymlinkAbsolutePathStrategy_Value) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (SymlinkAbsolutePathStrategy_Value) Descriptor() protoreflect.EnumDescriptor {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_enumTypes[3].Descriptor()
+}
+
+func (SymlinkAbsolutePathStrategy_Value) Type() protoreflect.EnumType {
+	return &file_build_bazel_remote_execution_v2_remote_execution_proto_enumTypes[3]
+}
+
+func (x SymlinkAbsolutePathStrategy_Value) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use SymlinkAbsolutePathStrategy_Value.Descriptor instead.
+func (SymlinkAbsolutePathStrategy_Value) EnumDescriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{39, 0}
+}
+
+type Compressor_Value int32
+
+const (
+	// No compression. Servers and clients MUST always support this, and do
+	// not need to advertise it.
+	Compressor_IDENTITY Compressor_Value = 0
+	// Zstandard compression.
+	Compressor_ZSTD Compressor_Value = 1
+	// RFC 1951 Deflate. This format is identical to what is used by ZIP
+	// files. Headers such as the one generated by gzip are not
+	// included.
+	//
+	// It is advised to use algorithms such as Zstandard instead, as
+	// those are faster and/or provide a better compression ratio.
+	Compressor_DEFLATE Compressor_Value = 2
+	// Brotli compression.
+	Compressor_BROTLI Compressor_Value = 3
+)
+
+// Enum value maps for Compressor_Value.
+var (
+	Compressor_Value_name = map[int32]string{
+		0: "IDENTITY",
+		1: "ZSTD",
+		2: "DEFLATE",
+		3: "BROTLI",
+	}
+	Compressor_Value_value = map[string]int32{
+		"IDENTITY": 0,
+		"ZSTD":     1,
+		"DEFLATE":  2,
+		"BROTLI":   3,
+	}
+)
+
+func (x Compressor_Value) Enum() *Compressor_Value {
+	p := new(Compressor_Value)
+	*p = x
+	return p
+}
+
+func (x Compressor_Value) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Compressor_Value) Descriptor() protoreflect.EnumDescriptor {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_enumTypes[4].Descriptor()
+}
+
+func (Compressor_Value) Type() protoreflect.EnumType {
+	return &file_build_bazel_remote_execution_v2_remote_execution_proto_enumTypes[4]
+}
+
+func (x Compressor_Value) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Compressor_Value.Descriptor instead.
+func (Compressor_Value) EnumDescriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{40, 0}
+}
+
+// An `Action` captures all the information about an execution which is required
+// to reproduce it.
+//
+// `Action`s are the core component of the [Execution] service. A single
+// `Action` represents a repeatable action that can be performed by the
+// execution service. `Action`s can be succinctly identified by the digest of
+// their wire format encoding and, once an `Action` has been executed, will be
+// cached in the action cache. Future requests can then use the cached result
+// rather than needing to run afresh.
+//
+// When a server completes execution of an
+// [Action][build.bazel.remote.execution.v2.Action], it MAY choose to
+// cache the [result][build.bazel.remote.execution.v2.ActionResult] in
+// the [ActionCache][build.bazel.remote.execution.v2.ActionCache] unless
+// `do_not_cache` is `true`. Clients SHOULD expect the server to do so. By
+// default, future calls to
+// [Execute][build.bazel.remote.execution.v2.Execution.Execute] the same
+// `Action` will also serve their results from the cache. Clients must take care
+// to understand the caching behaviour. Ideally, all `Action`s will be
+// reproducible so that serving a result from cache is always desirable and
+// correct.
+type Action struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The digest of the [Command][build.bazel.remote.execution.v2.Command]
+	// to run, which MUST be present in the
+	// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
+	CommandDigest *Digest `protobuf:"bytes,1,opt,name=command_digest,json=commandDigest,proto3" json:"command_digest,omitempty"`
+	// The digest of the root
+	// [Directory][build.bazel.remote.execution.v2.Directory] for the input
+	// files. The files in the directory tree are available in the correct
+	// location on the build machine before the command is executed. The root
+	// directory, as well as every subdirectory and content blob referred to, MUST
+	// be in the
+	// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
+	InputRootDigest *Digest `protobuf:"bytes,2,opt,name=input_root_digest,json=inputRootDigest,proto3" json:"input_root_digest,omitempty"`
+	// A timeout after which the execution should be killed. If the timeout is
+	// absent, then the client is specifying that the execution should continue
+	// as long as the server will let it. The server SHOULD impose a timeout if
+	// the client does not specify one, however, if the client does specify a
+	// timeout that is longer than the server's maximum timeout, the server MUST
+	// reject the request.
+	//
+	// The timeout is only intended to cover the "execution" of the specified
+	// action and not time in queue nor any overheads before or after execution
+	// such as marshalling inputs/outputs. The server SHOULD avoid including time
+	// spent the client doesn't have control over, and MAY extend or reduce the
+	// timeout to account for delays or speedups that occur during execution
+	// itself (e.g., lazily loading data from the Content Addressable Storage,
+	// live migration of virtual machines, emulation overhead).
+	//
+	// The timeout is a part of the
+	// [Action][build.bazel.remote.execution.v2.Action] message, and
+	// therefore two `Actions` with different timeouts are different, even if they
+	// are otherwise identical. This is because, if they were not, running an
+	// `Action` with a lower timeout than is required might result in a cache hit
+	// from an execution run with a longer timeout, hiding the fact that the
+	// timeout is too short. By encoding it directly in the `Action`, a lower
+	// timeout will result in a cache miss and the execution timeout will fail
+	// immediately, rather than whenever the cache entry gets evicted.
+	Timeout *durationpb.Duration `protobuf:"bytes,6,opt,name=timeout,proto3" json:"timeout,omitempty"`
+	// If true, then the `Action`'s result cannot be cached, and in-flight
+	// requests for the same `Action` may not be merged.
+	DoNotCache bool `protobuf:"varint,7,opt,name=do_not_cache,json=doNotCache,proto3" json:"do_not_cache,omitempty"`
+	// An optional additional salt value used to place this `Action` into a
+	// separate cache namespace from other instances having the same field
+	// contents. This salt typically comes from operational configuration
+	// specific to sources such as repo and service configuration,
+	// and allows disowning an entire set of ActionResults that might have been
+	// poisoned by buggy software or tool failures.
+	Salt []byte `protobuf:"bytes,9,opt,name=salt,proto3" json:"salt,omitempty"`
+	// The optional platform requirements for the execution environment. The
+	// server MAY choose to execute the action on any worker satisfying the
+	// requirements, so the client SHOULD ensure that running the action on any
+	// such worker will have the same result.  A detailed lexicon for this can be
+	// found in the accompanying platform.md.
+	// New in version 2.2: clients SHOULD set these platform properties as well
+	// as those in the [Command][build.bazel.remote.execution.v2.Command]. Servers
+	// SHOULD prefer those set here.
+	Platform *Platform `protobuf:"bytes,10,opt,name=platform,proto3" json:"platform,omitempty"`
+}
+
+func (x *Action) Reset() {
+	*x = Action{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Action) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Action) ProtoMessage() {}
+
+func (x *Action) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_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 Action.ProtoReflect.Descriptor instead.
+func (*Action) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Action) GetCommandDigest() *Digest {
+	if x != nil {
+		return x.CommandDigest
+	}
+	return nil
+}
+
+func (x *Action) GetInputRootDigest() *Digest {
+	if x != nil {
+		return x.InputRootDigest
+	}
+	return nil
+}
+
+func (x *Action) GetTimeout() *durationpb.Duration {
+	if x != nil {
+		return x.Timeout
+	}
+	return nil
+}
+
+func (x *Action) GetDoNotCache() bool {
+	if x != nil {
+		return x.DoNotCache
+	}
+	return false
+}
+
+func (x *Action) GetSalt() []byte {
+	if x != nil {
+		return x.Salt
+	}
+	return nil
+}
+
+func (x *Action) GetPlatform() *Platform {
+	if x != nil {
+		return x.Platform
+	}
+	return nil
+}
+
+// A `Command` is the actual command executed by a worker running an
+// [Action][build.bazel.remote.execution.v2.Action] and specifications of its
+// environment.
+//
+// Except as otherwise required, the environment (such as which system
+// libraries or binaries are available, and what filesystems are mounted where)
+// is defined by and specific to the implementation of the remote execution API.
+type Command struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The arguments to the command.
+	//
+	// The first argument specifies the command to run, which may be either an
+	// absolute path, a path relative to the working directory, or an unqualified
+	// path (without path separators) which will be resolved using the operating
+	// system's equivalent of the PATH environment variable. Path separators
+	// native to the operating system running on the worker SHOULD be used. If the
+	// `environment_variables` list contains an entry for the PATH environment
+	// variable, it SHOULD be respected. If not, the resolution process is
+	// implementation-defined.
+	//
+	// Changed in v2.3. v2.2 and older require that no PATH lookups are performed,
+	// and that relative paths are resolved relative to the input root. This
+	// behavior can, however, not be relied upon, as most implementations already
+	// followed the rules described above.
+	Arguments []string `protobuf:"bytes,1,rep,name=arguments,proto3" json:"arguments,omitempty"`
+	// The environment variables to set when running the program. The worker may
+	// provide its own default environment variables; these defaults can be
+	// overridden using this field. Additional variables can also be specified.
+	//
+	// In order to ensure that equivalent
+	// [Command][build.bazel.remote.execution.v2.Command]s always hash to the same
+	// value, the environment variables MUST be lexicographically sorted by name.
+	// Sorting of strings is done by code point, equivalently, by the UTF-8 bytes.
+	EnvironmentVariables []*Command_EnvironmentVariable `protobuf:"bytes,2,rep,name=environment_variables,json=environmentVariables,proto3" json:"environment_variables,omitempty"`
+	// A list of the output files that the client expects to retrieve from the
+	// action. Only the listed files, as well as directories listed in
+	// `output_directories`, will be returned to the client as output.
+	// Other files or directories that may be created during command execution
+	// are discarded.
+	//
+	// The paths are relative to the working directory of the action execution.
+	// The paths are specified using a single forward slash (`/`) as a path
+	// separator, even if the execution platform natively uses a different
+	// separator. The path MUST NOT include a trailing slash, nor a leading slash,
+	// being a relative path.
+	//
+	// In order to ensure consistent hashing of the same Action, the output paths
+	// MUST be sorted lexicographically by code point (or, equivalently, by UTF-8
+	// bytes).
+	//
+	// An output file cannot be duplicated, be a parent of another output file, or
+	// have the same path as any of the listed output directories.
+	//
+	// Directories leading up to the output files are created by the worker prior
+	// to execution, even if they are not explicitly part of the input root.
+	//
+	// DEPRECATED since v2.1: Use `output_paths` instead.
+	//
+	// Deprecated: Marked as deprecated in build/bazel/remote/execution/v2/remote_execution.proto.
+	OutputFiles []string `protobuf:"bytes,3,rep,name=output_files,json=outputFiles,proto3" json:"output_files,omitempty"`
+	// A list of the output directories that the client expects to retrieve from
+	// the action. Only the listed directories will be returned (an entire
+	// directory structure will be returned as a
+	// [Tree][build.bazel.remote.execution.v2.Tree] message digest, see
+	// [OutputDirectory][build.bazel.remote.execution.v2.OutputDirectory]), as
+	// well as files listed in `output_files`. Other files or directories that
+	// may be created during command execution are discarded.
+	//
+	// The paths are relative to the working directory of the action execution.
+	// The paths are specified using a single forward slash (`/`) as a path
+	// separator, even if the execution platform natively uses a different
+	// separator. The path MUST NOT include a trailing slash, nor a leading slash,
+	// being a relative path. The special value of empty string is allowed,
+	// although not recommended, and can be used to capture the entire working
+	// directory tree, including inputs.
+	//
+	// In order to ensure consistent hashing of the same Action, the output paths
+	// MUST be sorted lexicographically by code point (or, equivalently, by UTF-8
+	// bytes).
+	//
+	// An output directory cannot be duplicated or have the same path as any of
+	// the listed output files. An output directory is allowed to be a parent of
+	// another output directory.
+	//
+	// Directories leading up to the output directories (but not the output
+	// directories themselves) are created by the worker prior to execution, even
+	// if they are not explicitly part of the input root.
+	//
+	// DEPRECATED since 2.1: Use `output_paths` instead.
+	//
+	// Deprecated: Marked as deprecated in build/bazel/remote/execution/v2/remote_execution.proto.
+	OutputDirectories []string `protobuf:"bytes,4,rep,name=output_directories,json=outputDirectories,proto3" json:"output_directories,omitempty"`
+	// A list of the output paths that the client expects to retrieve from the
+	// action. Only the listed paths will be returned to the client as output.
+	// The type of the output (file or directory) is not specified, and will be
+	// determined by the server after action execution. If the resulting path is
+	// a file, it will be returned in an
+	// [OutputFile][build.bazel.remote.execution.v2.OutputFile] typed field.
+	// If the path is a directory, the entire directory structure will be returned
+	// as a [Tree][build.bazel.remote.execution.v2.Tree] message digest, see
+	// [OutputDirectory][build.bazel.remote.execution.v2.OutputDirectory]
+	// Other files or directories that may be created during command execution
+	// are discarded.
+	//
+	// The paths are relative to the working directory of the action execution.
+	// The paths are specified using a single forward slash (`/`) as a path
+	// separator, even if the execution platform natively uses a different
+	// separator. The path MUST NOT include a trailing slash, nor a leading slash,
+	// being a relative path.
+	//
+	// In order to ensure consistent hashing of the same Action, the output paths
+	// MUST be deduplicated and sorted lexicographically by code point (or,
+	// equivalently, by UTF-8 bytes).
+	//
+	// Directories leading up to the output paths are created by the worker prior
+	// to execution, even if they are not explicitly part of the input root.
+	//
+	// New in v2.1: this field supersedes the DEPRECATED `output_files` and
+	// `output_directories` fields. If `output_paths` is used, `output_files` and
+	// `output_directories` will be ignored!
+	OutputPaths []string `protobuf:"bytes,7,rep,name=output_paths,json=outputPaths,proto3" json:"output_paths,omitempty"`
+	// The platform requirements for the execution environment. The server MAY
+	// choose to execute the action on any worker satisfying the requirements, so
+	// the client SHOULD ensure that running the action on any such worker will
+	// have the same result.  A detailed lexicon for this can be found in the
+	// accompanying platform.md.
+	// DEPRECATED as of v2.2: platform properties are now specified directly in
+	// the action. See documentation note in the
+	// [Action][build.bazel.remote.execution.v2.Action] for migration.
+	//
+	// Deprecated: Marked as deprecated in build/bazel/remote/execution/v2/remote_execution.proto.
+	Platform *Platform `protobuf:"bytes,5,opt,name=platform,proto3" json:"platform,omitempty"`
+	// The working directory, relative to the input root, for the command to run
+	// in. It must be a directory which exists in the input tree. If it is left
+	// empty, then the action is run in the input root.
+	WorkingDirectory string `protobuf:"bytes,6,opt,name=working_directory,json=workingDirectory,proto3" json:"working_directory,omitempty"`
+	// A list of keys for node properties the client expects to retrieve for
+	// output files and directories. Keys are either names of string-based
+	// [NodeProperty][build.bazel.remote.execution.v2.NodeProperty] or
+	// names of fields in [NodeProperties][build.bazel.remote.execution.v2.NodeProperties].
+	// In order to ensure that equivalent `Action`s always hash to the same
+	// value, the node properties MUST be lexicographically sorted by name.
+	// Sorting of strings is done by code point, equivalently, by the UTF-8 bytes.
+	//
+	// The interpretation of string-based properties is server-dependent. If a
+	// property is not recognized by the server, the server will return an
+	// `INVALID_ARGUMENT`.
+	OutputNodeProperties []string `protobuf:"bytes,8,rep,name=output_node_properties,json=outputNodeProperties,proto3" json:"output_node_properties,omitempty"`
+	// The format that the worker should use to store the contents of
+	// output directories.
+	//
+	// In case this field is set to a value that is not supported by the
+	// worker, the worker SHOULD interpret this field as TREE_ONLY. The
+	// worker MAY store output directories in formats that are a superset
+	// of what was requested (e.g., interpreting DIRECTORY_ONLY as
+	// TREE_AND_DIRECTORY).
+	OutputDirectoryFormat Command_OutputDirectoryFormat `protobuf:"varint,9,opt,name=output_directory_format,json=outputDirectoryFormat,proto3,enum=build.bazel.remote.execution.v2.Command_OutputDirectoryFormat" json:"output_directory_format,omitempty"`
+}
+
+func (x *Command) Reset() {
+	*x = Command{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Command) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Command) ProtoMessage() {}
+
+func (x *Command) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Command.ProtoReflect.Descriptor instead.
+func (*Command) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *Command) GetArguments() []string {
+	if x != nil {
+		return x.Arguments
+	}
+	return nil
+}
+
+func (x *Command) GetEnvironmentVariables() []*Command_EnvironmentVariable {
+	if x != nil {
+		return x.EnvironmentVariables
+	}
+	return nil
+}
+
+// Deprecated: Marked as deprecated in build/bazel/remote/execution/v2/remote_execution.proto.
+func (x *Command) GetOutputFiles() []string {
+	if x != nil {
+		return x.OutputFiles
+	}
+	return nil
+}
+
+// Deprecated: Marked as deprecated in build/bazel/remote/execution/v2/remote_execution.proto.
+func (x *Command) GetOutputDirectories() []string {
+	if x != nil {
+		return x.OutputDirectories
+	}
+	return nil
+}
+
+func (x *Command) GetOutputPaths() []string {
+	if x != nil {
+		return x.OutputPaths
+	}
+	return nil
+}
+
+// Deprecated: Marked as deprecated in build/bazel/remote/execution/v2/remote_execution.proto.
+func (x *Command) GetPlatform() *Platform {
+	if x != nil {
+		return x.Platform
+	}
+	return nil
+}
+
+func (x *Command) GetWorkingDirectory() string {
+	if x != nil {
+		return x.WorkingDirectory
+	}
+	return ""
+}
+
+func (x *Command) GetOutputNodeProperties() []string {
+	if x != nil {
+		return x.OutputNodeProperties
+	}
+	return nil
+}
+
+func (x *Command) GetOutputDirectoryFormat() Command_OutputDirectoryFormat {
+	if x != nil {
+		return x.OutputDirectoryFormat
+	}
+	return Command_TREE_ONLY
+}
+
+// A `Platform` is a set of requirements, such as hardware, operating system, or
+// compiler toolchain, for an
+// [Action][build.bazel.remote.execution.v2.Action]'s execution
+// environment. A `Platform` is represented as a series of key-value pairs
+// representing the properties that are required of the platform.
+type Platform struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The properties that make up this platform. In order to ensure that
+	// equivalent `Platform`s always hash to the same value, the properties MUST
+	// be lexicographically sorted by name, and then by value. Sorting of strings
+	// is done by code point, equivalently, by the UTF-8 bytes.
+	Properties []*Platform_Property `protobuf:"bytes,1,rep,name=properties,proto3" json:"properties,omitempty"`
+}
+
+func (x *Platform) Reset() {
+	*x = Platform{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Platform) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Platform) ProtoMessage() {}
+
+func (x *Platform) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Platform.ProtoReflect.Descriptor instead.
+func (*Platform) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *Platform) GetProperties() []*Platform_Property {
+	if x != nil {
+		return x.Properties
+	}
+	return nil
+}
+
+// A `Directory` represents a directory node in a file tree, containing zero or
+// more children [FileNodes][build.bazel.remote.execution.v2.FileNode],
+// [DirectoryNodes][build.bazel.remote.execution.v2.DirectoryNode] and
+// [SymlinkNodes][build.bazel.remote.execution.v2.SymlinkNode].
+// Each `Node` contains its name in the directory, either the digest of its
+// content (either a file blob or a `Directory` proto) or a symlink target, as
+// well as possibly some metadata about the file or directory.
+//
+// In order to ensure that two equivalent directory trees hash to the same
+// value, the following restrictions MUST be obeyed when constructing a
+// a `Directory`:
+//
+//   - Every child in the directory must have a path of exactly one segment.
+//     Multiple levels of directory hierarchy may not be collapsed.
+//   - Each child in the directory must have a unique path segment (file name).
+//     Note that while the API itself is case-sensitive, the environment where
+//     the Action is executed may or may not be case-sensitive. That is, it is
+//     legal to call the API with a Directory that has both "Foo" and "foo" as
+//     children, but the Action may be rejected by the remote system upon
+//     execution.
+//   - The files, directories and symlinks in the directory must each be sorted
+//     in lexicographical order by path. The path strings must be sorted by code
+//     point, equivalently, by UTF-8 bytes.
+//   - The [NodeProperties][build.bazel.remote.execution.v2.NodeProperty] of files,
+//     directories, and symlinks must be sorted in lexicographical order by
+//     property name.
+//
+// A `Directory` that obeys the restrictions is said to be in canonical form.
+//
+// As an example, the following could be used for a file named `bar` and a
+// directory named `foo` with an executable file named `baz` (hashes shortened
+// for readability):
+//
+// ```json
+// // (Directory proto)
+//
+//	{
+//	  files: [
+//	    {
+//	      name: "bar",
+//	      digest: {
+//	        hash: "4a73bc9d03...",
+//	        size: 65534
+//	      },
+//	      node_properties: [
+//	        {
+//	          "name": "MTime",
+//	          "value": "2017-01-15T01:30:15.01Z"
+//	        }
+//	      ]
+//	    }
+//	  ],
+//	  directories: [
+//	    {
+//	      name: "foo",
+//	      digest: {
+//	        hash: "4cf2eda940...",
+//	        size: 43
+//	      }
+//	    }
+//	  ]
+//	}
+//
+// // (Directory proto with hash "4cf2eda940..." and size 43)
+//
+//	{
+//	  files: [
+//	    {
+//	      name: "baz",
+//	      digest: {
+//	        hash: "b2c941073e...",
+//	        size: 1294,
+//	      },
+//	      is_executable: true
+//	    }
+//	  ]
+//	}
+//
+// ```
+type Directory struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The files in the directory.
+	Files []*FileNode `protobuf:"bytes,1,rep,name=files,proto3" json:"files,omitempty"`
+	// The subdirectories in the directory.
+	Directories []*DirectoryNode `protobuf:"bytes,2,rep,name=directories,proto3" json:"directories,omitempty"`
+	// The symlinks in the directory.
+	Symlinks       []*SymlinkNode  `protobuf:"bytes,3,rep,name=symlinks,proto3" json:"symlinks,omitempty"`
+	NodeProperties *NodeProperties `protobuf:"bytes,5,opt,name=node_properties,json=nodeProperties,proto3" json:"node_properties,omitempty"`
+}
+
+func (x *Directory) Reset() {
+	*x = Directory{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Directory) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Directory) ProtoMessage() {}
+
+func (x *Directory) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Directory.ProtoReflect.Descriptor instead.
+func (*Directory) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *Directory) GetFiles() []*FileNode {
+	if x != nil {
+		return x.Files
+	}
+	return nil
+}
+
+func (x *Directory) GetDirectories() []*DirectoryNode {
+	if x != nil {
+		return x.Directories
+	}
+	return nil
+}
+
+func (x *Directory) GetSymlinks() []*SymlinkNode {
+	if x != nil {
+		return x.Symlinks
+	}
+	return nil
+}
+
+func (x *Directory) GetNodeProperties() *NodeProperties {
+	if x != nil {
+		return x.NodeProperties
+	}
+	return nil
+}
+
+// A single property for [FileNodes][build.bazel.remote.execution.v2.FileNode],
+// [DirectoryNodes][build.bazel.remote.execution.v2.DirectoryNode], and
+// [SymlinkNodes][build.bazel.remote.execution.v2.SymlinkNode]. The server is
+// responsible for specifying the property `name`s that it accepts. If
+// permitted by the server, the same `name` may occur multiple times.
+type NodeProperty struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The property name.
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	// The property value.
+	Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
+}
+
+func (x *NodeProperty) Reset() {
+	*x = NodeProperty{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *NodeProperty) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*NodeProperty) ProtoMessage() {}
+
+func (x *NodeProperty) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use NodeProperty.ProtoReflect.Descriptor instead.
+func (*NodeProperty) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *NodeProperty) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *NodeProperty) GetValue() string {
+	if x != nil {
+		return x.Value
+	}
+	return ""
+}
+
+// Node properties for [FileNodes][build.bazel.remote.execution.v2.FileNode],
+// [DirectoryNodes][build.bazel.remote.execution.v2.DirectoryNode], and
+// [SymlinkNodes][build.bazel.remote.execution.v2.SymlinkNode]. The server is
+// responsible for specifying the properties that it accepts.
+type NodeProperties struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// A list of string-based
+	// [NodeProperties][build.bazel.remote.execution.v2.NodeProperty].
+	Properties []*NodeProperty `protobuf:"bytes,1,rep,name=properties,proto3" json:"properties,omitempty"`
+	// The file's last modification timestamp.
+	Mtime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=mtime,proto3" json:"mtime,omitempty"`
+	// The UNIX file mode, e.g., 0755.
+	UnixMode *wrapperspb.UInt32Value `protobuf:"bytes,3,opt,name=unix_mode,json=unixMode,proto3" json:"unix_mode,omitempty"`
+}
+
+func (x *NodeProperties) Reset() {
+	*x = NodeProperties{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *NodeProperties) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*NodeProperties) ProtoMessage() {}
+
+func (x *NodeProperties) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use NodeProperties.ProtoReflect.Descriptor instead.
+func (*NodeProperties) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *NodeProperties) GetProperties() []*NodeProperty {
+	if x != nil {
+		return x.Properties
+	}
+	return nil
+}
+
+func (x *NodeProperties) GetMtime() *timestamppb.Timestamp {
+	if x != nil {
+		return x.Mtime
+	}
+	return nil
+}
+
+func (x *NodeProperties) GetUnixMode() *wrapperspb.UInt32Value {
+	if x != nil {
+		return x.UnixMode
+	}
+	return nil
+}
+
+// A `FileNode` represents a single file and associated metadata.
+type FileNode struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The name of the file.
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	// The digest of the file's content.
+	Digest *Digest `protobuf:"bytes,2,opt,name=digest,proto3" json:"digest,omitempty"`
+	// True if file is executable, false otherwise.
+	IsExecutable   bool            `protobuf:"varint,4,opt,name=is_executable,json=isExecutable,proto3" json:"is_executable,omitempty"`
+	NodeProperties *NodeProperties `protobuf:"bytes,6,opt,name=node_properties,json=nodeProperties,proto3" json:"node_properties,omitempty"`
+}
+
+func (x *FileNode) Reset() {
+	*x = FileNode{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *FileNode) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FileNode) ProtoMessage() {}
+
+func (x *FileNode) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use FileNode.ProtoReflect.Descriptor instead.
+func (*FileNode) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *FileNode) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *FileNode) GetDigest() *Digest {
+	if x != nil {
+		return x.Digest
+	}
+	return nil
+}
+
+func (x *FileNode) GetIsExecutable() bool {
+	if x != nil {
+		return x.IsExecutable
+	}
+	return false
+}
+
+func (x *FileNode) GetNodeProperties() *NodeProperties {
+	if x != nil {
+		return x.NodeProperties
+	}
+	return nil
+}
+
+// A `DirectoryNode` represents a child of a
+// [Directory][build.bazel.remote.execution.v2.Directory] which is itself
+// a `Directory` and its associated metadata.
+type DirectoryNode struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The name of the directory.
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	// The digest of the
+	// [Directory][build.bazel.remote.execution.v2.Directory] object
+	// represented. See [Digest][build.bazel.remote.execution.v2.Digest]
+	// for information about how to take the digest of a proto message.
+	Digest *Digest `protobuf:"bytes,2,opt,name=digest,proto3" json:"digest,omitempty"`
+}
+
+func (x *DirectoryNode) Reset() {
+	*x = DirectoryNode{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DirectoryNode) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DirectoryNode) ProtoMessage() {}
+
+func (x *DirectoryNode) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DirectoryNode.ProtoReflect.Descriptor instead.
+func (*DirectoryNode) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *DirectoryNode) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *DirectoryNode) GetDigest() *Digest {
+	if x != nil {
+		return x.Digest
+	}
+	return nil
+}
+
+// A `SymlinkNode` represents a symbolic link.
+type SymlinkNode struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The name of the symlink.
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	// The target path of the symlink. The path separator is a forward slash `/`.
+	// The target path can be relative to the parent directory of the symlink or
+	// it can be an absolute path starting with `/`. Support for absolute paths
+	// can be checked using the [Capabilities][build.bazel.remote.execution.v2.Capabilities]
+	// API. `..` components are allowed anywhere in the target path as logical
+	// canonicalization may lead to different behavior in the presence of
+	// directory symlinks (e.g. `foo/../bar` may not be the same as `bar`).
+	// To reduce potential cache misses, canonicalization is still recommended
+	// where this is possible without impacting correctness.
+	Target         string          `protobuf:"bytes,2,opt,name=target,proto3" json:"target,omitempty"`
+	NodeProperties *NodeProperties `protobuf:"bytes,4,opt,name=node_properties,json=nodeProperties,proto3" json:"node_properties,omitempty"`
+}
+
+func (x *SymlinkNode) Reset() {
+	*x = SymlinkNode{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SymlinkNode) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SymlinkNode) ProtoMessage() {}
+
+func (x *SymlinkNode) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SymlinkNode.ProtoReflect.Descriptor instead.
+func (*SymlinkNode) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *SymlinkNode) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *SymlinkNode) GetTarget() string {
+	if x != nil {
+		return x.Target
+	}
+	return ""
+}
+
+func (x *SymlinkNode) GetNodeProperties() *NodeProperties {
+	if x != nil {
+		return x.NodeProperties
+	}
+	return nil
+}
+
+// A content digest. A digest for a given blob consists of the size of the blob
+// and its hash. The hash algorithm to use is defined by the server.
+//
+// The size is considered to be an integral part of the digest and cannot be
+// separated. That is, even if the `hash` field is correctly specified but
+// `size_bytes` is not, the server MUST reject the request.
+//
+// The reason for including the size in the digest is as follows: in a great
+// many cases, the server needs to know the size of the blob it is about to work
+// with prior to starting an operation with it, such as flattening Merkle tree
+// structures or streaming it to a worker. Technically, the server could
+// implement a separate metadata store, but this results in a significantly more
+// complicated implementation as opposed to having the client specify the size
+// up-front (or storing the size along with the digest in every message where
+// digests are embedded). This does mean that the API leaks some implementation
+// details of (what we consider to be) a reasonable server implementation, but
+// we consider this to be a worthwhile tradeoff.
+//
+// When a `Digest` is used to refer to a proto message, it always refers to the
+// message in binary encoded form. To ensure consistent hashing, clients and
+// servers MUST ensure that they serialize messages according to the following
+// rules, even if there are alternate valid encodings for the same message:
+//
+// * Fields are serialized in tag order.
+// * There are no unknown fields.
+// * There are no duplicate fields.
+// * Fields are serialized according to the default semantics for their type.
+//
+// Most protocol buffer implementations will always follow these rules when
+// serializing, but care should be taken to avoid shortcuts. For instance,
+// concatenating two messages to merge them may produce duplicate fields.
+type Digest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The hash. In the case of SHA-256, it will always be a lowercase hex string
+	// exactly 64 characters long.
+	Hash string `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"`
+	// The size of the blob, in bytes.
+	SizeBytes int64 `protobuf:"varint,2,opt,name=size_bytes,json=sizeBytes,proto3" json:"size_bytes,omitempty"`
+}
+
+func (x *Digest) Reset() {
+	*x = Digest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Digest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Digest) ProtoMessage() {}
+
+func (x *Digest) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Digest.ProtoReflect.Descriptor instead.
+func (*Digest) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{9}
+}
+
+func (x *Digest) GetHash() string {
+	if x != nil {
+		return x.Hash
+	}
+	return ""
+}
+
+func (x *Digest) GetSizeBytes() int64 {
+	if x != nil {
+		return x.SizeBytes
+	}
+	return 0
+}
+
+// ExecutedActionMetadata contains details about a completed execution.
+type ExecutedActionMetadata struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The name of the worker which ran the execution.
+	Worker string `protobuf:"bytes,1,opt,name=worker,proto3" json:"worker,omitempty"`
+	// When was the action added to the queue.
+	QueuedTimestamp *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=queued_timestamp,json=queuedTimestamp,proto3" json:"queued_timestamp,omitempty"`
+	// When the worker received the action.
+	WorkerStartTimestamp *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=worker_start_timestamp,json=workerStartTimestamp,proto3" json:"worker_start_timestamp,omitempty"`
+	// When the worker completed the action, including all stages.
+	WorkerCompletedTimestamp *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=worker_completed_timestamp,json=workerCompletedTimestamp,proto3" json:"worker_completed_timestamp,omitempty"`
+	// When the worker started fetching action inputs.
+	InputFetchStartTimestamp *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=input_fetch_start_timestamp,json=inputFetchStartTimestamp,proto3" json:"input_fetch_start_timestamp,omitempty"`
+	// When the worker finished fetching action inputs.
+	InputFetchCompletedTimestamp *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=input_fetch_completed_timestamp,json=inputFetchCompletedTimestamp,proto3" json:"input_fetch_completed_timestamp,omitempty"`
+	// When the worker started executing the action command.
+	ExecutionStartTimestamp *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=execution_start_timestamp,json=executionStartTimestamp,proto3" json:"execution_start_timestamp,omitempty"`
+	// When the worker completed executing the action command.
+	ExecutionCompletedTimestamp *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=execution_completed_timestamp,json=executionCompletedTimestamp,proto3" json:"execution_completed_timestamp,omitempty"`
+	// New in v2.3: the amount of time the worker spent executing the action
+	// command, potentially computed using a worker-specific virtual clock.
+	//
+	// The virtual execution duration is only intended to cover the "execution" of
+	// the specified action and not time in queue nor any overheads before or
+	// after execution such as marshalling inputs/outputs. The server SHOULD avoid
+	// including time spent the client doesn't have control over, and MAY extend
+	// or reduce the execution duration to account for delays or speedups that
+	// occur during execution itself (e.g., lazily loading data from the Content
+	// Addressable Storage, live migration of virtual machines, emulation
+	// overhead).
+	//
+	// The method of timekeeping used to compute the virtual execution duration
+	// MUST be consistent with what is used to enforce the
+	// [Action][[build.bazel.remote.execution.v2.Action]'s `timeout`. There is no
+	// relationship between the virtual execution duration and the values of
+	// `execution_start_timestamp` and `execution_completed_timestamp`.
+	VirtualExecutionDuration *durationpb.Duration `protobuf:"bytes,12,opt,name=virtual_execution_duration,json=virtualExecutionDuration,proto3" json:"virtual_execution_duration,omitempty"`
+	// When the worker started uploading action outputs.
+	OutputUploadStartTimestamp *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=output_upload_start_timestamp,json=outputUploadStartTimestamp,proto3" json:"output_upload_start_timestamp,omitempty"`
+	// When the worker finished uploading action outputs.
+	OutputUploadCompletedTimestamp *timestamppb.Timestamp `protobuf:"bytes,10,opt,name=output_upload_completed_timestamp,json=outputUploadCompletedTimestamp,proto3" json:"output_upload_completed_timestamp,omitempty"`
+	// Details that are specific to the kind of worker used. For example,
+	// on POSIX-like systems this could contain a message with
+	// getrusage(2) statistics.
+	AuxiliaryMetadata []*anypb.Any `protobuf:"bytes,11,rep,name=auxiliary_metadata,json=auxiliaryMetadata,proto3" json:"auxiliary_metadata,omitempty"`
+}
+
+func (x *ExecutedActionMetadata) Reset() {
+	*x = ExecutedActionMetadata{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[10]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ExecutedActionMetadata) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ExecutedActionMetadata) ProtoMessage() {}
+
+func (x *ExecutedActionMetadata) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[10]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ExecutedActionMetadata.ProtoReflect.Descriptor instead.
+func (*ExecutedActionMetadata) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *ExecutedActionMetadata) GetWorker() string {
+	if x != nil {
+		return x.Worker
+	}
+	return ""
+}
+
+func (x *ExecutedActionMetadata) GetQueuedTimestamp() *timestamppb.Timestamp {
+	if x != nil {
+		return x.QueuedTimestamp
+	}
+	return nil
+}
+
+func (x *ExecutedActionMetadata) GetWorkerStartTimestamp() *timestamppb.Timestamp {
+	if x != nil {
+		return x.WorkerStartTimestamp
+	}
+	return nil
+}
+
+func (x *ExecutedActionMetadata) GetWorkerCompletedTimestamp() *timestamppb.Timestamp {
+	if x != nil {
+		return x.WorkerCompletedTimestamp
+	}
+	return nil
+}
+
+func (x *ExecutedActionMetadata) GetInputFetchStartTimestamp() *timestamppb.Timestamp {
+	if x != nil {
+		return x.InputFetchStartTimestamp
+	}
+	return nil
+}
+
+func (x *ExecutedActionMetadata) GetInputFetchCompletedTimestamp() *timestamppb.Timestamp {
+	if x != nil {
+		return x.InputFetchCompletedTimestamp
+	}
+	return nil
+}
+
+func (x *ExecutedActionMetadata) GetExecutionStartTimestamp() *timestamppb.Timestamp {
+	if x != nil {
+		return x.ExecutionStartTimestamp
+	}
+	return nil
+}
+
+func (x *ExecutedActionMetadata) GetExecutionCompletedTimestamp() *timestamppb.Timestamp {
+	if x != nil {
+		return x.ExecutionCompletedTimestamp
+	}
+	return nil
+}
+
+func (x *ExecutedActionMetadata) GetVirtualExecutionDuration() *durationpb.Duration {
+	if x != nil {
+		return x.VirtualExecutionDuration
+	}
+	return nil
+}
+
+func (x *ExecutedActionMetadata) GetOutputUploadStartTimestamp() *timestamppb.Timestamp {
+	if x != nil {
+		return x.OutputUploadStartTimestamp
+	}
+	return nil
+}
+
+func (x *ExecutedActionMetadata) GetOutputUploadCompletedTimestamp() *timestamppb.Timestamp {
+	if x != nil {
+		return x.OutputUploadCompletedTimestamp
+	}
+	return nil
+}
+
+func (x *ExecutedActionMetadata) GetAuxiliaryMetadata() []*anypb.Any {
+	if x != nil {
+		return x.AuxiliaryMetadata
+	}
+	return nil
+}
+
+// An ActionResult represents the result of an
+// [Action][build.bazel.remote.execution.v2.Action] being run.
+//
+// It is advised that at least one field (for example
+// `ActionResult.execution_metadata.Worker`) have a non-default value, to
+// ensure that the serialized value is non-empty, which can then be used
+// as a basic data sanity check.
+type ActionResult struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The output files of the action. For each output file requested in the
+	// `output_files` or `output_paths` field of the Action, if the corresponding
+	// file existed after the action completed, a single entry will be present
+	// either in this field, or the `output_file_symlinks` field if the file was
+	// a symbolic link to another file (`output_symlinks` field after v2.1).
+	//
+	// If an output listed in `output_files` was found, but was a directory rather
+	// than a regular file, the server will return a FAILED_PRECONDITION.
+	// If the action does not produce the requested output, then that output
+	// will be omitted from the list. The server is free to arrange the output
+	// list as desired; clients MUST NOT assume that the output list is sorted.
+	OutputFiles []*OutputFile `protobuf:"bytes,2,rep,name=output_files,json=outputFiles,proto3" json:"output_files,omitempty"`
+	// The output files of the action that are symbolic links to other files. Those
+	// may be links to other output files, or input files, or even absolute paths
+	// outside of the working directory, if the server supports
+	// [SymlinkAbsolutePathStrategy.ALLOWED][build.bazel.remote.execution.v2.CacheCapabilities.SymlinkAbsolutePathStrategy].
+	// For each output file requested in the `output_files` or `output_paths`
+	// field of the Action, if the corresponding file existed after
+	// the action completed, a single entry will be present either in this field,
+	// or in the `output_files` field, if the file was not a symbolic link.
+	//
+	// If an output symbolic link of the same name as listed in `output_files` of
+	// the Command was found, but its target type was not a regular file, the
+	// server will return a FAILED_PRECONDITION.
+	// If the action does not produce the requested output, then that output
+	// will be omitted from the list. The server is free to arrange the output
+	// list as desired; clients MUST NOT assume that the output list is sorted.
+	//
+	// DEPRECATED as of v2.1. Servers that wish to be compatible with v2.0 API
+	// should still populate this field in addition to `output_symlinks`.
+	//
+	// Deprecated: Marked as deprecated in build/bazel/remote/execution/v2/remote_execution.proto.
+	OutputFileSymlinks []*OutputSymlink `protobuf:"bytes,10,rep,name=output_file_symlinks,json=outputFileSymlinks,proto3" json:"output_file_symlinks,omitempty"`
+	// New in v2.1: this field will only be populated if the command
+	// `output_paths` field was used, and not the pre v2.1 `output_files` or
+	// `output_directories` fields.
+	// The output paths of the action that are symbolic links to other paths. Those
+	// may be links to other outputs, or inputs, or even absolute paths
+	// outside of the working directory, if the server supports
+	// [SymlinkAbsolutePathStrategy.ALLOWED][build.bazel.remote.execution.v2.CacheCapabilities.SymlinkAbsolutePathStrategy].
+	// A single entry for each output requested in `output_paths`
+	// field of the Action, if the corresponding path existed after
+	// the action completed and was a symbolic link.
+	//
+	// If the action does not produce a requested output, then that output
+	// will be omitted from the list. The server is free to arrange the output
+	// list as desired; clients MUST NOT assume that the output list is sorted.
+	OutputSymlinks []*OutputSymlink `protobuf:"bytes,12,rep,name=output_symlinks,json=outputSymlinks,proto3" json:"output_symlinks,omitempty"`
+	// The output directories of the action. For each output directory requested
+	// in the `output_directories` or `output_paths` field of the Action, if the
+	// corresponding directory existed after the action completed, a single entry
+	// will be present in the output list, which will contain the digest of a
+	// [Tree][build.bazel.remote.execution.v2.Tree] message containing the
+	// directory tree, and the path equal exactly to the corresponding Action
+	// output_directories member.
+	//
+	// As an example, suppose the Action had an output directory `a/b/dir` and the
+	// execution produced the following contents in `a/b/dir`: a file named `bar`
+	// and a directory named `foo` with an executable file named `baz`. Then,
+	// output_directory will contain (hashes shortened for readability):
+	//
+	// ```json
+	// // OutputDirectory proto:
+	//
+	//	{
+	//	  path: "a/b/dir"
+	//	  tree_digest: {
+	//	    hash: "4a73bc9d03...",
+	//	    size: 55
+	//	  }
+	//	}
+	//
+	// // Tree proto with hash "4a73bc9d03..." and size 55:
+	//
+	//	{
+	//	  root: {
+	//	    files: [
+	//	      {
+	//	        name: "bar",
+	//	        digest: {
+	//	          hash: "4a73bc9d03...",
+	//	          size: 65534
+	//	        }
+	//	      }
+	//	    ],
+	//	    directories: [
+	//	      {
+	//	        name: "foo",
+	//	        digest: {
+	//	          hash: "4cf2eda940...",
+	//	          size: 43
+	//	        }
+	//	      }
+	//	    ]
+	//	  }
+	//	  children : {
+	//	    // (Directory proto with hash "4cf2eda940..." and size 43)
+	//	    files: [
+	//	      {
+	//	        name: "baz",
+	//	        digest: {
+	//	          hash: "b2c941073e...",
+	//	          size: 1294,
+	//	        },
+	//	        is_executable: true
+	//	      }
+	//	    ]
+	//	  }
+	//	}
+	//
+	// ```
+	// If an output of the same name as listed in `output_files` of
+	// the Command was found in `output_directories`, but was not a directory, the
+	// server will return a FAILED_PRECONDITION.
+	OutputDirectories []*OutputDirectory `protobuf:"bytes,3,rep,name=output_directories,json=outputDirectories,proto3" json:"output_directories,omitempty"`
+	// The output directories of the action that are symbolic links to other
+	// directories. Those may be links to other output directories, or input
+	// directories, or even absolute paths outside of the working directory,
+	// if the server supports
+	// [SymlinkAbsolutePathStrategy.ALLOWED][build.bazel.remote.execution.v2.CacheCapabilities.SymlinkAbsolutePathStrategy].
+	// For each output directory requested in the `output_directories` field of
+	// the Action, if the directory existed after the action completed, a
+	// single entry will be present either in this field, or in the
+	// `output_directories` field, if the directory was not a symbolic link.
+	//
+	// If an output of the same name was found, but was a symbolic link to a file
+	// instead of a directory, the server will return a FAILED_PRECONDITION.
+	// If the action does not produce the requested output, then that output
+	// will be omitted from the list. The server is free to arrange the output
+	// list as desired; clients MUST NOT assume that the output list is sorted.
+	//
+	// DEPRECATED as of v2.1. Servers that wish to be compatible with v2.0 API
+	// should still populate this field in addition to `output_symlinks`.
+	//
+	// Deprecated: Marked as deprecated in build/bazel/remote/execution/v2/remote_execution.proto.
+	OutputDirectorySymlinks []*OutputSymlink `protobuf:"bytes,11,rep,name=output_directory_symlinks,json=outputDirectorySymlinks,proto3" json:"output_directory_symlinks,omitempty"`
+	// The exit code of the command.
+	ExitCode int32 `protobuf:"varint,4,opt,name=exit_code,json=exitCode,proto3" json:"exit_code,omitempty"`
+	// The standard output buffer of the action. The server SHOULD NOT inline
+	// stdout unless requested by the client in the
+	// [GetActionResultRequest][build.bazel.remote.execution.v2.GetActionResultRequest]
+	// message. The server MAY omit inlining, even if requested, and MUST do so if inlining
+	// would cause the response to exceed message size limits.
+	// Clients SHOULD NOT populate this field when uploading to the cache.
+	StdoutRaw []byte `protobuf:"bytes,5,opt,name=stdout_raw,json=stdoutRaw,proto3" json:"stdout_raw,omitempty"`
+	// The digest for a blob containing the standard output of the action, which
+	// can be retrieved from the
+	// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
+	StdoutDigest *Digest `protobuf:"bytes,6,opt,name=stdout_digest,json=stdoutDigest,proto3" json:"stdout_digest,omitempty"`
+	// The standard error buffer of the action. The server SHOULD NOT inline
+	// stderr unless requested by the client in the
+	// [GetActionResultRequest][build.bazel.remote.execution.v2.GetActionResultRequest]
+	// message. The server MAY omit inlining, even if requested, and MUST do so if inlining
+	// would cause the response to exceed message size limits.
+	// Clients SHOULD NOT populate this field when uploading to the cache.
+	StderrRaw []byte `protobuf:"bytes,7,opt,name=stderr_raw,json=stderrRaw,proto3" json:"stderr_raw,omitempty"`
+	// The digest for a blob containing the standard error of the action, which
+	// can be retrieved from the
+	// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
+	StderrDigest *Digest `protobuf:"bytes,8,opt,name=stderr_digest,json=stderrDigest,proto3" json:"stderr_digest,omitempty"`
+	// The details of the execution that originally produced this result.
+	ExecutionMetadata *ExecutedActionMetadata `protobuf:"bytes,9,opt,name=execution_metadata,json=executionMetadata,proto3" json:"execution_metadata,omitempty"`
+}
+
+func (x *ActionResult) Reset() {
+	*x = ActionResult{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[11]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ActionResult) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ActionResult) ProtoMessage() {}
+
+func (x *ActionResult) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[11]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ActionResult.ProtoReflect.Descriptor instead.
+func (*ActionResult) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{11}
+}
+
+func (x *ActionResult) GetOutputFiles() []*OutputFile {
+	if x != nil {
+		return x.OutputFiles
+	}
+	return nil
+}
+
+// Deprecated: Marked as deprecated in build/bazel/remote/execution/v2/remote_execution.proto.
+func (x *ActionResult) GetOutputFileSymlinks() []*OutputSymlink {
+	if x != nil {
+		return x.OutputFileSymlinks
+	}
+	return nil
+}
+
+func (x *ActionResult) GetOutputSymlinks() []*OutputSymlink {
+	if x != nil {
+		return x.OutputSymlinks
+	}
+	return nil
+}
+
+func (x *ActionResult) GetOutputDirectories() []*OutputDirectory {
+	if x != nil {
+		return x.OutputDirectories
+	}
+	return nil
+}
+
+// Deprecated: Marked as deprecated in build/bazel/remote/execution/v2/remote_execution.proto.
+func (x *ActionResult) GetOutputDirectorySymlinks() []*OutputSymlink {
+	if x != nil {
+		return x.OutputDirectorySymlinks
+	}
+	return nil
+}
+
+func (x *ActionResult) GetExitCode() int32 {
+	if x != nil {
+		return x.ExitCode
+	}
+	return 0
+}
+
+func (x *ActionResult) GetStdoutRaw() []byte {
+	if x != nil {
+		return x.StdoutRaw
+	}
+	return nil
+}
+
+func (x *ActionResult) GetStdoutDigest() *Digest {
+	if x != nil {
+		return x.StdoutDigest
+	}
+	return nil
+}
+
+func (x *ActionResult) GetStderrRaw() []byte {
+	if x != nil {
+		return x.StderrRaw
+	}
+	return nil
+}
+
+func (x *ActionResult) GetStderrDigest() *Digest {
+	if x != nil {
+		return x.StderrDigest
+	}
+	return nil
+}
+
+func (x *ActionResult) GetExecutionMetadata() *ExecutedActionMetadata {
+	if x != nil {
+		return x.ExecutionMetadata
+	}
+	return nil
+}
+
+// An `OutputFile` is similar to a
+// [FileNode][build.bazel.remote.execution.v2.FileNode], but it is used as an
+// output in an `ActionResult`. It allows a full file path rather than
+// only a name.
+type OutputFile struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The full path of the file relative to the working directory, including the
+	// filename. The path separator is a forward slash `/`. Since this is a
+	// relative path, it MUST NOT begin with a leading forward slash.
+	Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
+	// The digest of the file's content.
+	Digest *Digest `protobuf:"bytes,2,opt,name=digest,proto3" json:"digest,omitempty"`
+	// True if file is executable, false otherwise.
+	IsExecutable bool `protobuf:"varint,4,opt,name=is_executable,json=isExecutable,proto3" json:"is_executable,omitempty"`
+	// The contents of the file if inlining was requested. The server SHOULD NOT inline
+	// file contents unless requested by the client in the
+	// [GetActionResultRequest][build.bazel.remote.execution.v2.GetActionResultRequest]
+	// message. The server MAY omit inlining, even if requested, and MUST do so if inlining
+	// would cause the response to exceed message size limits.
+	// Clients SHOULD NOT populate this field when uploading to the cache.
+	Contents       []byte          `protobuf:"bytes,5,opt,name=contents,proto3" json:"contents,omitempty"`
+	NodeProperties *NodeProperties `protobuf:"bytes,7,opt,name=node_properties,json=nodeProperties,proto3" json:"node_properties,omitempty"`
+}
+
+func (x *OutputFile) Reset() {
+	*x = OutputFile{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[12]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *OutputFile) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OutputFile) ProtoMessage() {}
+
+func (x *OutputFile) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[12]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OutputFile.ProtoReflect.Descriptor instead.
+func (*OutputFile) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{12}
+}
+
+func (x *OutputFile) GetPath() string {
+	if x != nil {
+		return x.Path
+	}
+	return ""
+}
+
+func (x *OutputFile) GetDigest() *Digest {
+	if x != nil {
+		return x.Digest
+	}
+	return nil
+}
+
+func (x *OutputFile) GetIsExecutable() bool {
+	if x != nil {
+		return x.IsExecutable
+	}
+	return false
+}
+
+func (x *OutputFile) GetContents() []byte {
+	if x != nil {
+		return x.Contents
+	}
+	return nil
+}
+
+func (x *OutputFile) GetNodeProperties() *NodeProperties {
+	if x != nil {
+		return x.NodeProperties
+	}
+	return nil
+}
+
+// A `Tree` contains all the
+// [Directory][build.bazel.remote.execution.v2.Directory] protos in a
+// single directory Merkle tree, compressed into one message.
+type Tree struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The root directory in the tree.
+	Root *Directory `protobuf:"bytes,1,opt,name=root,proto3" json:"root,omitempty"`
+	// All the child directories: the directories referred to by the root and,
+	// recursively, all its children. In order to reconstruct the directory tree,
+	// the client must take the digests of each of the child directories and then
+	// build up a tree starting from the `root`.
+	// Servers SHOULD ensure that these are ordered consistently such that two
+	// actions producing equivalent output directories on the same server
+	// implementation also produce Tree messages with matching digests.
+	Children []*Directory `protobuf:"bytes,2,rep,name=children,proto3" json:"children,omitempty"`
+}
+
+func (x *Tree) Reset() {
+	*x = Tree{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[13]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Tree) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Tree) ProtoMessage() {}
+
+func (x *Tree) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[13]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Tree.ProtoReflect.Descriptor instead.
+func (*Tree) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{13}
+}
+
+func (x *Tree) GetRoot() *Directory {
+	if x != nil {
+		return x.Root
+	}
+	return nil
+}
+
+func (x *Tree) GetChildren() []*Directory {
+	if x != nil {
+		return x.Children
+	}
+	return nil
+}
+
+// An `OutputDirectory` is the output in an `ActionResult` corresponding to a
+// directory's full contents rather than a single file.
+type OutputDirectory struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The full path of the directory relative to the working directory. The path
+	// separator is a forward slash `/`. Since this is a relative path, it MUST
+	// NOT begin with a leading forward slash. The empty string value is allowed,
+	// and it denotes the entire working directory.
+	Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
+	// The digest of the encoded
+	// [Tree][build.bazel.remote.execution.v2.Tree] proto containing the
+	// directory's contents.
+	TreeDigest *Digest `protobuf:"bytes,3,opt,name=tree_digest,json=treeDigest,proto3" json:"tree_digest,omitempty"`
+	// If set, consumers MAY make the following assumptions about the
+	// directories contained in the the Tree, so that it may be
+	// instantiated on a local file system by scanning through it
+	// sequentially:
+	//
+	//   - All directories with the same binary representation are stored
+	//     exactly once.
+	//   - All directories, apart from the root directory, are referenced by
+	//     at least one parent directory.
+	//   - Directories are stored in topological order, with parents being
+	//     stored before the child. The root directory is thus the first to
+	//     be stored.
+	//
+	// Additionally, the Tree MUST be encoded as a stream of records,
+	// where each record has the following format:
+	//
+	// - A tag byte, having one of the following two values:
+	//   - (1 << 3) | 2 == 0x0a: First record (the root directory).
+	//   - (2 << 3) | 2 == 0x12: Any subsequent records (child directories).
+	//   - The size of the directory, encoded as a base 128 varint.
+	//   - The contents of the directory, encoded as a binary serialized
+	//     Protobuf message.
+	//
+	// This encoding is a subset of the Protobuf wire format of the Tree
+	// message. As it is only permitted to store data associated with
+	// field numbers 1 and 2, the tag MUST be encoded as a single byte.
+	// More details on the Protobuf wire format can be found here:
+	// https://developers.google.com/protocol-buffers/docs/encoding
+	//
+	// It is recommended that implementations using this feature construct
+	// Tree objects manually using the specification given above, as
+	// opposed to using a Protobuf library to marshal a full Tree message.
+	// As individual Directory messages already need to be marshaled to
+	// compute their digests, constructing the Tree object manually avoids
+	// redundant marshaling.
+	IsTopologicallySorted bool `protobuf:"varint,4,opt,name=is_topologically_sorted,json=isTopologicallySorted,proto3" json:"is_topologically_sorted,omitempty"`
+	// The digest of the encoded
+	// [Directory][build.bazel.remote.execution.v2.Directory] proto
+	// containing the contents the directory's root.
+	//
+	// If both `tree_digest` and `root_directory_digest` are set, this
+	// field MUST match the digest of the root directory contained in the
+	// Tree message.
+	RootDirectoryDigest *Digest `protobuf:"bytes,5,opt,name=root_directory_digest,json=rootDirectoryDigest,proto3" json:"root_directory_digest,omitempty"`
+}
+
+func (x *OutputDirectory) Reset() {
+	*x = OutputDirectory{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[14]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *OutputDirectory) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OutputDirectory) ProtoMessage() {}
+
+func (x *OutputDirectory) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[14]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OutputDirectory.ProtoReflect.Descriptor instead.
+func (*OutputDirectory) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *OutputDirectory) GetPath() string {
+	if x != nil {
+		return x.Path
+	}
+	return ""
+}
+
+func (x *OutputDirectory) GetTreeDigest() *Digest {
+	if x != nil {
+		return x.TreeDigest
+	}
+	return nil
+}
+
+func (x *OutputDirectory) GetIsTopologicallySorted() bool {
+	if x != nil {
+		return x.IsTopologicallySorted
+	}
+	return false
+}
+
+func (x *OutputDirectory) GetRootDirectoryDigest() *Digest {
+	if x != nil {
+		return x.RootDirectoryDigest
+	}
+	return nil
+}
+
+// An `OutputSymlink` is similar to a
+// [Symlink][build.bazel.remote.execution.v2.SymlinkNode], but it is used as an
+// output in an `ActionResult`.
+//
+// `OutputSymlink` is binary-compatible with `SymlinkNode`.
+type OutputSymlink struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The full path of the symlink relative to the working directory, including the
+	// filename. The path separator is a forward slash `/`. Since this is a
+	// relative path, it MUST NOT begin with a leading forward slash.
+	Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
+	// The target path of the symlink. The path separator is a forward slash `/`.
+	// The target path can be relative to the parent directory of the symlink or
+	// it can be an absolute path starting with `/`. Support for absolute paths
+	// can be checked using the [Capabilities][build.bazel.remote.execution.v2.Capabilities]
+	// API. `..` components are allowed anywhere in the target path.
+	Target         string          `protobuf:"bytes,2,opt,name=target,proto3" json:"target,omitempty"`
+	NodeProperties *NodeProperties `protobuf:"bytes,4,opt,name=node_properties,json=nodeProperties,proto3" json:"node_properties,omitempty"`
+}
+
+func (x *OutputSymlink) Reset() {
+	*x = OutputSymlink{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[15]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *OutputSymlink) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OutputSymlink) ProtoMessage() {}
+
+func (x *OutputSymlink) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[15]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OutputSymlink.ProtoReflect.Descriptor instead.
+func (*OutputSymlink) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{15}
+}
+
+func (x *OutputSymlink) GetPath() string {
+	if x != nil {
+		return x.Path
+	}
+	return ""
+}
+
+func (x *OutputSymlink) GetTarget() string {
+	if x != nil {
+		return x.Target
+	}
+	return ""
+}
+
+func (x *OutputSymlink) GetNodeProperties() *NodeProperties {
+	if x != nil {
+		return x.NodeProperties
+	}
+	return nil
+}
+
+// An `ExecutionPolicy` can be used to control the scheduling of the action.
+type ExecutionPolicy struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The priority (relative importance) of this action. Generally, a lower value
+	// means that the action should be run sooner than actions having a greater
+	// priority value, but the interpretation of a given value is server-
+	// dependent. A priority of 0 means the *default* priority. Priorities may be
+	// positive or negative, and such actions should run later or sooner than
+	// actions having the default priority, respectively. The particular semantics
+	// of this field is up to the server. In particular, every server will have
+	// their own supported range of priorities, and will decide how these map into
+	// scheduling policy.
+	Priority int32 `protobuf:"varint,1,opt,name=priority,proto3" json:"priority,omitempty"`
+}
+
+func (x *ExecutionPolicy) Reset() {
+	*x = ExecutionPolicy{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[16]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ExecutionPolicy) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ExecutionPolicy) ProtoMessage() {}
+
+func (x *ExecutionPolicy) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[16]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ExecutionPolicy.ProtoReflect.Descriptor instead.
+func (*ExecutionPolicy) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{16}
+}
+
+func (x *ExecutionPolicy) GetPriority() int32 {
+	if x != nil {
+		return x.Priority
+	}
+	return 0
+}
+
+// A `ResultsCachePolicy` is used for fine-grained control over how action
+// outputs are stored in the CAS and Action Cache.
+type ResultsCachePolicy struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The priority (relative importance) of this content in the overall cache.
+	// Generally, a lower value means a longer retention time or other advantage,
+	// but the interpretation of a given value is server-dependent. A priority of
+	// 0 means a *default* value, decided by the server.
+	//
+	// The particular semantics of this field is up to the server. In particular,
+	// every server will have their own supported range of priorities, and will
+	// decide how these map into retention/eviction policy.
+	Priority int32 `protobuf:"varint,1,opt,name=priority,proto3" json:"priority,omitempty"`
+}
+
+func (x *ResultsCachePolicy) Reset() {
+	*x = ResultsCachePolicy{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[17]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ResultsCachePolicy) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ResultsCachePolicy) ProtoMessage() {}
+
+func (x *ResultsCachePolicy) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[17]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ResultsCachePolicy.ProtoReflect.Descriptor instead.
+func (*ResultsCachePolicy) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{17}
+}
+
+func (x *ResultsCachePolicy) GetPriority() int32 {
+	if x != nil {
+		return x.Priority
+	}
+	return 0
+}
+
+// A request message for
+// [Execution.Execute][build.bazel.remote.execution.v2.Execution.Execute].
+type ExecuteRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The instance of the execution system to operate against. A server may
+	// support multiple instances of the execution system (with their own workers,
+	// storage, caches, etc.). The server MAY require use of this field to select
+	// between them in an implementation-defined fashion, otherwise it can be
+	// omitted.
+	InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"`
+	// If true, the action will be executed even if its result is already
+	// present in the [ActionCache][build.bazel.remote.execution.v2.ActionCache].
+	// The execution is still allowed to be merged with other in-flight executions
+	// of the same action, however - semantically, the service MUST only guarantee
+	// that the results of an execution with this field set were not visible
+	// before the corresponding execution request was sent.
+	// Note that actions from execution requests setting this field set are still
+	// eligible to be entered into the action cache upon completion, and services
+	// SHOULD overwrite any existing entries that may exist. This allows
+	// skip_cache_lookup requests to be used as a mechanism for replacing action
+	// cache entries that reference outputs no longer available or that are
+	// poisoned in any way.
+	// If false, the result may be served from the action cache.
+	SkipCacheLookup bool `protobuf:"varint,3,opt,name=skip_cache_lookup,json=skipCacheLookup,proto3" json:"skip_cache_lookup,omitempty"`
+	// The digest of the [Action][build.bazel.remote.execution.v2.Action] to
+	// execute.
+	ActionDigest *Digest `protobuf:"bytes,6,opt,name=action_digest,json=actionDigest,proto3" json:"action_digest,omitempty"`
+	// An optional policy for execution of the action.
+	// The server will have a default policy if this is not provided.
+	ExecutionPolicy *ExecutionPolicy `protobuf:"bytes,7,opt,name=execution_policy,json=executionPolicy,proto3" json:"execution_policy,omitempty"`
+	// An optional policy for the results of this execution in the remote cache.
+	// The server will have a default policy if this is not provided.
+	// This may be applied to both the ActionResult and the associated blobs.
+	ResultsCachePolicy *ResultsCachePolicy `protobuf:"bytes,8,opt,name=results_cache_policy,json=resultsCachePolicy,proto3" json:"results_cache_policy,omitempty"`
+	// The digest function that was used to compute the action digest.
+	//
+	// If the digest function used is one of MD5, MURMUR3, SHA1, SHA256,
+	// SHA384, SHA512, or VSO, the client MAY leave this field unset. In
+	// that case the server SHOULD infer the digest function using the
+	// length of the action digest hash and the digest functions announced
+	// in the server's capabilities.
+	DigestFunction DigestFunction_Value `protobuf:"varint,9,opt,name=digest_function,json=digestFunction,proto3,enum=build.bazel.remote.execution.v2.DigestFunction_Value" json:"digest_function,omitempty"`
+}
+
+func (x *ExecuteRequest) Reset() {
+	*x = ExecuteRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[18]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ExecuteRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ExecuteRequest) ProtoMessage() {}
+
+func (x *ExecuteRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[18]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ExecuteRequest.ProtoReflect.Descriptor instead.
+func (*ExecuteRequest) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{18}
+}
+
+func (x *ExecuteRequest) GetInstanceName() string {
+	if x != nil {
+		return x.InstanceName
+	}
+	return ""
+}
+
+func (x *ExecuteRequest) GetSkipCacheLookup() bool {
+	if x != nil {
+		return x.SkipCacheLookup
+	}
+	return false
+}
+
+func (x *ExecuteRequest) GetActionDigest() *Digest {
+	if x != nil {
+		return x.ActionDigest
+	}
+	return nil
+}
+
+func (x *ExecuteRequest) GetExecutionPolicy() *ExecutionPolicy {
+	if x != nil {
+		return x.ExecutionPolicy
+	}
+	return nil
+}
+
+func (x *ExecuteRequest) GetResultsCachePolicy() *ResultsCachePolicy {
+	if x != nil {
+		return x.ResultsCachePolicy
+	}
+	return nil
+}
+
+func (x *ExecuteRequest) GetDigestFunction() DigestFunction_Value {
+	if x != nil {
+		return x.DigestFunction
+	}
+	return DigestFunction_UNKNOWN
+}
+
+// A `LogFile` is a log stored in the CAS.
+type LogFile struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The digest of the log contents.
+	Digest *Digest `protobuf:"bytes,1,opt,name=digest,proto3" json:"digest,omitempty"`
+	// This is a hint as to the purpose of the log, and is set to true if the log
+	// is human-readable text that can be usefully displayed to a user, and false
+	// otherwise. For instance, if a command-line client wishes to print the
+	// server logs to the terminal for a failed action, this allows it to avoid
+	// displaying a binary file.
+	HumanReadable bool `protobuf:"varint,2,opt,name=human_readable,json=humanReadable,proto3" json:"human_readable,omitempty"`
+}
+
+func (x *LogFile) Reset() {
+	*x = LogFile{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[19]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *LogFile) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LogFile) ProtoMessage() {}
+
+func (x *LogFile) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[19]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use LogFile.ProtoReflect.Descriptor instead.
+func (*LogFile) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{19}
+}
+
+func (x *LogFile) GetDigest() *Digest {
+	if x != nil {
+		return x.Digest
+	}
+	return nil
+}
+
+func (x *LogFile) GetHumanReadable() bool {
+	if x != nil {
+		return x.HumanReadable
+	}
+	return false
+}
+
+// The response message for
+// [Execution.Execute][build.bazel.remote.execution.v2.Execution.Execute],
+// which will be contained in the [response
+// field][google.longrunning.Operation.response] of the
+// [Operation][google.longrunning.Operation].
+type ExecuteResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The result of the action.
+	Result *ActionResult `protobuf:"bytes,1,opt,name=result,proto3" json:"result,omitempty"`
+	// True if the result was served from cache, false if it was executed.
+	CachedResult bool `protobuf:"varint,2,opt,name=cached_result,json=cachedResult,proto3" json:"cached_result,omitempty"`
+	// If the status has a code other than `OK`, it indicates that the action did
+	// not finish execution. For example, if the operation times out during
+	// execution, the status will have a `DEADLINE_EXCEEDED` code. Servers MUST
+	// use this field for errors in execution, rather than the error field on the
+	// `Operation` object.
+	//
+	// If the status code is other than `OK`, then the result MUST NOT be cached.
+	// For an error status, the `result` field is optional; the server may
+	// populate the output-, stdout-, and stderr-related fields if it has any
+	// information available, such as the stdout and stderr of a timed-out action.
+	Status *status.Status `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
+	// An optional list of additional log outputs the server wishes to provide. A
+	// server can use this to return execution-specific logs however it wishes.
+	// This is intended primarily to make it easier for users to debug issues that
+	// may be outside of the actual job execution, such as by identifying the
+	// worker executing the action or by providing logs from the worker's setup
+	// phase. The keys SHOULD be human readable so that a client can display them
+	// to a user.
+	ServerLogs map[string]*LogFile `protobuf:"bytes,4,rep,name=server_logs,json=serverLogs,proto3" json:"server_logs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	// Freeform informational message with details on the execution of the action
+	// that may be displayed to the user upon failure or when requested explicitly.
+	Message string `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"`
+}
+
+func (x *ExecuteResponse) Reset() {
+	*x = ExecuteResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[20]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ExecuteResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ExecuteResponse) ProtoMessage() {}
+
+func (x *ExecuteResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[20]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ExecuteResponse.ProtoReflect.Descriptor instead.
+func (*ExecuteResponse) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{20}
+}
+
+func (x *ExecuteResponse) GetResult() *ActionResult {
+	if x != nil {
+		return x.Result
+	}
+	return nil
+}
+
+func (x *ExecuteResponse) GetCachedResult() bool {
+	if x != nil {
+		return x.CachedResult
+	}
+	return false
+}
+
+func (x *ExecuteResponse) GetStatus() *status.Status {
+	if x != nil {
+		return x.Status
+	}
+	return nil
+}
+
+func (x *ExecuteResponse) GetServerLogs() map[string]*LogFile {
+	if x != nil {
+		return x.ServerLogs
+	}
+	return nil
+}
+
+func (x *ExecuteResponse) GetMessage() string {
+	if x != nil {
+		return x.Message
+	}
+	return ""
+}
+
+// The current stage of action execution.
+//
+// Even though these stages are numbered according to the order in which
+// they generally occur, there is no requirement that the remote
+// execution system reports events along this order. For example, an
+// operation MAY transition from the EXECUTING stage back to QUEUED
+// in case the hardware on which the operation executes fails.
+//
+// If and only if the remote execution system reports that an operation
+// has reached the COMPLETED stage, it MUST set the [done
+// field][google.longrunning.Operation.done] of the
+// [Operation][google.longrunning.Operation] and terminate the stream.
+type ExecutionStage struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *ExecutionStage) Reset() {
+	*x = ExecutionStage{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[21]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ExecutionStage) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ExecutionStage) ProtoMessage() {}
+
+func (x *ExecutionStage) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[21]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ExecutionStage.ProtoReflect.Descriptor instead.
+func (*ExecutionStage) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{21}
+}
+
+// Metadata about an ongoing
+// [execution][build.bazel.remote.execution.v2.Execution.Execute], which
+// will be contained in the [metadata
+// field][google.longrunning.Operation.response] of the
+// [Operation][google.longrunning.Operation].
+type ExecuteOperationMetadata struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The current stage of execution.
+	Stage ExecutionStage_Value `protobuf:"varint,1,opt,name=stage,proto3,enum=build.bazel.remote.execution.v2.ExecutionStage_Value" json:"stage,omitempty"`
+	// The digest of the [Action][build.bazel.remote.execution.v2.Action]
+	// being executed.
+	ActionDigest *Digest `protobuf:"bytes,2,opt,name=action_digest,json=actionDigest,proto3" json:"action_digest,omitempty"`
+	// If set, the client can use this resource name with
+	// [ByteStream.Read][google.bytestream.ByteStream.Read] to stream the
+	// standard output from the endpoint hosting streamed responses.
+	StdoutStreamName string `protobuf:"bytes,3,opt,name=stdout_stream_name,json=stdoutStreamName,proto3" json:"stdout_stream_name,omitempty"`
+	// If set, the client can use this resource name with
+	// [ByteStream.Read][google.bytestream.ByteStream.Read] to stream the
+	// standard error from the endpoint hosting streamed responses.
+	StderrStreamName string `protobuf:"bytes,4,opt,name=stderr_stream_name,json=stderrStreamName,proto3" json:"stderr_stream_name,omitempty"`
+	// The client can read this field to view details about the ongoing
+	// execution.
+	PartialExecutionMetadata *ExecutedActionMetadata `protobuf:"bytes,5,opt,name=partial_execution_metadata,json=partialExecutionMetadata,proto3" json:"partial_execution_metadata,omitempty"`
+}
+
+func (x *ExecuteOperationMetadata) Reset() {
+	*x = ExecuteOperationMetadata{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[22]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ExecuteOperationMetadata) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ExecuteOperationMetadata) ProtoMessage() {}
+
+func (x *ExecuteOperationMetadata) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[22]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ExecuteOperationMetadata.ProtoReflect.Descriptor instead.
+func (*ExecuteOperationMetadata) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{22}
+}
+
+func (x *ExecuteOperationMetadata) GetStage() ExecutionStage_Value {
+	if x != nil {
+		return x.Stage
+	}
+	return ExecutionStage_UNKNOWN
+}
+
+func (x *ExecuteOperationMetadata) GetActionDigest() *Digest {
+	if x != nil {
+		return x.ActionDigest
+	}
+	return nil
+}
+
+func (x *ExecuteOperationMetadata) GetStdoutStreamName() string {
+	if x != nil {
+		return x.StdoutStreamName
+	}
+	return ""
+}
+
+func (x *ExecuteOperationMetadata) GetStderrStreamName() string {
+	if x != nil {
+		return x.StderrStreamName
+	}
+	return ""
+}
+
+func (x *ExecuteOperationMetadata) GetPartialExecutionMetadata() *ExecutedActionMetadata {
+	if x != nil {
+		return x.PartialExecutionMetadata
+	}
+	return nil
+}
+
+// A request message for
+// [WaitExecution][build.bazel.remote.execution.v2.Execution.WaitExecution].
+type WaitExecutionRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The name of the [Operation][google.longrunning.Operation]
+	// returned by [Execute][build.bazel.remote.execution.v2.Execution.Execute].
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+}
+
+func (x *WaitExecutionRequest) Reset() {
+	*x = WaitExecutionRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[23]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *WaitExecutionRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*WaitExecutionRequest) ProtoMessage() {}
+
+func (x *WaitExecutionRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[23]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use WaitExecutionRequest.ProtoReflect.Descriptor instead.
+func (*WaitExecutionRequest) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{23}
+}
+
+func (x *WaitExecutionRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+// A request message for
+// [ActionCache.GetActionResult][build.bazel.remote.execution.v2.ActionCache.GetActionResult].
+type GetActionResultRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The instance of the execution system to operate against. A server may
+	// support multiple instances of the execution system (with their own workers,
+	// storage, caches, etc.). The server MAY require use of this field to select
+	// between them in an implementation-defined fashion, otherwise it can be
+	// omitted.
+	InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"`
+	// The digest of the [Action][build.bazel.remote.execution.v2.Action]
+	// whose result is requested.
+	ActionDigest *Digest `protobuf:"bytes,2,opt,name=action_digest,json=actionDigest,proto3" json:"action_digest,omitempty"`
+	// A hint to the server to request inlining stdout in the
+	// [ActionResult][build.bazel.remote.execution.v2.ActionResult] message.
+	InlineStdout bool `protobuf:"varint,3,opt,name=inline_stdout,json=inlineStdout,proto3" json:"inline_stdout,omitempty"`
+	// A hint to the server to request inlining stderr in the
+	// [ActionResult][build.bazel.remote.execution.v2.ActionResult] message.
+	InlineStderr bool `protobuf:"varint,4,opt,name=inline_stderr,json=inlineStderr,proto3" json:"inline_stderr,omitempty"`
+	// A hint to the server to inline the contents of the listed output files.
+	// Each path needs to exactly match one file path in either `output_paths` or
+	// `output_files` (DEPRECATED since v2.1) in the
+	// [Command][build.bazel.remote.execution.v2.Command] message.
+	InlineOutputFiles []string `protobuf:"bytes,5,rep,name=inline_output_files,json=inlineOutputFiles,proto3" json:"inline_output_files,omitempty"`
+	// The digest function that was used to compute the action digest.
+	//
+	// If the digest function used is one of MD5, MURMUR3, SHA1, SHA256,
+	// SHA384, SHA512, or VSO, the client MAY leave this field unset. In
+	// that case the server SHOULD infer the digest function using the
+	// length of the action digest hash and the digest functions announced
+	// in the server's capabilities.
+	DigestFunction DigestFunction_Value `protobuf:"varint,6,opt,name=digest_function,json=digestFunction,proto3,enum=build.bazel.remote.execution.v2.DigestFunction_Value" json:"digest_function,omitempty"`
+}
+
+func (x *GetActionResultRequest) Reset() {
+	*x = GetActionResultRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[24]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetActionResultRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetActionResultRequest) ProtoMessage() {}
+
+func (x *GetActionResultRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[24]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetActionResultRequest.ProtoReflect.Descriptor instead.
+func (*GetActionResultRequest) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{24}
+}
+
+func (x *GetActionResultRequest) GetInstanceName() string {
+	if x != nil {
+		return x.InstanceName
+	}
+	return ""
+}
+
+func (x *GetActionResultRequest) GetActionDigest() *Digest {
+	if x != nil {
+		return x.ActionDigest
+	}
+	return nil
+}
+
+func (x *GetActionResultRequest) GetInlineStdout() bool {
+	if x != nil {
+		return x.InlineStdout
+	}
+	return false
+}
+
+func (x *GetActionResultRequest) GetInlineStderr() bool {
+	if x != nil {
+		return x.InlineStderr
+	}
+	return false
+}
+
+func (x *GetActionResultRequest) GetInlineOutputFiles() []string {
+	if x != nil {
+		return x.InlineOutputFiles
+	}
+	return nil
+}
+
+func (x *GetActionResultRequest) GetDigestFunction() DigestFunction_Value {
+	if x != nil {
+		return x.DigestFunction
+	}
+	return DigestFunction_UNKNOWN
+}
+
+// A request message for
+// [ActionCache.UpdateActionResult][build.bazel.remote.execution.v2.ActionCache.UpdateActionResult].
+type UpdateActionResultRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The instance of the execution system to operate against. A server may
+	// support multiple instances of the execution system (with their own workers,
+	// storage, caches, etc.). The server MAY require use of this field to select
+	// between them in an implementation-defined fashion, otherwise it can be
+	// omitted.
+	InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"`
+	// The digest of the [Action][build.bazel.remote.execution.v2.Action]
+	// whose result is being uploaded.
+	ActionDigest *Digest `protobuf:"bytes,2,opt,name=action_digest,json=actionDigest,proto3" json:"action_digest,omitempty"`
+	// The [ActionResult][build.bazel.remote.execution.v2.ActionResult]
+	// to store in the cache.
+	ActionResult *ActionResult `protobuf:"bytes,3,opt,name=action_result,json=actionResult,proto3" json:"action_result,omitempty"`
+	// An optional policy for the results of this execution in the remote cache.
+	// The server will have a default policy if this is not provided.
+	// This may be applied to both the ActionResult and the associated blobs.
+	ResultsCachePolicy *ResultsCachePolicy `protobuf:"bytes,4,opt,name=results_cache_policy,json=resultsCachePolicy,proto3" json:"results_cache_policy,omitempty"`
+	// The digest function that was used to compute the action digest.
+	//
+	// If the digest function used is one of MD5, MURMUR3, SHA1, SHA256,
+	// SHA384, SHA512, or VSO, the client MAY leave this field unset. In
+	// that case the server SHOULD infer the digest function using the
+	// length of the action digest hash and the digest functions announced
+	// in the server's capabilities.
+	DigestFunction DigestFunction_Value `protobuf:"varint,5,opt,name=digest_function,json=digestFunction,proto3,enum=build.bazel.remote.execution.v2.DigestFunction_Value" json:"digest_function,omitempty"`
+}
+
+func (x *UpdateActionResultRequest) Reset() {
+	*x = UpdateActionResultRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[25]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *UpdateActionResultRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UpdateActionResultRequest) ProtoMessage() {}
+
+func (x *UpdateActionResultRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[25]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use UpdateActionResultRequest.ProtoReflect.Descriptor instead.
+func (*UpdateActionResultRequest) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{25}
+}
+
+func (x *UpdateActionResultRequest) GetInstanceName() string {
+	if x != nil {
+		return x.InstanceName
+	}
+	return ""
+}
+
+func (x *UpdateActionResultRequest) GetActionDigest() *Digest {
+	if x != nil {
+		return x.ActionDigest
+	}
+	return nil
+}
+
+func (x *UpdateActionResultRequest) GetActionResult() *ActionResult {
+	if x != nil {
+		return x.ActionResult
+	}
+	return nil
+}
+
+func (x *UpdateActionResultRequest) GetResultsCachePolicy() *ResultsCachePolicy {
+	if x != nil {
+		return x.ResultsCachePolicy
+	}
+	return nil
+}
+
+func (x *UpdateActionResultRequest) GetDigestFunction() DigestFunction_Value {
+	if x != nil {
+		return x.DigestFunction
+	}
+	return DigestFunction_UNKNOWN
+}
+
+// A request message for
+// [ContentAddressableStorage.FindMissingBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.FindMissingBlobs].
+type FindMissingBlobsRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The instance of the execution system to operate against. A server may
+	// support multiple instances of the execution system (with their own workers,
+	// storage, caches, etc.). The server MAY require use of this field to select
+	// between them in an implementation-defined fashion, otherwise it can be
+	// omitted.
+	InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"`
+	// A list of the blobs to check. All digests MUST use the same digest
+	// function.
+	BlobDigests []*Digest `protobuf:"bytes,2,rep,name=blob_digests,json=blobDigests,proto3" json:"blob_digests,omitempty"`
+	// The digest function of the blobs whose existence is checked.
+	//
+	// If the digest function used is one of MD5, MURMUR3, SHA1, SHA256,
+	// SHA384, SHA512, or VSO, the client MAY leave this field unset. In
+	// that case the server SHOULD infer the digest function using the
+	// length of the blob digest hashes and the digest functions announced
+	// in the server's capabilities.
+	DigestFunction DigestFunction_Value `protobuf:"varint,3,opt,name=digest_function,json=digestFunction,proto3,enum=build.bazel.remote.execution.v2.DigestFunction_Value" json:"digest_function,omitempty"`
+}
+
+func (x *FindMissingBlobsRequest) Reset() {
+	*x = FindMissingBlobsRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[26]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *FindMissingBlobsRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FindMissingBlobsRequest) ProtoMessage() {}
+
+func (x *FindMissingBlobsRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[26]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use FindMissingBlobsRequest.ProtoReflect.Descriptor instead.
+func (*FindMissingBlobsRequest) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{26}
+}
+
+func (x *FindMissingBlobsRequest) GetInstanceName() string {
+	if x != nil {
+		return x.InstanceName
+	}
+	return ""
+}
+
+func (x *FindMissingBlobsRequest) GetBlobDigests() []*Digest {
+	if x != nil {
+		return x.BlobDigests
+	}
+	return nil
+}
+
+func (x *FindMissingBlobsRequest) GetDigestFunction() DigestFunction_Value {
+	if x != nil {
+		return x.DigestFunction
+	}
+	return DigestFunction_UNKNOWN
+}
+
+// A response message for
+// [ContentAddressableStorage.FindMissingBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.FindMissingBlobs].
+type FindMissingBlobsResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// A list of the blobs requested *not* present in the storage.
+	MissingBlobDigests []*Digest `protobuf:"bytes,2,rep,name=missing_blob_digests,json=missingBlobDigests,proto3" json:"missing_blob_digests,omitempty"`
+}
+
+func (x *FindMissingBlobsResponse) Reset() {
+	*x = FindMissingBlobsResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[27]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *FindMissingBlobsResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FindMissingBlobsResponse) ProtoMessage() {}
+
+func (x *FindMissingBlobsResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[27]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use FindMissingBlobsResponse.ProtoReflect.Descriptor instead.
+func (*FindMissingBlobsResponse) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{27}
+}
+
+func (x *FindMissingBlobsResponse) GetMissingBlobDigests() []*Digest {
+	if x != nil {
+		return x.MissingBlobDigests
+	}
+	return nil
+}
+
+// A request message for
+// [ContentAddressableStorage.BatchUpdateBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs].
+type BatchUpdateBlobsRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The instance of the execution system to operate against. A server may
+	// support multiple instances of the execution system (with their own workers,
+	// storage, caches, etc.). The server MAY require use of this field to select
+	// between them in an implementation-defined fashion, otherwise it can be
+	// omitted.
+	InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"`
+	// The individual upload requests.
+	Requests []*BatchUpdateBlobsRequest_Request `protobuf:"bytes,2,rep,name=requests,proto3" json:"requests,omitempty"`
+	// The digest function that was used to compute the digests of the
+	// blobs being uploaded.
+	//
+	// If the digest function used is one of MD5, MURMUR3, SHA1, SHA256,
+	// SHA384, SHA512, or VSO, the client MAY leave this field unset. In
+	// that case the server SHOULD infer the digest function using the
+	// length of the blob digest hashes and the digest functions announced
+	// in the server's capabilities.
+	DigestFunction DigestFunction_Value `protobuf:"varint,5,opt,name=digest_function,json=digestFunction,proto3,enum=build.bazel.remote.execution.v2.DigestFunction_Value" json:"digest_function,omitempty"`
+}
+
+func (x *BatchUpdateBlobsRequest) Reset() {
+	*x = BatchUpdateBlobsRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[28]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BatchUpdateBlobsRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BatchUpdateBlobsRequest) ProtoMessage() {}
+
+func (x *BatchUpdateBlobsRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[28]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use BatchUpdateBlobsRequest.ProtoReflect.Descriptor instead.
+func (*BatchUpdateBlobsRequest) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{28}
+}
+
+func (x *BatchUpdateBlobsRequest) GetInstanceName() string {
+	if x != nil {
+		return x.InstanceName
+	}
+	return ""
+}
+
+func (x *BatchUpdateBlobsRequest) GetRequests() []*BatchUpdateBlobsRequest_Request {
+	if x != nil {
+		return x.Requests
+	}
+	return nil
+}
+
+func (x *BatchUpdateBlobsRequest) GetDigestFunction() DigestFunction_Value {
+	if x != nil {
+		return x.DigestFunction
+	}
+	return DigestFunction_UNKNOWN
+}
+
+// A response message for
+// [ContentAddressableStorage.BatchUpdateBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs].
+type BatchUpdateBlobsResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The responses to the requests.
+	Responses []*BatchUpdateBlobsResponse_Response `protobuf:"bytes,1,rep,name=responses,proto3" json:"responses,omitempty"`
+}
+
+func (x *BatchUpdateBlobsResponse) Reset() {
+	*x = BatchUpdateBlobsResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[29]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BatchUpdateBlobsResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BatchUpdateBlobsResponse) ProtoMessage() {}
+
+func (x *BatchUpdateBlobsResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[29]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use BatchUpdateBlobsResponse.ProtoReflect.Descriptor instead.
+func (*BatchUpdateBlobsResponse) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{29}
+}
+
+func (x *BatchUpdateBlobsResponse) GetResponses() []*BatchUpdateBlobsResponse_Response {
+	if x != nil {
+		return x.Responses
+	}
+	return nil
+}
+
+// A request message for
+// [ContentAddressableStorage.BatchReadBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchReadBlobs].
+type BatchReadBlobsRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The instance of the execution system to operate against. A server may
+	// support multiple instances of the execution system (with their own workers,
+	// storage, caches, etc.). The server MAY require use of this field to select
+	// between them in an implementation-defined fashion, otherwise it can be
+	// omitted.
+	InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"`
+	// The individual blob digests. All digests MUST use the same digest
+	// function.
+	Digests []*Digest `protobuf:"bytes,2,rep,name=digests,proto3" json:"digests,omitempty"`
+	// A list of acceptable encodings for the returned inlined data, in no
+	// particular order. `IDENTITY` is always allowed even if not specified here.
+	AcceptableCompressors []Compressor_Value `protobuf:"varint,3,rep,packed,name=acceptable_compressors,json=acceptableCompressors,proto3,enum=build.bazel.remote.execution.v2.Compressor_Value" json:"acceptable_compressors,omitempty"`
+	// The digest function of the blobs being requested.
+	//
+	// If the digest function used is one of MD5, MURMUR3, SHA1, SHA256,
+	// SHA384, SHA512, or VSO, the client MAY leave this field unset. In
+	// that case the server SHOULD infer the digest function using the
+	// length of the blob digest hashes and the digest functions announced
+	// in the server's capabilities.
+	DigestFunction DigestFunction_Value `protobuf:"varint,4,opt,name=digest_function,json=digestFunction,proto3,enum=build.bazel.remote.execution.v2.DigestFunction_Value" json:"digest_function,omitempty"`
+}
+
+func (x *BatchReadBlobsRequest) Reset() {
+	*x = BatchReadBlobsRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[30]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BatchReadBlobsRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BatchReadBlobsRequest) ProtoMessage() {}
+
+func (x *BatchReadBlobsRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[30]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use BatchReadBlobsRequest.ProtoReflect.Descriptor instead.
+func (*BatchReadBlobsRequest) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{30}
+}
+
+func (x *BatchReadBlobsRequest) GetInstanceName() string {
+	if x != nil {
+		return x.InstanceName
+	}
+	return ""
+}
+
+func (x *BatchReadBlobsRequest) GetDigests() []*Digest {
+	if x != nil {
+		return x.Digests
+	}
+	return nil
+}
+
+func (x *BatchReadBlobsRequest) GetAcceptableCompressors() []Compressor_Value {
+	if x != nil {
+		return x.AcceptableCompressors
+	}
+	return nil
+}
+
+func (x *BatchReadBlobsRequest) GetDigestFunction() DigestFunction_Value {
+	if x != nil {
+		return x.DigestFunction
+	}
+	return DigestFunction_UNKNOWN
+}
+
+// A response message for
+// [ContentAddressableStorage.BatchReadBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchReadBlobs].
+type BatchReadBlobsResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The responses to the requests.
+	Responses []*BatchReadBlobsResponse_Response `protobuf:"bytes,1,rep,name=responses,proto3" json:"responses,omitempty"`
+}
+
+func (x *BatchReadBlobsResponse) Reset() {
+	*x = BatchReadBlobsResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[31]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BatchReadBlobsResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BatchReadBlobsResponse) ProtoMessage() {}
+
+func (x *BatchReadBlobsResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[31]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use BatchReadBlobsResponse.ProtoReflect.Descriptor instead.
+func (*BatchReadBlobsResponse) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{31}
+}
+
+func (x *BatchReadBlobsResponse) GetResponses() []*BatchReadBlobsResponse_Response {
+	if x != nil {
+		return x.Responses
+	}
+	return nil
+}
+
+// A request message for
+// [ContentAddressableStorage.GetTree][build.bazel.remote.execution.v2.ContentAddressableStorage.GetTree].
+type GetTreeRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The instance of the execution system to operate against. A server may
+	// support multiple instances of the execution system (with their own workers,
+	// storage, caches, etc.). The server MAY require use of this field to select
+	// between them in an implementation-defined fashion, otherwise it can be
+	// omitted.
+	InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"`
+	// The digest of the root, which must be an encoded
+	// [Directory][build.bazel.remote.execution.v2.Directory] message
+	// stored in the
+	// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
+	RootDigest *Digest `protobuf:"bytes,2,opt,name=root_digest,json=rootDigest,proto3" json:"root_digest,omitempty"`
+	// A maximum page size to request. If present, the server will request no more
+	// than this many items. Regardless of whether a page size is specified, the
+	// server may place its own limit on the number of items to be returned and
+	// require the client to retrieve more items using a subsequent request.
+	PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
+	// A page token, which must be a value received in a previous
+	// [GetTreeResponse][build.bazel.remote.execution.v2.GetTreeResponse].
+	// If present, the server will use that token as an offset, returning only
+	// that page and the ones that succeed it.
+	PageToken string `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
+	// The digest function that was used to compute the digest of the root
+	// directory.
+	//
+	// If the digest function used is one of MD5, MURMUR3, SHA1, SHA256,
+	// SHA384, SHA512, or VSO, the client MAY leave this field unset. In
+	// that case the server SHOULD infer the digest function using the
+	// length of the root digest hash and the digest functions announced
+	// in the server's capabilities.
+	DigestFunction DigestFunction_Value `protobuf:"varint,5,opt,name=digest_function,json=digestFunction,proto3,enum=build.bazel.remote.execution.v2.DigestFunction_Value" json:"digest_function,omitempty"`
+}
+
+func (x *GetTreeRequest) Reset() {
+	*x = GetTreeRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[32]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetTreeRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetTreeRequest) ProtoMessage() {}
+
+func (x *GetTreeRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[32]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetTreeRequest.ProtoReflect.Descriptor instead.
+func (*GetTreeRequest) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{32}
+}
+
+func (x *GetTreeRequest) GetInstanceName() string {
+	if x != nil {
+		return x.InstanceName
+	}
+	return ""
+}
+
+func (x *GetTreeRequest) GetRootDigest() *Digest {
+	if x != nil {
+		return x.RootDigest
+	}
+	return nil
+}
+
+func (x *GetTreeRequest) GetPageSize() int32 {
+	if x != nil {
+		return x.PageSize
+	}
+	return 0
+}
+
+func (x *GetTreeRequest) GetPageToken() string {
+	if x != nil {
+		return x.PageToken
+	}
+	return ""
+}
+
+func (x *GetTreeRequest) GetDigestFunction() DigestFunction_Value {
+	if x != nil {
+		return x.DigestFunction
+	}
+	return DigestFunction_UNKNOWN
+}
+
+// A response message for
+// [ContentAddressableStorage.GetTree][build.bazel.remote.execution.v2.ContentAddressableStorage.GetTree].
+type GetTreeResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The directories descended from the requested root.
+	Directories []*Directory `protobuf:"bytes,1,rep,name=directories,proto3" json:"directories,omitempty"`
+	// If present, signifies that there are more results which the client can
+	// retrieve by passing this as the page_token in a subsequent
+	// [request][build.bazel.remote.execution.v2.GetTreeRequest].
+	// If empty, signifies that this is the last page of results.
+	NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"`
+}
+
+func (x *GetTreeResponse) Reset() {
+	*x = GetTreeResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[33]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetTreeResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetTreeResponse) ProtoMessage() {}
+
+func (x *GetTreeResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[33]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetTreeResponse.ProtoReflect.Descriptor instead.
+func (*GetTreeResponse) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{33}
+}
+
+func (x *GetTreeResponse) GetDirectories() []*Directory {
+	if x != nil {
+		return x.Directories
+	}
+	return nil
+}
+
+func (x *GetTreeResponse) GetNextPageToken() string {
+	if x != nil {
+		return x.NextPageToken
+	}
+	return ""
+}
+
+// A request message for
+// [Capabilities.GetCapabilities][build.bazel.remote.execution.v2.Capabilities.GetCapabilities].
+type GetCapabilitiesRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The instance of the execution system to operate against. A server may
+	// support multiple instances of the execution system (with their own workers,
+	// storage, caches, etc.). The server MAY require use of this field to select
+	// between them in an implementation-defined fashion, otherwise it can be
+	// omitted.
+	InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"`
+}
+
+func (x *GetCapabilitiesRequest) Reset() {
+	*x = GetCapabilitiesRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[34]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetCapabilitiesRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetCapabilitiesRequest) ProtoMessage() {}
+
+func (x *GetCapabilitiesRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[34]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetCapabilitiesRequest.ProtoReflect.Descriptor instead.
+func (*GetCapabilitiesRequest) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{34}
+}
+
+func (x *GetCapabilitiesRequest) GetInstanceName() string {
+	if x != nil {
+		return x.InstanceName
+	}
+	return ""
+}
+
+// A response message for
+// [Capabilities.GetCapabilities][build.bazel.remote.execution.v2.Capabilities.GetCapabilities].
+type ServerCapabilities struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Capabilities of the remote cache system.
+	CacheCapabilities *CacheCapabilities `protobuf:"bytes,1,opt,name=cache_capabilities,json=cacheCapabilities,proto3" json:"cache_capabilities,omitempty"`
+	// Capabilities of the remote execution system.
+	ExecutionCapabilities *ExecutionCapabilities `protobuf:"bytes,2,opt,name=execution_capabilities,json=executionCapabilities,proto3" json:"execution_capabilities,omitempty"`
+	// Earliest RE API version supported, including deprecated versions.
+	DeprecatedApiVersion *semver.SemVer `protobuf:"bytes,3,opt,name=deprecated_api_version,json=deprecatedApiVersion,proto3" json:"deprecated_api_version,omitempty"`
+	// Earliest non-deprecated RE API version supported.
+	LowApiVersion *semver.SemVer `protobuf:"bytes,4,opt,name=low_api_version,json=lowApiVersion,proto3" json:"low_api_version,omitempty"`
+	// Latest RE API version supported.
+	HighApiVersion *semver.SemVer `protobuf:"bytes,5,opt,name=high_api_version,json=highApiVersion,proto3" json:"high_api_version,omitempty"`
+}
+
+func (x *ServerCapabilities) Reset() {
+	*x = ServerCapabilities{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[35]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ServerCapabilities) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ServerCapabilities) ProtoMessage() {}
+
+func (x *ServerCapabilities) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[35]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ServerCapabilities.ProtoReflect.Descriptor instead.
+func (*ServerCapabilities) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{35}
+}
+
+func (x *ServerCapabilities) GetCacheCapabilities() *CacheCapabilities {
+	if x != nil {
+		return x.CacheCapabilities
+	}
+	return nil
+}
+
+func (x *ServerCapabilities) GetExecutionCapabilities() *ExecutionCapabilities {
+	if x != nil {
+		return x.ExecutionCapabilities
+	}
+	return nil
+}
+
+func (x *ServerCapabilities) GetDeprecatedApiVersion() *semver.SemVer {
+	if x != nil {
+		return x.DeprecatedApiVersion
+	}
+	return nil
+}
+
+func (x *ServerCapabilities) GetLowApiVersion() *semver.SemVer {
+	if x != nil {
+		return x.LowApiVersion
+	}
+	return nil
+}
+
+func (x *ServerCapabilities) GetHighApiVersion() *semver.SemVer {
+	if x != nil {
+		return x.HighApiVersion
+	}
+	return nil
+}
+
+// The digest function used for converting values into keys for CAS and Action
+// Cache.
+type DigestFunction struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *DigestFunction) Reset() {
+	*x = DigestFunction{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[36]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DigestFunction) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DigestFunction) ProtoMessage() {}
+
+func (x *DigestFunction) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[36]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DigestFunction.ProtoReflect.Descriptor instead.
+func (*DigestFunction) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{36}
+}
+
+// Describes the server/instance capabilities for updating the action cache.
+type ActionCacheUpdateCapabilities struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	UpdateEnabled bool `protobuf:"varint,1,opt,name=update_enabled,json=updateEnabled,proto3" json:"update_enabled,omitempty"`
+}
+
+func (x *ActionCacheUpdateCapabilities) Reset() {
+	*x = ActionCacheUpdateCapabilities{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[37]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ActionCacheUpdateCapabilities) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ActionCacheUpdateCapabilities) ProtoMessage() {}
+
+func (x *ActionCacheUpdateCapabilities) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[37]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ActionCacheUpdateCapabilities.ProtoReflect.Descriptor instead.
+func (*ActionCacheUpdateCapabilities) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{37}
+}
+
+func (x *ActionCacheUpdateCapabilities) GetUpdateEnabled() bool {
+	if x != nil {
+		return x.UpdateEnabled
+	}
+	return false
+}
+
+// Allowed values for priority in
+// [ResultsCachePolicy][build.bazel.remoteexecution.v2.ResultsCachePolicy] and
+// [ExecutionPolicy][build.bazel.remoteexecution.v2.ResultsCachePolicy]
+// Used for querying both cache and execution valid priority ranges.
+type PriorityCapabilities struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Priorities []*PriorityCapabilities_PriorityRange `protobuf:"bytes,1,rep,name=priorities,proto3" json:"priorities,omitempty"`
+}
+
+func (x *PriorityCapabilities) Reset() {
+	*x = PriorityCapabilities{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[38]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *PriorityCapabilities) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PriorityCapabilities) ProtoMessage() {}
+
+func (x *PriorityCapabilities) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[38]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use PriorityCapabilities.ProtoReflect.Descriptor instead.
+func (*PriorityCapabilities) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{38}
+}
+
+func (x *PriorityCapabilities) GetPriorities() []*PriorityCapabilities_PriorityRange {
+	if x != nil {
+		return x.Priorities
+	}
+	return nil
+}
+
+// Describes how the server treats absolute symlink targets.
+type SymlinkAbsolutePathStrategy struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *SymlinkAbsolutePathStrategy) Reset() {
+	*x = SymlinkAbsolutePathStrategy{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[39]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SymlinkAbsolutePathStrategy) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SymlinkAbsolutePathStrategy) ProtoMessage() {}
+
+func (x *SymlinkAbsolutePathStrategy) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[39]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SymlinkAbsolutePathStrategy.ProtoReflect.Descriptor instead.
+func (*SymlinkAbsolutePathStrategy) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{39}
+}
+
+// Compression formats which may be supported.
+type Compressor struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *Compressor) Reset() {
+	*x = Compressor{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[40]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Compressor) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Compressor) ProtoMessage() {}
+
+func (x *Compressor) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[40]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Compressor.ProtoReflect.Descriptor instead.
+func (*Compressor) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{40}
+}
+
+// Capabilities of the remote cache system.
+type CacheCapabilities struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// All the digest functions supported by the remote cache.
+	// Remote cache may support multiple digest functions simultaneously.
+	DigestFunctions []DigestFunction_Value `protobuf:"varint,1,rep,packed,name=digest_functions,json=digestFunctions,proto3,enum=build.bazel.remote.execution.v2.DigestFunction_Value" json:"digest_functions,omitempty"`
+	// Capabilities for updating the action cache.
+	ActionCacheUpdateCapabilities *ActionCacheUpdateCapabilities `protobuf:"bytes,2,opt,name=action_cache_update_capabilities,json=actionCacheUpdateCapabilities,proto3" json:"action_cache_update_capabilities,omitempty"`
+	// Supported cache priority range for both CAS and ActionCache.
+	CachePriorityCapabilities *PriorityCapabilities `protobuf:"bytes,3,opt,name=cache_priority_capabilities,json=cachePriorityCapabilities,proto3" json:"cache_priority_capabilities,omitempty"`
+	// Maximum total size of blobs to be uploaded/downloaded using
+	// batch methods. A value of 0 means no limit is set, although
+	// in practice there will always be a message size limitation
+	// of the protocol in use, e.g. GRPC.
+	MaxBatchTotalSizeBytes int64 `protobuf:"varint,4,opt,name=max_batch_total_size_bytes,json=maxBatchTotalSizeBytes,proto3" json:"max_batch_total_size_bytes,omitempty"`
+	// Whether absolute symlink targets are supported.
+	SymlinkAbsolutePathStrategy SymlinkAbsolutePathStrategy_Value `protobuf:"varint,5,opt,name=symlink_absolute_path_strategy,json=symlinkAbsolutePathStrategy,proto3,enum=build.bazel.remote.execution.v2.SymlinkAbsolutePathStrategy_Value" json:"symlink_absolute_path_strategy,omitempty"`
+	// Compressors supported by the "compressed-blobs" bytestream resources.
+	// Servers MUST support identity/no-compression, even if it is not listed
+	// here.
+	//
+	// Note that this does not imply which if any compressors are supported by
+	// the server at the gRPC level.
+	SupportedCompressors []Compressor_Value `protobuf:"varint,6,rep,packed,name=supported_compressors,json=supportedCompressors,proto3,enum=build.bazel.remote.execution.v2.Compressor_Value" json:"supported_compressors,omitempty"`
+	// Compressors supported for inlined data in
+	// [BatchUpdateBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs]
+	// requests.
+	SupportedBatchUpdateCompressors []Compressor_Value `protobuf:"varint,7,rep,packed,name=supported_batch_update_compressors,json=supportedBatchUpdateCompressors,proto3,enum=build.bazel.remote.execution.v2.Compressor_Value" json:"supported_batch_update_compressors,omitempty"`
+}
+
+func (x *CacheCapabilities) Reset() {
+	*x = CacheCapabilities{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[41]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CacheCapabilities) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CacheCapabilities) ProtoMessage() {}
+
+func (x *CacheCapabilities) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[41]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use CacheCapabilities.ProtoReflect.Descriptor instead.
+func (*CacheCapabilities) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{41}
+}
+
+func (x *CacheCapabilities) GetDigestFunctions() []DigestFunction_Value {
+	if x != nil {
+		return x.DigestFunctions
+	}
+	return nil
+}
+
+func (x *CacheCapabilities) GetActionCacheUpdateCapabilities() *ActionCacheUpdateCapabilities {
+	if x != nil {
+		return x.ActionCacheUpdateCapabilities
+	}
+	return nil
+}
+
+func (x *CacheCapabilities) GetCachePriorityCapabilities() *PriorityCapabilities {
+	if x != nil {
+		return x.CachePriorityCapabilities
+	}
+	return nil
+}
+
+func (x *CacheCapabilities) GetMaxBatchTotalSizeBytes() int64 {
+	if x != nil {
+		return x.MaxBatchTotalSizeBytes
+	}
+	return 0
+}
+
+func (x *CacheCapabilities) GetSymlinkAbsolutePathStrategy() SymlinkAbsolutePathStrategy_Value {
+	if x != nil {
+		return x.SymlinkAbsolutePathStrategy
+	}
+	return SymlinkAbsolutePathStrategy_UNKNOWN
+}
+
+func (x *CacheCapabilities) GetSupportedCompressors() []Compressor_Value {
+	if x != nil {
+		return x.SupportedCompressors
+	}
+	return nil
+}
+
+func (x *CacheCapabilities) GetSupportedBatchUpdateCompressors() []Compressor_Value {
+	if x != nil {
+		return x.SupportedBatchUpdateCompressors
+	}
+	return nil
+}
+
+// Capabilities of the remote execution system.
+type ExecutionCapabilities struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Legacy field for indicating which digest function is supported by the
+	// remote execution system. It MUST be set to a value other than UNKNOWN.
+	// Implementations should consider the repeated digest_functions field
+	// first, falling back to this singular field if digest_functions is unset.
+	DigestFunction DigestFunction_Value `protobuf:"varint,1,opt,name=digest_function,json=digestFunction,proto3,enum=build.bazel.remote.execution.v2.DigestFunction_Value" json:"digest_function,omitempty"`
+	// Whether remote execution is enabled for the particular server/instance.
+	ExecEnabled bool `protobuf:"varint,2,opt,name=exec_enabled,json=execEnabled,proto3" json:"exec_enabled,omitempty"`
+	// Supported execution priority range.
+	ExecutionPriorityCapabilities *PriorityCapabilities `protobuf:"bytes,3,opt,name=execution_priority_capabilities,json=executionPriorityCapabilities,proto3" json:"execution_priority_capabilities,omitempty"`
+	// Supported node properties.
+	SupportedNodeProperties []string `protobuf:"bytes,4,rep,name=supported_node_properties,json=supportedNodeProperties,proto3" json:"supported_node_properties,omitempty"`
+	// All the digest functions supported by the remote execution system.
+	// If this field is set, it MUST also contain digest_function.
+	//
+	// Even if the remote execution system announces support for multiple
+	// digest functions, individual execution requests may only reference
+	// CAS objects using a single digest function. For example, it is not
+	// permitted to execute actions having both MD5 and SHA-256 hashed
+	// files in their input root.
+	//
+	// The CAS objects referenced by action results generated by the
+	// remote execution system MUST use the same digest function as the
+	// one used to construct the action.
+	DigestFunctions []DigestFunction_Value `protobuf:"varint,5,rep,packed,name=digest_functions,json=digestFunctions,proto3,enum=build.bazel.remote.execution.v2.DigestFunction_Value" json:"digest_functions,omitempty"`
+}
+
+func (x *ExecutionCapabilities) Reset() {
+	*x = ExecutionCapabilities{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[42]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ExecutionCapabilities) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ExecutionCapabilities) ProtoMessage() {}
+
+func (x *ExecutionCapabilities) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[42]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ExecutionCapabilities.ProtoReflect.Descriptor instead.
+func (*ExecutionCapabilities) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{42}
+}
+
+func (x *ExecutionCapabilities) GetDigestFunction() DigestFunction_Value {
+	if x != nil {
+		return x.DigestFunction
+	}
+	return DigestFunction_UNKNOWN
+}
+
+func (x *ExecutionCapabilities) GetExecEnabled() bool {
+	if x != nil {
+		return x.ExecEnabled
+	}
+	return false
+}
+
+func (x *ExecutionCapabilities) GetExecutionPriorityCapabilities() *PriorityCapabilities {
+	if x != nil {
+		return x.ExecutionPriorityCapabilities
+	}
+	return nil
+}
+
+func (x *ExecutionCapabilities) GetSupportedNodeProperties() []string {
+	if x != nil {
+		return x.SupportedNodeProperties
+	}
+	return nil
+}
+
+func (x *ExecutionCapabilities) GetDigestFunctions() []DigestFunction_Value {
+	if x != nil {
+		return x.DigestFunctions
+	}
+	return nil
+}
+
+// Details for the tool used to call the API.
+type ToolDetails struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Name of the tool, e.g. bazel.
+	ToolName string `protobuf:"bytes,1,opt,name=tool_name,json=toolName,proto3" json:"tool_name,omitempty"`
+	// Version of the tool used for the request, e.g. 5.0.3.
+	ToolVersion string `protobuf:"bytes,2,opt,name=tool_version,json=toolVersion,proto3" json:"tool_version,omitempty"`
+}
+
+func (x *ToolDetails) Reset() {
+	*x = ToolDetails{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[43]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ToolDetails) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ToolDetails) ProtoMessage() {}
+
+func (x *ToolDetails) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[43]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ToolDetails.ProtoReflect.Descriptor instead.
+func (*ToolDetails) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{43}
+}
+
+func (x *ToolDetails) GetToolName() string {
+	if x != nil {
+		return x.ToolName
+	}
+	return ""
+}
+
+func (x *ToolDetails) GetToolVersion() string {
+	if x != nil {
+		return x.ToolVersion
+	}
+	return ""
+}
+
+// An optional Metadata to attach to any RPC request to tell the server about an
+// external context of the request. The server may use this for logging or other
+// purposes. To use it, the client attaches the header to the call using the
+// canonical proto serialization:
+//
+// * name: `build.bazel.remote.execution.v2.requestmetadata-bin`
+// * contents: the base64 encoded binary `RequestMetadata` message.
+// Note: the gRPC library serializes binary headers encoded in base64 by
+// default (https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests).
+// Therefore, if the gRPC library is used to pass/retrieve this
+// metadata, the user may ignore the base64 encoding and assume it is simply
+// serialized as a binary message.
+type RequestMetadata struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The details for the tool invoking the requests.
+	ToolDetails *ToolDetails `protobuf:"bytes,1,opt,name=tool_details,json=toolDetails,proto3" json:"tool_details,omitempty"`
+	// An identifier that ties multiple requests to the same action.
+	// For example, multiple requests to the CAS, Action Cache, and Execution
+	// API are used in order to compile foo.cc.
+	ActionId string `protobuf:"bytes,2,opt,name=action_id,json=actionId,proto3" json:"action_id,omitempty"`
+	// An identifier that ties multiple actions together to a final result.
+	// For example, multiple actions are required to build and run foo_test.
+	ToolInvocationId string `protobuf:"bytes,3,opt,name=tool_invocation_id,json=toolInvocationId,proto3" json:"tool_invocation_id,omitempty"`
+	// An identifier to tie multiple tool invocations together. For example,
+	// runs of foo_test, bar_test and baz_test on a post-submit of a given patch.
+	CorrelatedInvocationsId string `protobuf:"bytes,4,opt,name=correlated_invocations_id,json=correlatedInvocationsId,proto3" json:"correlated_invocations_id,omitempty"`
+	// A brief description of the kind of action, for example, CppCompile or GoLink.
+	// There is no standard agreed set of values for this, and they are expected to vary between different client tools.
+	ActionMnemonic string `protobuf:"bytes,5,opt,name=action_mnemonic,json=actionMnemonic,proto3" json:"action_mnemonic,omitempty"`
+	// An identifier for the target which produced this action.
+	// No guarantees are made around how many actions may relate to a single target.
+	TargetId string `protobuf:"bytes,6,opt,name=target_id,json=targetId,proto3" json:"target_id,omitempty"`
+	// An identifier for the configuration in which the target was built,
+	// e.g. for differentiating building host tools or different target platforms.
+	// There is no expectation that this value will have any particular structure,
+	// or equality across invocations, though some client tools may offer these guarantees.
+	ConfigurationId string `protobuf:"bytes,7,opt,name=configuration_id,json=configurationId,proto3" json:"configuration_id,omitempty"`
+}
+
+func (x *RequestMetadata) Reset() {
+	*x = RequestMetadata{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[44]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *RequestMetadata) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RequestMetadata) ProtoMessage() {}
+
+func (x *RequestMetadata) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[44]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use RequestMetadata.ProtoReflect.Descriptor instead.
+func (*RequestMetadata) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{44}
+}
+
+func (x *RequestMetadata) GetToolDetails() *ToolDetails {
+	if x != nil {
+		return x.ToolDetails
+	}
+	return nil
+}
+
+func (x *RequestMetadata) GetActionId() string {
+	if x != nil {
+		return x.ActionId
+	}
+	return ""
+}
+
+func (x *RequestMetadata) GetToolInvocationId() string {
+	if x != nil {
+		return x.ToolInvocationId
+	}
+	return ""
+}
+
+func (x *RequestMetadata) GetCorrelatedInvocationsId() string {
+	if x != nil {
+		return x.CorrelatedInvocationsId
+	}
+	return ""
+}
+
+func (x *RequestMetadata) GetActionMnemonic() string {
+	if x != nil {
+		return x.ActionMnemonic
+	}
+	return ""
+}
+
+func (x *RequestMetadata) GetTargetId() string {
+	if x != nil {
+		return x.TargetId
+	}
+	return ""
+}
+
+func (x *RequestMetadata) GetConfigurationId() string {
+	if x != nil {
+		return x.ConfigurationId
+	}
+	return ""
+}
+
+// An `EnvironmentVariable` is one variable to set in the running program's
+// environment.
+type Command_EnvironmentVariable struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The variable name.
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	// The variable value.
+	Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
+}
+
+func (x *Command_EnvironmentVariable) Reset() {
+	*x = Command_EnvironmentVariable{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[45]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Command_EnvironmentVariable) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Command_EnvironmentVariable) ProtoMessage() {}
+
+func (x *Command_EnvironmentVariable) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[45]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Command_EnvironmentVariable.ProtoReflect.Descriptor instead.
+func (*Command_EnvironmentVariable) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{1, 0}
+}
+
+func (x *Command_EnvironmentVariable) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *Command_EnvironmentVariable) GetValue() string {
+	if x != nil {
+		return x.Value
+	}
+	return ""
+}
+
+// A single property for the environment. The server is responsible for
+// specifying the property `name`s that it accepts. If an unknown `name` is
+// provided in the requirements for an
+// [Action][build.bazel.remote.execution.v2.Action], the server SHOULD
+// reject the execution request. If permitted by the server, the same `name`
+// may occur multiple times.
+//
+// The server is also responsible for specifying the interpretation of
+// property `value`s. For instance, a property describing how much RAM must be
+// available may be interpreted as allowing a worker with 16GB to fulfill a
+// request for 8GB, while a property describing the OS environment on which
+// the action must be performed may require an exact match with the worker's
+// OS.
+//
+// The server MAY use the `value` of one or more properties to determine how
+// it sets up the execution environment, such as by making specific system
+// files available to the worker.
+//
+// Both names and values are typically case-sensitive. Note that the platform
+// is implicitly part of the action digest, so even tiny changes in the names
+// or values (like changing case) may result in different action cache
+// entries.
+type Platform_Property struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The property name.
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	// The property value.
+	Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
+}
+
+func (x *Platform_Property) Reset() {
+	*x = Platform_Property{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[46]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Platform_Property) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Platform_Property) ProtoMessage() {}
+
+func (x *Platform_Property) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[46]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Platform_Property.ProtoReflect.Descriptor instead.
+func (*Platform_Property) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{2, 0}
+}
+
+func (x *Platform_Property) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *Platform_Property) GetValue() string {
+	if x != nil {
+		return x.Value
+	}
+	return ""
+}
+
+// A request corresponding to a single blob that the client wants to upload.
+type BatchUpdateBlobsRequest_Request struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The digest of the blob. This MUST be the digest of `data`. All
+	// digests MUST use the same digest function.
+	Digest *Digest `protobuf:"bytes,1,opt,name=digest,proto3" json:"digest,omitempty"`
+	// The raw binary data.
+	Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
+	// The format of `data`. Must be `IDENTITY`/unspecified, or one of the
+	// compressors advertised by the
+	// [CacheCapabilities.supported_batch_compressors][build.bazel.remote.execution.v2.CacheCapabilities.supported_batch_compressors]
+	// field.
+	Compressor Compressor_Value `protobuf:"varint,3,opt,name=compressor,proto3,enum=build.bazel.remote.execution.v2.Compressor_Value" json:"compressor,omitempty"`
+}
+
+func (x *BatchUpdateBlobsRequest_Request) Reset() {
+	*x = BatchUpdateBlobsRequest_Request{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[48]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BatchUpdateBlobsRequest_Request) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BatchUpdateBlobsRequest_Request) ProtoMessage() {}
+
+func (x *BatchUpdateBlobsRequest_Request) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[48]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use BatchUpdateBlobsRequest_Request.ProtoReflect.Descriptor instead.
+func (*BatchUpdateBlobsRequest_Request) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{28, 0}
+}
+
+func (x *BatchUpdateBlobsRequest_Request) GetDigest() *Digest {
+	if x != nil {
+		return x.Digest
+	}
+	return nil
+}
+
+func (x *BatchUpdateBlobsRequest_Request) GetData() []byte {
+	if x != nil {
+		return x.Data
+	}
+	return nil
+}
+
+func (x *BatchUpdateBlobsRequest_Request) GetCompressor() Compressor_Value {
+	if x != nil {
+		return x.Compressor
+	}
+	return Compressor_IDENTITY
+}
+
+// A response corresponding to a single blob that the client tried to upload.
+type BatchUpdateBlobsResponse_Response struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The blob digest to which this response corresponds.
+	Digest *Digest `protobuf:"bytes,1,opt,name=digest,proto3" json:"digest,omitempty"`
+	// The result of attempting to upload that blob.
+	Status *status.Status `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"`
+}
+
+func (x *BatchUpdateBlobsResponse_Response) Reset() {
+	*x = BatchUpdateBlobsResponse_Response{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[49]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BatchUpdateBlobsResponse_Response) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BatchUpdateBlobsResponse_Response) ProtoMessage() {}
+
+func (x *BatchUpdateBlobsResponse_Response) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[49]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use BatchUpdateBlobsResponse_Response.ProtoReflect.Descriptor instead.
+func (*BatchUpdateBlobsResponse_Response) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{29, 0}
+}
+
+func (x *BatchUpdateBlobsResponse_Response) GetDigest() *Digest {
+	if x != nil {
+		return x.Digest
+	}
+	return nil
+}
+
+func (x *BatchUpdateBlobsResponse_Response) GetStatus() *status.Status {
+	if x != nil {
+		return x.Status
+	}
+	return nil
+}
+
+// A response corresponding to a single blob that the client tried to download.
+type BatchReadBlobsResponse_Response struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The digest to which this response corresponds.
+	Digest *Digest `protobuf:"bytes,1,opt,name=digest,proto3" json:"digest,omitempty"`
+	// The raw binary data.
+	Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
+	// The format the data is encoded in. MUST be `IDENTITY`/unspecified,
+	// or one of the acceptable compressors specified in the `BatchReadBlobsRequest`.
+	Compressor Compressor_Value `protobuf:"varint,4,opt,name=compressor,proto3,enum=build.bazel.remote.execution.v2.Compressor_Value" json:"compressor,omitempty"`
+	// The result of attempting to download that blob.
+	Status *status.Status `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
+}
+
+func (x *BatchReadBlobsResponse_Response) Reset() {
+	*x = BatchReadBlobsResponse_Response{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[50]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BatchReadBlobsResponse_Response) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BatchReadBlobsResponse_Response) ProtoMessage() {}
+
+func (x *BatchReadBlobsResponse_Response) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[50]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use BatchReadBlobsResponse_Response.ProtoReflect.Descriptor instead.
+func (*BatchReadBlobsResponse_Response) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{31, 0}
+}
+
+func (x *BatchReadBlobsResponse_Response) GetDigest() *Digest {
+	if x != nil {
+		return x.Digest
+	}
+	return nil
+}
+
+func (x *BatchReadBlobsResponse_Response) GetData() []byte {
+	if x != nil {
+		return x.Data
+	}
+	return nil
+}
+
+func (x *BatchReadBlobsResponse_Response) GetCompressor() Compressor_Value {
+	if x != nil {
+		return x.Compressor
+	}
+	return Compressor_IDENTITY
+}
+
+func (x *BatchReadBlobsResponse_Response) GetStatus() *status.Status {
+	if x != nil {
+		return x.Status
+	}
+	return nil
+}
+
+// Supported range of priorities, including boundaries.
+type PriorityCapabilities_PriorityRange struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The minimum numeric value for this priority range, which represents the
+	// most urgent task or longest retained item.
+	MinPriority int32 `protobuf:"varint,1,opt,name=min_priority,json=minPriority,proto3" json:"min_priority,omitempty"`
+	// The maximum numeric value for this priority range, which represents the
+	// least urgent task or shortest retained item.
+	MaxPriority int32 `protobuf:"varint,2,opt,name=max_priority,json=maxPriority,proto3" json:"max_priority,omitempty"`
+}
+
+func (x *PriorityCapabilities_PriorityRange) Reset() {
+	*x = PriorityCapabilities_PriorityRange{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[51]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *PriorityCapabilities_PriorityRange) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PriorityCapabilities_PriorityRange) ProtoMessage() {}
+
+func (x *PriorityCapabilities_PriorityRange) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[51]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use PriorityCapabilities_PriorityRange.ProtoReflect.Descriptor instead.
+func (*PriorityCapabilities_PriorityRange) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{38, 0}
+}
+
+func (x *PriorityCapabilities_PriorityRange) GetMinPriority() int32 {
+	if x != nil {
+		return x.MinPriority
+	}
+	return 0
+}
+
+func (x *PriorityCapabilities_PriorityRange) GetMaxPriority() int32 {
+	if x != nil {
+		return x.MaxPriority
+	}
+	return 0
+}
+
+var File_build_bazel_remote_execution_v2_remote_execution_proto protoreflect.FileDescriptor
+
+var file_build_bazel_remote_execution_v2_remote_execution_proto_rawDesc = []byte{
+	0x0a, 0x36, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2f, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2f, 0x72, 0x65,
+	0x6d, 0x6f, 0x74, 0x65, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76,
+	0x32, 0x2f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69,
+	0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e,
+	0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65,
+	0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x1a, 0x1f, 0x62, 0x75, 0x69, 0x6c, 0x64,
+	0x2f, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2f, 0x73, 0x65, 0x6d, 0x76, 0x65, 0x72, 0x2f, 0x73, 0x65,
+	0x6d, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2f, 0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2f, 0x6f, 0x70, 0x65,
+	0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67,
+	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61,
+	0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74,
+	0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+	0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70,
+	0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+	0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x22, 0xeb, 0x02, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a,
+	0x0e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61,
+	0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75,
+	0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x0d,
+	0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x53, 0x0a,
+	0x11, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x64, 0x69, 0x67, 0x65,
+	0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64,
+	0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78,
+	0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73,
+	0x74, 0x52, 0x0f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x44, 0x69, 0x67, 0x65,
+	0x73, 0x74, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07,
+	0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x64, 0x6f, 0x5f, 0x6e, 0x6f,
+	0x74, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64,
+	0x6f, 0x4e, 0x6f, 0x74, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x61, 0x6c,
+	0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x73, 0x61, 0x6c, 0x74, 0x12, 0x45, 0x0a,
+	0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x29, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65,
+	0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76,
+	0x32, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74,
+	0x66, 0x6f, 0x72, 0x6d, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09,
+	0x22, 0xd2, 0x05, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x1c, 0x0a, 0x09,
+	0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52,
+	0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x71, 0x0a, 0x15, 0x65, 0x6e,
+	0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62,
+	0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x62, 0x75, 0x69, 0x6c,
+	0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65,
+	0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d,
+	0x61, 0x6e, 0x64, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56,
+	0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x14, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e,
+	0x6d, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a,
+	0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20,
+	0x03, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46,
+	0x69, 0x6c, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x12, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x64,
+	0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09,
+	0x42, 0x02, 0x18, 0x01, 0x52, 0x11, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x44, 0x69, 0x72, 0x65,
+	0x63, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75,
+	0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x6f,
+	0x75, 0x74, 0x70, 0x75, 0x74, 0x50, 0x61, 0x74, 0x68, 0x73, 0x12, 0x49, 0x0a, 0x08, 0x70, 0x6c,
+	0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x62,
+	0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74,
+	0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x50,
+	0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x70, 0x6c, 0x61,
+	0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x2b, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67,
+	0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f,
+	0x72, 0x79, 0x12, 0x34, 0x0a, 0x16, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x6e, 0x6f, 0x64,
+	0x65, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03,
+	0x28, 0x09, 0x52, 0x14, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x72,
+	0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x76, 0x0a, 0x17, 0x6f, 0x75, 0x74, 0x70,
+	0x75, 0x74, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x66, 0x6f, 0x72,
+	0x6d, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3e, 0x2e, 0x62, 0x75, 0x69, 0x6c,
+	0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65,
+	0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d,
+	0x61, 0x6e, 0x64, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74,
+	0x6f, 0x72, 0x79, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x15, 0x6f, 0x75, 0x74, 0x70, 0x75,
+	0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74,
+	0x1a, 0x3f, 0x0a, 0x13, 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, 0x14, 0x0a, 0x05, 0x76,
+	0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
+	0x65, 0x22, 0x52, 0x0a, 0x15, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63,
+	0x74, 0x6f, 0x72, 0x79, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x52,
+	0x45, 0x45, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x49, 0x52,
+	0x45, 0x43, 0x54, 0x4f, 0x52, 0x59, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x01, 0x12, 0x16, 0x0a,
+	0x12, 0x54, 0x52, 0x45, 0x45, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54,
+	0x4f, 0x52, 0x59, 0x10, 0x02, 0x22, 0x94, 0x01, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f,
+	0x72, 0x6d, 0x12, 0x52, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73,
+	0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62,
+	0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63,
+	0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72,
+	0x6d, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70,
+	0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x34, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72,
+	0x74, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xc8, 0x02, 0x0a,
+	0x09, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x05, 0x66, 0x69,
+	0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x62, 0x75, 0x69, 0x6c,
+	0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65,
+	0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x46, 0x69, 0x6c, 0x65,
+	0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x50, 0x0a, 0x0b, 0x64,
+	0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,
+	0x32, 0x2e, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72,
+	0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
+	0x76, 0x32, 0x2e, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x4e, 0x6f, 0x64, 0x65,
+	0x52, 0x0b, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, 0x48, 0x0a,
+	0x08, 0x73, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32,
+	0x2c, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65,
+	0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76,
+	0x32, 0x2e, 0x53, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x08, 0x73,
+	0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x12, 0x58, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f,
+	0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x2f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72,
+	0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
+	0x76, 0x32, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65,
+	0x73, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65,
+	0x73, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x22, 0x38, 0x0a, 0x0c, 0x4e, 0x6f, 0x64, 0x65, 0x50,
+	0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76,
+	0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
+	0x65, 0x22, 0xcc, 0x01, 0x0a, 0x0e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72,
+	0x74, 0x69, 0x65, 0x73, 0x12, 0x4d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69,
+	0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64,
+	0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78,
+	0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50,
+	0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+	0x69, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x05, 0x6d, 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, 0x05,
+	0x6d, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x09, 0x75, 0x6e, 0x69, 0x78, 0x5f, 0x6d, 0x6f,
+	0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33,
+	0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x75, 0x6e, 0x69, 0x78, 0x4d, 0x6f, 0x64, 0x65,
+	0x22, 0xea, 0x01, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a,
+	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,
+	0x65, 0x12, 0x3f, 0x0a, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e,
+	0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e,
+	0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x06, 0x64, 0x69, 0x67, 0x65,
+	0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x73, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61,
+	0x62, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x73, 0x45, 0x78, 0x65,
+	0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x58, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f,
+	0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x2f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72,
+	0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
+	0x76, 0x32, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65,
+	0x73, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65,
+	0x73, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x22, 0x64, 0x0a,
+	0x0d, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x12,
+	0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,
+	0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c,
+	0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f,
+	0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x06, 0x64, 0x69, 0x67,
+	0x65, 0x73, 0x74, 0x22, 0x99, 0x01, 0x0a, 0x0b, 0x53, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x4e,
+	0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65,
+	0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12,
+	0x58, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69,
+	0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64,
+	0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78,
+	0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50,
+	0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x50,
+	0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22,
+	0x3b, 0x0a, 0x06, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73,
+	0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x1d, 0x0a,
+	0x0a, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x03, 0x52, 0x09, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0xfd, 0x07, 0x0a,
+	0x16, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d,
+	0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x77, 0x6f, 0x72, 0x6b, 0x65,
+	0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x12,
+	0x45, 0x0a, 0x10, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74,
+	0x61, 0x6d, 0x70, 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, 0x0f, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x54, 0x69, 0x6d,
+	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x50, 0x0a, 0x16, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72,
+	0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
+	0x6d, 0x70, 0x52, 0x14, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54,
+	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x58, 0x0a, 0x1a, 0x77, 0x6f, 0x72, 0x6b,
+	0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d,
+	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67,
+	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54,
+	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x18, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72,
+	0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
+	0x6d, 0x70, 0x12, 0x59, 0x0a, 0x1b, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x65, 0x74, 0x63,
+	0x68, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
+	0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74,
+	0x61, 0x6d, 0x70, 0x52, 0x18, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x65, 0x74, 0x63, 0x68, 0x53,
+	0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x61, 0x0a,
+	0x1f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x63, 0x6f, 0x6d,
+	0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
+	0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
+	0x6d, 0x70, 0x52, 0x1c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x65, 0x74, 0x63, 0x68, 0x43, 0x6f,
+	0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
+	0x12, 0x56, 0x0a, 0x19, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74,
+	0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52,
+	0x17, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54,
+	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x5e, 0x0a, 0x1d, 0x65, 0x78, 0x65, 0x63,
+	0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f,
+	0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
+	0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x1b, 0x65, 0x78, 0x65,
+	0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x54,
+	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x57, 0x0a, 0x1a, 0x76, 0x69, 0x72, 0x74,
+	0x75, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x75,
+	0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 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, 0x18, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c,
+	0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x12, 0x5d, 0x0a, 0x1d, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x75, 0x70, 0x6c, 0x6f,
+	0x61, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
+	0x6d, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73,
+	0x74, 0x61, 0x6d, 0x70, 0x52, 0x1a, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x55, 0x70, 0x6c, 0x6f,
+	0x61, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
+	0x12, 0x65, 0x0a, 0x21, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x75, 0x70, 0x6c, 0x6f, 0x61,
+	0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65,
+	0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f,
+	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69,
+	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x1e, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x55,
+	0x70, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x54, 0x69,
+	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x43, 0x0a, 0x12, 0x61, 0x75, 0x78, 0x69, 0x6c,
+	0x69, 0x61, 0x72, 0x79, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0b, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x11, 0x61, 0x75, 0x78, 0x69, 0x6c,
+	0x69, 0x61, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xd3, 0x06, 0x0a,
+	0x0c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x4e, 0x0a,
+	0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65,
+	0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69,
+	0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65,
+	0x52, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x64, 0x0a,
+	0x14, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x79, 0x6d,
+	0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x62, 0x75,
+	0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65,
+	0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x75,
+	0x74, 0x70, 0x75, 0x74, 0x53, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x42, 0x02, 0x18, 0x01, 0x52,
+	0x12, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x6d, 0x6c, 0x69,
+	0x6e, 0x6b, 0x73, 0x12, 0x57, 0x0a, 0x0f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x73, 0x79,
+	0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x62,
+	0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74,
+	0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x4f,
+	0x75, 0x74, 0x70, 0x75, 0x74, 0x53, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x52, 0x0e, 0x6f, 0x75,
+	0x74, 0x70, 0x75, 0x74, 0x53, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x12, 0x5f, 0x0a, 0x12,
+	0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x69,
+	0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64,
+	0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78,
+	0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75,
+	0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x11, 0x6f, 0x75, 0x74, 0x70,
+	0x75, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, 0x6e, 0x0a,
+	0x19, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72,
+	0x79, 0x5f, 0x73, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b,
+	0x32, 0x2e, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72,
+	0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
+	0x76, 0x32, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x53, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b,
+	0x42, 0x02, 0x18, 0x01, 0x52, 0x17, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x44, 0x69, 0x72, 0x65,
+	0x63, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x12, 0x1b, 0x0a,
+	0x09, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05,
+	0x52, 0x08, 0x65, 0x78, 0x69, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74,
+	0x64, 0x6f, 0x75, 0x74, 0x5f, 0x72, 0x61, 0x77, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09,
+	0x73, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x52, 0x61, 0x77, 0x12, 0x4c, 0x0a, 0x0d, 0x73, 0x74, 0x64,
+	0x6f, 0x75, 0x74, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72,
+	0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
+	0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x0c, 0x73, 0x74, 0x64, 0x6f, 0x75,
+	0x74, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x64, 0x65, 0x72,
+	0x72, 0x5f, 0x72, 0x61, 0x77, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x74, 0x64,
+	0x65, 0x72, 0x72, 0x52, 0x61, 0x77, 0x12, 0x4c, 0x0a, 0x0d, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72,
+	0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e,
+	0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f,
+	0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e,
+	0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x0c, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, 0x44, 0x69,
+	0x67, 0x65, 0x73, 0x74, 0x12, 0x66, 0x0a, 0x12, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f,
+	0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x37, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72,
+	0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
+	0x76, 0x32, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x41, 0x63, 0x74, 0x69, 0x6f,
+	0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x11, 0x65, 0x78, 0x65, 0x63, 0x75,
+	0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4a, 0x04, 0x08, 0x01,
+	0x10, 0x02, 0x22, 0x88, 0x02, 0x0a, 0x0a, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x69, 0x6c,
+	0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x3f, 0x0a, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61,
+	0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75,
+	0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x06,
+	0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x73, 0x5f, 0x65, 0x78, 0x65,
+	0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69,
+	0x73, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63,
+	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x63,
+	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x58, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f,
+	0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x2f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72,
+	0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
+	0x76, 0x32, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65,
+	0x73, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65,
+	0x73, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x8e, 0x01,
+	0x0a, 0x04, 0x54, 0x72, 0x65, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a,
+	0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74,
+	0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79,
+	0x52, 0x04, 0x72, 0x6f, 0x6f, 0x74, 0x12, 0x46, 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72,
+	0x65, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64,
+	0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78,
+	0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x72, 0x65, 0x63,
+	0x74, 0x6f, 0x72, 0x79, 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x8a,
+	0x02, 0x0a, 0x0f, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f,
+	0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x48, 0x0a, 0x0b, 0x74, 0x72, 0x65, 0x65, 0x5f, 0x64,
+	0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75,
+	0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65,
+	0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69,
+	0x67, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x74, 0x72, 0x65, 0x65, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74,
+	0x12, 0x36, 0x0a, 0x17, 0x69, 0x73, 0x5f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x63,
+	0x61, 0x6c, 0x6c, 0x79, 0x5f, 0x73, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28,
+	0x08, 0x52, 0x15, 0x69, 0x73, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c,
+	0x6c, 0x79, 0x53, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x12, 0x5b, 0x0a, 0x15, 0x72, 0x6f, 0x6f, 0x74,
+	0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73,
+	0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e,
+	0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65,
+	0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74,
+	0x52, 0x13, 0x72, 0x6f, 0x6f, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x44,
+	0x69, 0x67, 0x65, 0x73, 0x74, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x9b, 0x01, 0x0a, 0x0d,
+	0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x53, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x12, 0x12, 0x0a,
+	0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74,
+	0x68, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x58, 0x0a, 0x0f, 0x6e, 0x6f, 0x64,
+	0x65, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c,
+	0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f,
+	0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+	0x69, 0x65, 0x73, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+	0x69, 0x65, 0x73, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0x2d, 0x0a, 0x0f, 0x45, 0x78, 0x65,
+	0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1a, 0x0a, 0x08,
+	0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08,
+	0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x30, 0x0a, 0x12, 0x52, 0x65, 0x73, 0x75,
+	0x6c, 0x74, 0x73, 0x43, 0x61, 0x63, 0x68, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1a,
+	0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05,
+	0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0xe5, 0x03, 0x0a, 0x0e, 0x45,
+	0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a,
+	0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61,
+	0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65,
+	0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x73,
+	0x6b, 0x69, 0x70, 0x43, 0x61, 0x63, 0x68, 0x65, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x12, 0x4c,
+	0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18,
+	0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61,
+	0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75,
+	0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x0c,
+	0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x10,
+	0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79,
+	0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62,
+	0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63,
+	0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69,
+	0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74,
+	0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x65, 0x0a, 0x14, 0x72, 0x65, 0x73,
+	0x75, 0x6c, 0x74, 0x73, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63,
+	0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e,
+	0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65,
+	0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74,
+	0x73, 0x43, 0x61, 0x63, 0x68, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x12, 0x72, 0x65,
+	0x73, 0x75, 0x6c, 0x74, 0x73, 0x43, 0x61, 0x63, 0x68, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,
+	0x12, 0x5e, 0x0a, 0x0f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74,
+	0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x35, 0x2e, 0x62, 0x75, 0x69, 0x6c,
+	0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65,
+	0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65,
+	0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65,
+	0x52, 0x0e, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+	0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05,
+	0x10, 0x06, 0x22, 0x71, 0x0a, 0x07, 0x4c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x3f, 0x0a,
+	0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e,
+	0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f,
+	0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e,
+	0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x25,
+	0x0a, 0x0e, 0x68, 0x75, 0x6d, 0x61, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x68, 0x75, 0x6d, 0x61, 0x6e, 0x52, 0x65, 0x61,
+	0x64, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x8f, 0x03, 0x0a, 0x0f, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74,
+	0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x06, 0x72, 0x65, 0x73,
+	0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x62, 0x75, 0x69, 0x6c,
+	0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65,
+	0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x74, 0x69,
+	0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74,
+	0x12, 0x23, 0x0a, 0x0d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c,
+	0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x63, 0x61, 0x63, 0x68, 0x65, 0x64, 0x52,
+	0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72,
+	0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75,
+	0x73, 0x12, 0x61, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x73,
+	0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62,
+	0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63,
+	0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4c,
+	0x6f, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72,
+	0x4c, 0x6f, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18,
+	0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x67,
+	0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72,
+	0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03,
+	0x6b, 0x65, 0x79, 0x12, 0x3e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x28, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c,
+	0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f,
+	0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x76, 0x61,
+	0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x61, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75,
+	0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x22, 0x4f, 0x0a, 0x05, 0x56, 0x61, 0x6c,
+	0x75, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12,
+	0x0f, 0x0a, 0x0b, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x10, 0x01,
+	0x12, 0x0a, 0x0a, 0x06, 0x51, 0x55, 0x45, 0x55, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09,
+	0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x43,
+	0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x04, 0x22, 0x88, 0x03, 0x0a, 0x18, 0x45,
+	0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d,
+	0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x4b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x35, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62,
+	0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63,
+	0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69,
+	0x6f, 0x6e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x73,
+	0x74, 0x61, 0x67, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64,
+	0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75,
+	0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65,
+	0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69,
+	0x67, 0x65, 0x73, 0x74, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x67, 0x65,
+	0x73, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x5f, 0x73, 0x74, 0x72,
+	0x65, 0x61, 0x6d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10,
+	0x73, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4e, 0x61, 0x6d, 0x65,
+	0x12, 0x2c, 0x0a, 0x12, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61,
+	0x6d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x74,
+	0x64, 0x65, 0x72, 0x72, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x75,
+	0x0a, 0x1a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74,
+	0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x37, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c,
+	0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f,
+	0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x41, 0x63, 0x74,
+	0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x18, 0x70, 0x61, 0x72,
+	0x74, 0x69, 0x61, 0x6c, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74,
+	0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2a, 0x0a, 0x14, 0x57, 0x61, 0x69, 0x74, 0x45, 0x78, 0x65,
+	0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a,
+	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,
+	0x65, 0x22, 0xe5, 0x02, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52,
+	0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d,
+	0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d,
+	0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x69, 0x67, 0x65,
+	0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64,
+	0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78,
+	0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73,
+	0x74, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12,
+	0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x73, 0x74, 0x64, 0x6f, 0x75, 0x74,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74,
+	0x64, 0x6f, 0x75, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x73,
+	0x74, 0x64, 0x65, 0x72, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x6e, 0x6c,
+	0x69, 0x6e, 0x65, 0x53, 0x74, 0x64, 0x65, 0x72, 0x72, 0x12, 0x2e, 0x0a, 0x13, 0x69, 0x6e, 0x6c,
+	0x69, 0x6e, 0x65, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73,
+	0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x4f, 0x75,
+	0x74, 0x70, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x5e, 0x0a, 0x0f, 0x64, 0x69, 0x67,
+	0x65, 0x73, 0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01,
+	0x28, 0x0e, 0x32, 0x35, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c,
+	0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f,
+	0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74,
+	0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e, 0x64, 0x69, 0x67, 0x65, 0x73,
+	0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa9, 0x03, 0x0a, 0x19, 0x55, 0x70,
+	0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61,
+	0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c,
+	0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4c, 0x0a, 0x0d,
+	0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65,
+	0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69,
+	0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x0c, 0x61, 0x63,
+	0x74, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x52, 0x0a, 0x0d, 0x61, 0x63,
+	0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x2d, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e,
+	0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e,
+	0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74,
+	0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x65,
+	0x0a, 0x14, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f,
+	0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x62,
+	0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74,
+	0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x52,
+	0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x43, 0x61, 0x63, 0x68, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63,
+	0x79, 0x52, 0x12, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x43, 0x61, 0x63, 0x68, 0x65, 0x50,
+	0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x5e, 0x0a, 0x0f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x5f,
+	0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x35,
+	0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d,
+	0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32,
+	0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
+	0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x46, 0x75, 0x6e,
+	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xea, 0x01, 0x0a, 0x17, 0x46, 0x69, 0x6e, 0x64, 0x4d, 0x69,
+	0x73, 0x73, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61,
+	0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e,
+	0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4a, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x64,
+	0x69, 0x67, 0x65, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62,
+	0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74,
+	0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44,
+	0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x62, 0x44, 0x69, 0x67, 0x65, 0x73,
+	0x74, 0x73, 0x12, 0x5e, 0x0a, 0x0f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x5f, 0x66, 0x75, 0x6e,
+	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x35, 0x2e, 0x62, 0x75,
+	0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65,
+	0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69,
+	0x67, 0x65, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x6c,
+	0x75, 0x65, 0x52, 0x0e, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69,
+	0x6f, 0x6e, 0x22, 0x75, 0x0a, 0x18, 0x46, 0x69, 0x6e, 0x64, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e,
+	0x67, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x59,
+	0x0a, 0x14, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x64,
+	0x69, 0x67, 0x65, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62,
+	0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74,
+	0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44,
+	0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x12, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x42, 0x6c,
+	0x6f, 0x62, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x73, 0x22, 0xb0, 0x03, 0x0a, 0x17, 0x42, 0x61,
+	0x74, 0x63, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63,
+	0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e,
+	0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x5c, 0x0a, 0x08, 0x72, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x62,
+	0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74,
+	0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x42,
+	0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x08,
+	0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x5e, 0x0a, 0x0f, 0x64, 0x69, 0x67, 0x65,
+	0x73, 0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28,
+	0x0e, 0x32, 0x35, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e,
+	0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e,
+	0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69,
+	0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74,
+	0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xb1, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a,
+	0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74,
+	0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x06, 0x64,
+	0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x51, 0x0a, 0x0a, 0x63, 0x6f, 0x6d,
+	0x70, 0x72, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e,
+	0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f,
+	0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e,
+	0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65,
+	0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0xf5, 0x01, 0x0a,
+	0x18, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x62,
+	0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x60, 0x0a, 0x09, 0x72, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x62,
+	0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74,
+	0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x42,
+	0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x1a, 0x77, 0x0a, 0x08, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73,
+	0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e,
+	0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65,
+	0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74,
+	0x52, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74,
+	0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+	0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x22, 0xc9, 0x02, 0x0a, 0x15, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65,
+	0x61, 0x64, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23,
+	0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e,
+	0x61, 0x6d, 0x65, 0x12, 0x41, 0x0a, 0x07, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x73, 0x18, 0x02,
+	0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a,
+	0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74,
+	0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x07, 0x64,
+	0x69, 0x67, 0x65, 0x73, 0x74, 0x73, 0x12, 0x68, 0x0a, 0x16, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74,
+	0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73,
+	0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62,
+	0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63,
+	0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73,
+	0x73, 0x6f, 0x72, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x15, 0x61, 0x63, 0x63, 0x65, 0x70,
+	0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73,
+	0x12, 0x5e, 0x0a, 0x0f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74,
+	0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x35, 0x2e, 0x62, 0x75, 0x69, 0x6c,
+	0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65,
+	0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65,
+	0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65,
+	0x52, 0x0e, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+	0x22, 0xd9, 0x02, 0x0a, 0x16, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x61, 0x64, 0x42, 0x6c,
+	0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x09, 0x72,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40,
+	0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d,
+	0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32,
+	0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x61, 0x64, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x1a, 0xde, 0x01, 0x0a, 0x08,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x64, 0x69, 0x67, 0x65,
+	0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64,
+	0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78,
+	0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73,
+	0x74, 0x52, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74,
+	0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x51, 0x0a,
+	0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28,
+	0x0e, 0x32, 0x31, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e,
+	0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e,
+	0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x2e, 0x56,
+	0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x6f, 0x72,
+	0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x9b, 0x02, 0x0a,
+	0x0e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
+	0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65,
+	0x4e, 0x61, 0x6d, 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x64, 0x69, 0x67,
+	0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c,
+	0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65,
+	0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65,
+	0x73, 0x74, 0x52, 0x0a, 0x72, 0x6f, 0x6f, 0x74, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x1b,
+	0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70,
+	0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x5e, 0x0a, 0x0f, 0x64, 0x69,
+	0x67, 0x65, 0x73, 0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20,
+	0x01, 0x28, 0x0e, 0x32, 0x35, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65,
+	0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69,
+	0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63,
+	0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e, 0x64, 0x69, 0x67, 0x65,
+	0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x87, 0x01, 0x0a, 0x0f, 0x47,
+	0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c,
+	0x0a, 0x0b, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65,
+	0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69,
+	0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x52,
+	0x0b, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f,
+	0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54,
+	0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x3d, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62,
+	0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23,
+	0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e,
+	0x61, 0x6d, 0x65, 0x22, 0xc2, 0x03, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x61,
+	0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x61, 0x0a, 0x12, 0x63, 0x61,
+	0x63, 0x68, 0x65, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62,
+	0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63,
+	0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x43, 0x61,
+	0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x11, 0x63, 0x61, 0x63, 0x68,
+	0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x6d, 0x0a,
+	0x16, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62,
+	0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e,
+	0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f,
+	0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e,
+	0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c,
+	0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x15, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e,
+	0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x50, 0x0a, 0x16,
+	0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x70, 0x69, 0x5f, 0x76,
+	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x62,
+	0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x73, 0x65, 0x6d, 0x76, 0x65,
+	0x72, 0x2e, 0x53, 0x65, 0x6d, 0x56, 0x65, 0x72, 0x52, 0x14, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63,
+	0x61, 0x74, 0x65, 0x64, 0x41, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x42,
+	0x0a, 0x0f, 0x6c, 0x6f, 0x77, 0x5f, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f,
+	0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e,
+	0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x73, 0x65, 0x6d, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x6d,
+	0x56, 0x65, 0x72, 0x52, 0x0d, 0x6c, 0x6f, 0x77, 0x41, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69,
+	0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x10, 0x68, 0x69, 0x67, 0x68, 0x5f, 0x61, 0x70, 0x69, 0x5f, 0x76,
+	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x62,
+	0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x73, 0x65, 0x6d, 0x76, 0x65,
+	0x72, 0x2e, 0x53, 0x65, 0x6d, 0x56, 0x65, 0x72, 0x52, 0x0e, 0x68, 0x69, 0x67, 0x68, 0x41, 0x70,
+	0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x8f, 0x01, 0x0a, 0x0e, 0x44, 0x69, 0x67,
+	0x65, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x7d, 0x0a, 0x05, 0x56,
+	0x61, 0x6c, 0x75, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10,
+	0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x01, 0x12, 0x08, 0x0a,
+	0x04, 0x53, 0x48, 0x41, 0x31, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x44, 0x35, 0x10, 0x03,
+	0x12, 0x07, 0x0a, 0x03, 0x56, 0x53, 0x4f, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x48, 0x41,
+	0x33, 0x38, 0x34, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10,
+	0x06, 0x12, 0x0b, 0x0a, 0x07, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x33, 0x10, 0x07, 0x12, 0x0e,
+	0x0a, 0x0a, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x54, 0x52, 0x45, 0x45, 0x10, 0x08, 0x12, 0x0a,
+	0x0a, 0x06, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x33, 0x10, 0x09, 0x22, 0x46, 0x0a, 0x1d, 0x41, 0x63,
+	0x74, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43,
+	0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x75,
+	0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x08, 0x52, 0x0d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x61, 0x62, 0x6c,
+	0x65, 0x64, 0x22, 0xd2, 0x01, 0x0a, 0x14, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x43,
+	0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x63, 0x0a, 0x0a, 0x70,
+	0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
+	0x43, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65,
+	0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76,
+	0x32, 0x2e, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69,
+	0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x2e, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x52,
+	0x61, 0x6e, 0x67, 0x65, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x69, 0x65, 0x73,
+	0x1a, 0x55, 0x0a, 0x0d, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x52, 0x61, 0x6e, 0x67,
+	0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x69, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74,
+	0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x50, 0x72, 0x69, 0x6f,
+	0x72, 0x69, 0x74, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x72, 0x69, 0x6f,
+	0x72, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x50,
+	0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x50, 0x0a, 0x1b, 0x53, 0x79, 0x6d, 0x6c, 0x69,
+	0x6e, 0x6b, 0x41, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x50, 0x61, 0x74, 0x68, 0x53, 0x74,
+	0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x22, 0x31, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12,
+	0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a,
+	0x44, 0x49, 0x53, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07,
+	0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x10, 0x02, 0x22, 0x46, 0x0a, 0x0a, 0x43, 0x6f, 0x6d,
+	0x70, 0x72, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x38, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65,
+	0x12, 0x0c, 0x0a, 0x08, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x10, 0x00, 0x12, 0x08,
+	0x0a, 0x04, 0x5a, 0x53, 0x54, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x4c,
+	0x41, 0x54, 0x45, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x52, 0x4f, 0x54, 0x4c, 0x49, 0x10,
+	0x03, 0x22, 0xa4, 0x06, 0x0a, 0x11, 0x43, 0x61, 0x63, 0x68, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62,
+	0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x60, 0x0a, 0x10, 0x64, 0x69, 0x67, 0x65, 0x73,
+	0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
+	0x0e, 0x32, 0x35, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e,
+	0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e,
+	0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69,
+	0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74,
+	0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x20, 0x61, 0x63,
+	0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74,
+	0x65, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a,
+	0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74,
+	0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x63,
+	0x68, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69,
+	0x74, 0x69, 0x65, 0x73, 0x52, 0x1d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x63, 0x68,
+	0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74,
+	0x69, 0x65, 0x73, 0x12, 0x75, 0x0a, 0x1b, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x70, 0x72, 0x69,
+	0x6f, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69,
+	0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64,
+	0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78,
+	0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x72, 0x69, 0x6f, 0x72,
+	0x69, 0x74, 0x79, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52,
+	0x19, 0x63, 0x61, 0x63, 0x68, 0x65, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x43, 0x61,
+	0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x1a, 0x6d, 0x61,
+	0x78, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69,
+	0x7a, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x16,
+	0x6d, 0x61, 0x78, 0x42, 0x61, 0x74, 0x63, 0x68, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a,
+	0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x1e, 0x73, 0x79, 0x6d, 0x6c, 0x69,
+	0x6e, 0x6b, 0x5f, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68,
+	0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32,
+	0x42, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65,
+	0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76,
+	0x32, 0x2e, 0x53, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x41, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74,
+	0x65, 0x50, 0x61, 0x74, 0x68, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x56, 0x61,
+	0x6c, 0x75, 0x65, 0x52, 0x1b, 0x73, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x41, 0x62, 0x73, 0x6f,
+	0x6c, 0x75, 0x74, 0x65, 0x50, 0x61, 0x74, 0x68, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79,
+	0x12, 0x66, 0x0a, 0x15, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6f,
+	0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32,
+	0x31, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65,
+	0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76,
+	0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x2e, 0x56, 0x61, 0x6c,
+	0x75, 0x65, 0x52, 0x14, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6d,
+	0x70, 0x72, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x7e, 0x0a, 0x22, 0x73, 0x75, 0x70, 0x70,
+	0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x75, 0x70, 0x64, 0x61,
+	0x74, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x07,
+	0x20, 0x03, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a,
+	0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74,
+	0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x6f,
+	0x72, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x1f, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74,
+	0x65, 0x64, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d,
+	0x70, 0x72, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x22, 0xb7, 0x03, 0x0a, 0x15, 0x45, 0x78, 0x65,
+	0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69,
+	0x65, 0x73, 0x12, 0x5e, 0x0a, 0x0f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x5f, 0x66, 0x75, 0x6e,
+	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x35, 0x2e, 0x62, 0x75,
+	0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65,
+	0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69,
+	0x67, 0x65, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x6c,
+	0x75, 0x65, 0x52, 0x0e, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69,
+	0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c,
+	0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x45, 0x6e,
+	0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x7d, 0x0a, 0x1f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69,
+	0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x63, 0x61, 0x70, 0x61,
+	0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35,
+	0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d,
+	0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32,
+	0x2e, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c,
+	0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x1d, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e,
+	0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69,
+	0x74, 0x69, 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65,
+	0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65,
+	0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74,
+	0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73,
+	0x12, 0x60, 0x0a, 0x10, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74,
+	0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x35, 0x2e, 0x62, 0x75, 0x69,
+	0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e,
+	0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67,
+	0x65, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x75,
+	0x65, 0x52, 0x0f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,
+	0x6e, 0x73, 0x22, 0x4d, 0x0a, 0x0b, 0x54, 0x6f, 0x6f, 0x6c, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c,
+	0x73, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21,
+	0x0a, 0x0c, 0x74, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x6f, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f,
+	0x6e, 0x22, 0xda, 0x02, 0x0a, 0x0f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x74,
+	0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x4f, 0x0a, 0x0c, 0x74, 0x6f, 0x6f, 0x6c, 0x5f, 0x64, 0x65,
+	0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x62, 0x75,
+	0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65,
+	0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x6f,
+	0x6f, 0x6c, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x0b, 0x74, 0x6f, 0x6f, 0x6c, 0x44,
+	0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+	0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x63, 0x74, 0x69, 0x6f,
+	0x6e, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x12, 0x74, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x6e, 0x76, 0x6f,
+	0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x10, 0x74, 0x6f, 0x6f, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49,
+	0x64, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x5f,
+	0x69, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x69, 0x64, 0x18, 0x04,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64,
+	0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x49, 0x64, 0x12, 0x27, 0x0a,
+	0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6e, 0x65, 0x6d, 0x6f, 0x6e, 0x69, 0x63,
+	0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6e,
+	0x65, 0x6d, 0x6f, 0x6e, 0x69, 0x63, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74,
+	0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x72, 0x67, 0x65,
+	0x74, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61,
+	0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x32, 0xb9,
+	0x02, 0x0a, 0x09, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x8e, 0x01, 0x0a,
+	0x07, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x2f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64,
+	0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78,
+	0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75,
+	0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x4f,
+	0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b,
+	0x3a, 0x01, 0x2a, 0x22, 0x26, 0x2f, 0x76, 0x32, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e,
+	0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x2f, 0x61, 0x63, 0x74, 0x69,
+	0x6f, 0x6e, 0x73, 0x3a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x30, 0x01, 0x12, 0x9a, 0x01,
+	0x0a, 0x0d, 0x57, 0x61, 0x69, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12,
+	0x35, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65,
+	0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76,
+	0x32, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+	0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x4f, 0x70, 0x65, 0x72,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x3a, 0x01, 0x2a,
+	0x22, 0x26, 0x2f, 0x76, 0x32, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6f, 0x70, 0x65, 0x72,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x2a, 0x7d, 0x3a, 0x77, 0x61, 0x69, 0x74, 0x45,
+	0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x30, 0x01, 0x32, 0xd6, 0x03, 0x0a, 0x0b, 0x41,
+	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0xd7, 0x01, 0x0a, 0x0f, 0x47,
+	0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x37,
+	0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d,
+	0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32,
+	0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e,
+	0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65,
+	0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+	0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x5c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x56, 0x12, 0x54,
+	0x2f, 0x76, 0x32, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61,
+	0x6d, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73,
+	0x75, 0x6c, 0x74, 0x73, 0x2f, 0x7b, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x69, 0x67,
+	0x65, 0x73, 0x74, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x7d, 0x2f, 0x7b, 0x61, 0x63, 0x74, 0x69, 0x6f,
+	0x6e, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x62, 0x79,
+	0x74, 0x65, 0x73, 0x7d, 0x12, 0xec, 0x01, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41,
+	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x3a, 0x2e, 0x62, 0x75,
+	0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65,
+	0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x70,
+	0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e,
+	0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65,
+	0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+	0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x6b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x65, 0x3a, 0x0d,
+	0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x1a, 0x54, 0x2f,
+	0x76, 0x32, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d,
+	0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75,
+	0x6c, 0x74, 0x73, 0x2f, 0x7b, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x69, 0x67, 0x65,
+	0x73, 0x74, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x7d, 0x2f, 0x7b, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+	0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x62, 0x79, 0x74,
+	0x65, 0x73, 0x7d, 0x32, 0x9b, 0x06, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x41,
+	0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67,
+	0x65, 0x12, 0xbc, 0x01, 0x0a, 0x10, 0x46, 0x69, 0x6e, 0x64, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e,
+	0x67, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x12, 0x38, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62,
+	0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63,
+	0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x4d, 0x69, 0x73,
+	0x73, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x39, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72,
+	0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
+	0x76, 0x32, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x42, 0x6c,
+	0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x33, 0x82, 0xd3, 0xe4,
+	0x93, 0x02, 0x2d, 0x3a, 0x01, 0x2a, 0x22, 0x28, 0x2f, 0x76, 0x32, 0x2f, 0x7b, 0x69, 0x6e, 0x73,
+	0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x2f, 0x62,
+	0x6c, 0x6f, 0x62, 0x73, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67,
+	0x12, 0xbc, 0x01, 0x0a, 0x10, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
+	0x42, 0x6c, 0x6f, 0x62, 0x73, 0x12, 0x38, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61,
+	0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75,
+	0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x64,
+	0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x39, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65,
+	0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76,
+	0x32, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f,
+	0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93,
+	0x02, 0x2d, 0x3a, 0x01, 0x2a, 0x22, 0x28, 0x2f, 0x76, 0x32, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74,
+	0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x2f, 0x62, 0x6c,
+	0x6f, 0x62, 0x73, 0x3a, 0x62, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12,
+	0xb4, 0x01, 0x0a, 0x0e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x61, 0x64, 0x42, 0x6c, 0x6f,
+	0x62, 0x73, 0x12, 0x36, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c,
+	0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f,
+	0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x61, 0x64, 0x42, 0x6c,
+	0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x62, 0x75, 0x69,
+	0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e,
+	0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x61, 0x74,
+	0x63, 0x68, 0x52, 0x65, 0x61, 0x64, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x3a, 0x01, 0x2a, 0x22, 0x26,
+	0x2f, 0x76, 0x32, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61,
+	0x6d, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x2f, 0x62, 0x6c, 0x6f, 0x62, 0x73, 0x3a, 0x62, 0x61, 0x74,
+	0x63, 0x68, 0x52, 0x65, 0x61, 0x64, 0x12, 0xc8, 0x01, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x72,
+	0x65, 0x65, 0x12, 0x2f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c,
+	0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f,
+	0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65,
+	0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69,
+	0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x58, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x52, 0x12, 0x50, 0x2f,
+	0x76, 0x32, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d,
+	0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x2f, 0x62, 0x6c, 0x6f, 0x62, 0x73, 0x2f, 0x7b, 0x72, 0x6f, 0x6f,
+	0x74, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x7d, 0x2f, 0x7b,
+	0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x2e, 0x73, 0x69, 0x7a, 0x65,
+	0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x7d, 0x3a, 0x67, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x30,
+	0x01, 0x32, 0xbd, 0x01, 0x0a, 0x0c, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69,
+	0x65, 0x73, 0x12, 0xac, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69,
+	0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x37, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62,
+	0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63,
+	0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61,
+	0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x33, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65,
+	0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76,
+	0x32, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69,
+	0x74, 0x69, 0x65, 0x73, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, 0x76,
+	0x32, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
+	0x3d, 0x2a, 0x2a, 0x7d, 0x2f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65,
+	0x73, 0x42, 0xb4, 0x01, 0x0a, 0x1f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65,
+	0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69,
+	0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x42, 0x14, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x45, 0x78, 0x65,
+	0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x51, 0x67,
+	0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x62,
+	0x75, 0x69, 0x6c, 0x64, 0x2f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2d, 0x61, 0x70, 0x69, 0x73,
+	0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2f, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2f, 0x72, 0x65, 0x6d,
+	0x6f, 0x74, 0x65, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x32,
+	0x3b, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e,
+	0xa2, 0x02, 0x03, 0x52, 0x45, 0x58, 0xaa, 0x02, 0x1f, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x42,
+	0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x45, 0x78, 0x65, 0x63,
+	0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x32, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescOnce sync.Once
+	file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescData = file_build_bazel_remote_execution_v2_remote_execution_proto_rawDesc
+)
+
+func file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP() []byte {
+	file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescOnce.Do(func() {
+		file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescData = protoimpl.X.CompressGZIP(file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescData)
+	})
+	return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescData
+}
+
+var file_build_bazel_remote_execution_v2_remote_execution_proto_enumTypes = make([]protoimpl.EnumInfo, 5)
+var file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes = make([]protoimpl.MessageInfo, 52)
+var file_build_bazel_remote_execution_v2_remote_execution_proto_goTypes = []interface{}{
+	(Command_OutputDirectoryFormat)(0),         // 0: build.bazel.remote.execution.v2.Command.OutputDirectoryFormat
+	(ExecutionStage_Value)(0),                  // 1: build.bazel.remote.execution.v2.ExecutionStage.Value
+	(DigestFunction_Value)(0),                  // 2: build.bazel.remote.execution.v2.DigestFunction.Value
+	(SymlinkAbsolutePathStrategy_Value)(0),     // 3: build.bazel.remote.execution.v2.SymlinkAbsolutePathStrategy.Value
+	(Compressor_Value)(0),                      // 4: build.bazel.remote.execution.v2.Compressor.Value
+	(*Action)(nil),                             // 5: build.bazel.remote.execution.v2.Action
+	(*Command)(nil),                            // 6: build.bazel.remote.execution.v2.Command
+	(*Platform)(nil),                           // 7: build.bazel.remote.execution.v2.Platform
+	(*Directory)(nil),                          // 8: build.bazel.remote.execution.v2.Directory
+	(*NodeProperty)(nil),                       // 9: build.bazel.remote.execution.v2.NodeProperty
+	(*NodeProperties)(nil),                     // 10: build.bazel.remote.execution.v2.NodeProperties
+	(*FileNode)(nil),                           // 11: build.bazel.remote.execution.v2.FileNode
+	(*DirectoryNode)(nil),                      // 12: build.bazel.remote.execution.v2.DirectoryNode
+	(*SymlinkNode)(nil),                        // 13: build.bazel.remote.execution.v2.SymlinkNode
+	(*Digest)(nil),                             // 14: build.bazel.remote.execution.v2.Digest
+	(*ExecutedActionMetadata)(nil),             // 15: build.bazel.remote.execution.v2.ExecutedActionMetadata
+	(*ActionResult)(nil),                       // 16: build.bazel.remote.execution.v2.ActionResult
+	(*OutputFile)(nil),                         // 17: build.bazel.remote.execution.v2.OutputFile
+	(*Tree)(nil),                               // 18: build.bazel.remote.execution.v2.Tree
+	(*OutputDirectory)(nil),                    // 19: build.bazel.remote.execution.v2.OutputDirectory
+	(*OutputSymlink)(nil),                      // 20: build.bazel.remote.execution.v2.OutputSymlink
+	(*ExecutionPolicy)(nil),                    // 21: build.bazel.remote.execution.v2.ExecutionPolicy
+	(*ResultsCachePolicy)(nil),                 // 22: build.bazel.remote.execution.v2.ResultsCachePolicy
+	(*ExecuteRequest)(nil),                     // 23: build.bazel.remote.execution.v2.ExecuteRequest
+	(*LogFile)(nil),                            // 24: build.bazel.remote.execution.v2.LogFile
+	(*ExecuteResponse)(nil),                    // 25: build.bazel.remote.execution.v2.ExecuteResponse
+	(*ExecutionStage)(nil),                     // 26: build.bazel.remote.execution.v2.ExecutionStage
+	(*ExecuteOperationMetadata)(nil),           // 27: build.bazel.remote.execution.v2.ExecuteOperationMetadata
+	(*WaitExecutionRequest)(nil),               // 28: build.bazel.remote.execution.v2.WaitExecutionRequest
+	(*GetActionResultRequest)(nil),             // 29: build.bazel.remote.execution.v2.GetActionResultRequest
+	(*UpdateActionResultRequest)(nil),          // 30: build.bazel.remote.execution.v2.UpdateActionResultRequest
+	(*FindMissingBlobsRequest)(nil),            // 31: build.bazel.remote.execution.v2.FindMissingBlobsRequest
+	(*FindMissingBlobsResponse)(nil),           // 32: build.bazel.remote.execution.v2.FindMissingBlobsResponse
+	(*BatchUpdateBlobsRequest)(nil),            // 33: build.bazel.remote.execution.v2.BatchUpdateBlobsRequest
+	(*BatchUpdateBlobsResponse)(nil),           // 34: build.bazel.remote.execution.v2.BatchUpdateBlobsResponse
+	(*BatchReadBlobsRequest)(nil),              // 35: build.bazel.remote.execution.v2.BatchReadBlobsRequest
+	(*BatchReadBlobsResponse)(nil),             // 36: build.bazel.remote.execution.v2.BatchReadBlobsResponse
+	(*GetTreeRequest)(nil),                     // 37: build.bazel.remote.execution.v2.GetTreeRequest
+	(*GetTreeResponse)(nil),                    // 38: build.bazel.remote.execution.v2.GetTreeResponse
+	(*GetCapabilitiesRequest)(nil),             // 39: build.bazel.remote.execution.v2.GetCapabilitiesRequest
+	(*ServerCapabilities)(nil),                 // 40: build.bazel.remote.execution.v2.ServerCapabilities
+	(*DigestFunction)(nil),                     // 41: build.bazel.remote.execution.v2.DigestFunction
+	(*ActionCacheUpdateCapabilities)(nil),      // 42: build.bazel.remote.execution.v2.ActionCacheUpdateCapabilities
+	(*PriorityCapabilities)(nil),               // 43: build.bazel.remote.execution.v2.PriorityCapabilities
+	(*SymlinkAbsolutePathStrategy)(nil),        // 44: build.bazel.remote.execution.v2.SymlinkAbsolutePathStrategy
+	(*Compressor)(nil),                         // 45: build.bazel.remote.execution.v2.Compressor
+	(*CacheCapabilities)(nil),                  // 46: build.bazel.remote.execution.v2.CacheCapabilities
+	(*ExecutionCapabilities)(nil),              // 47: build.bazel.remote.execution.v2.ExecutionCapabilities
+	(*ToolDetails)(nil),                        // 48: build.bazel.remote.execution.v2.ToolDetails
+	(*RequestMetadata)(nil),                    // 49: build.bazel.remote.execution.v2.RequestMetadata
+	(*Command_EnvironmentVariable)(nil),        // 50: build.bazel.remote.execution.v2.Command.EnvironmentVariable
+	(*Platform_Property)(nil),                  // 51: build.bazel.remote.execution.v2.Platform.Property
+	nil,                                        // 52: build.bazel.remote.execution.v2.ExecuteResponse.ServerLogsEntry
+	(*BatchUpdateBlobsRequest_Request)(nil),    // 53: build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.Request
+	(*BatchUpdateBlobsResponse_Response)(nil),  // 54: build.bazel.remote.execution.v2.BatchUpdateBlobsResponse.Response
+	(*BatchReadBlobsResponse_Response)(nil),    // 55: build.bazel.remote.execution.v2.BatchReadBlobsResponse.Response
+	(*PriorityCapabilities_PriorityRange)(nil), // 56: build.bazel.remote.execution.v2.PriorityCapabilities.PriorityRange
+	(*durationpb.Duration)(nil),                // 57: google.protobuf.Duration
+	(*timestamppb.Timestamp)(nil),              // 58: google.protobuf.Timestamp
+	(*wrapperspb.UInt32Value)(nil),             // 59: google.protobuf.UInt32Value
+	(*anypb.Any)(nil),                          // 60: google.protobuf.Any
+	(*status.Status)(nil),                      // 61: google.rpc.Status
+	(*semver.SemVer)(nil),                      // 62: build.bazel.semver.SemVer
+	(*longrunning.Operation)(nil),              // 63: google.longrunning.Operation
+}
+var file_build_bazel_remote_execution_v2_remote_execution_proto_depIdxs = []int32{
+	14,  // 0: build.bazel.remote.execution.v2.Action.command_digest:type_name -> build.bazel.remote.execution.v2.Digest
+	14,  // 1: build.bazel.remote.execution.v2.Action.input_root_digest:type_name -> build.bazel.remote.execution.v2.Digest
+	57,  // 2: build.bazel.remote.execution.v2.Action.timeout:type_name -> google.protobuf.Duration
+	7,   // 3: build.bazel.remote.execution.v2.Action.platform:type_name -> build.bazel.remote.execution.v2.Platform
+	50,  // 4: build.bazel.remote.execution.v2.Command.environment_variables:type_name -> build.bazel.remote.execution.v2.Command.EnvironmentVariable
+	7,   // 5: build.bazel.remote.execution.v2.Command.platform:type_name -> build.bazel.remote.execution.v2.Platform
+	0,   // 6: build.bazel.remote.execution.v2.Command.output_directory_format:type_name -> build.bazel.remote.execution.v2.Command.OutputDirectoryFormat
+	51,  // 7: build.bazel.remote.execution.v2.Platform.properties:type_name -> build.bazel.remote.execution.v2.Platform.Property
+	11,  // 8: build.bazel.remote.execution.v2.Directory.files:type_name -> build.bazel.remote.execution.v2.FileNode
+	12,  // 9: build.bazel.remote.execution.v2.Directory.directories:type_name -> build.bazel.remote.execution.v2.DirectoryNode
+	13,  // 10: build.bazel.remote.execution.v2.Directory.symlinks:type_name -> build.bazel.remote.execution.v2.SymlinkNode
+	10,  // 11: build.bazel.remote.execution.v2.Directory.node_properties:type_name -> build.bazel.remote.execution.v2.NodeProperties
+	9,   // 12: build.bazel.remote.execution.v2.NodeProperties.properties:type_name -> build.bazel.remote.execution.v2.NodeProperty
+	58,  // 13: build.bazel.remote.execution.v2.NodeProperties.mtime:type_name -> google.protobuf.Timestamp
+	59,  // 14: build.bazel.remote.execution.v2.NodeProperties.unix_mode:type_name -> google.protobuf.UInt32Value
+	14,  // 15: build.bazel.remote.execution.v2.FileNode.digest:type_name -> build.bazel.remote.execution.v2.Digest
+	10,  // 16: build.bazel.remote.execution.v2.FileNode.node_properties:type_name -> build.bazel.remote.execution.v2.NodeProperties
+	14,  // 17: build.bazel.remote.execution.v2.DirectoryNode.digest:type_name -> build.bazel.remote.execution.v2.Digest
+	10,  // 18: build.bazel.remote.execution.v2.SymlinkNode.node_properties:type_name -> build.bazel.remote.execution.v2.NodeProperties
+	58,  // 19: build.bazel.remote.execution.v2.ExecutedActionMetadata.queued_timestamp:type_name -> google.protobuf.Timestamp
+	58,  // 20: build.bazel.remote.execution.v2.ExecutedActionMetadata.worker_start_timestamp:type_name -> google.protobuf.Timestamp
+	58,  // 21: build.bazel.remote.execution.v2.ExecutedActionMetadata.worker_completed_timestamp:type_name -> google.protobuf.Timestamp
+	58,  // 22: build.bazel.remote.execution.v2.ExecutedActionMetadata.input_fetch_start_timestamp:type_name -> google.protobuf.Timestamp
+	58,  // 23: build.bazel.remote.execution.v2.ExecutedActionMetadata.input_fetch_completed_timestamp:type_name -> google.protobuf.Timestamp
+	58,  // 24: build.bazel.remote.execution.v2.ExecutedActionMetadata.execution_start_timestamp:type_name -> google.protobuf.Timestamp
+	58,  // 25: build.bazel.remote.execution.v2.ExecutedActionMetadata.execution_completed_timestamp:type_name -> google.protobuf.Timestamp
+	57,  // 26: build.bazel.remote.execution.v2.ExecutedActionMetadata.virtual_execution_duration:type_name -> google.protobuf.Duration
+	58,  // 27: build.bazel.remote.execution.v2.ExecutedActionMetadata.output_upload_start_timestamp:type_name -> google.protobuf.Timestamp
+	58,  // 28: build.bazel.remote.execution.v2.ExecutedActionMetadata.output_upload_completed_timestamp:type_name -> google.protobuf.Timestamp
+	60,  // 29: build.bazel.remote.execution.v2.ExecutedActionMetadata.auxiliary_metadata:type_name -> google.protobuf.Any
+	17,  // 30: build.bazel.remote.execution.v2.ActionResult.output_files:type_name -> build.bazel.remote.execution.v2.OutputFile
+	20,  // 31: build.bazel.remote.execution.v2.ActionResult.output_file_symlinks:type_name -> build.bazel.remote.execution.v2.OutputSymlink
+	20,  // 32: build.bazel.remote.execution.v2.ActionResult.output_symlinks:type_name -> build.bazel.remote.execution.v2.OutputSymlink
+	19,  // 33: build.bazel.remote.execution.v2.ActionResult.output_directories:type_name -> build.bazel.remote.execution.v2.OutputDirectory
+	20,  // 34: build.bazel.remote.execution.v2.ActionResult.output_directory_symlinks:type_name -> build.bazel.remote.execution.v2.OutputSymlink
+	14,  // 35: build.bazel.remote.execution.v2.ActionResult.stdout_digest:type_name -> build.bazel.remote.execution.v2.Digest
+	14,  // 36: build.bazel.remote.execution.v2.ActionResult.stderr_digest:type_name -> build.bazel.remote.execution.v2.Digest
+	15,  // 37: build.bazel.remote.execution.v2.ActionResult.execution_metadata:type_name -> build.bazel.remote.execution.v2.ExecutedActionMetadata
+	14,  // 38: build.bazel.remote.execution.v2.OutputFile.digest:type_name -> build.bazel.remote.execution.v2.Digest
+	10,  // 39: build.bazel.remote.execution.v2.OutputFile.node_properties:type_name -> build.bazel.remote.execution.v2.NodeProperties
+	8,   // 40: build.bazel.remote.execution.v2.Tree.root:type_name -> build.bazel.remote.execution.v2.Directory
+	8,   // 41: build.bazel.remote.execution.v2.Tree.children:type_name -> build.bazel.remote.execution.v2.Directory
+	14,  // 42: build.bazel.remote.execution.v2.OutputDirectory.tree_digest:type_name -> build.bazel.remote.execution.v2.Digest
+	14,  // 43: build.bazel.remote.execution.v2.OutputDirectory.root_directory_digest:type_name -> build.bazel.remote.execution.v2.Digest
+	10,  // 44: build.bazel.remote.execution.v2.OutputSymlink.node_properties:type_name -> build.bazel.remote.execution.v2.NodeProperties
+	14,  // 45: build.bazel.remote.execution.v2.ExecuteRequest.action_digest:type_name -> build.bazel.remote.execution.v2.Digest
+	21,  // 46: build.bazel.remote.execution.v2.ExecuteRequest.execution_policy:type_name -> build.bazel.remote.execution.v2.ExecutionPolicy
+	22,  // 47: build.bazel.remote.execution.v2.ExecuteRequest.results_cache_policy:type_name -> build.bazel.remote.execution.v2.ResultsCachePolicy
+	2,   // 48: build.bazel.remote.execution.v2.ExecuteRequest.digest_function:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value
+	14,  // 49: build.bazel.remote.execution.v2.LogFile.digest:type_name -> build.bazel.remote.execution.v2.Digest
+	16,  // 50: build.bazel.remote.execution.v2.ExecuteResponse.result:type_name -> build.bazel.remote.execution.v2.ActionResult
+	61,  // 51: build.bazel.remote.execution.v2.ExecuteResponse.status:type_name -> google.rpc.Status
+	52,  // 52: build.bazel.remote.execution.v2.ExecuteResponse.server_logs:type_name -> build.bazel.remote.execution.v2.ExecuteResponse.ServerLogsEntry
+	1,   // 53: build.bazel.remote.execution.v2.ExecuteOperationMetadata.stage:type_name -> build.bazel.remote.execution.v2.ExecutionStage.Value
+	14,  // 54: build.bazel.remote.execution.v2.ExecuteOperationMetadata.action_digest:type_name -> build.bazel.remote.execution.v2.Digest
+	15,  // 55: build.bazel.remote.execution.v2.ExecuteOperationMetadata.partial_execution_metadata:type_name -> build.bazel.remote.execution.v2.ExecutedActionMetadata
+	14,  // 56: build.bazel.remote.execution.v2.GetActionResultRequest.action_digest:type_name -> build.bazel.remote.execution.v2.Digest
+	2,   // 57: build.bazel.remote.execution.v2.GetActionResultRequest.digest_function:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value
+	14,  // 58: build.bazel.remote.execution.v2.UpdateActionResultRequest.action_digest:type_name -> build.bazel.remote.execution.v2.Digest
+	16,  // 59: build.bazel.remote.execution.v2.UpdateActionResultRequest.action_result:type_name -> build.bazel.remote.execution.v2.ActionResult
+	22,  // 60: build.bazel.remote.execution.v2.UpdateActionResultRequest.results_cache_policy:type_name -> build.bazel.remote.execution.v2.ResultsCachePolicy
+	2,   // 61: build.bazel.remote.execution.v2.UpdateActionResultRequest.digest_function:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value
+	14,  // 62: build.bazel.remote.execution.v2.FindMissingBlobsRequest.blob_digests:type_name -> build.bazel.remote.execution.v2.Digest
+	2,   // 63: build.bazel.remote.execution.v2.FindMissingBlobsRequest.digest_function:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value
+	14,  // 64: build.bazel.remote.execution.v2.FindMissingBlobsResponse.missing_blob_digests:type_name -> build.bazel.remote.execution.v2.Digest
+	53,  // 65: build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.requests:type_name -> build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.Request
+	2,   // 66: build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.digest_function:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value
+	54,  // 67: build.bazel.remote.execution.v2.BatchUpdateBlobsResponse.responses:type_name -> build.bazel.remote.execution.v2.BatchUpdateBlobsResponse.Response
+	14,  // 68: build.bazel.remote.execution.v2.BatchReadBlobsRequest.digests:type_name -> build.bazel.remote.execution.v2.Digest
+	4,   // 69: build.bazel.remote.execution.v2.BatchReadBlobsRequest.acceptable_compressors:type_name -> build.bazel.remote.execution.v2.Compressor.Value
+	2,   // 70: build.bazel.remote.execution.v2.BatchReadBlobsRequest.digest_function:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value
+	55,  // 71: build.bazel.remote.execution.v2.BatchReadBlobsResponse.responses:type_name -> build.bazel.remote.execution.v2.BatchReadBlobsResponse.Response
+	14,  // 72: build.bazel.remote.execution.v2.GetTreeRequest.root_digest:type_name -> build.bazel.remote.execution.v2.Digest
+	2,   // 73: build.bazel.remote.execution.v2.GetTreeRequest.digest_function:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value
+	8,   // 74: build.bazel.remote.execution.v2.GetTreeResponse.directories:type_name -> build.bazel.remote.execution.v2.Directory
+	46,  // 75: build.bazel.remote.execution.v2.ServerCapabilities.cache_capabilities:type_name -> build.bazel.remote.execution.v2.CacheCapabilities
+	47,  // 76: build.bazel.remote.execution.v2.ServerCapabilities.execution_capabilities:type_name -> build.bazel.remote.execution.v2.ExecutionCapabilities
+	62,  // 77: build.bazel.remote.execution.v2.ServerCapabilities.deprecated_api_version:type_name -> build.bazel.semver.SemVer
+	62,  // 78: build.bazel.remote.execution.v2.ServerCapabilities.low_api_version:type_name -> build.bazel.semver.SemVer
+	62,  // 79: build.bazel.remote.execution.v2.ServerCapabilities.high_api_version:type_name -> build.bazel.semver.SemVer
+	56,  // 80: build.bazel.remote.execution.v2.PriorityCapabilities.priorities:type_name -> build.bazel.remote.execution.v2.PriorityCapabilities.PriorityRange
+	2,   // 81: build.bazel.remote.execution.v2.CacheCapabilities.digest_functions:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value
+	42,  // 82: build.bazel.remote.execution.v2.CacheCapabilities.action_cache_update_capabilities:type_name -> build.bazel.remote.execution.v2.ActionCacheUpdateCapabilities
+	43,  // 83: build.bazel.remote.execution.v2.CacheCapabilities.cache_priority_capabilities:type_name -> build.bazel.remote.execution.v2.PriorityCapabilities
+	3,   // 84: build.bazel.remote.execution.v2.CacheCapabilities.symlink_absolute_path_strategy:type_name -> build.bazel.remote.execution.v2.SymlinkAbsolutePathStrategy.Value
+	4,   // 85: build.bazel.remote.execution.v2.CacheCapabilities.supported_compressors:type_name -> build.bazel.remote.execution.v2.Compressor.Value
+	4,   // 86: build.bazel.remote.execution.v2.CacheCapabilities.supported_batch_update_compressors:type_name -> build.bazel.remote.execution.v2.Compressor.Value
+	2,   // 87: build.bazel.remote.execution.v2.ExecutionCapabilities.digest_function:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value
+	43,  // 88: build.bazel.remote.execution.v2.ExecutionCapabilities.execution_priority_capabilities:type_name -> build.bazel.remote.execution.v2.PriorityCapabilities
+	2,   // 89: build.bazel.remote.execution.v2.ExecutionCapabilities.digest_functions:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value
+	48,  // 90: build.bazel.remote.execution.v2.RequestMetadata.tool_details:type_name -> build.bazel.remote.execution.v2.ToolDetails
+	24,  // 91: build.bazel.remote.execution.v2.ExecuteResponse.ServerLogsEntry.value:type_name -> build.bazel.remote.execution.v2.LogFile
+	14,  // 92: build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.Request.digest:type_name -> build.bazel.remote.execution.v2.Digest
+	4,   // 93: build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.Request.compressor:type_name -> build.bazel.remote.execution.v2.Compressor.Value
+	14,  // 94: build.bazel.remote.execution.v2.BatchUpdateBlobsResponse.Response.digest:type_name -> build.bazel.remote.execution.v2.Digest
+	61,  // 95: build.bazel.remote.execution.v2.BatchUpdateBlobsResponse.Response.status:type_name -> google.rpc.Status
+	14,  // 96: build.bazel.remote.execution.v2.BatchReadBlobsResponse.Response.digest:type_name -> build.bazel.remote.execution.v2.Digest
+	4,   // 97: build.bazel.remote.execution.v2.BatchReadBlobsResponse.Response.compressor:type_name -> build.bazel.remote.execution.v2.Compressor.Value
+	61,  // 98: build.bazel.remote.execution.v2.BatchReadBlobsResponse.Response.status:type_name -> google.rpc.Status
+	23,  // 99: build.bazel.remote.execution.v2.Execution.Execute:input_type -> build.bazel.remote.execution.v2.ExecuteRequest
+	28,  // 100: build.bazel.remote.execution.v2.Execution.WaitExecution:input_type -> build.bazel.remote.execution.v2.WaitExecutionRequest
+	29,  // 101: build.bazel.remote.execution.v2.ActionCache.GetActionResult:input_type -> build.bazel.remote.execution.v2.GetActionResultRequest
+	30,  // 102: build.bazel.remote.execution.v2.ActionCache.UpdateActionResult:input_type -> build.bazel.remote.execution.v2.UpdateActionResultRequest
+	31,  // 103: build.bazel.remote.execution.v2.ContentAddressableStorage.FindMissingBlobs:input_type -> build.bazel.remote.execution.v2.FindMissingBlobsRequest
+	33,  // 104: build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs:input_type -> build.bazel.remote.execution.v2.BatchUpdateBlobsRequest
+	35,  // 105: build.bazel.remote.execution.v2.ContentAddressableStorage.BatchReadBlobs:input_type -> build.bazel.remote.execution.v2.BatchReadBlobsRequest
+	37,  // 106: build.bazel.remote.execution.v2.ContentAddressableStorage.GetTree:input_type -> build.bazel.remote.execution.v2.GetTreeRequest
+	39,  // 107: build.bazel.remote.execution.v2.Capabilities.GetCapabilities:input_type -> build.bazel.remote.execution.v2.GetCapabilitiesRequest
+	63,  // 108: build.bazel.remote.execution.v2.Execution.Execute:output_type -> google.longrunning.Operation
+	63,  // 109: build.bazel.remote.execution.v2.Execution.WaitExecution:output_type -> google.longrunning.Operation
+	16,  // 110: build.bazel.remote.execution.v2.ActionCache.GetActionResult:output_type -> build.bazel.remote.execution.v2.ActionResult
+	16,  // 111: build.bazel.remote.execution.v2.ActionCache.UpdateActionResult:output_type -> build.bazel.remote.execution.v2.ActionResult
+	32,  // 112: build.bazel.remote.execution.v2.ContentAddressableStorage.FindMissingBlobs:output_type -> build.bazel.remote.execution.v2.FindMissingBlobsResponse
+	34,  // 113: build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs:output_type -> build.bazel.remote.execution.v2.BatchUpdateBlobsResponse
+	36,  // 114: build.bazel.remote.execution.v2.ContentAddressableStorage.BatchReadBlobs:output_type -> build.bazel.remote.execution.v2.BatchReadBlobsResponse
+	38,  // 115: build.bazel.remote.execution.v2.ContentAddressableStorage.GetTree:output_type -> build.bazel.remote.execution.v2.GetTreeResponse
+	40,  // 116: build.bazel.remote.execution.v2.Capabilities.GetCapabilities:output_type -> build.bazel.remote.execution.v2.ServerCapabilities
+	108, // [108:117] is the sub-list for method output_type
+	99,  // [99:108] is the sub-list for method input_type
+	99,  // [99:99] is the sub-list for extension type_name
+	99,  // [99:99] is the sub-list for extension extendee
+	0,   // [0:99] is the sub-list for field type_name
+}
+
+func init() { file_build_bazel_remote_execution_v2_remote_execution_proto_init() }
+func file_build_bazel_remote_execution_v2_remote_execution_proto_init() {
+	if File_build_bazel_remote_execution_v2_remote_execution_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Action); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Command); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Platform); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Directory); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*NodeProperty); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*NodeProperties); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*FileNode); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DirectoryNode); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SymlinkNode); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Digest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ExecutedActionMetadata); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ActionResult); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*OutputFile); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Tree); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*OutputDirectory); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*OutputSymlink); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ExecutionPolicy); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ResultsCachePolicy); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ExecuteRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*LogFile); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ExecuteResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ExecutionStage); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ExecuteOperationMetadata); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*WaitExecutionRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetActionResultRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*UpdateActionResultRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*FindMissingBlobsRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*FindMissingBlobsResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BatchUpdateBlobsRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BatchUpdateBlobsResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BatchReadBlobsRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BatchReadBlobsResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetTreeRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetTreeResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetCapabilitiesRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ServerCapabilities); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DigestFunction); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ActionCacheUpdateCapabilities); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*PriorityCapabilities); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SymlinkAbsolutePathStrategy); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Compressor); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CacheCapabilities); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ExecutionCapabilities); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ToolDetails); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*RequestMetadata); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Command_EnvironmentVariable); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Platform_Property); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BatchUpdateBlobsRequest_Request); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BatchUpdateBlobsResponse_Response); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BatchReadBlobsResponse_Response); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*PriorityCapabilities_PriorityRange); 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_build_bazel_remote_execution_v2_remote_execution_proto_rawDesc,
+			NumEnums:      5,
+			NumMessages:   52,
+			NumExtensions: 0,
+			NumServices:   4,
+		},
+		GoTypes:           file_build_bazel_remote_execution_v2_remote_execution_proto_goTypes,
+		DependencyIndexes: file_build_bazel_remote_execution_v2_remote_execution_proto_depIdxs,
+		EnumInfos:         file_build_bazel_remote_execution_v2_remote_execution_proto_enumTypes,
+		MessageInfos:      file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes,
+	}.Build()
+	File_build_bazel_remote_execution_v2_remote_execution_proto = out.File
+	file_build_bazel_remote_execution_v2_remote_execution_proto_rawDesc = nil
+	file_build_bazel_remote_execution_v2_remote_execution_proto_goTypes = nil
+	file_build_bazel_remote_execution_v2_remote_execution_proto_depIdxs = nil
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// ExecutionClient is the client API for Execution service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type ExecutionClient interface {
+	// Execute an action remotely.
+	//
+	// In order to execute an action, the client must first upload all of the
+	// inputs, the
+	// [Command][build.bazel.remote.execution.v2.Command] to run, and the
+	// [Action][build.bazel.remote.execution.v2.Action] into the
+	// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
+	// It then calls `Execute` with an `action_digest` referring to them. The
+	// server will run the action and eventually return the result.
+	//
+	// The input `Action`'s fields MUST meet the various canonicalization
+	// requirements specified in the documentation for their types so that it has
+	// the same digest as other logically equivalent `Action`s. The server MAY
+	// enforce the requirements and return errors if a non-canonical input is
+	// received. It MAY also proceed without verifying some or all of the
+	// requirements, such as for performance reasons. If the server does not
+	// verify the requirement, then it will treat the `Action` as distinct from
+	// another logically equivalent action if they hash differently.
+	//
+	// Returns a stream of
+	// [google.longrunning.Operation][google.longrunning.Operation] messages
+	// describing the resulting execution, with eventual `response`
+	// [ExecuteResponse][build.bazel.remote.execution.v2.ExecuteResponse]. The
+	// `metadata` on the operation is of type
+	// [ExecuteOperationMetadata][build.bazel.remote.execution.v2.ExecuteOperationMetadata].
+	//
+	// If the client remains connected after the first response is returned after
+	// the server, then updates are streamed as if the client had called
+	// [WaitExecution][build.bazel.remote.execution.v2.Execution.WaitExecution]
+	// until the execution completes or the request reaches an error. The
+	// operation can also be queried using [Operations
+	// API][google.longrunning.Operations.GetOperation].
+	//
+	// The server NEED NOT implement other methods or functionality of the
+	// Operations API.
+	//
+	// Errors discovered during creation of the `Operation` will be reported
+	// as gRPC Status errors, while errors that occurred while running the
+	// action will be reported in the `status` field of the `ExecuteResponse`. The
+	// server MUST NOT set the `error` field of the `Operation` proto.
+	// The possible errors include:
+	//
+	//   - `INVALID_ARGUMENT`: One or more arguments are invalid.
+	//   - `FAILED_PRECONDITION`: One or more errors occurred in setting up the
+	//     action requested, such as a missing input or command or no worker being
+	//     available. The client may be able to fix the errors and retry.
+	//   - `RESOURCE_EXHAUSTED`: There is insufficient quota of some resource to run
+	//     the action.
+	//   - `UNAVAILABLE`: Due to a transient condition, such as all workers being
+	//     occupied (and the server does not support a queue), the action could not
+	//     be started. The client should retry.
+	//   - `INTERNAL`: An internal error occurred in the execution engine or the
+	//     worker.
+	//   - `DEADLINE_EXCEEDED`: The execution timed out.
+	//   - `CANCELLED`: The operation was cancelled by the client. This status is
+	//     only possible if the server implements the Operations API CancelOperation
+	//     method, and it was called for the current execution.
+	//
+	// In the case of a missing input or command, the server SHOULD additionally
+	// send a [PreconditionFailure][google.rpc.PreconditionFailure] error detail
+	// where, for each requested blob not present in the CAS, there is a
+	// `Violation` with a `type` of `MISSING` and a `subject` of
+	// `"blobs/{digest_function/}{hash}/{size}"` indicating the digest of the
+	// missing blob. The `subject` is formatted the same way as the
+	// `resource_name` provided to
+	// [ByteStream.Read][google.bytestream.ByteStream.Read], with the leading
+	// instance name omitted. `digest_function` MUST thus be omitted if its value
+	// is one of MD5, MURMUR3, SHA1, SHA256, SHA384, SHA512, or VSO.
+	//
+	// The server does not need to guarantee that a call to this method leads to
+	// at most one execution of the action. The server MAY execute the action
+	// multiple times, potentially in parallel. These redundant executions MAY
+	// continue to run, even if the operation is completed.
+	Execute(ctx context.Context, in *ExecuteRequest, opts ...grpc.CallOption) (Execution_ExecuteClient, error)
+	// Wait for an execution operation to complete. When the client initially
+	// makes the request, the server immediately responds with the current status
+	// of the execution. The server will leave the request stream open until the
+	// operation completes, and then respond with the completed operation. The
+	// server MAY choose to stream additional updates as execution progresses,
+	// such as to provide an update as to the state of the execution.
+	//
+	// In addition to the cases describe for Execute, the WaitExecution method
+	// may fail as follows:
+	//
+	//   - `NOT_FOUND`: The operation no longer exists due to any of a transient
+	//     condition, an unknown operation name, or if the server implements the
+	//     Operations API DeleteOperation method and it was called for the current
+	//     execution. The client should call `Execute` to retry.
+	WaitExecution(ctx context.Context, in *WaitExecutionRequest, opts ...grpc.CallOption) (Execution_WaitExecutionClient, error)
+}
+
+type executionClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewExecutionClient(cc grpc.ClientConnInterface) ExecutionClient {
+	return &executionClient{cc}
+}
+
+func (c *executionClient) Execute(ctx context.Context, in *ExecuteRequest, opts ...grpc.CallOption) (Execution_ExecuteClient, error) {
+	stream, err := c.cc.NewStream(ctx, &_Execution_serviceDesc.Streams[0], "/build.bazel.remote.execution.v2.Execution/Execute", opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &executionExecuteClient{stream}
+	if err := x.ClientStream.SendMsg(in); err != nil {
+		return nil, err
+	}
+	if err := x.ClientStream.CloseSend(); err != nil {
+		return nil, err
+	}
+	return x, nil
+}
+
+type Execution_ExecuteClient interface {
+	Recv() (*longrunning.Operation, error)
+	grpc.ClientStream
+}
+
+type executionExecuteClient struct {
+	grpc.ClientStream
+}
+
+func (x *executionExecuteClient) Recv() (*longrunning.Operation, error) {
+	m := new(longrunning.Operation)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+func (c *executionClient) WaitExecution(ctx context.Context, in *WaitExecutionRequest, opts ...grpc.CallOption) (Execution_WaitExecutionClient, error) {
+	stream, err := c.cc.NewStream(ctx, &_Execution_serviceDesc.Streams[1], "/build.bazel.remote.execution.v2.Execution/WaitExecution", opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &executionWaitExecutionClient{stream}
+	if err := x.ClientStream.SendMsg(in); err != nil {
+		return nil, err
+	}
+	if err := x.ClientStream.CloseSend(); err != nil {
+		return nil, err
+	}
+	return x, nil
+}
+
+type Execution_WaitExecutionClient interface {
+	Recv() (*longrunning.Operation, error)
+	grpc.ClientStream
+}
+
+type executionWaitExecutionClient struct {
+	grpc.ClientStream
+}
+
+func (x *executionWaitExecutionClient) Recv() (*longrunning.Operation, error) {
+	m := new(longrunning.Operation)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+// ExecutionServer is the server API for Execution service.
+type ExecutionServer interface {
+	// Execute an action remotely.
+	//
+	// In order to execute an action, the client must first upload all of the
+	// inputs, the
+	// [Command][build.bazel.remote.execution.v2.Command] to run, and the
+	// [Action][build.bazel.remote.execution.v2.Action] into the
+	// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
+	// It then calls `Execute` with an `action_digest` referring to them. The
+	// server will run the action and eventually return the result.
+	//
+	// The input `Action`'s fields MUST meet the various canonicalization
+	// requirements specified in the documentation for their types so that it has
+	// the same digest as other logically equivalent `Action`s. The server MAY
+	// enforce the requirements and return errors if a non-canonical input is
+	// received. It MAY also proceed without verifying some or all of the
+	// requirements, such as for performance reasons. If the server does not
+	// verify the requirement, then it will treat the `Action` as distinct from
+	// another logically equivalent action if they hash differently.
+	//
+	// Returns a stream of
+	// [google.longrunning.Operation][google.longrunning.Operation] messages
+	// describing the resulting execution, with eventual `response`
+	// [ExecuteResponse][build.bazel.remote.execution.v2.ExecuteResponse]. The
+	// `metadata` on the operation is of type
+	// [ExecuteOperationMetadata][build.bazel.remote.execution.v2.ExecuteOperationMetadata].
+	//
+	// If the client remains connected after the first response is returned after
+	// the server, then updates are streamed as if the client had called
+	// [WaitExecution][build.bazel.remote.execution.v2.Execution.WaitExecution]
+	// until the execution completes or the request reaches an error. The
+	// operation can also be queried using [Operations
+	// API][google.longrunning.Operations.GetOperation].
+	//
+	// The server NEED NOT implement other methods or functionality of the
+	// Operations API.
+	//
+	// Errors discovered during creation of the `Operation` will be reported
+	// as gRPC Status errors, while errors that occurred while running the
+	// action will be reported in the `status` field of the `ExecuteResponse`. The
+	// server MUST NOT set the `error` field of the `Operation` proto.
+	// The possible errors include:
+	//
+	//   - `INVALID_ARGUMENT`: One or more arguments are invalid.
+	//   - `FAILED_PRECONDITION`: One or more errors occurred in setting up the
+	//     action requested, such as a missing input or command or no worker being
+	//     available. The client may be able to fix the errors and retry.
+	//   - `RESOURCE_EXHAUSTED`: There is insufficient quota of some resource to run
+	//     the action.
+	//   - `UNAVAILABLE`: Due to a transient condition, such as all workers being
+	//     occupied (and the server does not support a queue), the action could not
+	//     be started. The client should retry.
+	//   - `INTERNAL`: An internal error occurred in the execution engine or the
+	//     worker.
+	//   - `DEADLINE_EXCEEDED`: The execution timed out.
+	//   - `CANCELLED`: The operation was cancelled by the client. This status is
+	//     only possible if the server implements the Operations API CancelOperation
+	//     method, and it was called for the current execution.
+	//
+	// In the case of a missing input or command, the server SHOULD additionally
+	// send a [PreconditionFailure][google.rpc.PreconditionFailure] error detail
+	// where, for each requested blob not present in the CAS, there is a
+	// `Violation` with a `type` of `MISSING` and a `subject` of
+	// `"blobs/{digest_function/}{hash}/{size}"` indicating the digest of the
+	// missing blob. The `subject` is formatted the same way as the
+	// `resource_name` provided to
+	// [ByteStream.Read][google.bytestream.ByteStream.Read], with the leading
+	// instance name omitted. `digest_function` MUST thus be omitted if its value
+	// is one of MD5, MURMUR3, SHA1, SHA256, SHA384, SHA512, or VSO.
+	//
+	// The server does not need to guarantee that a call to this method leads to
+	// at most one execution of the action. The server MAY execute the action
+	// multiple times, potentially in parallel. These redundant executions MAY
+	// continue to run, even if the operation is completed.
+	Execute(*ExecuteRequest, Execution_ExecuteServer) error
+	// Wait for an execution operation to complete. When the client initially
+	// makes the request, the server immediately responds with the current status
+	// of the execution. The server will leave the request stream open until the
+	// operation completes, and then respond with the completed operation. The
+	// server MAY choose to stream additional updates as execution progresses,
+	// such as to provide an update as to the state of the execution.
+	//
+	// In addition to the cases describe for Execute, the WaitExecution method
+	// may fail as follows:
+	//
+	//   - `NOT_FOUND`: The operation no longer exists due to any of a transient
+	//     condition, an unknown operation name, or if the server implements the
+	//     Operations API DeleteOperation method and it was called for the current
+	//     execution. The client should call `Execute` to retry.
+	WaitExecution(*WaitExecutionRequest, Execution_WaitExecutionServer) error
+}
+
+// UnimplementedExecutionServer can be embedded to have forward compatible implementations.
+type UnimplementedExecutionServer struct {
+}
+
+func (*UnimplementedExecutionServer) Execute(*ExecuteRequest, Execution_ExecuteServer) error {
+	return status1.Errorf(codes.Unimplemented, "method Execute not implemented")
+}
+func (*UnimplementedExecutionServer) WaitExecution(*WaitExecutionRequest, Execution_WaitExecutionServer) error {
+	return status1.Errorf(codes.Unimplemented, "method WaitExecution not implemented")
+}
+
+func RegisterExecutionServer(s *grpc.Server, srv ExecutionServer) {
+	s.RegisterService(&_Execution_serviceDesc, srv)
+}
+
+func _Execution_Execute_Handler(srv interface{}, stream grpc.ServerStream) error {
+	m := new(ExecuteRequest)
+	if err := stream.RecvMsg(m); err != nil {
+		return err
+	}
+	return srv.(ExecutionServer).Execute(m, &executionExecuteServer{stream})
+}
+
+type Execution_ExecuteServer interface {
+	Send(*longrunning.Operation) error
+	grpc.ServerStream
+}
+
+type executionExecuteServer struct {
+	grpc.ServerStream
+}
+
+func (x *executionExecuteServer) Send(m *longrunning.Operation) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+func _Execution_WaitExecution_Handler(srv interface{}, stream grpc.ServerStream) error {
+	m := new(WaitExecutionRequest)
+	if err := stream.RecvMsg(m); err != nil {
+		return err
+	}
+	return srv.(ExecutionServer).WaitExecution(m, &executionWaitExecutionServer{stream})
+}
+
+type Execution_WaitExecutionServer interface {
+	Send(*longrunning.Operation) error
+	grpc.ServerStream
+}
+
+type executionWaitExecutionServer struct {
+	grpc.ServerStream
+}
+
+func (x *executionWaitExecutionServer) Send(m *longrunning.Operation) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+var _Execution_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "build.bazel.remote.execution.v2.Execution",
+	HandlerType: (*ExecutionServer)(nil),
+	Methods:     []grpc.MethodDesc{},
+	Streams: []grpc.StreamDesc{
+		{
+			StreamName:    "Execute",
+			Handler:       _Execution_Execute_Handler,
+			ServerStreams: true,
+		},
+		{
+			StreamName:    "WaitExecution",
+			Handler:       _Execution_WaitExecution_Handler,
+			ServerStreams: true,
+		},
+	},
+	Metadata: "build/bazel/remote/execution/v2/remote_execution.proto",
+}
+
+// ActionCacheClient is the client API for ActionCache service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type ActionCacheClient interface {
+	// Retrieve a cached execution result.
+	//
+	// Implementations SHOULD ensure that any blobs referenced from the
+	// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]
+	// are available at the time of returning the
+	// [ActionResult][build.bazel.remote.execution.v2.ActionResult] and will be
+	// for some period of time afterwards. The lifetimes of the referenced blobs SHOULD be increased
+	// if necessary and applicable.
+	//
+	// Errors:
+	//
+	// * `NOT_FOUND`: The requested `ActionResult` is not in the cache.
+	GetActionResult(ctx context.Context, in *GetActionResultRequest, opts ...grpc.CallOption) (*ActionResult, error)
+	// Upload a new execution result.
+	//
+	// In order to allow the server to perform access control based on the type of
+	// action, and to assist with client debugging, the client MUST first upload
+	// the [Action][build.bazel.remote.execution.v2.Execution] that produced the
+	// result, along with its
+	// [Command][build.bazel.remote.execution.v2.Command], into the
+	// `ContentAddressableStorage`.
+	//
+	// Server implementations MAY modify the
+	// `UpdateActionResultRequest.action_result` and return an equivalent value.
+	//
+	// Errors:
+	//
+	//   - `INVALID_ARGUMENT`: One or more arguments are invalid.
+	//   - `FAILED_PRECONDITION`: One or more errors occurred in updating the
+	//     action result, such as a missing command or action.
+	//   - `RESOURCE_EXHAUSTED`: There is insufficient storage space to add the
+	//     entry to the cache.
+	UpdateActionResult(ctx context.Context, in *UpdateActionResultRequest, opts ...grpc.CallOption) (*ActionResult, error)
+}
+
+type actionCacheClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewActionCacheClient(cc grpc.ClientConnInterface) ActionCacheClient {
+	return &actionCacheClient{cc}
+}
+
+func (c *actionCacheClient) GetActionResult(ctx context.Context, in *GetActionResultRequest, opts ...grpc.CallOption) (*ActionResult, error) {
+	out := new(ActionResult)
+	err := c.cc.Invoke(ctx, "/build.bazel.remote.execution.v2.ActionCache/GetActionResult", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *actionCacheClient) UpdateActionResult(ctx context.Context, in *UpdateActionResultRequest, opts ...grpc.CallOption) (*ActionResult, error) {
+	out := new(ActionResult)
+	err := c.cc.Invoke(ctx, "/build.bazel.remote.execution.v2.ActionCache/UpdateActionResult", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// ActionCacheServer is the server API for ActionCache service.
+type ActionCacheServer interface {
+	// Retrieve a cached execution result.
+	//
+	// Implementations SHOULD ensure that any blobs referenced from the
+	// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]
+	// are available at the time of returning the
+	// [ActionResult][build.bazel.remote.execution.v2.ActionResult] and will be
+	// for some period of time afterwards. The lifetimes of the referenced blobs SHOULD be increased
+	// if necessary and applicable.
+	//
+	// Errors:
+	//
+	// * `NOT_FOUND`: The requested `ActionResult` is not in the cache.
+	GetActionResult(context.Context, *GetActionResultRequest) (*ActionResult, error)
+	// Upload a new execution result.
+	//
+	// In order to allow the server to perform access control based on the type of
+	// action, and to assist with client debugging, the client MUST first upload
+	// the [Action][build.bazel.remote.execution.v2.Execution] that produced the
+	// result, along with its
+	// [Command][build.bazel.remote.execution.v2.Command], into the
+	// `ContentAddressableStorage`.
+	//
+	// Server implementations MAY modify the
+	// `UpdateActionResultRequest.action_result` and return an equivalent value.
+	//
+	// Errors:
+	//
+	//   - `INVALID_ARGUMENT`: One or more arguments are invalid.
+	//   - `FAILED_PRECONDITION`: One or more errors occurred in updating the
+	//     action result, such as a missing command or action.
+	//   - `RESOURCE_EXHAUSTED`: There is insufficient storage space to add the
+	//     entry to the cache.
+	UpdateActionResult(context.Context, *UpdateActionResultRequest) (*ActionResult, error)
+}
+
+// UnimplementedActionCacheServer can be embedded to have forward compatible implementations.
+type UnimplementedActionCacheServer struct {
+}
+
+func (*UnimplementedActionCacheServer) GetActionResult(context.Context, *GetActionResultRequest) (*ActionResult, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetActionResult not implemented")
+}
+func (*UnimplementedActionCacheServer) UpdateActionResult(context.Context, *UpdateActionResultRequest) (*ActionResult, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method UpdateActionResult not implemented")
+}
+
+func RegisterActionCacheServer(s *grpc.Server, srv ActionCacheServer) {
+	s.RegisterService(&_ActionCache_serviceDesc, srv)
+}
+
+func _ActionCache_GetActionResult_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetActionResultRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ActionCacheServer).GetActionResult(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/build.bazel.remote.execution.v2.ActionCache/GetActionResult",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ActionCacheServer).GetActionResult(ctx, req.(*GetActionResultRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ActionCache_UpdateActionResult_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(UpdateActionResultRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ActionCacheServer).UpdateActionResult(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/build.bazel.remote.execution.v2.ActionCache/UpdateActionResult",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ActionCacheServer).UpdateActionResult(ctx, req.(*UpdateActionResultRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _ActionCache_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "build.bazel.remote.execution.v2.ActionCache",
+	HandlerType: (*ActionCacheServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetActionResult",
+			Handler:    _ActionCache_GetActionResult_Handler,
+		},
+		{
+			MethodName: "UpdateActionResult",
+			Handler:    _ActionCache_UpdateActionResult_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "build/bazel/remote/execution/v2/remote_execution.proto",
+}
+
+// ContentAddressableStorageClient is the client API for ContentAddressableStorage service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type ContentAddressableStorageClient interface {
+	// Determine if blobs are present in the CAS.
+	//
+	// Clients can use this API before uploading blobs to determine which ones are
+	// already present in the CAS and do not need to be uploaded again.
+	//
+	// Servers SHOULD increase the lifetimes of the referenced blobs if necessary and
+	// applicable.
+	//
+	// There are no method-specific errors.
+	FindMissingBlobs(ctx context.Context, in *FindMissingBlobsRequest, opts ...grpc.CallOption) (*FindMissingBlobsResponse, error)
+	// Upload many blobs at once.
+	//
+	// The server may enforce a limit of the combined total size of blobs
+	// to be uploaded using this API. This limit may be obtained using the
+	// [Capabilities][build.bazel.remote.execution.v2.Capabilities] API.
+	// Requests exceeding the limit should either be split into smaller
+	// chunks or uploaded using the
+	// [ByteStream API][google.bytestream.ByteStream], as appropriate.
+	//
+	// This request is equivalent to calling a Bytestream `Write` request
+	// on each individual blob, in parallel. The requests may succeed or fail
+	// independently.
+	//
+	// Errors:
+	//
+	//   - `INVALID_ARGUMENT`: The client attempted to upload more than the
+	//     server supported limit.
+	//
+	// Individual requests may return the following errors, additionally:
+	//
+	// * `RESOURCE_EXHAUSTED`: There is insufficient disk quota to store the blob.
+	// * `INVALID_ARGUMENT`: The
+	// [Digest][build.bazel.remote.execution.v2.Digest] does not match the
+	// provided data.
+	BatchUpdateBlobs(ctx context.Context, in *BatchUpdateBlobsRequest, opts ...grpc.CallOption) (*BatchUpdateBlobsResponse, error)
+	// Download many blobs at once.
+	//
+	// The server may enforce a limit of the combined total size of blobs
+	// to be downloaded using this API. This limit may be obtained using the
+	// [Capabilities][build.bazel.remote.execution.v2.Capabilities] API.
+	// Requests exceeding the limit should either be split into smaller
+	// chunks or downloaded using the
+	// [ByteStream API][google.bytestream.ByteStream], as appropriate.
+	//
+	// This request is equivalent to calling a Bytestream `Read` request
+	// on each individual blob, in parallel. The requests may succeed or fail
+	// independently.
+	//
+	// Errors:
+	//
+	//   - `INVALID_ARGUMENT`: The client attempted to read more than the
+	//     server supported limit.
+	//
+	// Every error on individual read will be returned in the corresponding digest
+	// status.
+	BatchReadBlobs(ctx context.Context, in *BatchReadBlobsRequest, opts ...grpc.CallOption) (*BatchReadBlobsResponse, error)
+	// Fetch the entire directory tree rooted at a node.
+	//
+	// This request must be targeted at a
+	// [Directory][build.bazel.remote.execution.v2.Directory] stored in the
+	// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]
+	// (CAS). The server will enumerate the `Directory` tree recursively and
+	// return every node descended from the root.
+	//
+	// The GetTreeRequest.page_token parameter can be used to skip ahead in
+	// the stream (e.g. when retrying a partially completed and aborted request),
+	// by setting it to a value taken from GetTreeResponse.next_page_token of the
+	// last successfully processed GetTreeResponse).
+	//
+	// The exact traversal order is unspecified and, unless retrieving subsequent
+	// pages from an earlier request, is not guaranteed to be stable across
+	// multiple invocations of `GetTree`.
+	//
+	// If part of the tree is missing from the CAS, the server will return the
+	// portion present and omit the rest.
+	//
+	// Errors:
+	//
+	// * `NOT_FOUND`: The requested tree root is not present in the CAS.
+	GetTree(ctx context.Context, in *GetTreeRequest, opts ...grpc.CallOption) (ContentAddressableStorage_GetTreeClient, error)
+}
+
+type contentAddressableStorageClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewContentAddressableStorageClient(cc grpc.ClientConnInterface) ContentAddressableStorageClient {
+	return &contentAddressableStorageClient{cc}
+}
+
+func (c *contentAddressableStorageClient) FindMissingBlobs(ctx context.Context, in *FindMissingBlobsRequest, opts ...grpc.CallOption) (*FindMissingBlobsResponse, error) {
+	out := new(FindMissingBlobsResponse)
+	err := c.cc.Invoke(ctx, "/build.bazel.remote.execution.v2.ContentAddressableStorage/FindMissingBlobs", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *contentAddressableStorageClient) BatchUpdateBlobs(ctx context.Context, in *BatchUpdateBlobsRequest, opts ...grpc.CallOption) (*BatchUpdateBlobsResponse, error) {
+	out := new(BatchUpdateBlobsResponse)
+	err := c.cc.Invoke(ctx, "/build.bazel.remote.execution.v2.ContentAddressableStorage/BatchUpdateBlobs", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *contentAddressableStorageClient) BatchReadBlobs(ctx context.Context, in *BatchReadBlobsRequest, opts ...grpc.CallOption) (*BatchReadBlobsResponse, error) {
+	out := new(BatchReadBlobsResponse)
+	err := c.cc.Invoke(ctx, "/build.bazel.remote.execution.v2.ContentAddressableStorage/BatchReadBlobs", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *contentAddressableStorageClient) GetTree(ctx context.Context, in *GetTreeRequest, opts ...grpc.CallOption) (ContentAddressableStorage_GetTreeClient, error) {
+	stream, err := c.cc.NewStream(ctx, &_ContentAddressableStorage_serviceDesc.Streams[0], "/build.bazel.remote.execution.v2.ContentAddressableStorage/GetTree", opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &contentAddressableStorageGetTreeClient{stream}
+	if err := x.ClientStream.SendMsg(in); err != nil {
+		return nil, err
+	}
+	if err := x.ClientStream.CloseSend(); err != nil {
+		return nil, err
+	}
+	return x, nil
+}
+
+type ContentAddressableStorage_GetTreeClient interface {
+	Recv() (*GetTreeResponse, error)
+	grpc.ClientStream
+}
+
+type contentAddressableStorageGetTreeClient struct {
+	grpc.ClientStream
+}
+
+func (x *contentAddressableStorageGetTreeClient) Recv() (*GetTreeResponse, error) {
+	m := new(GetTreeResponse)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+// ContentAddressableStorageServer is the server API for ContentAddressableStorage service.
+type ContentAddressableStorageServer interface {
+	// Determine if blobs are present in the CAS.
+	//
+	// Clients can use this API before uploading blobs to determine which ones are
+	// already present in the CAS and do not need to be uploaded again.
+	//
+	// Servers SHOULD increase the lifetimes of the referenced blobs if necessary and
+	// applicable.
+	//
+	// There are no method-specific errors.
+	FindMissingBlobs(context.Context, *FindMissingBlobsRequest) (*FindMissingBlobsResponse, error)
+	// Upload many blobs at once.
+	//
+	// The server may enforce a limit of the combined total size of blobs
+	// to be uploaded using this API. This limit may be obtained using the
+	// [Capabilities][build.bazel.remote.execution.v2.Capabilities] API.
+	// Requests exceeding the limit should either be split into smaller
+	// chunks or uploaded using the
+	// [ByteStream API][google.bytestream.ByteStream], as appropriate.
+	//
+	// This request is equivalent to calling a Bytestream `Write` request
+	// on each individual blob, in parallel. The requests may succeed or fail
+	// independently.
+	//
+	// Errors:
+	//
+	//   - `INVALID_ARGUMENT`: The client attempted to upload more than the
+	//     server supported limit.
+	//
+	// Individual requests may return the following errors, additionally:
+	//
+	// * `RESOURCE_EXHAUSTED`: There is insufficient disk quota to store the blob.
+	// * `INVALID_ARGUMENT`: The
+	// [Digest][build.bazel.remote.execution.v2.Digest] does not match the
+	// provided data.
+	BatchUpdateBlobs(context.Context, *BatchUpdateBlobsRequest) (*BatchUpdateBlobsResponse, error)
+	// Download many blobs at once.
+	//
+	// The server may enforce a limit of the combined total size of blobs
+	// to be downloaded using this API. This limit may be obtained using the
+	// [Capabilities][build.bazel.remote.execution.v2.Capabilities] API.
+	// Requests exceeding the limit should either be split into smaller
+	// chunks or downloaded using the
+	// [ByteStream API][google.bytestream.ByteStream], as appropriate.
+	//
+	// This request is equivalent to calling a Bytestream `Read` request
+	// on each individual blob, in parallel. The requests may succeed or fail
+	// independently.
+	//
+	// Errors:
+	//
+	//   - `INVALID_ARGUMENT`: The client attempted to read more than the
+	//     server supported limit.
+	//
+	// Every error on individual read will be returned in the corresponding digest
+	// status.
+	BatchReadBlobs(context.Context, *BatchReadBlobsRequest) (*BatchReadBlobsResponse, error)
+	// Fetch the entire directory tree rooted at a node.
+	//
+	// This request must be targeted at a
+	// [Directory][build.bazel.remote.execution.v2.Directory] stored in the
+	// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]
+	// (CAS). The server will enumerate the `Directory` tree recursively and
+	// return every node descended from the root.
+	//
+	// The GetTreeRequest.page_token parameter can be used to skip ahead in
+	// the stream (e.g. when retrying a partially completed and aborted request),
+	// by setting it to a value taken from GetTreeResponse.next_page_token of the
+	// last successfully processed GetTreeResponse).
+	//
+	// The exact traversal order is unspecified and, unless retrieving subsequent
+	// pages from an earlier request, is not guaranteed to be stable across
+	// multiple invocations of `GetTree`.
+	//
+	// If part of the tree is missing from the CAS, the server will return the
+	// portion present and omit the rest.
+	//
+	// Errors:
+	//
+	// * `NOT_FOUND`: The requested tree root is not present in the CAS.
+	GetTree(*GetTreeRequest, ContentAddressableStorage_GetTreeServer) error
+}
+
+// UnimplementedContentAddressableStorageServer can be embedded to have forward compatible implementations.
+type UnimplementedContentAddressableStorageServer struct {
+}
+
+func (*UnimplementedContentAddressableStorageServer) FindMissingBlobs(context.Context, *FindMissingBlobsRequest) (*FindMissingBlobsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method FindMissingBlobs not implemented")
+}
+func (*UnimplementedContentAddressableStorageServer) BatchUpdateBlobs(context.Context, *BatchUpdateBlobsRequest) (*BatchUpdateBlobsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method BatchUpdateBlobs not implemented")
+}
+func (*UnimplementedContentAddressableStorageServer) BatchReadBlobs(context.Context, *BatchReadBlobsRequest) (*BatchReadBlobsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method BatchReadBlobs not implemented")
+}
+func (*UnimplementedContentAddressableStorageServer) GetTree(*GetTreeRequest, ContentAddressableStorage_GetTreeServer) error {
+	return status1.Errorf(codes.Unimplemented, "method GetTree not implemented")
+}
+
+func RegisterContentAddressableStorageServer(s *grpc.Server, srv ContentAddressableStorageServer) {
+	s.RegisterService(&_ContentAddressableStorage_serviceDesc, srv)
+}
+
+func _ContentAddressableStorage_FindMissingBlobs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(FindMissingBlobsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ContentAddressableStorageServer).FindMissingBlobs(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/build.bazel.remote.execution.v2.ContentAddressableStorage/FindMissingBlobs",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ContentAddressableStorageServer).FindMissingBlobs(ctx, req.(*FindMissingBlobsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ContentAddressableStorage_BatchUpdateBlobs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(BatchUpdateBlobsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ContentAddressableStorageServer).BatchUpdateBlobs(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/build.bazel.remote.execution.v2.ContentAddressableStorage/BatchUpdateBlobs",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ContentAddressableStorageServer).BatchUpdateBlobs(ctx, req.(*BatchUpdateBlobsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ContentAddressableStorage_BatchReadBlobs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(BatchReadBlobsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ContentAddressableStorageServer).BatchReadBlobs(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/build.bazel.remote.execution.v2.ContentAddressableStorage/BatchReadBlobs",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ContentAddressableStorageServer).BatchReadBlobs(ctx, req.(*BatchReadBlobsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ContentAddressableStorage_GetTree_Handler(srv interface{}, stream grpc.ServerStream) error {
+	m := new(GetTreeRequest)
+	if err := stream.RecvMsg(m); err != nil {
+		return err
+	}
+	return srv.(ContentAddressableStorageServer).GetTree(m, &contentAddressableStorageGetTreeServer{stream})
+}
+
+type ContentAddressableStorage_GetTreeServer interface {
+	Send(*GetTreeResponse) error
+	grpc.ServerStream
+}
+
+type contentAddressableStorageGetTreeServer struct {
+	grpc.ServerStream
+}
+
+func (x *contentAddressableStorageGetTreeServer) Send(m *GetTreeResponse) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+var _ContentAddressableStorage_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "build.bazel.remote.execution.v2.ContentAddressableStorage",
+	HandlerType: (*ContentAddressableStorageServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "FindMissingBlobs",
+			Handler:    _ContentAddressableStorage_FindMissingBlobs_Handler,
+		},
+		{
+			MethodName: "BatchUpdateBlobs",
+			Handler:    _ContentAddressableStorage_BatchUpdateBlobs_Handler,
+		},
+		{
+			MethodName: "BatchReadBlobs",
+			Handler:    _ContentAddressableStorage_BatchReadBlobs_Handler,
+		},
+	},
+	Streams: []grpc.StreamDesc{
+		{
+			StreamName:    "GetTree",
+			Handler:       _ContentAddressableStorage_GetTree_Handler,
+			ServerStreams: true,
+		},
+	},
+	Metadata: "build/bazel/remote/execution/v2/remote_execution.proto",
+}
+
+// CapabilitiesClient is the client API for Capabilities service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type CapabilitiesClient interface {
+	// GetCapabilities returns the server capabilities configuration of the
+	// remote endpoint.
+	// Only the capabilities of the services supported by the endpoint will
+	// be returned:
+	//   - Execution + CAS + Action Cache endpoints should return both
+	//     CacheCapabilities and ExecutionCapabilities.
+	//   - Execution only endpoints should return ExecutionCapabilities.
+	//   - CAS + Action Cache only endpoints should return CacheCapabilities.
+	//
+	// There are no method-specific errors.
+	GetCapabilities(ctx context.Context, in *GetCapabilitiesRequest, opts ...grpc.CallOption) (*ServerCapabilities, error)
+}
+
+type capabilitiesClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewCapabilitiesClient(cc grpc.ClientConnInterface) CapabilitiesClient {
+	return &capabilitiesClient{cc}
+}
+
+func (c *capabilitiesClient) GetCapabilities(ctx context.Context, in *GetCapabilitiesRequest, opts ...grpc.CallOption) (*ServerCapabilities, error) {
+	out := new(ServerCapabilities)
+	err := c.cc.Invoke(ctx, "/build.bazel.remote.execution.v2.Capabilities/GetCapabilities", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// CapabilitiesServer is the server API for Capabilities service.
+type CapabilitiesServer interface {
+	// GetCapabilities returns the server capabilities configuration of the
+	// remote endpoint.
+	// Only the capabilities of the services supported by the endpoint will
+	// be returned:
+	//   - Execution + CAS + Action Cache endpoints should return both
+	//     CacheCapabilities and ExecutionCapabilities.
+	//   - Execution only endpoints should return ExecutionCapabilities.
+	//   - CAS + Action Cache only endpoints should return CacheCapabilities.
+	//
+	// There are no method-specific errors.
+	GetCapabilities(context.Context, *GetCapabilitiesRequest) (*ServerCapabilities, error)
+}
+
+// UnimplementedCapabilitiesServer can be embedded to have forward compatible implementations.
+type UnimplementedCapabilitiesServer struct {
+}
+
+func (*UnimplementedCapabilitiesServer) GetCapabilities(context.Context, *GetCapabilitiesRequest) (*ServerCapabilities, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetCapabilities not implemented")
+}
+
+func RegisterCapabilitiesServer(s *grpc.Server, srv CapabilitiesServer) {
+	s.RegisterService(&_Capabilities_serviceDesc, srv)
+}
+
+func _Capabilities_GetCapabilities_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetCapabilitiesRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CapabilitiesServer).GetCapabilities(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/build.bazel.remote.execution.v2.Capabilities/GetCapabilities",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CapabilitiesServer).GetCapabilities(ctx, req.(*GetCapabilitiesRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _Capabilities_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "build.bazel.remote.execution.v2.Capabilities",
+	HandlerType: (*CapabilitiesServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetCapabilities",
+			Handler:    _Capabilities_GetCapabilities_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "build/bazel/remote/execution/v2/remote_execution.proto",
+}
diff --git a/build/bazel/remote/execution/v2/remote_execution.proto b/build/bazel/remote/execution/v2/remote_execution.proto
index ca96a34..31e20dc 100644
--- a/build/bazel/remote/execution/v2/remote_execution.proto
+++ b/build/bazel/remote/execution/v2/remote_execution.proto
@@ -19,12 +19,14 @@
 import "build/bazel/semver/semver.proto";
 import "google/api/annotations.proto";
 import "google/longrunning/operations.proto";
+import "google/protobuf/any.proto";
 import "google/protobuf/duration.proto";
 import "google/protobuf/timestamp.proto";
+import "google/protobuf/wrappers.proto";
 import "google/rpc/status.proto";
 
 option csharp_namespace = "Build.Bazel.Remote.Execution.V2";
-option go_package = "remoteexecution";
+option go_package = "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2;remoteexecution";
 option java_multiple_files = true;
 option java_outer_classname = "RemoteExecutionProto";
 option java_package = "build.bazel.remote.execution.v2";
@@ -102,7 +104,17 @@
   // send a [PreconditionFailure][google.rpc.PreconditionFailure] error detail
   // where, for each requested blob not present in the CAS, there is a
   // `Violation` with a `type` of `MISSING` and a `subject` of
-  // `"blobs/{hash}/{size}"` indicating the digest of the missing blob.
+  // `"blobs/{digest_function/}{hash}/{size}"` indicating the digest of the
+  // missing blob. The `subject` is formatted the same way as the
+  // `resource_name` provided to
+  // [ByteStream.Read][google.bytestream.ByteStream.Read], with the leading
+  // instance name omitted. `digest_function` MUST thus be omitted if its value
+  // is one of MD5, MURMUR3, SHA1, SHA256, SHA384, SHA512, or VSO.
+  //
+  // The server does not need to guarantee that a call to this method leads to
+  // at most one execution of the action. The server MAY execute the action
+  // multiple times, potentially in parallel. These redundant executions MAY
+  // continue to run, even if the operation is completed.
   rpc Execute(ExecuteRequest) returns (stream google.longrunning.Operation) {
     option (google.api.http) = { post: "/v2/{instance_name=**}/actions:execute" body: "*" };
   }
@@ -113,6 +125,14 @@
   // operation completes, and then respond with the completed operation. The
   // server MAY choose to stream additional updates as execution progresses,
   // such as to provide an update as to the state of the execution.
+  //
+  // In addition to the cases describe for Execute, the WaitExecution method
+  // may fail as follows:
+  //
+  // * `NOT_FOUND`: The operation no longer exists due to any of a transient
+  //   condition, an unknown operation name, or if the server implements the
+  //   Operations API DeleteOperation method and it was called for the current
+  //   execution. The client should call `Execute` to retry.
   rpc WaitExecution(WaitExecutionRequest) returns (stream google.longrunning.Operation) {
     option (google.api.http) = { post: "/v2/{name=operations/**}:waitExecution" body: "*" };
   }
@@ -128,10 +148,7 @@
 //
 // The lifetime of entries in the action cache is implementation-specific, but
 // the server SHOULD assume that more recently used entries are more likely to
-// be used again. Additionally, action cache implementations SHOULD ensure that
-// any blobs referenced in the
-// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]
-// are still valid when returning a result.
+// be used again.
 //
 // As with other services in the Remote Execution API, any call may return an
 // error with a [RetryInfo][google.rpc.RetryInfo] error detail providing
@@ -140,6 +157,13 @@
 service ActionCache {
   // Retrieve a cached execution result.
   //
+  // Implementations SHOULD ensure that any blobs referenced from the
+  // [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]
+  // are available at the time of returning the
+  // [ActionResult][build.bazel.remote.execution.v2.ActionResult] and will be
+  // for some period of time afterwards. The lifetimes of the referenced blobs SHOULD be increased
+  // if necessary and applicable.
+  //
   // Errors:
   //
   // * `NOT_FOUND`: The requested `ActionResult` is not in the cache.
@@ -156,6 +180,9 @@
   // [Command][build.bazel.remote.execution.v2.Command], into the
   // `ContentAddressableStorage`.
   //
+  // Server implementations MAY modify the
+  // `UpdateActionResultRequest.action_result` and return an equivalent value.
+  //
   // Errors:
   //
   // * `INVALID_ARGUMENT`: One or more arguments are invalid.
@@ -185,53 +212,128 @@
 //
 // For small file uploads the client should group them together and call
 // [BatchUpdateBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs].
-// For large uploads, the client must use the
-// [Write method][google.bytestream.ByteStream.Write] of the ByteStream API. The
-// `resource_name` is `{instance_name}/uploads/{uuid}/blobs/{hash}/{size}`,
-// where `instance_name` is as described in the next paragraph, `uuid` is a
-// version 4 UUID generated by the client, and `hash` and `size` are the
-// [Digest][build.bazel.remote.execution.v2.Digest] of the blob. The
-// `uuid` is used only to avoid collisions when multiple clients try to upload
-// the same file (or the same client tries to upload the file multiple times at
-// once on different threads), so the client MAY reuse the `uuid` for uploading
-// different blobs. The `resource_name` may optionally have a trailing filename
-// (or other metadata) for a client to use if it is storing URLs, as in
-// `{instance}/uploads/{uuid}/blobs/{hash}/{size}/foo/bar/baz.cc`. Anything
-// after the `size` is ignored.
 //
-// A single server MAY support multiple instances of the execution system, each
-// with their own workers, storage, cache, etc. The exact relationship between
-// instances is up to the server. If the server does, then the `instance_name`
-// is an identifier, possibly containing multiple path segments, used to
-// distinguish between the various instances on the server, in a manner defined
-// by the server. For servers which do not support multiple instances, then the
-// `instance_name` is the empty path and the leading slash is omitted, so that
-// the `resource_name` becomes `uploads/{uuid}/blobs/{hash}/{size}`.
-// To simplify parsing, a path segment cannot equal any of the following
-// keywords: `blobs`, `uploads`, `actions`, `actionResults`, `operations` and
-// `capabilities`.
+// For large uploads, the client must use the
+// [Write method][google.bytestream.ByteStream.Write] of the ByteStream API.
+//
+// For uncompressed data, The `WriteRequest.resource_name` is of the following form:
+// `{instance_name}/uploads/{uuid}/blobs/{digest_function/}{hash}/{size}{/optional_metadata}`
+//
+// Where:
+// * `instance_name` is an identifier used to distinguish between the various
+//   instances on the server. Syntax and semantics of this field are defined
+//   by the server; Clients must not make any assumptions about it (e.g.,
+//   whether it spans multiple path segments or not). If it is the empty path,
+//   the leading slash is omitted, so that  the `resource_name` becomes
+//   `uploads/{uuid}/blobs/{digest_function/}{hash}/{size}{/optional_metadata}`.
+//   To simplify parsing, a path segment cannot equal any of the following
+//   keywords: `blobs`, `uploads`, `actions`, `actionResults`, `operations`,
+//   `capabilities` or `compressed-blobs`.
+// * `uuid` is a version 4 UUID generated by the client, used to avoid
+//   collisions between concurrent uploads of the same data. Clients MAY
+//   reuse the same `uuid` for uploading different blobs.
+// * `digest_function` is a lowercase string form of a `DigestFunction.Value`
+//   enum, indicating which digest function was used to compute `hash`. If the
+//   digest function used is one of MD5, MURMUR3, SHA1, SHA256, SHA384, SHA512,
+//   or VSO, this component MUST be omitted. In that case the server SHOULD
+//   infer the digest function using the length of the `hash` and the digest
+//   functions announced in the server's capabilities.
+// * `hash` and `size` refer to the [Digest][build.bazel.remote.execution.v2.Digest]
+//   of the data being uploaded.
+// * `optional_metadata` is implementation specific data, which clients MAY omit.
+//   Servers MAY ignore this metadata.
+//
+// Data can alternatively be uploaded in compressed form, with the following
+// `WriteRequest.resource_name` form:
+// `{instance_name}/uploads/{uuid}/compressed-blobs/{compressor}/{digest_function/}{uncompressed_hash}/{uncompressed_size}{/optional_metadata}`
+//
+// Where:
+// * `instance_name`, `uuid`, `digest_function` and `optional_metadata` are
+//   defined as above.
+// * `compressor` is a lowercase string form of a `Compressor.Value` enum
+//   other than `identity`, which is supported by the server and advertised in
+//   [CacheCapabilities.supported_compressor][build.bazel.remote.execution.v2.CacheCapabilities.supported_compressor].
+// * `uncompressed_hash` and `uncompressed_size` refer to the
+//   [Digest][build.bazel.remote.execution.v2.Digest] of the data being
+//   uploaded, once uncompressed. Servers MUST verify that these match
+//   the uploaded data once uncompressed, and MUST return an
+//   `INVALID_ARGUMENT` error in the case of mismatch.
+//
+// Note that when writing compressed blobs, the `WriteRequest.write_offset` in
+// the initial request in a stream refers to the offset in the uncompressed form
+// of the blob. In subsequent requests, `WriteRequest.write_offset` MUST be the
+// sum of the first request's 'WriteRequest.write_offset' and the total size of
+// all the compressed data bundles in the previous requests.
+// Note that this mixes an uncompressed offset with a compressed byte length,
+// which is nonsensical, but it is done to fit the semantics of the existing
+// ByteStream protocol.
+//
+// Uploads of the same data MAY occur concurrently in any form, compressed or
+// uncompressed.
+//
+// Clients SHOULD NOT use gRPC-level compression for ByteStream API `Write`
+// calls of compressed blobs, since this would compress already-compressed data.
 //
 // When attempting an upload, if another client has already completed the upload
 // (which may occur in the middle of a single upload if another client uploads
-// the same blob concurrently), the request will terminate immediately with
-// a response whose `committed_size` is the full size of the uploaded file
-// (regardless of how much data was transmitted by the client). If the client
-// completes the upload but the
+// the same blob concurrently), the request will terminate immediately without
+// error, and with a response whose `committed_size` is the value `-1` if this
+// is a compressed upload, or with the full size of the uploaded file if this is
+// an uncompressed upload (regardless of how much data was transmitted by the
+// client). If the client completes the upload but the
 // [Digest][build.bazel.remote.execution.v2.Digest] does not match, an
 // `INVALID_ARGUMENT` error will be returned. In either case, the client should
 // not attempt to retry the upload.
 //
-// For downloading blobs, the client must use the
-// [Read method][google.bytestream.ByteStream.Read] of the ByteStream API, with
-// a `resource_name` of `"{instance_name}/blobs/{hash}/{size}"`, where
-// `instance_name` is the instance name (see above), and `hash` and `size` are
-// the [Digest][build.bazel.remote.execution.v2.Digest] of the blob.
+// Small downloads can be grouped and requested in a batch via
+// [BatchReadBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchReadBlobs].
+//
+// For large downloads, the client must use the
+// [Read method][google.bytestream.ByteStream.Read] of the ByteStream API.
+//
+// For uncompressed data, The `ReadRequest.resource_name` is of the following form:
+// `{instance_name}/blobs/{digest_function/}{hash}/{size}`
+// Where `instance_name`, `digest_function`, `hash` and `size` are defined as
+// for uploads.
+//
+// Data can alternatively be downloaded in compressed form, with the following
+// `ReadRequest.resource_name` form:
+// `{instance_name}/compressed-blobs/{compressor}/{digest_function/}{uncompressed_hash}/{uncompressed_size}`
+//
+// Where:
+// * `instance_name`, `compressor` and `digest_function` are defined as for
+//   uploads.
+// * `uncompressed_hash` and `uncompressed_size` refer to the
+//   [Digest][build.bazel.remote.execution.v2.Digest] of the data being
+//   downloaded, once uncompressed. Clients MUST verify that these match
+//   the downloaded data once uncompressed, and take appropriate steps in
+//   the case of failure such as retrying a limited number of times or
+//   surfacing an error to the user.
+//
+// When downloading compressed blobs:
+// * `ReadRequest.read_offset` refers to the offset in the uncompressed form
+//   of the blob.
+// * Servers MUST return `INVALID_ARGUMENT` if `ReadRequest.read_limit` is
+//   non-zero.
+// * Servers MAY use any compression level they choose, including different
+//   levels for different blobs (e.g. choosing a level designed for maximum
+//   speed for data known to be incompressible).
+// * Clients SHOULD NOT use gRPC-level compression, since this would compress
+//   already-compressed data.
+//
+// Servers MUST be able to provide data for all recently advertised blobs in
+// each of the compression formats that the server supports, as well as in
+// uncompressed form.
 //
 // The lifetime of entries in the CAS is implementation specific, but it SHOULD
 // be long enough to allow for newly-added and recently looked-up entries to be
 // used in subsequent calls (e.g. to
 // [Execute][build.bazel.remote.execution.v2.Execution.Execute]).
 //
+// Servers MUST behave as though empty blobs are always available, even if they
+// have not been uploaded. Clients MAY optimize away the uploading or
+// downloading of empty blobs.
+//
 // As with other services in the Remote Execution API, any call may return an
 // error with a [RetryInfo][google.rpc.RetryInfo] error detail providing
 // information about when the client should retry the request; clients SHOULD
@@ -242,6 +344,9 @@
   // Clients can use this API before uploading blobs to determine which ones are
   // already present in the CAS and do not need to be uploaded again.
   //
+  // Servers SHOULD increase the lifetimes of the referenced blobs if necessary and
+  // applicable.
+  //
   // There are no method-specific errors.
   rpc FindMissingBlobs(FindMissingBlobsRequest) returns (FindMissingBlobsResponse) {
     option (google.api.http) = { post: "/v2/{instance_name=**}/blobs:findMissing" body: "*" };
@@ -319,6 +424,8 @@
   // If part of the tree is missing from the CAS, the server will return the
   // portion present and omit the rest.
   //
+  // Errors:
+  //
   // * `NOT_FOUND`: The requested tree root is not present in the CAS.
   rpc GetTree(GetTreeRequest) returns (stream GetTreeResponse) {
     option (google.api.http) = { get: "/v2/{instance_name=**}/blobs/{root_digest.hash}/{root_digest.size_bytes}:getTree" };
@@ -332,7 +439,16 @@
 // The query may include a particular `instance_name`, in which case the values
 // returned will pertain to that instance.
 service Capabilities {
-  // GetCapabilities returns the server capabilities configuration.
+  // GetCapabilities returns the server capabilities configuration of the
+  // remote endpoint.
+  // Only the capabilities of the services supported by the endpoint will
+  // be returned:
+  // * Execution + CAS + Action Cache endpoints should return both
+  //   CacheCapabilities and ExecutionCapabilities.
+  // * Execution only endpoints should return ExecutionCapabilities.
+  // * CAS + Action Cache only endpoints should return CacheCapabilities.
+  //
+  // There are no method-specific errors.
   rpc GetCapabilities(GetCapabilitiesRequest) returns (ServerCapabilities) {
     option (google.api.http) = {
       get: "/v2/{instance_name=**}/capabilities"
@@ -385,6 +501,14 @@
   // timeout that is longer than the server's maximum timeout, the server MUST
   // reject the request.
   //
+  // The timeout is only intended to cover the "execution" of the specified
+  // action and not time in queue nor any overheads before or after execution
+  // such as marshalling inputs/outputs. The server SHOULD avoid including time
+  // spent the client doesn't have control over, and MAY extend or reduce the
+  // timeout to account for delays or speedups that occur during execution
+  // itself (e.g., lazily loading data from the Content Addressable Storage,
+  // live migration of virtual machines, emulation overhead).
+  //
   // The timeout is a part of the
   // [Action][build.bazel.remote.execution.v2.Action] message, and
   // therefore two `Actions` with different timeouts are different, even if they
@@ -399,6 +523,26 @@
   // If true, then the `Action`'s result cannot be cached, and in-flight
   // requests for the same `Action` may not be merged.
   bool do_not_cache = 7;
+
+  reserved 8; // Used for field moved to [Command][build.bazel.remote.execution.v2.Command].
+
+  // An optional additional salt value used to place this `Action` into a
+  // separate cache namespace from other instances having the same field
+  // contents. This salt typically comes from operational configuration
+  // specific to sources such as repo and service configuration,
+  // and allows disowning an entire set of ActionResults that might have been
+  // poisoned by buggy software or tool failures.
+  bytes salt = 9;
+
+  // The optional platform requirements for the execution environment. The
+  // server MAY choose to execute the action on any worker satisfying the
+  // requirements, so the client SHOULD ensure that running the action on any
+  // such worker will have the same result.  A detailed lexicon for this can be
+  // found in the accompanying platform.md.
+  // New in version 2.2: clients SHOULD set these platform properties as well
+  // as those in the [Command][build.bazel.remote.execution.v2.Command]. Servers
+  // SHOULD prefer those set here.
+  Platform platform = 10;
 }
 
 // A `Command` is the actual command executed by a worker running an
@@ -419,9 +563,21 @@
     string value = 2;
   }
 
-  // The arguments to the command. The first argument must be the path to the
-  // executable, which must be either a relative path, in which case it is
-  // evaluated with respect to the input root, or an absolute path.
+  // The arguments to the command.
+  //
+  // The first argument specifies the command to run, which may be either an
+  // absolute path, a path relative to the working directory, or an unqualified
+  // path (without path separators) which will be resolved using the operating
+  // system's equivalent of the PATH environment variable. Path separators
+  // native to the operating system running on the worker SHOULD be used. If the
+  // `environment_variables` list contains an entry for the PATH environment
+  // variable, it SHOULD be respected. If not, the resolution process is
+  // implementation-defined.
+  //
+  // Changed in v2.3. v2.2 and older require that no PATH lookups are performed,
+  // and that relative paths are resolved relative to the input root. This
+  // behavior can, however, not be relied upon, as most implementations already
+  // followed the rules described above.
   repeated string arguments = 1;
 
   // The environment variables to set when running the program. The worker may
@@ -455,7 +611,9 @@
   //
   // Directories leading up to the output files are created by the worker prior
   // to execution, even if they are not explicitly part of the input root.
-  repeated string output_files = 3;
+  //
+  // DEPRECATED since v2.1: Use `output_paths` instead.
+  repeated string output_files = 3 [ deprecated = true ];
 
   // A list of the output directories that the client expects to retrieve from
   // the action. Only the listed directories will be returned (an entire
@@ -478,23 +636,100 @@
   // bytes).
   //
   // An output directory cannot be duplicated or have the same path as any of
-  // the listed output files.
+  // the listed output files. An output directory is allowed to be a parent of
+  // another output directory.
   //
   // Directories leading up to the output directories (but not the output
   // directories themselves) are created by the worker prior to execution, even
   // if they are not explicitly part of the input root.
-  repeated string output_directories = 4;
+  //
+  // DEPRECATED since 2.1: Use `output_paths` instead.
+  repeated string output_directories = 4 [ deprecated = true ];
+
+  // A list of the output paths that the client expects to retrieve from the
+  // action. Only the listed paths will be returned to the client as output.
+  // The type of the output (file or directory) is not specified, and will be
+  // determined by the server after action execution. If the resulting path is
+  // a file, it will be returned in an
+  // [OutputFile][build.bazel.remote.execution.v2.OutputFile] typed field.
+  // If the path is a directory, the entire directory structure will be returned
+  // as a [Tree][build.bazel.remote.execution.v2.Tree] message digest, see
+  // [OutputDirectory][build.bazel.remote.execution.v2.OutputDirectory]
+  // Other files or directories that may be created during command execution
+  // are discarded.
+  //
+  // The paths are relative to the working directory of the action execution.
+  // The paths are specified using a single forward slash (`/`) as a path
+  // separator, even if the execution platform natively uses a different
+  // separator. The path MUST NOT include a trailing slash, nor a leading slash,
+  // being a relative path.
+  //
+  // In order to ensure consistent hashing of the same Action, the output paths
+  // MUST be deduplicated and sorted lexicographically by code point (or,
+  // equivalently, by UTF-8 bytes).
+  //
+  // Directories leading up to the output paths are created by the worker prior
+  // to execution, even if they are not explicitly part of the input root.
+  //
+  // New in v2.1: this field supersedes the DEPRECATED `output_files` and
+  // `output_directories` fields. If `output_paths` is used, `output_files` and
+  // `output_directories` will be ignored!
+  repeated string output_paths = 7;
 
   // The platform requirements for the execution environment. The server MAY
   // choose to execute the action on any worker satisfying the requirements, so
   // the client SHOULD ensure that running the action on any such worker will
-  // have the same result.
-  Platform platform = 5;
+  // have the same result.  A detailed lexicon for this can be found in the
+  // accompanying platform.md.
+  // DEPRECATED as of v2.2: platform properties are now specified directly in
+  // the action. See documentation note in the
+  // [Action][build.bazel.remote.execution.v2.Action] for migration.
+  Platform platform = 5 [ deprecated = true ];
 
   // The working directory, relative to the input root, for the command to run
   // in. It must be a directory which exists in the input tree. If it is left
   // empty, then the action is run in the input root.
   string working_directory = 6;
+
+  // A list of keys for node properties the client expects to retrieve for
+  // output files and directories. Keys are either names of string-based
+  // [NodeProperty][build.bazel.remote.execution.v2.NodeProperty] or
+  // names of fields in [NodeProperties][build.bazel.remote.execution.v2.NodeProperties].
+  // In order to ensure that equivalent `Action`s always hash to the same
+  // value, the node properties MUST be lexicographically sorted by name.
+  // Sorting of strings is done by code point, equivalently, by the UTF-8 bytes.
+  //
+  // The interpretation of string-based properties is server-dependent. If a
+  // property is not recognized by the server, the server will return an
+  // `INVALID_ARGUMENT`.
+  repeated string output_node_properties = 8;
+
+  enum OutputDirectoryFormat {
+    // The client is only interested in receiving output directories in
+    // the form of a single Tree object, using the `tree_digest` field.
+    TREE_ONLY = 0;
+
+    // The client is only interested in receiving output directories in
+    // the form of a hierarchy of separately stored Directory objects,
+    // using the `root_directory_digest` field.
+    DIRECTORY_ONLY = 1;
+
+    // The client is interested in receiving output directories both in
+    // the form of a single Tree object and a hierarchy of separately
+    // stored Directory objects, using both the `tree_digest` and
+    // `root_directory_digest` fields.
+    TREE_AND_DIRECTORY = 2;
+  }
+
+  // The format that the worker should use to store the contents of
+  // output directories.
+  //
+  // In case this field is set to a value that is not supported by the
+  // worker, the worker SHOULD interpret this field as TREE_ONLY. The
+  // worker MAY store output directories in formats that are a superset
+  // of what was requested (e.g., interpreting DIRECTORY_ONLY as
+  // TREE_AND_DIRECTORY).
+  OutputDirectoryFormat output_directory_format = 9;
 }
 
 // A `Platform` is a set of requirements, such as hardware, operating system, or
@@ -520,6 +755,11 @@
   // The server MAY use the `value` of one or more properties to determine how
   // it sets up the execution environment, such as by making specific system
   // files available to the worker.
+  //
+  // Both names and values are typically case-sensitive. Note that the platform
+  // is implicitly part of the action digest, so even tiny changes in the names
+  // or values (like changing case) may result in different action cache
+  // entries.
   message Property {
     // The property name.
     string name = 1;
@@ -558,6 +798,9 @@
 // * The files, directories and symlinks in the directory must each be sorted
 //   in lexicographical order by path. The path strings must be sorted by code
 //   point, equivalently, by UTF-8 bytes.
+// * The [NodeProperties][build.bazel.remote.execution.v2.NodeProperty] of files,
+//   directories, and symlinks must be sorted in lexicographical order by
+//   property name.
 //
 // A `Directory` that obeys the restrictions is said to be in canonical form.
 //
@@ -574,7 +817,13 @@
 //       digest: {
 //         hash: "4a73bc9d03...",
 //         size: 65534
-//       }
+//       },
+//       node_properties: [
+//         {
+//           "name": "MTime",
+//           "value": "2017-01-15T01:30:15.01Z"
+//         }
+//       ]
 //     }
 //   ],
 //   directories: [
@@ -611,6 +860,40 @@
 
   // The symlinks in the directory.
   repeated SymlinkNode symlinks = 3;
+
+  // The node properties of the Directory.
+  reserved 4;
+  NodeProperties node_properties = 5;
+}
+
+// A single property for [FileNodes][build.bazel.remote.execution.v2.FileNode],
+// [DirectoryNodes][build.bazel.remote.execution.v2.DirectoryNode], and
+// [SymlinkNodes][build.bazel.remote.execution.v2.SymlinkNode]. The server is
+// responsible for specifying the property `name`s that it accepts. If
+// permitted by the server, the same `name` may occur multiple times.
+message NodeProperty {
+    // The property name.
+    string name = 1;
+
+    // The property value.
+    string value = 2;
+}
+
+// Node properties for [FileNodes][build.bazel.remote.execution.v2.FileNode],
+// [DirectoryNodes][build.bazel.remote.execution.v2.DirectoryNode], and
+// [SymlinkNodes][build.bazel.remote.execution.v2.SymlinkNode]. The server is
+// responsible for specifying the properties that it accepts.
+//
+message NodeProperties {
+  // A list of string-based
+  // [NodeProperties][build.bazel.remote.execution.v2.NodeProperty].
+  repeated NodeProperty properties = 1;
+
+  // The file's last modification timestamp.
+  google.protobuf.Timestamp mtime = 2;
+
+  // The UNIX file mode, e.g., 0755.
+  google.protobuf.UInt32Value unix_mode = 3;
 }
 
 // A `FileNode` represents a single file and associated metadata.
@@ -625,6 +908,10 @@
 
   // True if file is executable, false otherwise.
   bool is_executable = 4;
+
+  // The node properties of the FileNode.
+  reserved 5;
+  NodeProperties node_properties = 6;
 }
 
 // A `DirectoryNode` represents a child of a
@@ -650,14 +937,20 @@
   // The target path can be relative to the parent directory of the symlink or
   // it can be an absolute path starting with `/`. Support for absolute paths
   // can be checked using the [Capabilities][build.bazel.remote.execution.v2.Capabilities]
-  // API. The canonical form forbids the substrings `/./` and `//` in the target
-  // path. `..` components are allowed anywhere in the target path.
+  // API. `..` components are allowed anywhere in the target path as logical
+  // canonicalization may lead to different behavior in the presence of
+  // directory symlinks (e.g. `foo/../bar` may not be the same as `bar`).
+  // To reduce potential cache misses, canonicalization is still recommended
+  // where this is possible without impacting correctness.
   string target = 2;
+
+  // The node properties of the SymlinkNode.
+  reserved 3;
+  NodeProperties node_properties = 4;
 }
 
 // A content digest. A digest for a given blob consists of the size of the blob
-// and its hash. The hash algorithm to use is defined by the server, but servers
-// SHOULD use SHA-256.
+// and its hash. The hash algorithm to use is defined by the server.
 //
 // The size is considered to be an integral part of the digest and cannot be
 // separated. That is, even if the `hash` field is correctly specified but
@@ -688,8 +981,8 @@
 // serializing, but care should be taken to avoid shortcuts. For instance,
 // concatenating two messages to merge them may produce duplicate fields.
 message Digest {
-  // The hash. In the case of SHA-256, it will always be a lowercase hex string
-  // exactly 64 characters long.
+  // The hash, represented as a lowercase hexadecimal string, padded with
+  // leading zeroes up to the hash function length.
   string hash = 1;
 
   // The size of the blob, in bytes.
@@ -722,26 +1015,56 @@
   // When the worker completed executing the action command.
   google.protobuf.Timestamp execution_completed_timestamp = 8;
 
+  // New in v2.3: the amount of time the worker spent executing the action
+  // command, potentially computed using a worker-specific virtual clock.
+  //
+  // The virtual execution duration is only intended to cover the "execution" of
+  // the specified action and not time in queue nor any overheads before or
+  // after execution such as marshalling inputs/outputs. The server SHOULD avoid
+  // including time spent the client doesn't have control over, and MAY extend
+  // or reduce the execution duration to account for delays or speedups that
+  // occur during execution itself (e.g., lazily loading data from the Content
+  // Addressable Storage, live migration of virtual machines, emulation
+  // overhead).
+  //
+  // The method of timekeeping used to compute the virtual execution duration
+  // MUST be consistent with what is used to enforce the
+  // [Action][[build.bazel.remote.execution.v2.Action]'s `timeout`. There is no
+  // relationship between the virtual execution duration and the values of
+  // `execution_start_timestamp` and `execution_completed_timestamp`.
+  google.protobuf.Duration virtual_execution_duration = 12;
+
   // When the worker started uploading action outputs.
   google.protobuf.Timestamp output_upload_start_timestamp = 9;
 
   // When the worker finished uploading action outputs.
   google.protobuf.Timestamp output_upload_completed_timestamp = 10;
+
+  // Details that are specific to the kind of worker used. For example,
+  // on POSIX-like systems this could contain a message with
+  // getrusage(2) statistics.
+  repeated google.protobuf.Any auxiliary_metadata = 11;
 }
 
 // An ActionResult represents the result of an
 // [Action][build.bazel.remote.execution.v2.Action] being run.
+//
+// It is advised that at least one field (for example
+// `ActionResult.execution_metadata.Worker`) have a non-default value, to
+// ensure that the serialized value is non-empty, which can then be used
+// as a basic data sanity check.
 message ActionResult {
   reserved 1; // Reserved for use as the resource name.
 
   // The output files of the action. For each output file requested in the
-  // `output_files` field of the Action, if the corresponding file existed after
-  // the action completed, a single entry will be present either in this field,
-  // or in the output_file_symlinks field, if the file was a symbolic link to
-  // another file.
+  // `output_files` or `output_paths` field of the Action, if the corresponding
+  // file existed after the action completed, a single entry will be present
+  // either in this field, or the `output_file_symlinks` field if the file was
+  // a symbolic link to another file (`output_symlinks` field after v2.1).
   //
-  // If the action does not produce the requested output, or produces a
-  // directory where a regular file is expected or vice versa, then that output
+  // If an output listed in `output_files` was found, but was a directory rather
+  // than a regular file, the server will return a FAILED_PRECONDITION.
+  // If the action does not produce the requested output, then that output
   // will be omitted from the list. The server is free to arrange the output
   // list as desired; clients MUST NOT assume that the output list is sorted.
   repeated OutputFile output_files = 2;
@@ -750,21 +1073,42 @@
   // may be links to other output files, or input files, or even absolute paths
   // outside of the working directory, if the server supports
   // [SymlinkAbsolutePathStrategy.ALLOWED][build.bazel.remote.execution.v2.CacheCapabilities.SymlinkAbsolutePathStrategy].
-  // For each output file requested in the `output_files` field of the Action,
-  // if the corresponding file existed after
+  // For each output file requested in the `output_files` or `output_paths`
+  // field of the Action, if the corresponding file existed after
   // the action completed, a single entry will be present either in this field,
   // or in the `output_files` field, if the file was not a symbolic link.
   //
-  // If the action does not produce the requested output, or produces a
-  // directory where a regular file is expected or vice versa, then that output
+  // If an output symbolic link of the same name as listed in `output_files` of
+  // the Command was found, but its target type was not a regular file, the
+  // server will return a FAILED_PRECONDITION.
+  // If the action does not produce the requested output, then that output
   // will be omitted from the list. The server is free to arrange the output
   // list as desired; clients MUST NOT assume that the output list is sorted.
-  repeated OutputSymlink output_file_symlinks = 10;
+  //
+  // DEPRECATED as of v2.1. Servers that wish to be compatible with v2.0 API
+  // should still populate this field in addition to `output_symlinks`.
+  repeated OutputSymlink output_file_symlinks = 10 [ deprecated = true ];
+
+  // New in v2.1: this field will only be populated if the command
+  // `output_paths` field was used, and not the pre v2.1 `output_files` or
+  // `output_directories` fields.
+  // The output paths of the action that are symbolic links to other paths. Those
+  // may be links to other outputs, or inputs, or even absolute paths
+  // outside of the working directory, if the server supports
+  // [SymlinkAbsolutePathStrategy.ALLOWED][build.bazel.remote.execution.v2.CacheCapabilities.SymlinkAbsolutePathStrategy].
+  // A single entry for each output requested in `output_paths`
+  // field of the Action, if the corresponding path existed after
+  // the action completed and was a symbolic link.
+  //
+  // If the action does not produce a requested output, then that output
+  // will be omitted from the list. The server is free to arrange the output
+  // list as desired; clients MUST NOT assume that the output list is sorted.
+  repeated OutputSymlink output_symlinks = 12;
 
   // The output directories of the action. For each output directory requested
-  // in the `output_directories` field of the Action, if the corresponding
-  // directory existed after the action completed, a single entry will be
-  // present in the output list, which will contain the digest of a
+  // in the `output_directories` or `output_paths` field of the Action, if the
+  // corresponding directory existed after the action completed, a single entry
+  // will be present in the output list, which will contain the digest of a
   // [Tree][build.bazel.remote.execution.v2.Tree] message containing the
   // directory tree, and the path equal exactly to the corresponding Action
   // output_directories member.
@@ -820,6 +1164,9 @@
   //   }
   // }
   // ```
+  // If an output of the same name as listed in `output_files` of
+  // the Command was found in `output_directories`, but was not a directory, the
+  // server will return a FAILED_PRECONDITION.
   repeated OutputDirectory output_directories = 3;
 
   // The output directories of the action that are symbolic links to other
@@ -828,45 +1175,47 @@
   // if the server supports
   // [SymlinkAbsolutePathStrategy.ALLOWED][build.bazel.remote.execution.v2.CacheCapabilities.SymlinkAbsolutePathStrategy].
   // For each output directory requested in the `output_directories` field of
-  // the Action, if the directory file existed after
-  // the action completed, a single entry will be present either in this field,
-  // or in the `output_directories` field, if the directory was not a symbolic link.
+  // the Action, if the directory existed after the action completed, a
+  // single entry will be present either in this field, or in the
+  // `output_directories` field, if the directory was not a symbolic link.
   //
-  // If the action does not produce the requested output, or produces a
-  // file where a directory is expected or vice versa, then that output
+  // If an output of the same name was found, but was a symbolic link to a file
+  // instead of a directory, the server will return a FAILED_PRECONDITION.
+  // If the action does not produce the requested output, then that output
   // will be omitted from the list. The server is free to arrange the output
   // list as desired; clients MUST NOT assume that the output list is sorted.
-  repeated OutputSymlink output_directory_symlinks = 11;
+  //
+  // DEPRECATED as of v2.1. Servers that wish to be compatible with v2.0 API
+  // should still populate this field in addition to `output_symlinks`.
+  repeated OutputSymlink output_directory_symlinks = 11 [ deprecated = true ];
 
   // The exit code of the command.
   int32 exit_code = 4;
 
-  // The standard output buffer of the action. The server will determine, based
-  // on the size of the buffer, whether to return it in raw form or to return
-  // a digest in `stdout_digest` that points to the buffer. If neither is set,
-  // then the buffer is empty. The client SHOULD NOT assume it will get one of
-  // the raw buffer or a digest on any given request and should be prepared to
-  // handle either.
+  // The standard output buffer of the action. The server SHOULD NOT inline
+  // stdout unless requested by the client in the
+  // [GetActionResultRequest][build.bazel.remote.execution.v2.GetActionResultRequest]
+  // message. The server MAY omit inlining, even if requested, and MUST do so if inlining
+  // would cause the response to exceed message size limits.
+  // Clients SHOULD NOT populate this field when uploading to the cache.
   bytes stdout_raw = 5;
 
   // The digest for a blob containing the standard output of the action, which
   // can be retrieved from the
   // [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
-  // See `stdout_raw` for when this will be set.
   Digest stdout_digest = 6;
 
-  // The standard error buffer of the action. The server will determine, based
-  // on the size of the buffer, whether to return it in raw form or to return
-  // a digest in `stderr_digest` that points to the buffer. If neither is set,
-  // then the buffer is empty. The client SHOULD NOT assume it will get one of
-  // the raw buffer or a digest on any given request and should be prepared to
-  // handle either.
+  // The standard error buffer of the action. The server SHOULD NOT inline
+  // stderr unless requested by the client in the
+  // [GetActionResultRequest][build.bazel.remote.execution.v2.GetActionResultRequest]
+  // message. The server MAY omit inlining, even if requested, and MUST do so if inlining
+  // would cause the response to exceed message size limits.
+  // Clients SHOULD NOT populate this field when uploading to the cache.
   bytes stderr_raw = 7;
 
   // The digest for a blob containing the standard error of the action, which
   // can be retrieved from the
   // [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
-  // See `stderr_raw` for when this will be set.
   Digest stderr_digest = 8;
 
   // The details of the execution that originally produced this result.
@@ -877,8 +1226,6 @@
 // [FileNode][build.bazel.remote.execution.v2.FileNode], but it is used as an
 // output in an `ActionResult`. It allows a full file path rather than
 // only a name.
-//
-// `OutputFile` is binary-compatible with `FileNode`.
 message OutputFile {
   // The full path of the file relative to the working directory, including the
   // filename. The path separator is a forward slash `/`. Since this is a
@@ -892,6 +1239,18 @@
 
   // True if file is executable, false otherwise.
   bool is_executable = 4;
+
+  // The contents of the file if inlining was requested. The server SHOULD NOT inline
+  // file contents unless requested by the client in the
+  // [GetActionResultRequest][build.bazel.remote.execution.v2.GetActionResultRequest]
+  // message. The server MAY omit inlining, even if requested, and MUST do so if inlining
+  // would cause the response to exceed message size limits.
+  // Clients SHOULD NOT populate this field when uploading to the cache.
+  bytes contents = 5;
+
+  // The supported node properties of the OutputFile, if requested by the Action.
+  reserved 6;
+  NodeProperties node_properties = 7;
 }
 
 // A `Tree` contains all the
@@ -905,6 +1264,9 @@
   // recursively, all its children. In order to reconstruct the directory tree,
   // the client must take the digests of each of the child directories and then
   // build up a tree starting from the `root`.
+  // Servers SHOULD ensure that these are ordered consistently such that two
+  // actions producing equivalent output directories on the same server
+  // implementation also produce Tree messages with matching digests.
   repeated Directory children = 2;
 }
 
@@ -923,6 +1285,52 @@
   // [Tree][build.bazel.remote.execution.v2.Tree] proto containing the
   // directory's contents.
   Digest tree_digest = 3;
+
+  // If set, consumers MAY make the following assumptions about the
+  // directories contained in the the Tree, so that it may be
+  // instantiated on a local file system by scanning through it
+  // sequentially:
+  //
+  // - All directories with the same binary representation are stored
+  //   exactly once.
+  // - All directories, apart from the root directory, are referenced by
+  //   at least one parent directory.
+  // - Directories are stored in topological order, with parents being
+  //   stored before the child. The root directory is thus the first to
+  //   be stored.
+  //
+  // Additionally, the Tree MUST be encoded as a stream of records,
+  // where each record has the following format:
+  //
+  // - A tag byte, having one of the following two values:
+  //   - (1 << 3) | 2 == 0x0a: First record (the root directory).
+  //   - (2 << 3) | 2 == 0x12: Any subsequent records (child directories).
+  // - The size of the directory, encoded as a base 128 varint.
+  // - The contents of the directory, encoded as a binary serialized
+  //   Protobuf message.
+  //
+  // This encoding is a subset of the Protobuf wire format of the Tree
+  // message. As it is only permitted to store data associated with
+  // field numbers 1 and 2, the tag MUST be encoded as a single byte.
+  // More details on the Protobuf wire format can be found here:
+  // https://developers.google.com/protocol-buffers/docs/encoding
+  //
+  // It is recommended that implementations using this feature construct
+  // Tree objects manually using the specification given above, as
+  // opposed to using a Protobuf library to marshal a full Tree message.
+  // As individual Directory messages already need to be marshaled to
+  // compute their digests, constructing the Tree object manually avoids
+  // redundant marshaling.
+  bool is_topologically_sorted = 4;
+
+  // The digest of the encoded
+  // [Directory][build.bazel.remote.execution.v2.Directory] proto
+  // containing the contents the directory's root.
+  //
+  // If both `tree_digest` and `root_directory_digest` are set, this
+  // field MUST match the digest of the root directory contained in the
+  // Tree message.
+  Digest root_directory_digest = 5;
 }
 
 // An `OutputSymlink` is similar to a
@@ -940,9 +1348,13 @@
   // The target path can be relative to the parent directory of the symlink or
   // it can be an absolute path starting with `/`. Support for absolute paths
   // can be checked using the [Capabilities][build.bazel.remote.execution.v2.Capabilities]
-  // API. The canonical form forbids the substrings `/./` and `//` in the target
-  // path. `..` components are allowed anywhere in the target path.
+  // API. `..` components are allowed anywhere in the target path.
   string target = 2;
+
+  // The supported node properties of the OutputSymlink, if requested by the
+  // Action.
+  reserved 3;
+  NodeProperties node_properties = 4;
 }
 
 // An `ExecutionPolicy` can be used to control the scheduling of the action.
@@ -1012,6 +1424,29 @@
   // The server will have a default policy if this is not provided.
   // This may be applied to both the ActionResult and the associated blobs.
   ResultsCachePolicy results_cache_policy = 8;
+
+  // The digest function that was used to compute the action digest.
+  //
+  // If the digest function used is one of MD5, MURMUR3, SHA1, SHA256,
+  // SHA384, SHA512, or VSO, the client MAY leave this field unset. In
+  // that case the server SHOULD infer the digest function using the
+  // length of the action digest hash and the digest functions announced
+  // in the server's capabilities.
+  DigestFunction.Value digest_function = 9;
+
+  // A hint to the server to request inlining stdout in the
+  // [ActionResult][build.bazel.remote.execution.v2.ActionResult] message.
+  bool inline_stdout = 10;
+
+  // A hint to the server to request inlining stderr in the
+  // [ActionResult][build.bazel.remote.execution.v2.ActionResult] message.
+  bool inline_stderr = 11;
+
+  // A hint to the server to inline the contents of the listed output files.
+  // Each path needs to exactly match one file path in either `output_paths` or
+  // `output_files` (DEPRECATED since v2.1) in the
+  // [Command][build.bazel.remote.execution.v2.Command] message.
+  repeated string inline_output_files = 12;
 }
 
 // A `LogFile` is a log stored in the CAS.
@@ -1065,14 +1500,21 @@
   string message = 5;
 }
 
-// Metadata about an ongoing
-// [execution][build.bazel.remote.execution.v2.Execution.Execute], which
-// will be contained in the [metadata
-// field][google.longrunning.Operation.response] of the
-// [Operation][google.longrunning.Operation].
-message ExecuteOperationMetadata {
-  // The current stage of execution.
-  enum Stage {
+// The current stage of action execution.
+//
+// Even though these stages are numbered according to the order in which
+// they generally occur, there is no requirement that the remote
+// execution system reports events along this order. For example, an
+// operation MAY transition from the EXECUTING stage back to QUEUED
+// in case the hardware on which the operation executes fails.
+//
+// If and only if the remote execution system reports that an operation
+// has reached the COMPLETED stage, it MUST set the [done
+// field][google.longrunning.Operation.done] of the
+// [Operation][google.longrunning.Operation] and terminate the stream.
+message ExecutionStage {
+  enum Value {
+    // Invalid value.
     UNKNOWN = 0;
 
     // Checking the result against the cache.
@@ -1087,22 +1529,34 @@
     // Finished execution.
     COMPLETED = 4;
   }
+}
 
-  Stage stage = 1;
+// Metadata about an ongoing
+// [execution][build.bazel.remote.execution.v2.Execution.Execute], which
+// will be contained in the [metadata
+// field][google.longrunning.Operation.response] of the
+// [Operation][google.longrunning.Operation].
+message ExecuteOperationMetadata {
+  // The current stage of execution.
+  ExecutionStage.Value stage = 1;
 
   // The digest of the [Action][build.bazel.remote.execution.v2.Action]
   // being executed.
   Digest action_digest = 2;
 
-  // If set, the client can use this name with
+  // If set, the client can use this resource name with
   // [ByteStream.Read][google.bytestream.ByteStream.Read] to stream the
-  // standard output.
+  // standard output from the endpoint hosting streamed responses.
   string stdout_stream_name = 3;
 
-  // If set, the client can use this name with
+  // If set, the client can use this resource name with
   // [ByteStream.Read][google.bytestream.ByteStream.Read] to stream the
-  // standard error.
+  // standard error from the endpoint hosting streamed responses.
   string stderr_stream_name = 4;
+
+  // The client can read this field to view details about the ongoing
+  // execution.
+  ExecutedActionMetadata partial_execution_metadata = 5;
 }
 
 // A request message for
@@ -1126,6 +1580,29 @@
   // The digest of the [Action][build.bazel.remote.execution.v2.Action]
   // whose result is requested.
   Digest action_digest = 2;
+
+  // A hint to the server to request inlining stdout in the
+  // [ActionResult][build.bazel.remote.execution.v2.ActionResult] message.
+  bool inline_stdout = 3;
+
+  // A hint to the server to request inlining stderr in the
+  // [ActionResult][build.bazel.remote.execution.v2.ActionResult] message.
+  bool inline_stderr = 4;
+
+  // A hint to the server to inline the contents of the listed output files.
+  // Each path needs to exactly match one file path in either `output_paths` or
+  // `output_files` (DEPRECATED since v2.1) in the
+  // [Command][build.bazel.remote.execution.v2.Command] message.
+  repeated string inline_output_files = 5;
+
+  // The digest function that was used to compute the action digest.
+  //
+  // If the digest function used is one of MD5, MURMUR3, SHA1, SHA256,
+  // SHA384, SHA512, or VSO, the client MAY leave this field unset. In
+  // that case the server SHOULD infer the digest function using the
+  // length of the action digest hash and the digest functions announced
+  // in the server's capabilities.
+  DigestFunction.Value digest_function = 6;
 }
 
 // A request message for
@@ -1150,6 +1627,15 @@
   // The server will have a default policy if this is not provided.
   // This may be applied to both the ActionResult and the associated blobs.
   ResultsCachePolicy results_cache_policy = 4;
+
+  // The digest function that was used to compute the action digest.
+  //
+  // If the digest function used is one of MD5, MURMUR3, SHA1, SHA256,
+  // SHA384, SHA512, or VSO, the client MAY leave this field unset. In
+  // that case the server SHOULD infer the digest function using the
+  // length of the action digest hash and the digest functions announced
+  // in the server's capabilities.
+  DigestFunction.Value digest_function = 5;
 }
 
 // A request message for
@@ -1162,8 +1648,18 @@
   // omitted.
   string instance_name = 1;
 
-  // A list of the blobs to check.
+  // A list of the blobs to check. All digests MUST use the same digest
+  // function.
   repeated Digest blob_digests = 2;
+
+  // The digest function of the blobs whose existence is checked.
+  //
+  // If the digest function used is one of MD5, MURMUR3, SHA1, SHA256,
+  // SHA384, SHA512, or VSO, the client MAY leave this field unset. In
+  // that case the server SHOULD infer the digest function using the
+  // length of the blob digest hashes and the digest functions announced
+  // in the server's capabilities.
+  DigestFunction.Value digest_function = 3;
 }
 
 // A response message for
@@ -1178,11 +1674,18 @@
 message BatchUpdateBlobsRequest {
   // A request corresponding to a single blob that the client wants to upload.
   message Request {
-    // The digest of the blob. This MUST be the digest of `data`.
+    // The digest of the blob. This MUST be the digest of `data`. All
+    // digests MUST use the same digest function.
     Digest digest = 1;
 
     // The raw binary data.
     bytes data = 2;
+
+    // The format of `data`. Must be `IDENTITY`/unspecified, or one of the
+    // compressors advertised by the 
+    // [CacheCapabilities.supported_batch_compressors][build.bazel.remote.execution.v2.CacheCapabilities.supported_batch_compressors]
+    // field.
+    Compressor.Value compressor = 3;
   }
 
   // The instance of the execution system to operate against. A server may
@@ -1194,6 +1697,16 @@
 
   // The individual upload requests.
   repeated Request requests = 2;
+
+  // The digest function that was used to compute the digests of the
+  // blobs being uploaded.
+  //
+  // If the digest function used is one of MD5, MURMUR3, SHA1, SHA256,
+  // SHA384, SHA512, or VSO, the client MAY leave this field unset. In
+  // that case the server SHOULD infer the digest function using the
+  // length of the blob digest hashes and the digest functions announced
+  // in the server's capabilities.
+  DigestFunction.Value digest_function = 5;
 }
 
 // A response message for
@@ -1222,8 +1735,22 @@
   // omitted.
   string instance_name = 1;
 
-  // The individual blob digests.
+  // The individual blob digests. All digests MUST use the same digest
+  // function.
   repeated Digest digests = 2;
+
+  // A list of acceptable encodings for the returned inlined data, in no
+  // particular order. `IDENTITY` is always allowed even if not specified here.
+  repeated Compressor.Value acceptable_compressors = 3;
+
+  // The digest function of the blobs being requested.
+  //
+  // If the digest function used is one of MD5, MURMUR3, SHA1, SHA256,
+  // SHA384, SHA512, or VSO, the client MAY leave this field unset. In
+  // that case the server SHOULD infer the digest function using the
+  // length of the blob digest hashes and the digest functions announced
+  // in the server's capabilities.
+  DigestFunction.Value digest_function = 4;
 }
 
 // A response message for
@@ -1237,6 +1764,10 @@
     // The raw binary data.
     bytes data = 2;
 
+    // The format the data is encoded in. MUST be `IDENTITY`/unspecified,
+    // or one of the acceptable compressors specified in the `BatchReadBlobsRequest`.
+    Compressor.Value compressor = 4;
+
     // The result of attempting to download that blob.
     google.rpc.Status status = 3;
   }
@@ -1269,8 +1800,19 @@
 
   // A page token, which must be a value received in a previous
   // [GetTreeResponse][build.bazel.remote.execution.v2.GetTreeResponse].
-  // If present, the server will use it to return the following page of results.
+  // If present, the server will use that token as an offset, returning only
+  // that page and the ones that succeed it.
   string page_token = 4;
+
+  // The digest function that was used to compute the digest of the root
+  // directory.
+  //
+  // If the digest function used is one of MD5, MURMUR3, SHA1, SHA256,
+  // SHA384, SHA512, or VSO, the client MAY leave this field unset. In
+  // that case the server SHOULD infer the digest function using the
+  // length of the root digest hash and the digest functions announced
+  // in the server's capabilities.
+  DigestFunction.Value digest_function = 5;
 }
 
 // A response message for
@@ -1318,18 +1860,95 @@
 
 // The digest function used for converting values into keys for CAS and Action
 // Cache.
-enum DigestFunction {
-  // It is an error for the server to return this value.
-  UNKNOWN = 0;
+message DigestFunction {
+  enum Value {
+    // It is an error for the server to return this value.
+    UNKNOWN = 0;
 
-  // The Sha-256 digest function.
-  SHA256 = 1;
+    // The SHA-256 digest function.
+    SHA256 = 1;
 
-  // The Sha-1 digest function.
-  SHA1 = 2;
+    // The SHA-1 digest function.
+    SHA1 = 2;
 
-  // The MD5 digest function.
-  MD5 = 3;
+    // The MD5 digest function.
+    MD5 = 3;
+
+    // The Microsoft "VSO-Hash" paged SHA256 digest function.
+    // See https://github.com/microsoft/BuildXL/blob/master/Documentation/Specs/PagedHash.md .
+    VSO = 4;
+
+    // The SHA-384 digest function.
+    SHA384 = 5;
+
+    // The SHA-512 digest function.
+    SHA512 = 6;
+
+    // Murmur3 128-bit digest function, x64 variant. Note that this is not a
+    // cryptographic hash function and its collision properties are not strongly guaranteed.
+    // See https://github.com/aappleby/smhasher/wiki/MurmurHash3 .
+    MURMUR3 = 7;
+
+    // The SHA-256 digest function, modified to use a Merkle tree for
+    // large objects. This permits implementations to store large blobs
+    // as a decomposed sequence of 2^j sized chunks, where j >= 10,
+    // while being able to validate integrity at the chunk level.
+    //
+    // Furthermore, on systems that do not offer dedicated instructions
+    // for computing SHA-256 hashes (e.g., the Intel SHA and ARMv8
+    // cryptographic extensions), SHA256TREE hashes can be computed more
+    // efficiently than plain SHA-256 hashes by using generic SIMD
+    // extensions, such as Intel AVX2 or ARM NEON.
+    //
+    // SHA256TREE hashes are computed as follows:
+    //
+    // - For blobs that are 1024 bytes or smaller, the hash is computed
+    //   using the regular SHA-256 digest function.
+    //
+    // - For blobs that are more than 1024 bytes in size, the hash is
+    //   computed as follows:
+    //
+    //   1. The blob is partitioned into a left (leading) and right
+    //      (trailing) blob. These blobs have lengths m and n
+    //      respectively, where m = 2^k and 0 < n <= m.
+    //
+    //   2. Hashes of the left and right blob, Hash(left) and
+    //      Hash(right) respectively, are computed by recursively
+    //      applying the SHA256TREE algorithm.
+    //
+    //   3. A single invocation is made to the SHA-256 block cipher with
+    //      the following parameters:
+    //
+    //          M = Hash(left) || Hash(right)
+    //          H = {
+    //              0xcbbb9d5d, 0x629a292a, 0x9159015a, 0x152fecd8,
+    //              0x67332667, 0x8eb44a87, 0xdb0c2e0d, 0x47b5481d,
+    //          }
+    //
+    //      The values of H are the leading fractional parts of the
+    //      square roots of the 9th to the 16th prime number (23 to 53).
+    //      This differs from plain SHA-256, where the first eight prime
+    //      numbers (2 to 19) are used, thereby preventing trivial hash
+    //      collisions between small and large objects.
+    //
+    //   4. The hash of the full blob can then be obtained by
+    //      concatenating the outputs of the block cipher:
+    //
+    //          Hash(blob) = a || b || c || d || e || f || g || h
+    //
+    //      Addition of the original values of H, as normally done
+    //      through the use of the Davies-Meyer structure, is not
+    //      performed. This isn't necessary, as the block cipher is only
+    //      invoked once.
+    //
+    // Test vectors of this digest function can be found in the
+    // accompanying sha256tree_test_vectors.txt file.
+    SHA256TREE = 8;
+
+    // The BLAKE3 hash function.
+    // See https://github.com/BLAKE3-team/BLAKE3.
+    BLAKE3 = 9;
+  }
 }
 
 // Describes the server/instance capabilities for updating the action cache.
@@ -1338,21 +1957,26 @@
 }
 
 // Allowed values for priority in
-// [ResultsCachePolicy][google.devtools.remoteexecution.v2.ResultsCachePolicy]
+// [ResultsCachePolicy][build.bazel.remoteexecution.v2.ResultsCachePolicy] and
+// [ExecutionPolicy][build.bazel.remoteexecution.v2.ResultsCachePolicy]
 // Used for querying both cache and execution valid priority ranges.
 message PriorityCapabilities {
   // Supported range of priorities, including boundaries.
   message PriorityRange {
+    // The minimum numeric value for this priority range, which represents the
+    // most urgent task or longest retained item.
     int32 min_priority = 1;
+    // The maximum numeric value for this priority range, which represents the
+    // least urgent task or shortest retained item.
     int32 max_priority = 2;
   }
   repeated PriorityRange priorities = 1;
 }
 
-// Capabilities of the remote cache system.
-message CacheCapabilities {
-  // Describes how the server treats absolute symlink targets.
-  enum SymlinkAbsolutePathStrategy {
+// Describes how the server treats absolute symlink targets.
+message SymlinkAbsolutePathStrategy {
+  enum Value {
+    // Invalid value.
     UNKNOWN = 0;
 
     // Server will return an `INVALID_ARGUMENT` on input symlinks with absolute
@@ -1365,10 +1989,36 @@
     // resulting in non-hermetic builds.
     ALLOWED = 2;
   }
+}
 
+// Compression formats which may be supported.
+message Compressor {
+  enum Value {
+    // No compression. Servers and clients MUST always support this, and do
+    // not need to advertise it.
+    IDENTITY = 0;
+
+    // Zstandard compression.
+    ZSTD = 1;
+
+    // RFC 1951 Deflate. This format is identical to what is used by ZIP
+    // files. Headers such as the one generated by gzip are not
+    // included.
+    //
+    // It is advised to use algorithms such as Zstandard instead, as
+    // those are faster and/or provide a better compression ratio.
+    DEFLATE = 2;
+
+    // Brotli compression.
+    BROTLI = 3;
+  }
+}
+
+// Capabilities of the remote cache system.
+message CacheCapabilities {
   // All the digest functions supported by the remote cache.
   // Remote cache may support multiple digest functions simultaneously.
-  repeated DigestFunction digest_function = 1;
+  repeated DigestFunction.Value digest_functions = 1;
 
   // Capabilities for updating the action cache.
   ActionCacheUpdateCapabilities action_cache_update_capabilities = 2;
@@ -1383,19 +2033,52 @@
   int64 max_batch_total_size_bytes = 4;
 
   // Whether absolute symlink targets are supported.
-  SymlinkAbsolutePathStrategy symlink_absolute_path_strategy = 5;
+  SymlinkAbsolutePathStrategy.Value symlink_absolute_path_strategy = 5;
+
+  // Compressors supported by the "compressed-blobs" bytestream resources.
+  // Servers MUST support identity/no-compression, even if it is not listed
+  // here.
+  //
+  // Note that this does not imply which if any compressors are supported by
+  // the server at the gRPC level.
+  repeated Compressor.Value supported_compressors = 6;
+
+  // Compressors supported for inlined data in
+  // [BatchUpdateBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs]
+  // requests.
+  repeated Compressor.Value supported_batch_update_compressors = 7;
 }
 
 // Capabilities of the remote execution system.
 message ExecutionCapabilities {
-  // Remote execution may only support a single digest function.
-  DigestFunction digest_function = 1;
+  // Legacy field for indicating which digest function is supported by the
+  // remote execution system. It MUST be set to a value other than UNKNOWN.
+  // Implementations should consider the repeated digest_functions field
+  // first, falling back to this singular field if digest_functions is unset.
+  DigestFunction.Value digest_function = 1;
 
   // Whether remote execution is enabled for the particular server/instance.
   bool exec_enabled = 2;
 
   // Supported execution priority range.
   PriorityCapabilities execution_priority_capabilities = 3;
+
+  // Supported node properties.
+  repeated string supported_node_properties = 4;
+
+  // All the digest functions supported by the remote execution system.
+  // If this field is set, it MUST also contain digest_function.
+  //
+  // Even if the remote execution system announces support for multiple
+  // digest functions, individual execution requests may only reference
+  // CAS objects using a single digest function. For example, it is not
+  // permitted to execute actions having both MD5 and SHA-256 hashed
+  // files in their input root.
+  //
+  // The CAS objects referenced by action results generated by the
+  // remote execution system MUST use the same digest function as the
+  // one used to construct the action.
+  repeated DigestFunction.Value digest_functions = 5;
 }
 
 // Details for the tool used to call the API.
@@ -1414,6 +2097,11 @@
 //
 // * name: `build.bazel.remote.execution.v2.requestmetadata-bin`
 // * contents: the base64 encoded binary `RequestMetadata` message.
+// Note: the gRPC library serializes binary headers encoded in base64 by
+// default (https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests).
+// Therefore, if the gRPC library is used to pass/retrieve this
+// metadata, the user may ignore the base64 encoding and assume it is simply
+// serialized as a binary message.
 message RequestMetadata {
   // The details for the tool invoking the requests.
   ToolDetails tool_details = 1;
@@ -1430,4 +2118,18 @@
   // An identifier to tie multiple tool invocations together. For example,
   // runs of foo_test, bar_test and baz_test on a post-submit of a given patch.
   string correlated_invocations_id = 4;
+
+  // A brief description of the kind of action, for example, CppCompile or GoLink.
+  // There is no standard agreed set of values for this, and they are expected to vary between different client tools.
+  string action_mnemonic = 5;
+
+  // An identifier for the target which produced this action.
+  // No guarantees are made around how many actions may relate to a single target.
+  string target_id = 6;
+
+  // An identifier for the configuration in which the target was built,
+  // e.g. for differentiating building host tools or different target platforms.
+  // There is no expectation that this value will have any particular structure,
+  // or equality across invocations, though some client tools may offer these guarantees.
+  string configuration_id = 7;
 }
diff --git a/build/bazel/remote/execution/v2/sha256tree_test_vectors.txt b/build/bazel/remote/execution/v2/sha256tree_test_vectors.txt
new file mode 100644
index 0000000..d048317
--- /dev/null
+++ b/build/bazel/remote/execution/v2/sha256tree_test_vectors.txt
@@ -0,0 +1,27 @@
+# Test vectors for the SHA256TREE digest function
+#
+# Each test vector corresponds to the hash of a repeating sequence of
+# 251 bytes: 0, 1, 2, ..., 249, 250, 0, 1, ..., and so on. The number in
+# the first column corresponds to the length of the sequence, in bytes.
+#
+# Test vectors for input lengths 1024 and less are not provided, as
+# those are identical to those of plain SHA-256.
+
+1025	36c0998b21839ef74300b9de47d96d1f62323dc81f2b4231e98ce70cd6ffe750
+2048	b584996386f01793751c5cf0c39561f51b7e9924b818943b3cb2f6928cea0fa9
+2049	7318d2029b0392edf4cf109edb5a086b4bdadbb7950f710a1483eb881d9e5d44
+3072	dfc61c0a041f79d55d53bfe31c6cda7df77fdc8e6fbac1143d70b7144fdf6937
+3073	517d20c0e5835f060a1bd6388ed68574f63424bdac2a2c3a35a5c2ef859d8fe2
+4096	2f72bb93880012168c027f6781527ff08177c7c8dccb443f4d2c6389c186633d
+4097	c3ec942c1b8f4580320d3a06bcf4f8fe1f5db2be797ab67061ea4c2a95f208f2
+5120	a76924f6535b4b473377c285ec27acc84cc58e95ab1e9e29b1bb6a4a3fb9d0b3
+5121	98f987c3e9fc057a70873715b679b89a663d0df806859b6ce73f8379b06a10ff
+6144	372f988af412041b680ab236feef45626380062beb7514bbf93607aedd28fc9a
+6145	6dc4b78efd770453417b2ffdc74b27054793efe6122ecd7ee098670ed7c4651c
+7168	43686312c0cabccf9d5ad509efa096e3d743c63c7a51f122473c57949e4dd9a0
+7169	ad729297ab36cd099665b27c4247474a5518e4cd0be443f5f31d95edda08429b
+8192	fcfdde6fe59178e17708c5ba647919c3b141a44c9d1970782e597e1465266932
+8193	113c6e3a2452f388b6fad13dfab66ee0bff597a0a9a517ad8d0165f7190b603e
+16384	a7a10149a8cb00be537000560edb83b196306b780b72fad8af218f369f75fc19
+31744	2cdf7662636c173d4b236f6ea03bf84c65e7f6487b53b2a61c420e26cf8a98c7
+102400	0668d69e5331840d2f1823d717b7b3f5d1fdc8a09504cddb692b87ff83d50e5f
diff --git a/build/bazel/remote/logstream/v1/BUILD b/build/bazel/remote/logstream/v1/BUILD
new file mode 100644
index 0000000..d189c9c
--- /dev/null
+++ b/build/bazel/remote/logstream/v1/BUILD
@@ -0,0 +1,30 @@
+package(default_visibility = ["//visibility:public"])
+
+load("@rules_proto//proto:defs.bzl", "proto_library")
+
+licenses(["notice"])
+
+proto_library(
+    name = "remote_logstream_proto",
+    srcs = ["remote_logstream.proto"],
+)
+
+alias(
+    name = "remote_logstream_java_proto",
+    actual = "//build/bazel/remote/logstream/v1/java:remote_logstream_java_proto",
+)
+
+alias(
+    name = "remote_logstream_cc_proto",
+    actual = "//build/bazel/remote/logstream/v1/cc:remote_logstream_cc_grpc",
+)
+
+alias(
+    name = "remote_logstream_go_proto",
+    actual = "//build/bazel/remote/logstream/v1/go:remote_logstream_go_proto",
+)
+
+alias(
+    name = "go_default_library",
+    actual = "//build/bazel/remote/logstream/v1/go:go_default_library",
+)
diff --git a/build/bazel/remote/logstream/v1/cc/BUILD b/build/bazel/remote/logstream/v1/cc/BUILD
new file mode 100644
index 0000000..21458e0
--- /dev/null
+++ b/build/bazel/remote/logstream/v1/cc/BUILD
@@ -0,0 +1,25 @@
+package(default_visibility = ["//build/bazel/remote/logstream/v1:__pkg__"])
+
+load("//internal:cc_grpc_library.bzl", "cc_grpc_codegen")
+
+cc_proto_library(
+    name = "remote_logstream_cc_proto",
+    deps = ["//build/bazel/remote/logstream/v1:remote_logstream_proto"],
+)
+
+cc_grpc_codegen(
+    name = "remote_logstream_cc_grpc_codegen",
+    proto = "//build/bazel/remote/logstream/v1:remote_logstream_proto",
+)
+
+cc_library(
+    name = "remote_logstream_cc_grpc",
+    srcs = [":remote_logstream_cc_grpc_codegen"],
+    hdrs = [":remote_logstream_cc_grpc_codegen"],
+    include_prefix = "build/bazel/remote/logstream/v1",
+    strip_include_prefix = "/" + package_name(),
+    deps = [
+        ":remote_logstream_cc_proto",
+        "@com_github_grpc_grpc//:grpc++_codegen_proto",
+    ],
+)
diff --git a/build/bazel/remote/logstream/v1/go/BUILD b/build/bazel/remote/logstream/v1/go/BUILD
new file mode 100644
index 0000000..df86f75
--- /dev/null
+++ b/build/bazel/remote/logstream/v1/go/BUILD
@@ -0,0 +1,17 @@
+package(default_visibility = ["//build/bazel/remote/logstream/v1:__pkg__"])
+
+load("@io_bazel_rules_go//go:def.bzl", "go_library")
+load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library")
+
+go_proto_library(
+    name = "remote_logstream_go_proto",
+    compilers = ["@io_bazel_rules_go//proto:go_grpc"],
+    importpath = "github.com/bazelbuild/remote-apis/build/bazel/remote/logstream/v1",
+    proto = "//build/bazel/remote/logstream/v1:remote_logstream_proto",
+)
+
+go_library(
+    name = "go_default_library",
+    embed = [":remote_logstream_go_proto"],
+    importpath = "github.com/bazelbuild/remote-apis/build/bazel/remote/logstream/v1",
+)
diff --git a/build/bazel/remote/logstream/v1/java/BUILD b/build/bazel/remote/logstream/v1/java/BUILD
new file mode 100644
index 0000000..23f3a2c
--- /dev/null
+++ b/build/bazel/remote/logstream/v1/java/BUILD
@@ -0,0 +1,6 @@
+package(default_visibility = ["//build/bazel/remote/logstream/v1:__pkg__"])
+
+java_proto_library(
+    name = "remote_logstream_java_proto",
+    deps = ["//build/bazel/remote/logstream/v1:remote_logstream_proto"],
+)
diff --git a/build/bazel/remote/logstream/v1/remote_logstream.pb.go b/build/bazel/remote/logstream/v1/remote_logstream.pb.go
new file mode 100755
index 0000000..cd1ac2f
--- /dev/null
+++ b/build/bazel/remote/logstream/v1/remote_logstream.pb.go
@@ -0,0 +1,389 @@
+// Copyright 2020 The Bazel Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Log Stream API
+
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.31.0
+// 	protoc        v3.15.0
+// source: build/bazel/remote/logstream/v1/remote_logstream.proto
+
+package remotelogstream
+
+import (
+	context "context"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+	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)
+)
+
+// Contains all information necessary to create a new LogStream resource.
+type CreateLogStreamRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Required. The parent resource of the created LogStream.
+	// The list of valid types of parent resources of LogStreams is up to the
+	// implementing server.
+	// Example: projects/123
+	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
+}
+
+func (x *CreateLogStreamRequest) Reset() {
+	*x = CreateLogStreamRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_logstream_v1_remote_logstream_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CreateLogStreamRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CreateLogStreamRequest) ProtoMessage() {}
+
+func (x *CreateLogStreamRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_logstream_v1_remote_logstream_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 CreateLogStreamRequest.ProtoReflect.Descriptor instead.
+func (*CreateLogStreamRequest) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_logstream_v1_remote_logstream_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *CreateLogStreamRequest) GetParent() string {
+	if x != nil {
+		return x.Parent
+	}
+	return ""
+}
+
+// A handle to a log (an ordered sequence of bytes).
+type LogStream struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Structured name of the resource in the format:
+	//
+	//	{parent=**}/logstreams/{logstream_id}
+	//	Example: projects/123/logstreams/456-def
+	//
+	// Attempting to call the Byte Stream API's `Write` RPC with a LogStream's
+	//
+	//	`name` as the value for `ByteStream.Write.resource_name` is an error.
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	// Resource name to pass to `ByteStream.Write` in the format:
+	//
+	//	{parent=**}/logstreams/{logstream_id}/{write_token}
+	//	Example: projects/123/logstreams/456-def/789-ghi
+	//
+	// Attempting to call the Byte Stream API's `Read` RPC with a LogStream's
+	//
+	//	`write_resource_name` as the value for `ByteStream.Write.resource_name`
+	//	is an error.
+	//
+	// `write_resource_name` is separate from `name` to ensure that only the
+	// intended writers can write to a given LogStream. Writers must address write
+	// operations to the `write_resource_name`, not the `name`, and must have
+	// permission to write LogStreams. `write_resource_name` embeds a secret token
+	// and should be protected accordingly; a mishandled `write_resource_name` can
+	// result in unintended writers corrupting the LogStream. Therefore, the field
+	// should be excluded from calls to any calls which retrieve LogStream
+	// metadata (i.e.: `GetLogStream`).
+	//
+	// Bytes written to this resource must to be readable when `ByteStream.Read`
+	// is called with the `name` resource.
+	// Reading a write_resource_name must return an INVALID_ARGUMENT error.
+	WriteResourceName string `protobuf:"bytes,2,opt,name=write_resource_name,json=writeResourceName,proto3" json:"write_resource_name,omitempty"`
+}
+
+func (x *LogStream) Reset() {
+	*x = LogStream{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_remote_logstream_v1_remote_logstream_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *LogStream) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LogStream) ProtoMessage() {}
+
+func (x *LogStream) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_remote_logstream_v1_remote_logstream_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use LogStream.ProtoReflect.Descriptor instead.
+func (*LogStream) Descriptor() ([]byte, []int) {
+	return file_build_bazel_remote_logstream_v1_remote_logstream_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *LogStream) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *LogStream) GetWriteResourceName() string {
+	if x != nil {
+		return x.WriteResourceName
+	}
+	return ""
+}
+
+var File_build_bazel_remote_logstream_v1_remote_logstream_proto protoreflect.FileDescriptor
+
+var file_build_bazel_remote_logstream_v1_remote_logstream_proto_rawDesc = []byte{
+	0x0a, 0x36, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2f, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2f, 0x72, 0x65,
+	0x6d, 0x6f, 0x74, 0x65, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2f, 0x76,
+	0x31, 0x2f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x74, 0x72, 0x65,
+	0x61, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e,
+	0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x6c, 0x6f, 0x67,
+	0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x22, 0x30, 0x0a, 0x16, 0x43, 0x72, 0x65,
+	0x61, 0x74, 0x65, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x22, 0x4f, 0x0a, 0x09, 0x4c,
+	0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x13,
+	0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e,
+	0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x77, 0x72, 0x69, 0x74, 0x65,
+	0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x32, 0x8c, 0x01, 0x0a,
+	0x10, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,
+	0x65, 0x12, 0x78, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x67, 0x53, 0x74,
+	0x72, 0x65, 0x61, 0x6d, 0x12, 0x37, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a,
+	0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x73, 0x74, 0x72,
+	0x65, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x67,
+	0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e,
+	0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f,
+	0x74, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e,
+	0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x00, 0x42, 0xb3, 0x01, 0x0a, 0x1f,
+	0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f,
+	0x74, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x42,
+	0x14, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d,
+	0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x51, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e,
+	0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2f, 0x72,
+	0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2d, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64,
+	0x2f, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2f, 0x6c, 0x6f,
+	0x67, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2f, 0x76, 0x31, 0x3b, 0x72, 0x65, 0x6d, 0x6f, 0x74,
+	0x65, 0x6c, 0x6f, 0x67, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xa2, 0x02, 0x02, 0x52, 0x4c, 0xaa,
+	0x02, 0x1f, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x42, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x52, 0x65,
+	0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76,
+	0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_build_bazel_remote_logstream_v1_remote_logstream_proto_rawDescOnce sync.Once
+	file_build_bazel_remote_logstream_v1_remote_logstream_proto_rawDescData = file_build_bazel_remote_logstream_v1_remote_logstream_proto_rawDesc
+)
+
+func file_build_bazel_remote_logstream_v1_remote_logstream_proto_rawDescGZIP() []byte {
+	file_build_bazel_remote_logstream_v1_remote_logstream_proto_rawDescOnce.Do(func() {
+		file_build_bazel_remote_logstream_v1_remote_logstream_proto_rawDescData = protoimpl.X.CompressGZIP(file_build_bazel_remote_logstream_v1_remote_logstream_proto_rawDescData)
+	})
+	return file_build_bazel_remote_logstream_v1_remote_logstream_proto_rawDescData
+}
+
+var file_build_bazel_remote_logstream_v1_remote_logstream_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
+var file_build_bazel_remote_logstream_v1_remote_logstream_proto_goTypes = []interface{}{
+	(*CreateLogStreamRequest)(nil), // 0: build.bazel.remote.logstream.v1.CreateLogStreamRequest
+	(*LogStream)(nil),              // 1: build.bazel.remote.logstream.v1.LogStream
+}
+var file_build_bazel_remote_logstream_v1_remote_logstream_proto_depIdxs = []int32{
+	0, // 0: build.bazel.remote.logstream.v1.LogStreamService.CreateLogStream:input_type -> build.bazel.remote.logstream.v1.CreateLogStreamRequest
+	1, // 1: build.bazel.remote.logstream.v1.LogStreamService.CreateLogStream:output_type -> build.bazel.remote.logstream.v1.LogStream
+	1, // [1:2] is the sub-list for method output_type
+	0, // [0:1] 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_build_bazel_remote_logstream_v1_remote_logstream_proto_init() }
+func file_build_bazel_remote_logstream_v1_remote_logstream_proto_init() {
+	if File_build_bazel_remote_logstream_v1_remote_logstream_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_build_bazel_remote_logstream_v1_remote_logstream_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CreateLogStreamRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_build_bazel_remote_logstream_v1_remote_logstream_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*LogStream); 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_build_bazel_remote_logstream_v1_remote_logstream_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   2,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
+		GoTypes:           file_build_bazel_remote_logstream_v1_remote_logstream_proto_goTypes,
+		DependencyIndexes: file_build_bazel_remote_logstream_v1_remote_logstream_proto_depIdxs,
+		MessageInfos:      file_build_bazel_remote_logstream_v1_remote_logstream_proto_msgTypes,
+	}.Build()
+	File_build_bazel_remote_logstream_v1_remote_logstream_proto = out.File
+	file_build_bazel_remote_logstream_v1_remote_logstream_proto_rawDesc = nil
+	file_build_bazel_remote_logstream_v1_remote_logstream_proto_goTypes = nil
+	file_build_bazel_remote_logstream_v1_remote_logstream_proto_depIdxs = nil
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// LogStreamServiceClient is the client API for LogStreamService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type LogStreamServiceClient interface {
+	// Create a LogStream which may be written to.
+	//
+	// The returned LogStream resource name will include a `write_resource_name`
+	// which is the resource to use when writing to the LogStream.
+	// Callers of CreateLogStream are expected to NOT publish the
+	// `write_resource_name`.
+	CreateLogStream(ctx context.Context, in *CreateLogStreamRequest, opts ...grpc.CallOption) (*LogStream, error)
+}
+
+type logStreamServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewLogStreamServiceClient(cc grpc.ClientConnInterface) LogStreamServiceClient {
+	return &logStreamServiceClient{cc}
+}
+
+func (c *logStreamServiceClient) CreateLogStream(ctx context.Context, in *CreateLogStreamRequest, opts ...grpc.CallOption) (*LogStream, error) {
+	out := new(LogStream)
+	err := c.cc.Invoke(ctx, "/build.bazel.remote.logstream.v1.LogStreamService/CreateLogStream", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// LogStreamServiceServer is the server API for LogStreamService service.
+type LogStreamServiceServer interface {
+	// Create a LogStream which may be written to.
+	//
+	// The returned LogStream resource name will include a `write_resource_name`
+	// which is the resource to use when writing to the LogStream.
+	// Callers of CreateLogStream are expected to NOT publish the
+	// `write_resource_name`.
+	CreateLogStream(context.Context, *CreateLogStreamRequest) (*LogStream, error)
+}
+
+// UnimplementedLogStreamServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedLogStreamServiceServer struct {
+}
+
+func (*UnimplementedLogStreamServiceServer) CreateLogStream(context.Context, *CreateLogStreamRequest) (*LogStream, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method CreateLogStream not implemented")
+}
+
+func RegisterLogStreamServiceServer(s *grpc.Server, srv LogStreamServiceServer) {
+	s.RegisterService(&_LogStreamService_serviceDesc, srv)
+}
+
+func _LogStreamService_CreateLogStream_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(CreateLogStreamRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(LogStreamServiceServer).CreateLogStream(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/build.bazel.remote.logstream.v1.LogStreamService/CreateLogStream",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(LogStreamServiceServer).CreateLogStream(ctx, req.(*CreateLogStreamRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _LogStreamService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "build.bazel.remote.logstream.v1.LogStreamService",
+	HandlerType: (*LogStreamServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "CreateLogStream",
+			Handler:    _LogStreamService_CreateLogStream_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "build/bazel/remote/logstream/v1/remote_logstream.proto",
+}
diff --git a/build/bazel/remote/logstream/v1/remote_logstream.proto b/build/bazel/remote/logstream/v1/remote_logstream.proto
new file mode 100644
index 0000000..2741016
--- /dev/null
+++ b/build/bazel/remote/logstream/v1/remote_logstream.proto
@@ -0,0 +1,139 @@
+// Copyright 2020 The Bazel Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Log Stream API
+
+syntax = "proto3";
+
+package build.bazel.remote.logstream.v1;
+
+option csharp_namespace = "Build.Bazel.Remote.LogStream.v1";
+option go_package = "github.com/bazelbuild/remote-apis/build/bazel/remote/logstream/v1;remotelogstream";
+option java_multiple_files = true;
+option java_outer_classname = "RemoteLogStreamProto";
+option java_package = "build.bazel.remote.logstream.v1";
+option objc_class_prefix = "RL";
+
+
+// #### Introduction
+//
+// The Log Stream API manages LogStream resources which are used to stream
+// writes and reads of an ordered sequence of bytes of unknown eventual length.
+//
+// Note that this is an API Interface and not an API Service, per the definitions
+// at: https://cloud.google.com/apis/design/glossary
+//
+// Log Stream API supports the reading of unfinalized LogStreams either by
+// seeking or in "tail" mode, for example by end-users browsing to a build
+// result UI interested in seeing logs from a build action as soon as they are
+// (or as they become) available.
+//
+// Reads and Writes of LogStreams are done via the Byte Stream API:
+// https://cloud.google.com/dataproc/docs/reference/rpc/google.bytestream
+// https://github.com/googleapis/googleapis/blob/master/google/bytestream/bytestream.proto
+//
+// #### Writing LogStreams
+//
+// LogStreams are written to via the Byte Stream API's `Write` RPC. Bytes
+// written to LogStreams are expected to be committed and available for reading
+// within a reasonable period of time (implementation-defined). Committed bytes
+// to a LogStream cannot be overwritten, and finalized LogStreams - indicated by
+// setting `finish_write` field in the final WriteRequest - also cannot be
+// appended to.
+//
+// When calling the Byte Stream API's `Write` RPC to write LogStreams, writers
+// must pass the `write_resource_name` of a LogStream as
+// `ByteStream.WriteRequest.resource_name` rather than the LogStream's `name`.
+// Separate resource names for reading and writing allows for broadcasting the
+// read resource name widely while simultaneously ensuring that only writer(s)
+// with knowledge of the write resource name may have written bytes to the
+// LogStream.
+//
+// #### Reading LogStreams
+//
+// Use the Byte Stream API's `Read` RPC to read LogStreams. When reading
+// finalized LogStreams the server will stream all contents of the LogStream
+// starting at `ByteStream.ReadRequest.read_offset`.
+//
+// When reading unfinalized LogStreams the server must keep the streaming
+// `ByteStream.Read` RPC open and send `ByteStream.ReadResponse` messages as
+// more bytes become available or the LogStream is finalized.
+//
+// #### Example Multi-Party Read/Write Flow
+//
+// 1. LogStream Writer calls `CreateLogStream`
+// 2. LogStream Writer publishes `LogStream.name`
+// 3. LogStream Writer calls `ByteStream.Write` with
+//    `LogStream.write_resource_name` as
+//    `ByteStream.WriteRequest.resource_name`,
+//    `ByteStream.WriteRequest.finish_write`=false.
+// 4. LogStream Reader(s) call `ByteStream.Read` with the published
+//    `LogStream.name` as `ByteStream.ReadRequest.resource_name`.
+// 5. LogStream Service streams all committed bytes to LogStream Reader(s),
+//    leave the stream open.
+// 6. LogStream Writer calls `ByteStream.Write` with
+//    `LogStream.write_resource_name` as
+//    `ByteStream.WriteRequest.resource_name`,
+//    `ByteStream.WriteRequest.finish_write`=true.
+// 7. LogStream Service streams all remaining bytes to LogStream Reader(s),
+//    terminates the stream.
+service LogStreamService {
+  // Create a LogStream which may be written to.
+  //
+  // The returned LogStream resource name will include a `write_resource_name`
+  // which is the resource to use when writing to the LogStream.
+  // Callers of CreateLogStream are expected to NOT publish the
+  // `write_resource_name`.
+  rpc CreateLogStream(CreateLogStreamRequest) returns (LogStream) {}
+}
+
+// Contains all information necessary to create a new LogStream resource.
+message CreateLogStreamRequest {
+  // Required. The parent resource of the created LogStream.
+  // The list of valid types of parent resources of LogStreams is up to the
+  // implementing server.
+  // Example: projects/123
+  string parent = 1;
+}
+
+// A handle to a log (an ordered sequence of bytes).
+message LogStream {
+  // Structured name of the resource in the format:
+  //   {parent=**}/logstreams/{logstream_id}
+  //   Example: projects/123/logstreams/456-def
+  // Attempting to call the Byte Stream API's `Write` RPC with a LogStream's
+  //   `name` as the value for `ByteStream.Write.resource_name` is an error.
+  string name = 1;
+
+  // Resource name to pass to `ByteStream.Write` in the format:
+  //   {parent=**}/logstreams/{logstream_id}/{write_token}
+  //   Example: projects/123/logstreams/456-def/789-ghi
+  // Attempting to call the Byte Stream API's `Read` RPC with a LogStream's
+  //   `write_resource_name` as the value for `ByteStream.Write.resource_name`
+  //   is an error.
+  //
+  // `write_resource_name` is separate from `name` to ensure that only the
+  // intended writers can write to a given LogStream. Writers must address write
+  // operations to the `write_resource_name`, not the `name`, and must have
+  // permission to write LogStreams. `write_resource_name` embeds a secret token
+  // and should be protected accordingly; a mishandled `write_resource_name` can
+  // result in unintended writers corrupting the LogStream. Therefore, the field
+  // should be excluded from calls to any calls which retrieve LogStream
+  // metadata (i.e.: `GetLogStream`).
+  //
+  // Bytes written to this resource must to be readable when `ByteStream.Read`
+  // is called with the `name` resource.
+  // Reading a write_resource_name must return an INVALID_ARGUMENT error.
+  string write_resource_name = 2;
+}
diff --git a/build/bazel/semver/BUILD b/build/bazel/semver/BUILD
index a3da887..9663c94 100644
--- a/build/bazel/semver/BUILD
+++ b/build/bazel/semver/BUILD
@@ -1,5 +1,6 @@
 package(default_visibility = ["//visibility:public"])
-load("@com_github_grpc_grpc//bazel:cc_grpc_library.bzl", "cc_grpc_library")
+
+load("@rules_proto//proto:defs.bzl", "proto_library")
 
 licenses(["notice"])
 
@@ -8,17 +9,22 @@
     srcs = ["semver.proto"],
 )
 
-java_proto_library(
+alias(
     name = "semver_java_proto",
-    deps = [":semver_proto"],
+    actual = "//build/bazel/semver/java:semver_java_proto",
 )
 
-cc_grpc_library(
+alias(
     name = "semver_cc_proto",
-    srcs = ["semver.proto"],
-    deps = [],
-    proto_only = False,
-    well_known_protos = True,
-    use_external = False,
+    actual = "//build/bazel/semver/cc:semver_cc_proto",
 )
 
+alias(
+    name = "semver_go_proto",
+    actual = "//build/bazel/semver/go:semver_go_proto",
+)
+
+alias(
+    name = "go_default_library",
+    actual = "//build/bazel/semver/go:go_default_library",
+)
diff --git a/build/bazel/semver/cc/BUILD b/build/bazel/semver/cc/BUILD
new file mode 100644
index 0000000..ceda8a5
--- /dev/null
+++ b/build/bazel/semver/cc/BUILD
@@ -0,0 +1,6 @@
+package(default_visibility = ["//build/bazel/semver:__pkg__"])
+
+cc_proto_library(
+    name = "semver_cc_proto",
+    deps = ["//build/bazel/semver:semver_proto"],
+)
diff --git a/build/bazel/semver/go/BUILD b/build/bazel/semver/go/BUILD
new file mode 100644
index 0000000..3023c19
--- /dev/null
+++ b/build/bazel/semver/go/BUILD
@@ -0,0 +1,16 @@
+package(default_visibility = ["//build/bazel/semver:__pkg__"])
+
+load("@io_bazel_rules_go//go:def.bzl", "go_library")
+load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library")
+
+go_proto_library(
+    name = "semver_go_proto",
+    importpath = "github.com/bazelbuild/remote-apis/build/bazel/semver",
+    proto = "//build/bazel/semver:semver_proto",
+)
+
+go_library(
+    name = "go_default_library",
+    embed = [":semver_go_proto"],
+    importpath = "github.com/bazelbuild/remote-apis/build/bazel/semver",
+)
diff --git a/build/bazel/semver/java/BUILD b/build/bazel/semver/java/BUILD
new file mode 100644
index 0000000..7148af3
--- /dev/null
+++ b/build/bazel/semver/java/BUILD
@@ -0,0 +1,6 @@
+package(default_visibility = ["//build/bazel/semver:__pkg__"])
+
+java_proto_library(
+    name = "semver_java_proto",
+    deps = ["//build/bazel/semver:semver_proto"],
+)
diff --git a/build/bazel/semver/semver.pb.go b/build/bazel/semver/semver.pb.go
new file mode 100755
index 0000000..a33beca
--- /dev/null
+++ b/build/bazel/semver/semver.pb.go
@@ -0,0 +1,199 @@
+// Copyright 2018 The Bazel Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.31.0
+// 	protoc        v3.15.0
+// source: build/bazel/semver/semver.proto
+
+package semver
+
+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)
+)
+
+// The full version of a given tool.
+type SemVer struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The major version, e.g 10 for 10.2.3.
+	Major int32 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"`
+	// The minor version, e.g. 2 for 10.2.3.
+	Minor int32 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"`
+	// The patch version, e.g 3 for 10.2.3.
+	Patch int32 `protobuf:"varint,3,opt,name=patch,proto3" json:"patch,omitempty"`
+	// The pre-release version. Either this field or major/minor/patch fields
+	// must be filled. They are mutually exclusive. Pre-release versions are
+	// assumed to be earlier than any released versions.
+	Prerelease string `protobuf:"bytes,4,opt,name=prerelease,proto3" json:"prerelease,omitempty"`
+}
+
+func (x *SemVer) Reset() {
+	*x = SemVer{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_build_bazel_semver_semver_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SemVer) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SemVer) ProtoMessage() {}
+
+func (x *SemVer) ProtoReflect() protoreflect.Message {
+	mi := &file_build_bazel_semver_semver_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 SemVer.ProtoReflect.Descriptor instead.
+func (*SemVer) Descriptor() ([]byte, []int) {
+	return file_build_bazel_semver_semver_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *SemVer) GetMajor() int32 {
+	if x != nil {
+		return x.Major
+	}
+	return 0
+}
+
+func (x *SemVer) GetMinor() int32 {
+	if x != nil {
+		return x.Minor
+	}
+	return 0
+}
+
+func (x *SemVer) GetPatch() int32 {
+	if x != nil {
+		return x.Patch
+	}
+	return 0
+}
+
+func (x *SemVer) GetPrerelease() string {
+	if x != nil {
+		return x.Prerelease
+	}
+	return ""
+}
+
+var File_build_bazel_semver_semver_proto protoreflect.FileDescriptor
+
+var file_build_bazel_semver_semver_proto_rawDesc = []byte{
+	0x0a, 0x1f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2f, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2f, 0x73, 0x65,
+	0x6d, 0x76, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x6d, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x12, 0x12, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x73,
+	0x65, 0x6d, 0x76, 0x65, 0x72, 0x22, 0x6a, 0x0a, 0x06, 0x53, 0x65, 0x6d, 0x56, 0x65, 0x72, 0x12,
+	0x14, 0x0a, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05,
+	0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x70,
+	0x61, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63,
+	0x68, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x18,
+	0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73,
+	0x65, 0x42, 0x74, 0x0a, 0x12, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c,
+	0x2e, 0x73, 0x65, 0x6d, 0x76, 0x65, 0x72, 0x42, 0x0b, 0x53, 0x65, 0x6d, 0x76, 0x65, 0x72, 0x50,
+	0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x34, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,
+	0x6f, 0x6d, 0x2f, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2f, 0x72, 0x65,
+	0x6d, 0x6f, 0x74, 0x65, 0x2d, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2f,
+	0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2f, 0x73, 0x65, 0x6d, 0x76, 0x65, 0x72, 0xa2, 0x02, 0x03, 0x53,
+	0x4d, 0x56, 0xaa, 0x02, 0x12, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x42, 0x61, 0x7a, 0x65, 0x6c,
+	0x2e, 0x53, 0x65, 0x6d, 0x76, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_build_bazel_semver_semver_proto_rawDescOnce sync.Once
+	file_build_bazel_semver_semver_proto_rawDescData = file_build_bazel_semver_semver_proto_rawDesc
+)
+
+func file_build_bazel_semver_semver_proto_rawDescGZIP() []byte {
+	file_build_bazel_semver_semver_proto_rawDescOnce.Do(func() {
+		file_build_bazel_semver_semver_proto_rawDescData = protoimpl.X.CompressGZIP(file_build_bazel_semver_semver_proto_rawDescData)
+	})
+	return file_build_bazel_semver_semver_proto_rawDescData
+}
+
+var file_build_bazel_semver_semver_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_build_bazel_semver_semver_proto_goTypes = []interface{}{
+	(*SemVer)(nil), // 0: build.bazel.semver.SemVer
+}
+var file_build_bazel_semver_semver_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_build_bazel_semver_semver_proto_init() }
+func file_build_bazel_semver_semver_proto_init() {
+	if File_build_bazel_semver_semver_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_build_bazel_semver_semver_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SemVer); 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_build_bazel_semver_semver_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_build_bazel_semver_semver_proto_goTypes,
+		DependencyIndexes: file_build_bazel_semver_semver_proto_depIdxs,
+		MessageInfos:      file_build_bazel_semver_semver_proto_msgTypes,
+	}.Build()
+	File_build_bazel_semver_semver_proto = out.File
+	file_build_bazel_semver_semver_proto_rawDesc = nil
+	file_build_bazel_semver_semver_proto_goTypes = nil
+	file_build_bazel_semver_semver_proto_depIdxs = nil
+}
diff --git a/build/bazel/semver/semver.proto b/build/bazel/semver/semver.proto
index 3b626b7..44f83f8 100644
--- a/build/bazel/semver/semver.proto
+++ b/build/bazel/semver/semver.proto
@@ -17,7 +17,7 @@
 package build.bazel.semver;
 
 option csharp_namespace = "Build.Bazel.Semver";
-option go_package = "semver";
+option go_package = "github.com/bazelbuild/remote-apis/build/bazel/semver";
 option java_multiple_files = true;
 option java_outer_classname = "SemverProto";
 option java_package = "build.bazel.semver";
diff --git a/external/BUILD.googleapis b/external/BUILD.googleapis
deleted file mode 100644
index 1cfef9f..0000000
--- a/external/BUILD.googleapis
+++ /dev/null
@@ -1,78 +0,0 @@
-package(default_visibility = ["//visibility:public"])
-
-load("@com_github_grpc_grpc//bazel:cc_grpc_library.bzl", "cc_grpc_library")
-
-licenses(["notice"])
-
-proto_library(
-    name = "google_api_annotations_proto",
-    srcs = ["google/api/annotations.proto"],
-    deps = [
-        ":google_api_http_proto",
-        "@com_google_protobuf//:descriptor_proto",
-    ],
-)
-
-cc_grpc_library(
-    name = "google_api_annotations_cc_proto",
-    srcs = ["google/api/annotations.proto"],
-    deps = [":google_api_http_cc_proto"],
-    proto_only = False,
-    well_known_protos = True,
-    use_external = False,
-)
-
-proto_library(
-    name = "google_api_http_proto",
-    srcs = ["google/api/http.proto"],
-)
-
-cc_grpc_library(
-    name = "google_api_http_cc_proto",
-    srcs = ["google/api/http.proto"],
-    deps = [],
-    proto_only = False,
-    well_known_protos = True,
-    use_external = False,
-)
-
-proto_library(
-    name = "google_longrunning_operations_proto",
-    srcs = ["google/longrunning/operations.proto"],
-    deps = [
-        ":google_api_annotations_proto",
-        ":google_api_http_proto",
-        ":google_rpc_status_proto",
-        "@com_google_protobuf//:any_proto",
-        "@com_google_protobuf//:empty_proto",
-    ],
-)
-
-cc_grpc_library(
-    name = "google_longrunning_operations_cc_proto",
-    srcs = ["google/longrunning/operations.proto"],
-    deps = [
-        ":google_api_annotations_cc_proto",
-        ":google_api_http_cc_proto",
-        ":google_rpc_status_cc_proto",
-    ],
-    proto_only = False,
-    well_known_protos = True,
-    use_external = False,
-)
-
-proto_library(
-    name = "google_rpc_status_proto",
-    srcs = ["google/rpc/status.proto"],
-    deps = ["@com_google_protobuf//:any_proto"],
-)
-
-cc_grpc_library(
-    name = "google_rpc_status_cc_proto",
-    srcs = ["google/rpc/status.proto"],
-    deps = [],
-    proto_only = False,
-    well_known_protos = True,
-    use_external = False,
-)
-
diff --git a/go.mod b/go.mod
new file mode 100644
index 0000000..2c33596
--- /dev/null
+++ b/go.mod
@@ -0,0 +1,12 @@
+module github.com/bazelbuild/remote-apis
+
+go 1.12
+
+require (
+	github.com/golang/protobuf v1.5.2
+	golang.org/x/net v0.0.0-20210505214959-0714010a04ed // indirect
+	golang.org/x/sys v0.0.0-20210507014357-30e306a8bba5 // indirect
+	google.golang.org/genproto v0.0.0-20210506142907-4a47615972c2
+	google.golang.org/grpc v1.37.0
+	google.golang.org/protobuf v1.26.0
+)
diff --git a/go.sum b/go.sum
new file mode 100644
index 0000000..2238940
--- /dev/null
+++ b/go.sum
@@ -0,0 +1,123 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
+golang.org/x/net v0.0.0-20210505214959-0714010a04ed h1:V9kAVxLvz1lkufatrpHuUVyJ/5tR3Ms7rk951P4mI98=
+golang.org/x/net v0.0.0-20210505214959-0714010a04ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210507014357-30e306a8bba5 h1:cez+MEm4+A0CG7ik1Qzj3bmK9DFoouuLom9lwM+Ijow=
+golang.org/x/sys v0.0.0-20210507014357-30e306a8bba5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/genproto v0.0.0-20210506142907-4a47615972c2 h1:pl8qT5D+48655f14yDURpIZwSPvMWuuekfAP+gxtjvk=
+google.golang.org/genproto v0.0.0-20210506142907-4a47615972c2/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
+google.golang.org/grpc v1.37.0 h1:uSZWeQJX5j11bIQ4AJoj+McDBo29cY1MCoC1wO3ts+c=
+google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
diff --git a/hooks/pre-commit b/hooks/pre-commit
new file mode 100755
index 0000000..ca2e9e8
--- /dev/null
+++ b/hooks/pre-commit
@@ -0,0 +1,15 @@
+#!/bin/sh
+# Precommit hook to rebuild generated go code. Fails if building or copying the
+# files fails.
+set -e
+bazel build build/bazel/remote/execution/v2:remote_execution_go_proto \
+      build/bazel/remote/asset/v1:remote_asset_go_proto \
+      build/bazel/remote/logstream/v1:remote_logstream_go_proto
+
+for i in "build/bazel/remote/execution/v2/remote_execution.pb.go" \
+	 "build/bazel/semver/semver.pb.go" \
+	 "build/bazel/remote/asset/v1/remote_asset.pb.go" \
+	 "build/bazel/remote/logstream/v1/remote_logstream.pb.go" ; do
+    cp "$(find $(bazel info bazel-bin) -path "*/$i")" "$i"
+    git add "$i"
+done
diff --git a/internal/BUILD b/internal/BUILD
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/internal/BUILD
diff --git a/internal/cc_grpc_library.bzl b/internal/cc_grpc_library.bzl
new file mode 100644
index 0000000..a6e8ab0
--- /dev/null
+++ b/internal/cc_grpc_library.bzl
@@ -0,0 +1,118 @@
+"""Rule for running the gRPC C++ code generator.
+
+This is a simplified and modernised version of the upstream gRPC
+`bazel/cc_grpc_library.bzl` file, which as of release v1.45
+(published 2022-03-19) does not support separating the `proto_library` and
+`cc_proto_library` targets into separate packages or repositories.
+
+The following logic should eventually find a home in upstream gRPC, rules_proto,
+or rules_cc so that the Bazel Remote APIs repository can be further decoupled
+from language-specific concerns.
+"""
+
+load("@com_github_grpc_grpc//bazel:protobuf.bzl", "get_include_protoc_args")
+
+_EXT_PROTO = ".proto"
+_EXT_PROTODEVEL = ".protodevel"
+_EXT_GRPC_HDR = ".grpc.pb.h"
+_EXT_GRPC_SRC = ".grpc.pb.cc"
+
+def _drop_proto_ext(name):
+    if name.endswith(_EXT_PROTO):
+        return name[:-len(_EXT_PROTO)]
+    if name.endswith(_EXT_PROTODEVEL):
+        return name[:-len(_EXT_PROTODEVEL)]
+    fail("{!r} does not end with {!r} or {!r}".format(
+        name,
+        _EXT_PROTO,
+        _EXT_PROTODEVEL,
+    ))
+
+def _proto_srcname(file):
+    """Return the Protobuf source name for a proto_library source file.
+
+    The source name is what the Protobuf compiler uses to identify a .proto
+    source file. It is relative to the compiler's `--proto_path` flag.
+    """
+    ws_root = file.owner.workspace_root
+    if ws_root != "" and file.path.startswith(ws_root):
+        return file.path[len(ws_root) + 1:]
+    return file.short_path
+
+def _cc_grpc_codegen(ctx):
+    """Run the gRPC C++ code generator to produce sources and headers"""
+    proto = ctx.attr.proto[ProtoInfo]
+    proto_srcs = proto.check_deps_sources.to_list()
+    proto_imports = proto.transitive_imports.to_list()
+
+    protoc_out = ctx.actions.declare_directory(ctx.attr.name + "_protoc_out")
+    protoc_outputs = [protoc_out]
+    rule_outputs = []
+
+    for proto_src in proto_srcs:
+        srcname = _drop_proto_ext(_proto_srcname(proto_src))
+        basename = _drop_proto_ext(proto_src.basename)
+
+        out_hdr = ctx.actions.declare_file(basename + _EXT_GRPC_HDR)
+        out_src = ctx.actions.declare_file(basename + _EXT_GRPC_SRC)
+
+        protoc_out_prefix = protoc_out.basename
+        protoc_out_hdr = ctx.actions.declare_file(
+            "{}/{}".format(protoc_out_prefix, srcname + _EXT_GRPC_HDR),
+        )
+        protoc_out_src = ctx.actions.declare_file(
+            "{}/{}".format(protoc_out_prefix, srcname + _EXT_GRPC_SRC),
+        )
+
+        rule_outputs.extend([out_hdr, out_src])
+        protoc_outputs.extend([protoc_out_hdr, protoc_out_src])
+
+        ctx.actions.expand_template(
+            template = protoc_out_hdr,
+            output = out_hdr,
+            substitutions = {},
+        )
+        ctx.actions.expand_template(
+            template = protoc_out_src,
+            output = out_src,
+            substitutions = {},
+        )
+
+    plugin = ctx.executable._protoc_gen_grpc
+    protoc_args = ctx.actions.args()
+    protoc_args.add("--plugin", "protoc-gen-grpc=" + plugin.path)
+    protoc_args.add("--grpc_out", protoc_out.path)
+
+    protoc_args.add_all(get_include_protoc_args(proto_imports))
+    protoc_args.add_all(proto_srcs, map_each = _proto_srcname)
+
+    ctx.actions.run(
+        executable = ctx.executable._protoc,
+        arguments = [protoc_args],
+        inputs = proto_srcs + proto_imports,
+        outputs = protoc_outputs,
+        tools = [plugin],
+    )
+
+    return DefaultInfo(files = depset(rule_outputs))
+
+cc_grpc_codegen = rule(
+    implementation = _cc_grpc_codegen,
+    attrs = {
+        "proto": attr.label(
+            mandatory = True,
+            allow_single_file = True,
+            providers = [ProtoInfo],
+        ),
+        "_protoc_gen_grpc": attr.label(
+            default = Label("@com_github_grpc_grpc//src/compiler:grpc_cpp_plugin"),
+            executable = True,
+            cfg = "host",
+        ),
+        "_protoc": attr.label(
+            default = Label("//external:protocol_compiler"),
+            executable = True,
+            cfg = "host",
+        ),
+    },
+)
diff --git a/remote_apis_deps.bzl b/remote_apis_deps.bzl
new file mode 100644
index 0000000..c828a2e
--- /dev/null
+++ b/remote_apis_deps.bzl
@@ -0,0 +1,55 @@
+"""Load dependencies needed to depend on the RE API repo."""
+
+load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies", "go_repository")
+load("@io_bazel_rules_go//go:deps.bzl", "go_download_sdk", "go_register_toolchains", "go_rules_dependencies")
+
+def _maybe(repo_rule, name, **kwargs):
+    if name not in native.existing_rules():
+        repo_rule(name = name, **kwargs)
+
+def remote_apis_go_deps():
+    """Load dependencies needed to depend on RE API for Go"""
+    go_download_sdk(name = "go_sdk", version = "1.20.6")
+    go_register_toolchains()
+
+    # The version of this repo needs to be in sync with @googleapis
+    go_repository(
+        name = "org_golang_google_genproto",
+        build_extra_args = ["-exclude=vendor"],
+        build_file_generation = "on",
+        build_file_proto_mode = "disable_global",
+        importpath = "google.golang.org/genproto",
+        sum = "h1:S9GbmC1iCgvbLyAokVCwiO6tVIrU9Y7c5oMx1V/ki/Y=",
+        version = "v0.0.0-20221024183307-1bc688fe9f3e",
+    )
+
+    go_rules_dependencies()
+    gazelle_dependencies(go_sdk = "go_sdk")
+    _maybe(
+        go_repository,
+        name = "com_github_golang_protobuf",
+        importpath = "github.com/golang/protobuf",
+        tag = "v1.3.2",
+    )
+    _maybe(
+        go_repository,
+        name = "org_golang_google_grpc",
+        build_file_proto_mode = "disable",
+        importpath = "google.golang.org/grpc",
+        sum = "h1:uSZWeQJX5j11bIQ4AJoj+McDBo29cY1MCoC1wO3ts+c=",
+        version = "v1.37.0",
+    )
+    _maybe(
+        go_repository,
+        name = "org_golang_x_net",
+        importpath = "golang.org/x/net",
+        sum = "h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628=",
+        version = "v0.0.0-20190311183353-d8887717615a",
+    )
+    _maybe(
+        go_repository,
+        name = "org_golang_x_text",
+        importpath = "golang.org/x/text",
+        sum = "h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=",
+        version = "v0.3.0",
+    )
diff --git a/repository_rules.bzl b/repository_rules.bzl
new file mode 100644
index 0000000..b6174ce
--- /dev/null
+++ b/repository_rules.bzl
@@ -0,0 +1,18 @@
+"""Deprecated stub for compatibility with previous releases."""
+
+load("//:remote_apis_deps.bzl", "remote_apis_go_deps")
+
+def switched_rules_by_language(
+        name,
+        java = False,
+        go = False,
+        cc = False,
+        rules_override = {}):
+    """Deprecated stub for compatibility with previous releases."""
+    print(
+        "The switched_rules_by_language macro is deprecated. Consumers of" +
+        " @bazel_remote_apis should specify per-language dependencies in" +
+        " their own workspace.",
+    )
+    if go:
+        remote_apis_go_deps()