Repository: googleapis/java-storage
Pull request #2344 (2024-01-03 09:31:08)

fix: missing serialVersionUID of serializable classes
In files: HttpStorageOptions.java, GrpcStorageOptions.java, Notification.java, StorageOptions.java and UnifiedOpts.java there are some classes that are serializable but it does not contain any serialVersionUID field. The compiler generates one by default in such scenarios, but the generated id is dependent on compiler implementation and may cause unwanted problems during deserialization. 

##### The Role of serialVersionUID:

The primary role of serialVersionUID is to provide version control during deserialization. When deserialize an object, the JVM checks whether the serialVersionUID of the serialized data matches the serialVersionUID of the class in the current classpath. If they match, the deserialization proceeds without issues. However, if they do not match, programmers encounter InvalidClassException.

As, serialVersionUID servers the purpose of version control of class during serialization-deserialization, without a serialVersionUID, we risk breaking backward compatibility when making changes to classes, which can lead to unexpected issues and errors during deserialization.

##### Sponsorship and Support:

This work is done by the security researchers from OpenRefactory and is supported by the [Open Source Security Foundation (OpenSSF)](https://openssf.org/): [Project Alpha-Omega](https://alpha-omega.dev/). Alpha-Omega is a project partnering with open source software project maintainers to systematically find new, as-yet-undiscovered vulnerabilities in open source code - and get them fixed – to improve global software supply chain security.

The bug is found by running the Intelligent Code Repair (iCR) tool by OpenRefactory and then manually triaging the results.



Patch:
diff --git a/gapic-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StorageClient.java b/gapic-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StorageClient.java
index 83ed6ef7..cb160294 100644
--- a/gapic-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StorageClient.java
+++ b/gapic-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StorageClient.java
@@ -3576,6 +3576,7 @@ public class StorageClient implements BackgroundResource {
    *           .setLexicographicStart("lexicographicStart-2093413008")
    *           .setLexicographicEnd("lexicographicEnd1646968169")
    *           .setSoftDeleted(true)
+   *           .setIncludeFoldersAsPrefixes(true)
    *           .setMatchGlob("matchGlob613636317")
    *           .build();
    *   for (Object element : storageClient.listObjects(request).iterateAll()) {
@@ -3617,6 +3618,7 @@ public class StorageClient implements BackgroundResource {
    *           .setLexicographicStart("lexicographicStart-2093413008")
    *           .setLexicographicEnd("lexicographicEnd1646968169")
    *           .setSoftDeleted(true)
+   *           .setIncludeFoldersAsPrefixes(true)
    *           .setMatchGlob("matchGlob613636317")
    *           .build();
    *   ApiFuture<Object> future = storageClient.listObjectsPagedCallable().futureCall(request);
@@ -3658,6 +3660,7 @@ public class StorageClient implements BackgroundResource {
    *           .setLexicographicStart("lexicographicStart-2093413008")
    *           .setLexicographicEnd("lexicographicEnd1646968169")
    *           .setSoftDeleted(true)
+   *           .setIncludeFoldersAsPrefixes(true)
    *           .setMatchGlob("matchGlob613636317")
    *           .build();
    *   while (true) {
diff --git a/gapic-google-cloud-storage-v2/src/main/resources/META-INF/native-image/com.google.storage.v2/reflect-config.json b/gapic-google-cloud-storage-v2/src/main/resources/META-INF/native-image/com.google.storage.v2/reflect-config.json
index aedfd2a2..534ec435 100644
--- a/gapic-google-cloud-storage-v2/src/main/resources/META-INF/native-image/com.google.storage.v2/reflect-config.json
+++ b/gapic-google-cloud-storage-v2/src/main/resources/META-INF/native-image/com.google.storage.v2/reflect-config.json
@@ -1601,6 +1601,24 @@
     "allDeclaredClasses": true,
     "allPublicClasses": true
   },
+  {
+    "name": "com.google.storage.v2.Bucket$HierarchicalNamespace",
+    "queryAllDeclaredConstructors": true,
+    "queryAllPublicConstructors": true,
+    "queryAllDeclaredMethods": true,
+    "allPublicMethods": true,
+    "allDeclaredClasses": true,
+    "allPublicClasses": true
+  },
+  {
+    "name": "com.google.storage.v2.Bucket$HierarchicalNamespace$Builder",
+    "queryAllDeclaredConstructors": true,
+    "queryAllPublicConstructors": true,
+    "queryAllDeclaredMethods": true,
+    "allPublicMethods": true,
+    "allDeclaredClasses": true,
+    "allPublicClasses": true
+  },
   {
     "name": "com.google.storage.v2.Bucket$IamConfig",
     "queryAllDeclaredConstructors": true,
diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStubSettings.java b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStubSettings.java
index c65cddfc..c1bf741c 100644
--- a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStubSettings.java
+++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStubSettings.java
@@ -20,7 +20,6 @@ import static com.google.storage.control.v2.StorageControlClient.ListFoldersPage
 
 import com.google.api.core.ApiFunction;
 import com.google.api.core.ApiFuture;
-import com.google.api.core.BetaApi;
 import com.google.api.gax.core.GaxProperties;
 import com.google.api.gax.core.GoogleCredentialsProvider;
 import com.google.api.gax.core.InstantiatingExecutorProvider;
@@ -533,8 +532,6 @@ public class StorageControlStubSettings extends StubSettings<StorageControlStubS
     }
 
     /** Returns the builder for the settings used for calls to renameFolder. */
-    @BetaApi(
-        "The surface for use by generated code is not stable yet and may change in the future.")
     public OperationCallSettings.Builder<RenameFolderRequest, Folder, RenameFolderMetadata>
         renameFolderOperationSettings() {
       return renameFolderOperationSettings;
diff --git a/google-cloud-storage/pom.xml b/google-cloud-storage/pom.xml
index a7138c4b..604b126f 100644
--- a/google-cloud-storage/pom.xml
+++ b/google-cloud-storage/pom.xml
@@ -16,7 +16,7 @@
   </parent>
   <properties>
     <site.installationModule>google-cloud-storage</site.installationModule>
-    <pubsub-proto.version>1.109.1</pubsub-proto.version>
+    <pubsub-proto.version>1.109.2</pubsub-proto.version>
     <junit-platform.version>5.10.2</junit-platform.version>
   </properties>
   <dependencies>
@@ -173,13 +173,13 @@
     <dependency>
       <groupId>com.google.api.grpc</groupId>
       <artifactId>proto-google-cloud-kms-v1</artifactId>
-      <version>0.130.0</version>
+      <version>0.131.0</version>
       <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>com.google.cloud</groupId>
       <artifactId>google-cloud-kms</artifactId>
-      <version>2.39.0</version>
+      <version>2.40.0</version>
       <scope>test</scope>
     </dependency>
     <dependency>
diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageOptions.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageOptions.java
index dcadfb40..841343d3 100644
--- a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageOptions.java
+++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageOptions.java
@@ -767,6 +767,7 @@ public final class GrpcStorageOptions extends StorageOptions
 
   private static final class NoopGrpcInterceptorProvider
       implements GrpcInterceptorProvider, Serializable {
+    private static long serialVersionUID = -8523033236999805349L;
     private static final NoopGrpcInterceptorProvider INSTANCE = new NoopGrpcInterceptorProvider();
 
     @Override
diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/HttpStorageOptions.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/HttpStorageOptions.java
index 9d4873e2..fd2a5731 100644
--- a/google-cloud-storage/src/main/java/com/google/cloud/storage/HttpStorageOptions.java
+++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/HttpStorageOptions.java
@@ -36,6 +36,8 @@ import com.google.cloud.storage.spi.v1.HttpStorageRpc;
 import com.google.cloud.storage.spi.v1.StorageRpc;
 import com.google.common.base.MoreObjects;
 import com.google.common.collect.ImmutableSet;
+import java.io.IOException;
+import java.io.ObjectInputStream;
 import java.io.Serializable;
 import java.util.Set;
 
@@ -52,7 +54,7 @@ public class HttpStorageOptions extends StorageOptions {
   private static final String DEFAULT_HOST = "https://storage.googleapis.com";
 
   private final HttpRetryAlgorithmManager retryAlgorithmManager;
-  private final RetryDependenciesAdapter retryDepsAdapter;
+  private transient RetryDependenciesAdapter retryDepsAdapter;
 
   private HttpStorageOptions(Builder builder, StorageDefaults serviceDefaults) {
     super(builder, serviceDefaults);
@@ -93,6 +95,11 @@ public class HttpStorageOptions extends StorageOptions {
     return obj instanceof HttpStorageOptions && baseEquals((HttpStorageOptions) obj);
   }
 
+  private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
+    in.defaultReadObject();
+    this.retryDepsAdapter = new RetryDependenciesAdapter();
+  }
+
   public static HttpStorageOptions.Builder newBuilder() {
     return new HttpStorageOptions.Builder().setHost(DEFAULT_HOST);
   }
@@ -345,8 +352,7 @@ public class HttpStorageOptions extends StorageOptions {
    * We don't yet want to make HttpStorageOptions itself implement {@link RetryingDependencies} but
    * we do need use it in a couple places, for those we create this adapter.
    */
-  private final class RetryDependenciesAdapter implements RetryingDependencies, Serializable {
-
+  private final class RetryDependenciesAdapter implements RetryingDependencies {
     private RetryDependenciesAdapter() {}
 
     @Override
diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/Notification.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/Notification.java
index f3e2bb81..f3e0738d 100644
--- a/google-cloud-storage/src/main/java/com/google/cloud/storage/Notification.java
+++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/Notification.java
@@ -26,6 +26,7 @@ import java.util.Objects;
  * details.
  */
 public class Notification extends NotificationInfo {
+  private static final long serialVersionUID = 3150928330690874200L;
 
   private final StorageOptions options;
   private transient Storage storage;
diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageOptions.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageOptions.java
index 74a6ffb3..53ad6142 100644
--- a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageOptions.java
+++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageOptions.java
@@ -63,6 +63,8 @@ public abstract class StorageOptions extends ServiceOptions<Storage, StorageOpti
   /** @deprecated Use {@link HttpStorageFactory} */
   @Deprecated
   public static class DefaultStorageFactory extends HttpStorageFactory {
+    private static final long serialVersionUID = -7856840922014956661L;
+
     /** @deprecated Use {@link HttpStorageDefaults#getDefaultServiceFactory()} */
     @Deprecated
     public DefaultStorageFactory() {
@@ -73,6 +75,7 @@ public abstract class StorageOptions extends ServiceOptions<Storage, StorageOpti
   /** @deprecated Use {@link HttpStorageRpcFactory} */
   @Deprecated
   public static class DefaultStorageRpcFactory extends HttpStorageRpcFactory {
+    private static final long serialVersionUID = -7856840922014956661L;
 
     /** @deprecated Use {@link HttpStorageDefaults#getDefaultRpcFactory()} */
     @Deprecated
diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/UnifiedOpts.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/UnifiedOpts.java
index dbf7bb64..dbf104e9 100644
--- a/google-cloud-storage/src/main/java/com/google/cloud/storage/UnifiedOpts.java
+++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/UnifiedOpts.java
@@ -2540,6 +2540,7 @@ final class UnifiedOpts {
   }
 
   private static final class PrefixedNamedField implements NamedField {
+    private static long serialVersionUID = -4899304145424680141L;
 
     private final String prefix;
     private final NamedField delegate;
@@ -2586,6 +2587,7 @@ final class UnifiedOpts {
   }
 
   private static final class LiteralNamedField implements NamedField {
+    private static long serialVersionUID = 1422947423774466409L;
 
     private final String name;
 
@@ -2627,6 +2629,7 @@ final class UnifiedOpts {
   }
 
   private static final class NestedNamedField implements NamedField {
+    private static long serialVersionUID = -7623005572810688221L;
     private final NamedField parent;
     private final NamedField child;
 
diff --git a/pom.xml b/pom.xml
index 6a1297ca..98845612 100644
--- a/pom.xml
+++ b/pom.xml
@@ -86,7 +86,7 @@
       <dependency>
         <groupId>com.google.cloud</groupId>
         <artifactId>google-cloud-pubsub</artifactId>
-        <version>1.127.1</version>
+        <version>1.127.2</version>
         <scope>test</scope>
       </dependency>
       <dependency>
diff --git a/proto-google-cloud-storage-v2/clirr-ignored-differences.xml b/proto-google-cloud-storage-v2/clirr-ignored-differences.xml
index 32b659c4..61451374 100644
--- a/proto-google-cloud-storage-v2/clirr-ignored-differences.xml
+++ b/proto-google-cloud-storage-v2/clirr-ignored-differences.xml
@@ -66,4 +66,16 @@
     <className>com/google/storage/v2/*</className>
     <method>* *HardDeleteTime*(*)</method>
   </difference>
+
+  <difference>
+    <differenceType>7012</differenceType>
+    <className>com/google/storage/v2/*</className>
+    <method>* *HierarchicalNamespace*(*)</method>
+  </difference>
+
+  <difference>
+    <differenceType>7012</differenceType>
+    <className>com/google/storage/v2/*</className>
+    <method>* *IncludeFoldersAsPrefixes*(*)</method>
+  </difference>
 </differences>
diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/Bucket.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/Bucket.java
index faca15fd..347b9632 100644
--- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/Bucket.java
+++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/Bucket.java
@@ -18085,6 +18085,545 @@ public final class Bucket extends com.google.protobuf.GeneratedMessageV3
     }
   }
 
+  public interface HierarchicalNamespaceOrBuilder
+      extends
+      // @@protoc_insertion_point(interface_extends:google.storage.v2.Bucket.HierarchicalNamespace)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     *
+     *
+     * <pre>
+     * Optional. Enables the hierarchical namespace feature.
+     * </pre>
+     *
+     * <code>bool enabled = 1 [(.google.api.field_behavior) = OPTIONAL];</code>
+     *
+     * @return The enabled.
+     */
+    boolean getEnabled();
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Configuration for a bucket's hierarchical namespace feature.
+   * </pre>
+   *
+   * Protobuf type {@code google.storage.v2.Bucket.HierarchicalNamespace}
+   */
+  public static final class HierarchicalNamespace extends com.google.protobuf.GeneratedMessageV3
+      implements
+      // @@protoc_insertion_point(message_implements:google.storage.v2.Bucket.HierarchicalNamespace)
+      HierarchicalNamespaceOrBuilder {
+    private static final long serialVersionUID = 0L;
+    // Use HierarchicalNamespace.newBuilder() to construct.
+    private HierarchicalNamespace(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+
+    private HierarchicalNamespace() {}
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(UnusedPrivateParameter unused) {
+      return new HierarchicalNamespace();
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+      return com.google.storage.v2.StorageProto
+          .internal_static_google_storage_v2_Bucket_HierarchicalNamespace_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.google.storage.v2.StorageProto
+          .internal_static_google_storage_v2_Bucket_HierarchicalNamespace_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.google.storage.v2.Bucket.HierarchicalNamespace.class,
+              com.google.storage.v2.Bucket.HierarchicalNamespace.Builder.class);
+    }
+
+    public static final int ENABLED_FIELD_NUMBER = 1;
+    private boolean enabled_ = false;
+    /**
+     *
+     *
+     * <pre>
+     * Optional. Enables the hierarchical namespace feature.
+     * </pre>
+     *
+     * <code>bool enabled = 1 [(.google.api.field_behavior) = OPTIONAL];</code>
+     *
+     * @return The enabled.
+     */
+    @java.lang.Override
+    public boolean getEnabled() {
+      return enabled_;
+    }
+
+    private byte memoizedIsInitialized = -1;
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
+      if (enabled_ != false) {
+        output.writeBool(1, enabled_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (enabled_ != false) {
+        size += com.google.protobuf.CodedOutputStream.computeBoolSize(1, enabled_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+        return true;
+      }
+      if (!(obj instanceof com.google.storage.v2.Bucket.HierarchicalNamespace)) {
+        return super.equals(obj);
+      }
+      com.google.storage.v2.Bucket.HierarchicalNamespace other =
+          (com.google.storage.v2.Bucket.HierarchicalNamespace) obj;
+
+      if (getEnabled() != other.getEnabled()) return false;
+      if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + ENABLED_FIELD_NUMBER;
+      hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getEnabled());
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static com.google.storage.v2.Bucket.HierarchicalNamespace parseFrom(
+        java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static com.google.storage.v2.Bucket.HierarchicalNamespace parseFrom(
+        java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static com.google.storage.v2.Bucket.HierarchicalNamespace parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static com.google.storage.v2.Bucket.HierarchicalNamespace parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static com.google.storage.v2.Bucket.HierarchicalNamespace parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static com.google.storage.v2.Bucket.HierarchicalNamespace parseFrom(
+        byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static com.google.storage.v2.Bucket.HierarchicalNamespace parseFrom(
+        java.io.InputStream input) throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+    }
+
+    public static com.google.storage.v2.Bucket.HierarchicalNamespace parseFrom(
+        java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseWithIOException(
+          PARSER, input, extensionRegistry);
+    }
+
+    public static com.google.storage.v2.Bucket.HierarchicalNamespace parseDelimitedFrom(
+        java.io.InputStream input) throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input);
+    }
+
+    public static com.google.storage.v2.Bucket.HierarchicalNamespace parseDelimitedFrom(
+        java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(
+          PARSER, input, extensionRegistry);
+    }
+
+    public static com.google.storage.v2.Bucket.HierarchicalNamespace parseFrom(
+        com.google.protobuf.CodedInputStream input) throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+    }
+
+    public static com.google.storage.v2.Bucket.HierarchicalNamespace parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseWithIOException(
+          PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() {
+      return newBuilder();
+    }
+
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+
+    public static Builder newBuilder(com.google.storage.v2.Bucket.HierarchicalNamespace prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Configuration for a bucket's hierarchical namespace feature.
+     * </pre>
+     *
+     * Protobuf type {@code google.storage.v2.Bucket.HierarchicalNamespace}
+     */
+    public static final class Builder
+        extends com.google.protobuf.GeneratedMessageV3.Builder<Builder>
+        implements
+        // @@protoc_insertion_point(builder_implements:google.storage.v2.Bucket.HierarchicalNamespace)
+        com.google.storage.v2.Bucket.HierarchicalNamespaceOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+        return com.google.storage.v2.StorageProto
+            .internal_static_google_storage_v2_Bucket_HierarchicalNamespace_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.google.storage.v2.StorageProto
+            .internal_static_google_storage_v2_Bucket_HierarchicalNamespace_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                com.google.storage.v2.Bucket.HierarchicalNamespace.class,
+                com.google.storage.v2.Bucket.HierarchicalNamespace.Builder.class);
+      }
+
+      // Construct using com.google.storage.v2.Bucket.HierarchicalNamespace.newBuilder()
+      private Builder() {}
+
+      private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+      }
+
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        bitField0_ = 0;
+        enabled_ = false;
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+        return com.google.storage.v2.StorageProto
+            .internal_static_google_storage_v2_Bucket_HierarchicalNamespace_descriptor;
+      }
+
+      @java.lang.Override
+      public com.google.storage.v2.Bucket.HierarchicalNamespace getDefaultInstanceForType() {
+        return com.google.storage.v2.Bucket.HierarchicalNamespace.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public com.google.storage.v2.Bucket.HierarchicalNamespace build() {
+        com.google.storage.v2.Bucket.HierarchicalNamespace result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public com.google.storage.v2.Bucket.HierarchicalNamespace buildPartial() {
+        com.google.storage.v2.Bucket.HierarchicalNamespace result =
+            new com.google.storage.v2.Bucket.HierarchicalNamespace(this);
+        if (bitField0_ != 0) {
+          buildPartial0(result);
+        }
+        onBuilt();
+        return result;
+      }
+
+      private void buildPartial0(com.google.storage.v2.Bucket.HierarchicalNamespace result) {
+        int from_bitField0_ = bitField0_;
+        if (((from_bitField0_ & 0x00000001) != 0)) {
+          result.enabled_ = enabled_;
+        }
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+        return super.setField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+
+      @java.lang.Override
+      public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index,
+          java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof com.google.storage.v2.Bucket.HierarchicalNamespace) {
+          return mergeFrom((com.google.storage.v2.Bucket.HierarchicalNamespace) other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(com.google.storage.v2.Bucket.HierarchicalNamespace other) {
+        if (other == com.google.storage.v2.Bucket.HierarchicalNamespace.getDefaultInstance())
+          return this;
+        if (other.getEnabled() != false) {
+          setEnabled(other.getEnabled());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 8:
+                {
+                  enabled_ = input.readBool();
+                  bitField0_ |= 0x00000001;
+                  break;
+                } // case 8
+              default:
+                {
+                  if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                    done = true; // was an endgroup tag
+                  }
+                  break;
+                } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+
+      private int bitField0_;
+
+      private boolean enabled_;
+      /**
+       *
+       *
+       * <pre>
+       * Optional. Enables the hierarchical namespace feature.
+       * </pre>
+       *
+       * <code>bool enabled = 1 [(.google.api.field_behavior) = OPTIONAL];</code>
+       *
+       * @return The enabled.
+       */
+      @java.lang.Override
+      public boolean getEnabled() {
+        return enabled_;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * Optional. Enables the hierarchical namespace feature.
+       * </pre>
+       *
+       * <code>bool enabled = 1 [(.google.api.field_behavior) = OPTIONAL];</code>
+       *
+       * @param value The enabled to set.
+       * @return This builder for chaining.
+       */
+      public Builder setEnabled(boolean value) {
+
+        enabled_ = value;
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * Optional. Enables the hierarchical namespace feature.
+       * </pre>
+       *
+       * <code>bool enabled = 1 [(.google.api.field_behavior) = OPTIONAL];</code>
+       *
+       * @return This builder for chaining.
+       */
+      public Builder clearEnabled() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        enabled_ = false;
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+      // @@protoc_insertion_point(builder_scope:google.storage.v2.Bucket.HierarchicalNamespace)
+    }
+
+    // @@protoc_insertion_point(class_scope:google.storage.v2.Bucket.HierarchicalNamespace)
+    private static final com.google.storage.v2.Bucket.HierarchicalNamespace DEFAULT_INSTANCE;
+
+    static {
+      DEFAULT_INSTANCE = new com.google.storage.v2.Bucket.HierarchicalNamespace();
+    }
+
+    public static com.google.storage.v2.Bucket.HierarchicalNamespace getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<HierarchicalNamespace> PARSER =
+        new com.google.protobuf.AbstractParser<HierarchicalNamespace>() {
+          @java.lang.Override
+          public HierarchicalNamespace parsePartialFrom(
+              com.google.protobuf.CodedInputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            Builder builder = newBuilder();
+            try {
+              builder.mergeFrom(input, extensionRegistry);
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+              throw e.setUnfinishedMessage(builder.buildPartial());
+            } catch (com.google.protobuf.UninitializedMessageException e) {
+              throw e.asInvalidProtocolBufferException()
+                  .setUnfinishedMessage(builder.buildPartial());
+            } catch (java.io.IOException e) {
+              throw new com.google.protobuf.InvalidProtocolBufferException(e)
+                  .setUnfinishedMessage(builder.buildPartial());
+            }
+            return builder.buildPartial();
+          }
+        };
+
+    public static com.google.protobuf.Parser<HierarchicalNamespace> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<HierarchicalNamespace> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.storage.v2.Bucket.HierarchicalNamespace getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+  }
+
   private int bitField0_;
   public static final int NAME_FIELD_NUMBER = 1;
 
@@ -19635,6 +20174,69 @@ public final class Bucket extends com.google.protobuf.GeneratedMessageV3
         : autoclass_;
   }
 
+  public static final int HIERARCHICAL_NAMESPACE_FIELD_NUMBER = 32;
+  private com.google.storage.v2.Bucket.HierarchicalNamespace hierarchicalNamespace_;
+  /**
+   *
+   *
+   * <pre>
+   * Optional. The bucket's hierarchical namespace configuration. If there is no
+   * configuration, the hierarchical namespace feature will be disabled and have
+   * no effect on the bucket.
+   * </pre>
+   *
+   * <code>
+   * .google.storage.v2.Bucket.HierarchicalNamespace hierarchical_namespace = 32 [(.google.api.field_behavior) = OPTIONAL];
+   * </code>
+   *
+   * @return Whether the hierarchicalNamespace field is set.
+   */
+  @java.lang.Override
+  public boolean hasHierarchicalNamespace() {
+    return ((bitField0_ & 0x00002000) != 0);
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Optional. The bucket's hierarchical namespace configuration. If there is no
+   * configuration, the hierarchical namespace feature will be disabled and have
+   * no effect on the bucket.
+   * </pre>
+   *
+   * <code>
+   * .google.storage.v2.Bucket.HierarchicalNamespace hierarchical_namespace = 32 [(.google.api.field_behavior) = OPTIONAL];
+   * </code>
+   *
+   * @return The hierarchicalNamespace.
+   */
+  @java.lang.Override
+  public com.google.storage.v2.Bucket.HierarchicalNamespace getHierarchicalNamespace() {
+    return hierarchicalNamespace_ == null
+        ? com.google.storage.v2.Bucket.HierarchicalNamespace.getDefaultInstance()
+        : hierarchicalNamespace_;
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Optional. The bucket's hierarchical namespace configuration. If there is no
+   * configuration, the hierarchical namespace feature will be disabled and have
+   * no effect on the bucket.
+   * </pre>
+   *
+   * <code>
+   * .google.storage.v2.Bucket.HierarchicalNamespace hierarchical_namespace = 32 [(.google.api.field_behavior) = OPTIONAL];
+   * </code>
+   */
+  @java.lang.Override
+  public com.google.storage.v2.Bucket.HierarchicalNamespaceOrBuilder
+      getHierarchicalNamespaceOrBuilder() {
+    return hierarchicalNamespace_ == null
+        ? com.google.storage.v2.Bucket.HierarchicalNamespace.getDefaultInstance()
+        : hierarchicalNamespace_;
+  }
+
   public static final int SOFT_DELETE_POLICY_FIELD_NUMBER = 31;
   private com.google.storage.v2.Bucket.SoftDeletePolicy softDeletePolicy_;
   /**
@@ -19653,7 +20255,7 @@ public final class Bucket extends com.google.protobuf.GeneratedMessageV3
    */
   @java.lang.Override
   public boolean hasSoftDeletePolicy() {
-    return ((bitField0_ & 0x00002000) != 0);
+    return ((bitField0_ & 0x00004000) != 0);
   }
   /**
    *
@@ -19791,9 +20393,12 @@ public final class Bucket extends com.google.protobuf.GeneratedMessageV3
     if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(etag_)) {
       com.google.protobuf.GeneratedMessageV3.writeString(output, 29, etag_);
     }
-    if (((bitField0_ & 0x00002000) != 0)) {
+    if (((bitField0_ & 0x00004000) != 0)) {
       output.writeMessage(31, getSoftDeletePolicy());
     }
+    if (((bitField0_ & 0x00002000) != 0)) {
+      output.writeMessage(32, getHierarchicalNamespace());
+    }
     getUnknownFields().writeTo(output);
   }
 
@@ -19895,9 +20500,13 @@ public final class Bucket extends com.google.protobuf.GeneratedMessageV3
     if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(etag_)) {
       size += com.google.protobuf.GeneratedMessageV3.computeStringSize(29, etag_);
     }
-    if (((bitField0_ & 0x00002000) != 0)) {
+    if (((bitField0_ & 0x00004000) != 0)) {
       size += com.google.protobuf.CodedOutputStream.computeMessageSize(31, getSoftDeletePolicy());
     }
+    if (((bitField0_ & 0x00002000) != 0)) {
+      size +=
+          com.google.protobuf.CodedOutputStream.computeMessageSize(32, getHierarchicalNamespace());
+    }
     size += getUnknownFields().getSerializedSize();
     memoizedSize = size;
     return size;
@@ -19980,6 +20589,10 @@ public final class Bucket extends com.google.protobuf.GeneratedMessageV3
     if (hasAutoclass()) {
       if (!getAutoclass().equals(other.getAutoclass())) return false;
     }
+    if (hasHierarchicalNamespace() != other.hasHierarchicalNamespace()) return false;
+    if (hasHierarchicalNamespace()) {
+      if (!getHierarchicalNamespace().equals(other.getHierarchicalNamespace())) return false;
+    }
     if (hasSoftDeletePolicy() != other.hasSoftDeletePolicy()) return false;
     if (hasSoftDeletePolicy()) {
       if (!getSoftDeletePolicy().equals(other.getSoftDeletePolicy())) return false;
@@ -20085,6 +20698,10 @@ public final class Bucket extends com.google.protobuf.GeneratedMessageV3
       hash = (37 * hash) + AUTOCLASS_FIELD_NUMBER;
       hash = (53 * hash) + getAutoclass().hashCode();
     }
+    if (hasHierarchicalNamespace()) {
+      hash = (37 * hash) + HIERARCHICAL_NAMESPACE_FIELD_NUMBER;
+      hash = (53 * hash) + getHierarchicalNamespace().hashCode();
+    }
     if (hasSoftDeletePolicy()) {
       hash = (37 * hash) + SOFT_DELETE_POLICY_FIELD_NUMBER;
       hash = (53 * hash) + getSoftDeletePolicy().hashCode();
@@ -20264,6 +20881,7 @@ public final class Bucket extends com.google.protobuf.GeneratedMessageV3
         getIamConfigFieldBuilder();
         getCustomPlacementConfigFieldBuilder();
         getAutoclassFieldBuilder();
+        getHierarchicalNamespaceFieldBuilder();
         getSoftDeletePolicyFieldBuilder();
       }
     }
@@ -20370,6 +20988,11 @@ public final class Bucket extends com.google.protobuf.GeneratedMessageV3
         autoclassBuilder_.dispose();
         autoclassBuilder_ = null;
       }
+      hierarchicalNamespace_ = null;
+      if (hierarchicalNamespaceBuilder_ != null) {
+        hierarchicalNamespaceBuilder_.dispose();
+        hierarchicalNamespaceBuilder_ = null;
+      }
       softDeletePolicy_ = null;
       if (softDeletePolicyBuilder_ != null) {
         softDeletePolicyBuilder_.dispose();
@@ -20535,9 +21158,16 @@ public final class Bucket extends com.google.protobuf.GeneratedMessageV3
         to_bitField0_ |= 0x00001000;
       }
       if (((from_bitField0_ & 0x10000000) != 0)) {
+        result.hierarchicalNamespace_ =
+            hierarchicalNamespaceBuilder_ == null
+                ? hierarchicalNamespace_
+                : hierarchicalNamespaceBuilder_.build();
+        to_bitField0_ |= 0x00002000;
+      }
+      if (((from_bitField0_ & 0x20000000) != 0)) {
         result.softDeletePolicy_ =
             softDeletePolicyBuilder_ == null ? softDeletePolicy_ : softDeletePolicyBuilder_.build();
-        to_bitField0_ |= 0x00002000;
+        to_bitField0_ |= 0x00004000;
       }
       result.bitField0_ |= to_bitField0_;
     }
@@ -20758,6 +21388,9 @@ public final class Bucket extends com.google.protobuf.GeneratedMessageV3
       if (other.hasAutoclass()) {
         mergeAutoclass(other.getAutoclass());
       }
+      if (other.hasHierarchicalNamespace()) {
+        mergeHierarchicalNamespace(other.getHierarchicalNamespace());
+      }
       if (other.hasSoftDeletePolicy()) {
         mergeSoftDeletePolicy(other.getSoftDeletePolicy());
       }
@@ -20987,9 +21620,16 @@ public final class Bucket extends com.google.protobuf.GeneratedMessageV3
               {
                 input.readMessage(
                     getSoftDeletePolicyFieldBuilder().getBuilder(), extensionRegistry);
-                bitField0_ |= 0x10000000;
+                bitField0_ |= 0x20000000;
                 break;
               } // case 250
+            case 258:
+              {
+                input.readMessage(
+                    getHierarchicalNamespaceFieldBuilder().getBuilder(), extensionRegistry);
+                bitField0_ |= 0x10000000;
+                break;
+              } // case 258
             default:
               {
                 if (!super.parseUnknownField(input, extensionRegistry, tag)) {
@@ -26086,6 +26726,233 @@ public final class Bucket extends com.google.protobuf.GeneratedMessageV3
       return autoclassBuilder_;
     }
 
+    private com.google.storage.v2.Bucket.HierarchicalNamespace hierarchicalNamespace_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+            com.google.storage.v2.Bucket.HierarchicalNamespace,
+            com.google.storage.v2.Bucket.HierarchicalNamespace.Builder,
+            com.google.storage.v2.Bucket.HierarchicalNamespaceOrBuilder>
+        hierarchicalNamespaceBuilder_;
+    /**
+     *
+     *
+     * <pre>
+     * Optional. The bucket's hierarchical namespace configuration. If there is no
+     * configuration, the hierarchical namespace feature will be disabled and have
+     * no effect on the bucket.
+     * </pre>
+     *
+     * <code>
+     * .google.storage.v2.Bucket.HierarchicalNamespace hierarchical_namespace = 32 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     *
+     * @return Whether the hierarchicalNamespace field is set.
+     */
+    public boolean hasHierarchicalNamespace() {
+      return ((bitField0_ & 0x10000000) != 0);
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. The bucket's hierarchical namespace configuration. If there is no
+     * configuration, the hierarchical namespace feature will be disabled and have
+     * no effect on the bucket.
+     * </pre>
+     *
+     * <code>
+     * .google.storage.v2.Bucket.HierarchicalNamespace hierarchical_namespace = 32 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     *
+     * @return The hierarchicalNamespace.
+     */
+    public com.google.storage.v2.Bucket.HierarchicalNamespace getHierarchicalNamespace() {
+      if (hierarchicalNamespaceBuilder_ == null) {
+        return hierarchicalNamespace_ == null
+            ? com.google.storage.v2.Bucket.HierarchicalNamespace.getDefaultInstance()
+            : hierarchicalNamespace_;
+      } else {
+        return hierarchicalNamespaceBuilder_.getMessage();
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. The bucket's hierarchical namespace configuration. If there is no
+     * configuration, the hierarchical namespace feature will be disabled and have
+     * no effect on the bucket.
+     * </pre>
+     *
+     * <code>
+     * .google.storage.v2.Bucket.HierarchicalNamespace hierarchical_namespace = 32 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     */
+    public Builder setHierarchicalNamespace(
+        com.google.storage.v2.Bucket.HierarchicalNamespace value) {
+      if (hierarchicalNamespaceBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        hierarchicalNamespace_ = value;
+      } else {
+        hierarchicalNamespaceBuilder_.setMessage(value);
+      }
+      bitField0_ |= 0x10000000;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. The bucket's hierarchical namespace configuration. If there is no
+     * configuration, the hierarchical namespace feature will be disabled and have
+     * no effect on the bucket.
+     * </pre>
+     *
+     * <code>
+     * .google.storage.v2.Bucket.HierarchicalNamespace hierarchical_namespace = 32 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     */
+    public Builder setHierarchicalNamespace(
+        com.google.storage.v2.Bucket.HierarchicalNamespace.Builder builderForValue) {
+      if (hierarchicalNamespaceBuilder_ == null) {
+        hierarchicalNamespace_ = builderForValue.build();
+      } else {
+        hierarchicalNamespaceBuilder_.setMessage(builderForValue.build());
+      }
+      bitField0_ |= 0x10000000;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. The bucket's hierarchical namespace configuration. If there is no
+     * configuration, the hierarchical namespace feature will be disabled and have
+     * no effect on the bucket.
+     * </pre>
+     *
+     * <code>
+     * .google.storage.v2.Bucket.HierarchicalNamespace hierarchical_namespace = 32 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     */
+    public Builder mergeHierarchicalNamespace(
+        com.google.storage.v2.Bucket.HierarchicalNamespace value) {
+      if (hierarchicalNamespaceBuilder_ == null) {
+        if (((bitField0_ & 0x10000000) != 0)
+            && hierarchicalNamespace_ != null
+            && hierarchicalNamespace_
+                != com.google.storage.v2.Bucket.HierarchicalNamespace.getDefaultInstance()) {
+          getHierarchicalNamespaceBuilder().mergeFrom(value);
+        } else {
+          hierarchicalNamespace_ = value;
+        }
+      } else {
+        hierarchicalNamespaceBuilder_.mergeFrom(value);
+      }
+      if (hierarchicalNamespace_ != null) {
+        bitField0_ |= 0x10000000;
+        onChanged();
+      }
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. The bucket's hierarchical namespace configuration. If there is no
+     * configuration, the hierarchical namespace feature will be disabled and have
+     * no effect on the bucket.
+     * </pre>
+     *
+     * <code>
+     * .google.storage.v2.Bucket.HierarchicalNamespace hierarchical_namespace = 32 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     */
+    public Builder clearHierarchicalNamespace() {
+      bitField0_ = (bitField0_ & ~0x10000000);
+      hierarchicalNamespace_ = null;
+      if (hierarchicalNamespaceBuilder_ != null) {
+        hierarchicalNamespaceBuilder_.dispose();
+        hierarchicalNamespaceBuilder_ = null;
+      }
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. The bucket's hierarchical namespace configuration. If there is no
+     * configuration, the hierarchical namespace feature will be disabled and have
+     * no effect on the bucket.
+     * </pre>
+     *
+     * <code>
+     * .google.storage.v2.Bucket.HierarchicalNamespace hierarchical_namespace = 32 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     */
+    public com.google.storage.v2.Bucket.HierarchicalNamespace.Builder
+        getHierarchicalNamespaceBuilder() {
+      bitField0_ |= 0x10000000;
+      onChanged();
+      return getHierarchicalNamespaceFieldBuilder().getBuilder();
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. The bucket's hierarchical namespace configuration. If there is no
+     * configuration, the hierarchical namespace feature will be disabled and have
+     * no effect on the bucket.
+     * </pre>
+     *
+     * <code>
+     * .google.storage.v2.Bucket.HierarchicalNamespace hierarchical_namespace = 32 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     */
+    public com.google.storage.v2.Bucket.HierarchicalNamespaceOrBuilder
+        getHierarchicalNamespaceOrBuilder() {
+      if (hierarchicalNamespaceBuilder_ != null) {
+        return hierarchicalNamespaceBuilder_.getMessageOrBuilder();
+      } else {
+        return hierarchicalNamespace_ == null
+            ? com.google.storage.v2.Bucket.HierarchicalNamespace.getDefaultInstance()
+            : hierarchicalNamespace_;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. The bucket's hierarchical namespace configuration. If there is no
+     * configuration, the hierarchical namespace feature will be disabled and have
+     * no effect on the bucket.
+     * </pre>
+     *
+     * <code>
+     * .google.storage.v2.Bucket.HierarchicalNamespace hierarchical_namespace = 32 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+            com.google.storage.v2.Bucket.HierarchicalNamespace,
+            com.google.storage.v2.Bucket.HierarchicalNamespace.Builder,
+            com.google.storage.v2.Bucket.HierarchicalNamespaceOrBuilder>
+        getHierarchicalNamespaceFieldBuilder() {
+      if (hierarchicalNamespaceBuilder_ == null) {
+        hierarchicalNamespaceBuilder_ =
+            new com.google.protobuf.SingleFieldBuilderV3<
+                com.google.storage.v2.Bucket.HierarchicalNamespace,
+                com.google.storage.v2.Bucket.HierarchicalNamespace.Builder,
+                com.google.storage.v2.Bucket.HierarchicalNamespaceOrBuilder>(
+                getHierarchicalNamespace(), getParentForChildren(), isClean());
+        hierarchicalNamespace_ = null;
+      }
+      return hierarchicalNamespaceBuilder_;
+    }
+
     private com.google.storage.v2.Bucket.SoftDeletePolicy softDeletePolicy_;
     private com.google.protobuf.SingleFieldBuilderV3<
             com.google.storage.v2.Bucket.SoftDeletePolicy,
@@ -26107,7 +26974,7 @@ public final class Bucket extends com.google.protobuf.GeneratedMessageV3
      * @return Whether the softDeletePolicy field is set.
      */
     public boolean hasSoftDeletePolicy() {
-      return ((bitField0_ & 0x10000000) != 0);
+      return ((bitField0_ & 0x20000000) != 0);
     }
     /**
      *
@@ -26153,7 +27020,7 @@ public final class Bucket extends com.google.protobuf.GeneratedMessageV3
       } else {
         softDeletePolicyBuilder_.setMessage(value);
       }
-      bitField0_ |= 0x10000000;
+      bitField0_ |= 0x20000000;
       onChanged();
       return this;
     }
@@ -26176,7 +27043,7 @@ public final class Bucket extends com.google.protobuf.GeneratedMessageV3
       } else {
         softDeletePolicyBuilder_.setMessage(builderForValue.build());
       }
-      bitField0_ |= 0x10000000;
+      bitField0_ |= 0x20000000;
       onChanged();
       return this;
     }
@@ -26194,7 +27061,7 @@ public final class Bucket extends com.google.protobuf.GeneratedMessageV3
      */
     public Builder mergeSoftDeletePolicy(com.google.storage.v2.Bucket.SoftDeletePolicy value) {
       if (softDeletePolicyBuilder_ == null) {
-        if (((bitField0_ & 0x10000000) != 0)
+        if (((bitField0_ & 0x20000000) != 0)
             && softDeletePolicy_ != null
             && softDeletePolicy_
                 != com.google.storage.v2.Bucket.SoftDeletePolicy.getDefaultInstance()) {
@@ -26206,7 +27073,7 @@ public final class Bucket extends com.google.protobuf.GeneratedMessageV3
         softDeletePolicyBuilder_.mergeFrom(value);
       }
       if (softDeletePolicy_ != null) {
-        bitField0_ |= 0x10000000;
+        bitField0_ |= 0x20000000;
         onChanged();
       }
       return this;
@@ -26224,7 +27091,7 @@ public final class Bucket extends com.google.protobuf.GeneratedMessageV3
      * </code>
      */
     public Builder clearSoftDeletePolicy() {
-      bitField0_ = (bitField0_ & ~0x10000000);
+      bitField0_ = (bitField0_ & ~0x20000000);
       softDeletePolicy_ = null;
       if (softDeletePolicyBuilder_ != null) {
         softDeletePolicyBuilder_.dispose();
@@ -26246,7 +27113,7 @@ public final class Bucket extends com.google.protobuf.GeneratedMessageV3
      * </code>
      */
     public com.google.storage.v2.Bucket.SoftDeletePolicy.Builder getSoftDeletePolicyBuilder() {
-      bitField0_ |= 0x10000000;
+      bitField0_ |= 0x20000000;
       onChanged();
       return getSoftDeletePolicyFieldBuilder().getBuilder();
     }
diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BucketOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BucketOrBuilder.java
index 41ca1c71..8c6c315b 100644
--- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BucketOrBuilder.java
+++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BucketOrBuilder.java
@@ -1075,6 +1075,53 @@ public interface BucketOrBuilder
    */
   com.google.storage.v2.Bucket.AutoclassOrBuilder getAutoclassOrBuilder();
 
+  /**
+   *
+   *
+   * <pre>
+   * Optional. The bucket's hierarchical namespace configuration. If there is no
+   * configuration, the hierarchical namespace feature will be disabled and have
+   * no effect on the bucket.
+   * </pre>
+   *
+   * <code>
+   * .google.storage.v2.Bucket.HierarchicalNamespace hierarchical_namespace = 32 [(.google.api.field_behavior) = OPTIONAL];
+   * </code>
+   *
+   * @return Whether the hierarchicalNamespace field is set.
+   */
+  boolean hasHierarchicalNamespace();
+  /**
+   *
+   *
+   * <pre>
+   * Optional. The bucket's hierarchical namespace configuration. If there is no
+   * configuration, the hierarchical namespace feature will be disabled and have
+   * no effect on the bucket.
+   * </pre>
+   *
+   * <code>
+   * .google.storage.v2.Bucket.HierarchicalNamespace hierarchical_namespace = 32 [(.google.api.field_behavior) = OPTIONAL];
+   * </code>
+   *
+   * @return The hierarchicalNamespace.
+   */
+  com.google.storage.v2.Bucket.HierarchicalNamespace getHierarchicalNamespace();
+  /**
+   *
+   *
+   * <pre>
+   * Optional. The bucket's hierarchical namespace configuration. If there is no
+   * configuration, the hierarchical namespace feature will be disabled and have
+   * no effect on the bucket.
+   * </pre>
+   *
+   * <code>
+   * .google.storage.v2.Bucket.HierarchicalNamespace hierarchical_namespace = 32 [(.google.api.field_behavior) = OPTIONAL];
+   * </code>
+   */
+  com.google.storage.v2.Bucket.HierarchicalNamespaceOrBuilder getHierarchicalNamespaceOrBuilder();
+
   /**
    *
    *
diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsRequest.java
index 043db519..22ec3b58 100644
--- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsRequest.java
+++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsRequest.java
@@ -540,6 +540,25 @@ public final class ListObjectsRequest extends com.google.protobuf.GeneratedMessa
     return softDeleted_;
   }
 
+  public static final int INCLUDE_FOLDERS_AS_PREFIXES_FIELD_NUMBER = 13;
+  private boolean includeFoldersAsPrefixes_ = false;
+  /**
+   *
+   *
+   * <pre>
+   * Optional. If true, will also include folders and managed folders (besides
+   * objects) in the returned `prefixes`. Requires `delimiter` to be set to '/'.
+   * </pre>
+   *
+   * <code>bool include_folders_as_prefixes = 13 [(.google.api.field_behavior) = OPTIONAL];</code>
+   *
+   * @return The includeFoldersAsPrefixes.
+   */
+  @java.lang.Override
+  public boolean getIncludeFoldersAsPrefixes() {
+    return includeFoldersAsPrefixes_;
+  }
+
   public static final int MATCH_GLOB_FIELD_NUMBER = 14;
 
   @SuppressWarnings("serial")
@@ -644,6 +663,9 @@ public final class ListObjectsRequest extends com.google.protobuf.GeneratedMessa
     if (softDeleted_ != false) {
       output.writeBool(12, softDeleted_);
     }
+    if (includeFoldersAsPrefixes_ != false) {
+      output.writeBool(13, includeFoldersAsPrefixes_);
+    }
     if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(matchGlob_)) {
       com.google.protobuf.GeneratedMessageV3.writeString(output, 14, matchGlob_);
     }
@@ -689,6 +711,9 @@ public final class ListObjectsRequest extends com.google.protobuf.GeneratedMessa
     if (softDeleted_ != false) {
       size += com.google.protobuf.CodedOutputStream.computeBoolSize(12, softDeleted_);
     }
+    if (includeFoldersAsPrefixes_ != false) {
+      size += com.google.protobuf.CodedOutputStream.computeBoolSize(13, includeFoldersAsPrefixes_);
+    }
     if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(matchGlob_)) {
       size += com.google.protobuf.GeneratedMessageV3.computeStringSize(14, matchGlob_);
     }
@@ -721,6 +746,7 @@ public final class ListObjectsRequest extends com.google.protobuf.GeneratedMessa
     if (!getLexicographicStart().equals(other.getLexicographicStart())) return false;
     if (!getLexicographicEnd().equals(other.getLexicographicEnd())) return false;
     if (getSoftDeleted() != other.getSoftDeleted()) return false;
+    if (getIncludeFoldersAsPrefixes() != other.getIncludeFoldersAsPrefixes()) return false;
     if (!getMatchGlob().equals(other.getMatchGlob())) return false;
     if (!getUnknownFields().equals(other.getUnknownFields())) return false;
     return true;
@@ -757,6 +783,8 @@ public final class ListObjectsRequest extends com.google.protobuf.GeneratedMessa
     hash = (53 * hash) + getLexicographicEnd().hashCode();
     hash = (37 * hash) + SOFT_DELETED_FIELD_NUMBER;
     hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getSoftDeleted());
+    hash = (37 * hash) + INCLUDE_FOLDERS_AS_PREFIXES_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getIncludeFoldersAsPrefixes());
     hash = (37 * hash) + MATCH_GLOB_FIELD_NUMBER;
     hash = (53 * hash) + getMatchGlob().hashCode();
     hash = (29 * hash) + getUnknownFields().hashCode();
@@ -922,6 +950,7 @@ public final class ListObjectsRequest extends com.google.protobuf.GeneratedMessa
       lexicographicStart_ = "";
       lexicographicEnd_ = "";
       softDeleted_ = false;
+      includeFoldersAsPrefixes_ = false;
       matchGlob_ = "";
       return this;
     }
@@ -995,6 +1024,9 @@ public final class ListObjectsRequest extends com.google.protobuf.GeneratedMessa
         result.softDeleted_ = softDeleted_;
       }
       if (((from_bitField0_ & 0x00000800) != 0)) {
+        result.includeFoldersAsPrefixes_ = includeFoldersAsPrefixes_;
+      }
+      if (((from_bitField0_ & 0x00001000) != 0)) {
         result.matchGlob_ = matchGlob_;
       }
       result.bitField0_ |= to_bitField0_;
@@ -1090,9 +1122,12 @@ public final class ListObjectsRequest extends com.google.protobuf.GeneratedMessa
       if (other.getSoftDeleted() != false) {
         setSoftDeleted(other.getSoftDeleted());
       }
+      if (other.getIncludeFoldersAsPrefixes() != false) {
+        setIncludeFoldersAsPrefixes(other.getIncludeFoldersAsPrefixes());
+      }
       if (!other.getMatchGlob().isEmpty()) {
         matchGlob_ = other.matchGlob_;
-        bitField0_ |= 0x00000800;
+        bitField0_ |= 0x00001000;
         onChanged();
       }
       this.mergeUnknownFields(other.getUnknownFields());
@@ -1187,10 +1222,16 @@ public final class ListObjectsRequest extends com.google.protobuf.GeneratedMessa
                 bitField0_ |= 0x00000400;
                 break;
               } // case 96
+            case 104:
+              {
+                includeFoldersAsPrefixes_ = input.readBool();
+                bitField0_ |= 0x00000800;
+                break;
+              } // case 104
             case 114:
               {
                 matchGlob_ = input.readStringRequireUtf8();
-                bitField0_ |= 0x00000800;
+                bitField0_ |= 0x00001000;
                 break;
               } // case 114
             default:
@@ -2365,6 +2406,62 @@ public final class ListObjectsRequest extends com.google.protobuf.GeneratedMessa
       return this;
     }
 
+    private boolean includeFoldersAsPrefixes_;
+    /**
+     *
+     *
+     * <pre>
+     * Optional. If true, will also include folders and managed folders (besides
+     * objects) in the returned `prefixes`. Requires `delimiter` to be set to '/'.
+     * </pre>
+     *
+     * <code>bool include_folders_as_prefixes = 13 [(.google.api.field_behavior) = OPTIONAL];</code>
+     *
+     * @return The includeFoldersAsPrefixes.
+     */
+    @java.lang.Override
+    public boolean getIncludeFoldersAsPrefixes() {
+      return includeFoldersAsPrefixes_;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. If true, will also include folders and managed folders (besides
+     * objects) in the returned `prefixes`. Requires `delimiter` to be set to '/'.
+     * </pre>
+     *
+     * <code>bool include_folders_as_prefixes = 13 [(.google.api.field_behavior) = OPTIONAL];</code>
+     *
+     * @param value The includeFoldersAsPrefixes to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIncludeFoldersAsPrefixes(boolean value) {
+
+      includeFoldersAsPrefixes_ = value;
+      bitField0_ |= 0x00000800;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. If true, will also include folders and managed folders (besides
+     * objects) in the returned `prefixes`. Requires `delimiter` to be set to '/'.
+     * </pre>
+     *
+     * <code>bool include_folders_as_prefixes = 13 [(.google.api.field_behavior) = OPTIONAL];</code>
+     *
+     * @return This builder for chaining.
+     */
+    public Builder clearIncludeFoldersAsPrefixes() {
+      bitField0_ = (bitField0_ & ~0x00000800);
+      includeFoldersAsPrefixes_ = false;
+      onChanged();
+      return this;
+    }
+
     private java.lang.Object matchGlob_ = "";
     /**
      *
@@ -2436,7 +2533,7 @@ public final class ListObjectsRequest extends com.google.protobuf.GeneratedMessa
         throw new NullPointerException();
       }
       matchGlob_ = value;
-      bitField0_ |= 0x00000800;
+      bitField0_ |= 0x00001000;
       onChanged();
       return this;
     }
@@ -2456,7 +2553,7 @@ public final class ListObjectsRequest extends com.google.protobuf.GeneratedMessa
      */
     public Builder clearMatchGlob() {
       matchGlob_ = getDefaultInstance().getMatchGlob();
-      bitField0_ = (bitField0_ & ~0x00000800);
+      bitField0_ = (bitField0_ & ~0x00001000);
       onChanged();
       return this;
     }
@@ -2481,7 +2578,7 @@ public final class ListObjectsRequest extends com.google.protobuf.GeneratedMessa
       }
       checkByteStringIsUtf8(value);
       matchGlob_ = value;
-      bitField0_ |= 0x00000800;
+      bitField0_ |= 0x00001000;
       onChanged();
       return this;
     }
diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsRequestOrBuilder.java
index 34a38165..215d9afc 100644
--- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsRequestOrBuilder.java
+++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsRequestOrBuilder.java
@@ -307,6 +307,20 @@ public interface ListObjectsRequestOrBuilder
    */
   boolean getSoftDeleted();
 
+  /**
+   *
+   *
+   * <pre>
+   * Optional. If true, will also include folders and managed folders (besides
+   * objects) in the returned `prefixes`. Requires `delimiter` to be set to '/'.
+   * </pre>
+   *
+   * <code>bool include_folders_as_prefixes = 13 [(.google.api.field_behavior) = OPTIONAL];</code>
+   *
+   * @return The includeFoldersAsPrefixes.
+   */
+  boolean getIncludeFoldersAsPrefixes();
+
   /**
    *
    *
diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StorageProto.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StorageProto.java
index 7c9d8f22..fab5bd68 100644
--- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StorageProto.java
+++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StorageProto.java
@@ -276,6 +276,10 @@ public final class StorageProto {
       internal_static_google_storage_v2_Bucket_Autoclass_descriptor;
   static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
       internal_static_google_storage_v2_Bucket_Autoclass_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+      internal_static_google_storage_v2_Bucket_HierarchicalNamespace_descriptor;
+  static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_google_storage_v2_Bucket_HierarchicalNamespace_fieldAccessorTable;
   static final com.google.protobuf.Descriptors.Descriptor
       internal_static_google_storage_v2_Bucket_LabelsEntry_descriptor;
   static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
@@ -528,7 +532,7 @@ public final class StorageProto {
           + "\006\n\004data\"r\n\027BidiWriteObjectResponse\022\030\n\016pe"
           + "rsisted_size\030\001 \001(\003H\000\022-\n\010resource\030\002 \001(\0132\031"
           + ".google.storage.v2.ObjectH\000B\016\n\014write_sta"
-          + "tus\"\203\003\n\022ListObjectsRequest\0225\n\006parent\030\001 \001"
+          + "tus\"\255\003\n\022ListObjectsRequest\0225\n\006parent\030\001 \001"
           + "(\tB%\340A\002\372A\037\n\035storage.googleapis.com/Bucke"
           + "t\022\021\n\tpage_size\030\002 \001(\005\022\022\n\npage_token\030\003 \001(\t"
           + "\022\021\n\tdelimiter\030\004 \001(\t\022\"\n\032include_trailing_"
@@ -536,411 +540,416 @@ public final class StorageProto {
           + "ons\030\007 \001(\010\0222\n\tread_mask\030\010 \001(\0132\032.google.pr"
           + "otobuf.FieldMaskH\000\210\001\001\022 \n\023lexicographic_s"
           + "tart\030\n \001(\tB\003\340A\001\022\036\n\021lexicographic_end\030\013 \001"
-          + "(\tB\003\340A\001\022\031\n\014soft_deleted\030\014 \001(\010B\003\340A\001\022\027\n\nma"
-          + "tch_glob\030\016 \001(\tB\003\340A\001B\014\n\n_read_mask\"\205\001\n\027Qu"
-          + "eryWriteStatusRequest\022\026\n\tupload_id\030\001 \001(\t"
-          + "B\003\340A\002\022R\n\034common_object_request_params\030\002 "
-          + "\001(\0132,.google.storage.v2.CommonObjectRequ"
-          + "estParams\"s\n\030QueryWriteStatusResponse\022\030\n"
-          + "\016persisted_size\030\001 \001(\003H\000\022-\n\010resource\030\002 \001("
-          + "\0132\031.google.storage.v2.ObjectH\000B\016\n\014write_"
-          + "status\"\250\n\n\024RewriteObjectRequest\022 \n\020desti"
-          + "nation_name\030\030 \001(\tB\006\340A\002\340A\005\022D\n\022destination"
-          + "_bucket\030\031 \001(\tB(\340A\002\340A\005\372A\037\n\035storage.google"
-          + "apis.com/Bucket\022C\n\023destination_kms_key\030\033"
-          + " \001(\tB&\372A#\n!cloudkms.googleapis.com/Crypt"
-          + "oKey\022.\n\013destination\030\001 \001(\0132\031.google.stora"
-          + "ge.v2.Object\022<\n\rsource_bucket\030\002 \001(\tB%\340A\002"
-          + "\372A\037\n\035storage.googleapis.com/Bucket\022\032\n\rso"
-          + "urce_object\030\003 \001(\tB\003\340A\002\022\031\n\021source_generat"
-          + "ion\030\004 \001(\003\022\025\n\rrewrite_token\030\005 \001(\t\022\"\n\032dest"
-          + "ination_predefined_acl\030\034 \001(\t\022 \n\023if_gener"
-          + "ation_match\030\007 \001(\003H\000\210\001\001\022$\n\027if_generation_"
-          + "not_match\030\010 \001(\003H\001\210\001\001\022$\n\027if_metageneratio"
-          + "n_match\030\t \001(\003H\002\210\001\001\022(\n\033if_metageneration_"
-          + "not_match\030\n \001(\003H\003\210\001\001\022\'\n\032if_source_genera"
-          + "tion_match\030\013 \001(\003H\004\210\001\001\022+\n\036if_source_gener"
-          + "ation_not_match\030\014 \001(\003H\005\210\001\001\022+\n\036if_source_"
-          + "metageneration_match\030\r \001(\003H\006\210\001\001\022/\n\"if_so"
-          + "urce_metageneration_not_match\030\016 \001(\003H\007\210\001\001"
-          + "\022$\n\034max_bytes_rewritten_per_call\030\017 \001(\003\022("
-          + "\n copy_source_encryption_algorithm\030\020 \001(\t"
-          + "\022(\n copy_source_encryption_key_bytes\030\025 \001"
-          + "(\014\022/\n\'copy_source_encryption_key_sha256_"
-          + "bytes\030\026 \001(\014\022R\n\034common_object_request_par"
-          + "ams\030\023 \001(\0132,.google.storage.v2.CommonObje"
-          + "ctRequestParams\022<\n\020object_checksums\030\035 \001("
-          + "\0132\".google.storage.v2.ObjectChecksumsB\026\n"
-          + "\024_if_generation_matchB\032\n\030_if_generation_"
-          + "not_matchB\032\n\030_if_metageneration_matchB\036\n"
-          + "\034_if_metageneration_not_matchB\035\n\033_if_sou"
-          + "rce_generation_matchB!\n\037_if_source_gener"
-          + "ation_not_matchB!\n\037_if_source_metagenera"
-          + "tion_matchB%\n#_if_source_metageneration_"
-          + "not_match\"\227\001\n\017RewriteResponse\022\035\n\025total_b"
-          + "ytes_rewritten\030\001 \001(\003\022\023\n\013object_size\030\002 \001("
-          + "\003\022\014\n\004done\030\003 \001(\010\022\025\n\rrewrite_token\030\004 \001(\t\022+"
-          + "\n\010resource\030\005 \001(\0132\031.google.storage.v2.Obj"
-          + "ect\"\362\001\n\032StartResumableWriteRequest\022B\n\021wr"
-          + "ite_object_spec\030\001 \001(\0132\".google.storage.v"
-          + "2.WriteObjectSpecB\003\340A\002\022R\n\034common_object_"
-          + "request_params\030\003 \001(\0132,.google.storage.v2"
-          + ".CommonObjectRequestParams\022<\n\020object_che"
-          + "cksums\030\005 \001(\0132\".google.storage.v2.ObjectC"
-          + "hecksums\"0\n\033StartResumableWriteResponse\022"
-          + "\021\n\tupload_id\030\001 \001(\t\"\357\003\n\023UpdateObjectReque"
-          + "st\022.\n\006object\030\001 \001(\0132\031.google.storage.v2.O"
-          + "bjectB\003\340A\002\022 \n\023if_generation_match\030\002 \001(\003H"
-          + "\000\210\001\001\022$\n\027if_generation_not_match\030\003 \001(\003H\001\210"
-          + "\001\001\022$\n\027if_metageneration_match\030\004 \001(\003H\002\210\001\001"
-          + "\022(\n\033if_metageneration_not_match\030\005 \001(\003H\003\210"
-          + "\001\001\022\026\n\016predefined_acl\030\n \001(\t\0224\n\013update_mas"
-          + "k\030\007 \001(\0132\032.google.protobuf.FieldMaskB\003\340A\002"
-          + "\022R\n\034common_object_request_params\030\010 \001(\0132,"
-          + ".google.storage.v2.CommonObjectRequestPa"
-          + "ramsB\026\n\024_if_generation_matchB\032\n\030_if_gene"
-          + "ration_not_matchB\032\n\030_if_metageneration_m"
-          + "atchB\036\n\034_if_metageneration_not_match\"`\n\030"
-          + "GetServiceAccountRequest\022D\n\007project\030\001 \001("
-          + "\tB3\340A\002\372A-\n+cloudresourcemanager.googleap"
-          + "is.com/Project\"\200\001\n\024CreateHmacKeyRequest\022"
-          + "D\n\007project\030\001 \001(\tB3\340A\002\372A-\n+cloudresourcem"
-          + "anager.googleapis.com/Project\022\"\n\025service"
-          + "_account_email\030\002 \001(\tB\003\340A\002\"g\n\025CreateHmacK"
-          + "eyResponse\0224\n\010metadata\030\001 \001(\0132\".google.st"
-          + "orage.v2.HmacKeyMetadata\022\030\n\020secret_key_b"
-          + "ytes\030\003 \001(\014\"t\n\024DeleteHmacKeyRequest\022\026\n\tac"
-          + "cess_id\030\001 \001(\tB\003\340A\002\022D\n\007project\030\002 \001(\tB3\340A\002"
-          + "\372A-\n+cloudresourcemanager.googleapis.com"
-          + "/Project\"q\n\021GetHmacKeyRequest\022\026\n\taccess_"
-          + "id\030\001 \001(\tB\003\340A\002\022D\n\007project\030\002 \001(\tB3\340A\002\372A-\n+"
-          + "cloudresourcemanager.googleapis.com/Proj"
-          + "ect\"\274\001\n\023ListHmacKeysRequest\022D\n\007project\030\001"
-          + " \001(\tB3\340A\002\372A-\n+cloudresourcemanager.googl"
-          + "eapis.com/Project\022\021\n\tpage_size\030\002 \001(\005\022\022\n\n"
-          + "page_token\030\003 \001(\t\022\035\n\025service_account_emai"
-          + "l\030\004 \001(\t\022\031\n\021show_deleted_keys\030\005 \001(\010\"f\n\024Li"
-          + "stHmacKeysResponse\0225\n\thmac_keys\030\001 \003(\0132\"."
-          + "google.storage.v2.HmacKeyMetadata\022\027\n\017nex"
-          + "t_page_token\030\002 \001(\t\"\202\001\n\024UpdateHmacKeyRequ"
-          + "est\0229\n\010hmac_key\030\001 \001(\0132\".google.storage.v"
-          + "2.HmacKeyMetadataB\003\340A\002\022/\n\013update_mask\030\003 "
-          + "\001(\0132\032.google.protobuf.FieldMask\"|\n\031Commo"
-          + "nObjectRequestParams\022\034\n\024encryption_algor"
-          + "ithm\030\001 \001(\t\022\034\n\024encryption_key_bytes\030\004 \001(\014"
-          + "\022#\n\033encryption_key_sha256_bytes\030\005 \001(\014\"\312\005"
-          + "\n\020ServiceConstants\"\265\005\n\006Values\022\026\n\022VALUES_"
-          + "UNSPECIFIED\020\000\022\033\n\024MAX_READ_CHUNK_BYTES\020\200\200"
-          + "\200\001\022\034\n\025MAX_WRITE_CHUNK_BYTES\020\200\200\200\001\022\031\n\022MAX_"
-          + "OBJECT_SIZE_MB\020\200\200\300\002\022)\n$MAX_CUSTOM_METADA"
-          + "TA_FIELD_NAME_BYTES\020\200\010\022*\n%MAX_CUSTOM_MET"
-          + "ADATA_FIELD_VALUE_BYTES\020\200 \022)\n$MAX_CUSTOM"
-          + "_METADATA_TOTAL_SIZE_BYTES\020\200@\022*\n$MAX_BUC"
-          + "KET_METADATA_TOTAL_SIZE_BYTES\020\200\240\001\022\'\n#MAX"
-          + "_NOTIFICATION_CONFIGS_PER_BUCKET\020d\022\"\n\036MA"
-          + "X_LIFECYCLE_RULES_PER_BUCKET\020d\022&\n\"MAX_NO"
-          + "TIFICATION_CUSTOM_ATTRIBUTES\020\005\0221\n,MAX_NO"
-          + "TIFICATION_CUSTOM_ATTRIBUTE_KEY_LENGTH\020\200"
-          + "\002\0223\n.MAX_NOTIFICATION_CUSTOM_ATTRIBUTE_V"
-          + "ALUE_LENGTH\020\200\010\022\034\n\030MAX_LABELS_ENTRIES_COU"
-          + "NT\020@\022\037\n\033MAX_LABELS_KEY_VALUE_LENGTH\020?\022\037\n"
-          + "\032MAX_LABELS_KEY_VALUE_BYTES\020\200\001\022.\n)MAX_OB"
-          + "JECT_IDS_PER_DELETE_OBJECTS_REQUEST\020\350\007\022\036"
-          + "\n\032SPLIT_TOKEN_MAX_VALID_DAYS\020\016\032\002\020\001\"\215\033\n\006B"
-          + "ucket\022\021\n\004name\030\001 \001(\tB\003\340A\005\022\026\n\tbucket_id\030\002 "
-          + "\001(\tB\003\340A\003\022\014\n\004etag\030\035 \001(\t\022D\n\007project\030\003 \001(\tB"
-          + "3\340A\005\372A-\n+cloudresourcemanager.googleapis"
-          + ".com/Project\022\033\n\016metageneration\030\004 \001(\003B\003\340A"
-          + "\003\022\025\n\010location\030\005 \001(\tB\003\340A\005\022\032\n\rlocation_typ"
-          + "e\030\006 \001(\tB\003\340A\003\022\025\n\rstorage_class\030\007 \001(\t\022\013\n\003r"
-          + "po\030\033 \001(\t\0223\n\003acl\030\010 \003(\0132&.google.storage.v"
-          + "2.BucketAccessControl\022B\n\022default_object_"
-          + "acl\030\t \003(\0132&.google.storage.v2.ObjectAcce"
-          + "ssControl\0226\n\tlifecycle\030\n \001(\0132#.google.st"
-          + "orage.v2.Bucket.Lifecycle\0224\n\013create_time"
-          + "\030\013 \001(\0132\032.google.protobuf.TimestampB\003\340A\003\022"
-          + ",\n\004cors\030\014 \003(\0132\036.google.storage.v2.Bucket"
-          + ".Cors\0224\n\013update_time\030\r \001(\0132\032.google.prot"
-          + "obuf.TimestampB\003\340A\003\022 \n\030default_event_bas"
-          + "ed_hold\030\016 \001(\010\0225\n\006labels\030\017 \003(\0132%.google.s"
-          + "torage.v2.Bucket.LabelsEntry\0222\n\007website\030"
-          + "\020 \001(\0132!.google.storage.v2.Bucket.Website"
-          + "\0228\n\nversioning\030\021 \001(\0132$.google.storage.v2"
-          + ".Bucket.Versioning\0222\n\007logging\030\022 \001(\0132!.go"
-          + "ogle.storage.v2.Bucket.Logging\022,\n\005owner\030"
-          + "\023 \001(\0132\030.google.storage.v2.OwnerB\003\340A\003\0228\n\n"
-          + "encryption\030\024 \001(\0132$.google.storage.v2.Buc"
-          + "ket.Encryption\0222\n\007billing\030\025 \001(\0132!.google"
-          + ".storage.v2.Bucket.Billing\022C\n\020retention_"
-          + "policy\030\026 \001(\0132).google.storage.v2.Bucket."
-          + "RetentionPolicy\0227\n\niam_config\030\027 \001(\0132#.go"
-          + "ogle.storage.v2.Bucket.IamConfig\022\025\n\rsati"
-          + "sfies_pzs\030\031 \001(\010\022P\n\027custom_placement_conf"
-          + "ig\030\032 \001(\0132/.google.storage.v2.Bucket.Cust"
-          + "omPlacementConfig\0226\n\tautoclass\030\034 \001(\0132#.g"
-          + "oogle.storage.v2.Bucket.Autoclass\022K\n\022sof"
-          + "t_delete_policy\030\037 \001(\0132*.google.storage.v"
-          + "2.Bucket.SoftDeletePolicyB\003\340A\001\032!\n\007Billin"
-          + "g\022\026\n\016requester_pays\030\001 \001(\010\032X\n\004Cors\022\016\n\006ori"
-          + "gin\030\001 \003(\t\022\016\n\006method\030\002 \003(\t\022\027\n\017response_he"
-          + "ader\030\003 \003(\t\022\027\n\017max_age_seconds\030\004 \001(\005\032M\n\nE"
-          + "ncryption\022?\n\017default_kms_key\030\001 \001(\tB&\372A#\n"
-          + "!cloudkms.googleapis.com/CryptoKey\032\354\001\n\tI"
-          + "amConfig\022a\n\033uniform_bucket_level_access\030"
-          + "\001 \001(\0132<.google.storage.v2.Bucket.IamConf"
-          + "ig.UniformBucketLevelAccess\022 \n\030public_ac"
-          + "cess_prevention\030\003 \001(\t\032Z\n\030UniformBucketLe"
-          + "velAccess\022\017\n\007enabled\030\001 \001(\010\022-\n\tlock_time\030"
-          + "\002 \001(\0132\032.google.protobuf.Timestamp\032\363\005\n\tLi"
-          + "fecycle\0226\n\004rule\030\001 \003(\0132(.google.storage.v"
-          + "2.Bucket.Lifecycle.Rule\032\255\005\n\004Rule\022?\n\006acti"
-          + "on\030\001 \001(\0132/.google.storage.v2.Bucket.Life"
-          + "cycle.Rule.Action\022E\n\tcondition\030\002 \001(\01322.g"
-          + "oogle.storage.v2.Bucket.Lifecycle.Rule.C"
-          + "ondition\032-\n\006Action\022\014\n\004type\030\001 \001(\t\022\025\n\rstor"
-          + "age_class\030\002 \001(\t\032\355\003\n\tCondition\022\025\n\010age_day"
-          + "s\030\001 \001(\005H\000\210\001\001\022)\n\016created_before\030\002 \001(\0132\021.g"
-          + "oogle.type.Date\022\024\n\007is_live\030\003 \001(\010H\001\210\001\001\022\037\n"
-          + "\022num_newer_versions\030\004 \001(\005H\002\210\001\001\022\035\n\025matche"
-          + "s_storage_class\030\005 \003(\t\022#\n\026days_since_cust"
-          + "om_time\030\007 \001(\005H\003\210\001\001\022-\n\022custom_time_before"
-          + "\030\010 \001(\0132\021.google.type.Date\022\'\n\032days_since_"
-          + "noncurrent_time\030\t \001(\005H\004\210\001\001\0221\n\026noncurrent"
-          + "_time_before\030\n \001(\0132\021.google.type.Date\022\026\n"
-          + "\016matches_prefix\030\013 \003(\t\022\026\n\016matches_suffix\030"
-          + "\014 \003(\tB\013\n\t_age_daysB\n\n\010_is_liveB\025\n\023_num_n"
-          + "ewer_versionsB\031\n\027_days_since_custom_time"
-          + "B\035\n\033_days_since_noncurrent_time\0328\n\007Loggi"
-          + "ng\022\022\n\nlog_bucket\030\001 \001(\t\022\031\n\021log_object_pre"
-          + "fix\030\002 \001(\t\032\217\001\n\017RetentionPolicy\0222\n\016effecti"
-          + "ve_time\030\001 \001(\0132\032.google.protobuf.Timestam"
-          + "p\022\021\n\tis_locked\030\002 \001(\010\0225\n\022retention_durati"
-          + "on\030\004 \001(\0132\031.google.protobuf.Duration\032\261\001\n\020"
-          + "SoftDeletePolicy\022:\n\022retention_duration\030\001"
-          + " \001(\0132\031.google.protobuf.DurationH\000\210\001\001\0227\n\016"
-          + "effective_time\030\002 \001(\0132\032.google.protobuf.T"
-          + "imestampH\001\210\001\001B\025\n\023_retention_durationB\021\n\017"
-          + "_effective_time\032\035\n\nVersioning\022\017\n\007enabled"
-          + "\030\001 \001(\010\032;\n\007Website\022\030\n\020main_page_suffix\030\001 "
-          + "\001(\t\022\026\n\016not_found_page\030\002 \001(\t\032/\n\025CustomPla"
-          + "cementConfig\022\026\n\016data_locations\030\001 \003(\t\032\213\002\n"
-          + "\tAutoclass\022\017\n\007enabled\030\001 \001(\010\0224\n\013toggle_ti"
-          + "me\030\002 \001(\0132\032.google.protobuf.TimestampB\003\340A"
-          + "\003\022#\n\026terminal_storage_class\030\003 \001(\tH\000\210\001\001\022P"
-          + "\n\"terminal_storage_class_update_time\030\004 \001"
-          + "(\0132\032.google.protobuf.TimestampB\003\340A\003H\001\210\001\001"
-          + "B\031\n\027_terminal_storage_classB%\n#_terminal"
-          + "_storage_class_update_time\032-\n\013LabelsEntr"
-          + "y\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\t:\0028\001:G\352AD\n\035"
-          + "storage.googleapis.com/Bucket\022#projects/"
-          + "{project}/buckets/{bucket}\"\316\001\n\023BucketAcc"
-          + "essControl\022\014\n\004role\030\001 \001(\t\022\n\n\002id\030\002 \001(\t\022\016\n\006"
-          + "entity\030\003 \001(\t\022\027\n\nentity_alt\030\t \001(\tB\003\340A\003\022\021\n"
-          + "\tentity_id\030\004 \001(\t\022\014\n\004etag\030\010 \001(\t\022\r\n\005email\030"
-          + "\005 \001(\t\022\016\n\006domain\030\006 \001(\t\0224\n\014project_team\030\007 "
-          + "\001(\0132\036.google.storage.v2.ProjectTeam\"I\n\017C"
-          + "hecksummedData\022\026\n\007content\030\001 \001(\014B\005\010\001\340A\001\022\023"
-          + "\n\006crc32c\030\002 \001(\007H\000\210\001\001B\t\n\007_crc32c\"C\n\017Object"
-          + "Checksums\022\023\n\006crc32c\030\001 \001(\007H\000\210\001\001\022\020\n\010md5_ha"
-          + "sh\030\002 \001(\014B\t\n\007_crc32c\"\255\002\n\017HmacKeyMetadata\022"
-          + "\017\n\002id\030\001 \001(\tB\003\340A\005\022\026\n\taccess_id\030\002 \001(\tB\003\340A\005"
-          + "\022D\n\007project\030\003 \001(\tB3\340A\005\372A-\n+cloudresource"
-          + "manager.googleapis.com/Project\022\"\n\025servic"
-          + "e_account_email\030\004 \001(\tB\003\340A\003\022\r\n\005state\030\005 \001("
-          + "\t\0224\n\013create_time\030\006 \001(\0132\032.google.protobuf"
-          + ".TimestampB\003\340A\003\0224\n\013update_time\030\007 \001(\0132\032.g",
-      "oogle.protobuf.TimestampB\003\340A\003\022\014\n\004etag\030\010 "
-          + "\001(\t\"\247\003\n\022NotificationConfig\022\021\n\004name\030\001 \001(\t"
-          + "B\003\340A\002\022\022\n\005topic\030\002 \001(\tB\003\340A\002\022\014\n\004etag\030\007 \001(\t\022"
-          + "\023\n\013event_types\030\003 \003(\t\022V\n\021custom_attribute"
-          + "s\030\004 \003(\0132;.google.storage.v2.Notification"
-          + "Config.CustomAttributesEntry\022\032\n\022object_n"
-          + "ame_prefix\030\005 \001(\t\022\033\n\016payload_format\030\006 \001(\t"
-          + "B\003\340A\002\0327\n\025CustomAttributesEntry\022\013\n\003key\030\001 "
-          + "\001(\t\022\r\n\005value\030\002 \001(\t:\0028\001:}\352Az\n)storage.goo"
-          + "gleapis.com/NotificationConfig\022Mprojects"
-          + "/{project}/buckets/{bucket}/notification"
-          + "Configs/{notification_config}\"L\n\022Custome"
-          + "rEncryption\022\034\n\024encryption_algorithm\030\001 \001("
-          + "\t\022\030\n\020key_sha256_bytes\030\003 \001(\014\"\254\n\n\006Object\022\021"
-          + "\n\004name\030\001 \001(\tB\003\340A\005\0225\n\006bucket\030\002 \001(\tB%\340A\005\372A"
-          + "\037\n\035storage.googleapis.com/Bucket\022\014\n\004etag"
-          + "\030\033 \001(\t\022\027\n\ngeneration\030\003 \001(\003B\003\340A\005\022\033\n\016metag"
-          + "eneration\030\004 \001(\003B\003\340A\003\022\025\n\rstorage_class\030\005 "
-          + "\001(\t\022\021\n\004size\030\006 \001(\003B\003\340A\003\022\030\n\020content_encodi"
-          + "ng\030\007 \001(\t\022\033\n\023content_disposition\030\010 \001(\t\022\025\n"
-          + "\rcache_control\030\t \001(\t\0223\n\003acl\030\n \003(\0132&.goog"
-          + "le.storage.v2.ObjectAccessControl\022\030\n\020con"
-          + "tent_language\030\013 \001(\t\0224\n\013delete_time\030\014 \001(\013"
-          + "2\032.google.protobuf.TimestampB\003\340A\003\022\024\n\014con"
-          + "tent_type\030\r \001(\t\0224\n\013create_time\030\016 \001(\0132\032.g"
-          + "oogle.protobuf.TimestampB\003\340A\003\022\034\n\017compone"
-          + "nt_count\030\017 \001(\005B\003\340A\003\022:\n\tchecksums\030\020 \001(\0132\""
-          + ".google.storage.v2.ObjectChecksumsB\003\340A\003\022"
-          + "4\n\013update_time\030\021 \001(\0132\032.google.protobuf.T"
-          + "imestampB\003\340A\003\0227\n\007kms_key\030\022 \001(\tB&\372A#\n!clo"
-          + "udkms.googleapis.com/CryptoKey\022B\n\031update"
-          + "_storage_class_time\030\023 \001(\0132\032.google.proto"
-          + "buf.TimestampB\003\340A\003\022\026\n\016temporary_hold\030\024 \001"
-          + "(\010\0229\n\025retention_expire_time\030\025 \001(\0132\032.goog"
-          + "le.protobuf.Timestamp\0229\n\010metadata\030\026 \003(\0132"
-          + "\'.google.storage.v2.Object.MetadataEntry"
-          + "\022\035\n\020event_based_hold\030\027 \001(\010H\000\210\001\001\022,\n\005owner"
-          + "\030\030 \001(\0132\030.google.storage.v2.OwnerB\003\340A\003\022B\n"
-          + "\023customer_encryption\030\031 \001(\0132%.google.stor"
-          + "age.v2.CustomerEncryption\022/\n\013custom_time"
-          + "\030\032 \001(\0132\032.google.protobuf.Timestamp\022>\n\020so"
-          + "ft_delete_time\030\034 \001(\0132\032.google.protobuf.T"
-          + "imestampB\003\340A\003H\001\210\001\001\022>\n\020hard_delete_time\030\035"
-          + " \001(\0132\032.google.protobuf.TimestampB\003\340A\003H\002\210"
-          + "\001\001\032/\n\rMetadataEntry\022\013\n\003key\030\001 \001(\t\022\r\n\005valu"
-          + "e\030\002 \001(\t:\0028\001B\023\n\021_event_based_holdB\023\n\021_sof"
-          + "t_delete_timeB\023\n\021_hard_delete_time\"\316\001\n\023O"
-          + "bjectAccessControl\022\014\n\004role\030\001 \001(\t\022\n\n\002id\030\002"
-          + " \001(\t\022\016\n\006entity\030\003 \001(\t\022\027\n\nentity_alt\030\t \001(\t"
-          + "B\003\340A\003\022\021\n\tentity_id\030\004 \001(\t\022\014\n\004etag\030\010 \001(\t\022\r"
-          + "\n\005email\030\005 \001(\t\022\016\n\006domain\030\006 \001(\t\0224\n\014project"
-          + "_team\030\007 \001(\0132\036.google.storage.v2.ProjectT"
-          + "eam\"l\n\023ListObjectsResponse\022*\n\007objects\030\001 "
-          + "\003(\0132\031.google.storage.v2.Object\022\020\n\010prefix"
-          + "es\030\002 \003(\t\022\027\n\017next_page_token\030\003 \001(\t\"3\n\013Pro"
-          + "jectTeam\022\026\n\016project_number\030\001 \001(\t\022\014\n\004team"
-          + "\030\002 \001(\t\"\'\n\016ServiceAccount\022\025\n\remail_addres"
-          + "s\030\001 \001(\t\"*\n\005Owner\022\016\n\006entity\030\001 \001(\t\022\021\n\tenti"
-          + "ty_id\030\002 \001(\t\"C\n\014ContentRange\022\r\n\005start\030\001 \001"
-          + "(\003\022\013\n\003end\030\002 \001(\003\022\027\n\017complete_length\030\003 \001(\003"
-          + "2\252\'\n\007Storage\022r\n\014DeleteBucket\022&.google.st"
-          + "orage.v2.DeleteBucketRequest\032\026.google.pr"
-          + "otobuf.Empty\"\"\332A\004name\212\323\344\223\002\025\022\023\n\004name\022\013{bu"
-          + "cket=**}\022o\n\tGetBucket\022#.google.storage.v"
-          + "2.GetBucketRequest\032\031.google.storage.v2.B"
-          + "ucket\"\"\332A\004name\212\323\344\223\002\025\022\023\n\004name\022\013{bucket=**"
-          + "}\022\253\001\n\014CreateBucket\022&.google.storage.v2.C"
-          + "reateBucketRequest\032\031.google.storage.v2.B"
-          + "ucket\"X\332A\027parent,bucket,bucket_id\212\323\344\223\0028\022"
-          + "\026\n\006parent\022\014{project=**}\022\036\n\016bucket.projec"
-          + "t\022\014{project=**}\022\205\001\n\013ListBuckets\022%.google"
-          + ".storage.v2.ListBucketsRequest\032&.google."
-          + "storage.v2.ListBucketsResponse\"\'\332A\006paren"
-          + "t\212\323\344\223\002\030\022\026\n\006parent\022\014{project=**}\022\223\001\n\031Lock"
-          + "BucketRetentionPolicy\0223.google.storage.v"
-          + "2.LockBucketRetentionPolicyRequest\032\031.goo"
-          + "gle.storage.v2.Bucket\"&\332A\006bucket\212\323\344\223\002\027\022\025"
-          + "\n\006bucket\022\013{bucket=**}\022u\n\014GetIamPolicy\022\"."
-          + "google.iam.v1.GetIamPolicyRequest\032\025.goog"
-          + "le.iam.v1.Policy\"*\332A\010resource\212\323\344\223\002\031\022\027\n\010r"
-          + "esource\022\013{bucket=**}\022|\n\014SetIamPolicy\022\".g"
-          + "oogle.iam.v1.SetIamPolicyRequest\032\025.googl"
-          + "e.iam.v1.Policy\"1\332A\017resource,policy\212\323\344\223\002"
-          + "\031\022\027\n\010resource\022\013{bucket=**}\022\327\001\n\022TestIamPe"
-          + "rmissions\022(.google.iam.v1.TestIamPermiss"
-          + "ionsRequest\032).google.iam.v1.TestIamPermi"
-          + "ssionsResponse\"l\332A\024resource,permissions\212"
-          + "\323\344\223\002O\022\027\n\010resource\022\013{bucket=**}\0224\n\010resour"
-          + "ce\022({bucket=projects/*/buckets/*}/object"
-          + "s/**\022\212\001\n\014UpdateBucket\022&.google.storage.v"
-          + "2.UpdateBucketRequest\032\031.google.storage.v"
-          + "2.Bucket\"7\332A\022bucket,update_mask\212\323\344\223\002\034\022\032\n"
-          + "\013bucket.name\022\013{bucket=**}\022\237\001\n\030DeleteNoti"
-          + "ficationConfig\0222.google.storage.v2.Delet"
-          + "eNotificationConfigRequest\032\026.google.prot"
-          + "obuf.Empty\"7\332A\004name\212\323\344\223\002*\022(\n\004name\022 {buck"
-          + "et=projects/*/buckets/*}/**\022\250\001\n\025GetNotif"
-          + "icationConfig\022/.google.storage.v2.GetNot"
-          + "ificationConfigRequest\032%.google.storage."
-          + "v2.NotificationConfig\"7\332A\004name\212\323\344\223\002*\022(\n\004"
-          + "name\022 {bucket=projects/*/buckets/*}/**\022\261"
-          + "\001\n\030CreateNotificationConfig\0222.google.sto"
-          + "rage.v2.CreateNotificationConfigRequest\032"
-          + "%.google.storage.v2.NotificationConfig\":"
-          + "\332A\032parent,notification_config\212\323\344\223\002\027\022\025\n\006p"
-          + "arent\022\013{bucket=**}\022\250\001\n\027ListNotificationC"
-          + "onfigs\0221.google.storage.v2.ListNotificat"
-          + "ionConfigsRequest\0322.google.storage.v2.Li"
-          + "stNotificationConfigsResponse\"&\332A\006parent"
-          + "\212\323\344\223\002\027\022\025\n\006parent\022\013{bucket=**}\022~\n\rCompose"
-          + "Object\022\'.google.storage.v2.ComposeObject"
-          + "Request\032\031.google.storage.v2.Object\")\212\323\344\223"
-          + "\002#\022!\n\022destination.bucket\022\013{bucket=**}\022\230\001"
-          + "\n\014DeleteObject\022&.google.storage.v2.Delet"
-          + "eObjectRequest\032\026.google.protobuf.Empty\"H"
-          + "\332A\rbucket,object\332A\030bucket,object,generat"
-          + "ion\212\323\344\223\002\027\022\025\n\006bucket\022\013{bucket=**}\022\215\001\n\rRes"
-          + "toreObject\022\'.google.storage.v2.RestoreOb"
-          + "jectRequest\032\031.google.storage.v2.Object\"8"
-          + "\332A\030bucket,object,generation\212\323\344\223\002\027\022\025\n\006buc"
-          + "ket\022\013{bucket=**}\022\272\001\n\024CancelResumableWrit"
-          + "e\022..google.storage.v2.CancelResumableWri"
-          + "teRequest\032/.google.storage.v2.CancelResu"
-          + "mableWriteResponse\"A\332A\tupload_id\212\323\344\223\002/\022-"
-          + "\n\tupload_id\022 {bucket=projects/*/buckets/"
-          + "*}/**\022\225\001\n\tGetObject\022#.google.storage.v2."
-          + "GetObjectRequest\032\031.google.storage.v2.Obj"
-          + "ect\"H\332A\rbucket,object\332A\030bucket,object,ge"
-          + "neration\212\323\344\223\002\027\022\025\n\006bucket\022\013{bucket=**}\022\245\001"
-          + "\n\nReadObject\022$.google.storage.v2.ReadObj"
-          + "ectRequest\032%.google.storage.v2.ReadObjec"
-          + "tResponse\"H\332A\rbucket,object\332A\030bucket,obj"
-          + "ect,generation\212\323\344\223\002\027\022\025\n\006bucket\022\013{bucket="
-          + "**}0\001\022\214\001\n\014UpdateObject\022&.google.storage."
-          + "v2.UpdateObjectRequest\032\031.google.storage."
-          + "v2.Object\"9\332A\022object,update_mask\212\323\344\223\002\036\022\034"
-          + "\n\robject.bucket\022\013{bucket=**}\022`\n\013WriteObj"
-          + "ect\022%.google.storage.v2.WriteObjectReque"
-          + "st\032&.google.storage.v2.WriteObjectRespon"
-          + "se\"\000(\001\022n\n\017BidiWriteObject\022).google.stora"
-          + "ge.v2.BidiWriteObjectRequest\032*.google.st"
-          + "orage.v2.BidiWriteObjectResponse\"\000(\0010\001\022\204"
-          + "\001\n\013ListObjects\022%.google.storage.v2.ListO"
-          + "bjectsRequest\032&.google.storage.v2.ListOb"
-          + "jectsResponse\"&\332A\006parent\212\323\344\223\002\027\022\025\n\006parent"
-          + "\022\013{bucket=**}\022\230\001\n\rRewriteObject\022\'.google"
-          + ".storage.v2.RewriteObjectRequest\032\".googl"
-          + "e.storage.v2.RewriteResponse\":\212\323\344\223\0024\022\017\n\r"
-          + "source_bucket\022!\n\022destination_bucket\022\013{bu"
-          + "cket=**}\022\256\001\n\023StartResumableWrite\022-.googl"
-          + "e.storage.v2.StartResumableWriteRequest\032"
-          + "..google.storage.v2.StartResumableWriteR"
-          + "esponse\"8\212\323\344\223\0022\0220\n!write_object_spec.res"
-          + "ource.bucket\022\013{bucket=**}\022\256\001\n\020QueryWrite"
-          + "Status\022*.google.storage.v2.QueryWriteSta"
-          + "tusRequest\032+.google.storage.v2.QueryWrit"
-          + "eStatusResponse\"A\332A\tupload_id\212\323\344\223\002/\022-\n\tu"
-          + "pload_id\022 {bucket=projects/*/buckets/*}/"
-          + "**\022\200\001\n\021GetServiceAccount\022+.google.storag"
-          + "e.v2.GetServiceAccountRequest\032!.google.s"
-          + "torage.v2.ServiceAccount\"\033\332A\007project\212\323\344\223"
-          + "\002\013\022\t\n\007project\022\225\001\n\rCreateHmacKey\022\'.google"
-          + ".storage.v2.CreateHmacKeyRequest\032(.googl"
-          + "e.storage.v2.CreateHmacKeyResponse\"1\332A\035p"
-          + "roject,service_account_email\212\323\344\223\002\013\022\t\n\007pr"
-          + "oject\022w\n\rDeleteHmacKey\022\'.google.storage."
-          + "v2.DeleteHmacKeyRequest\032\026.google.protobu"
-          + "f.Empty\"%\332A\021access_id,project\212\323\344\223\002\013\022\t\n\007p"
-          + "roject\022}\n\nGetHmacKey\022$.google.storage.v2"
-          + ".GetHmacKeyRequest\032\".google.storage.v2.H"
-          + "macKeyMetadata\"%\332A\021access_id,project\212\323\344\223"
-          + "\002\013\022\t\n\007project\022|\n\014ListHmacKeys\022&.google.s"
-          + "torage.v2.ListHmacKeysRequest\032\'.google.s"
-          + "torage.v2.ListHmacKeysResponse\"\033\332A\007proje"
-          + "ct\212\323\344\223\002\013\022\t\n\007project\022\235\001\n\rUpdateHmacKey\022\'."
-          + "google.storage.v2.UpdateHmacKeyRequest\032\""
-          + ".google.storage.v2.HmacKeyMetadata\"?\332A\024h"
-          + "mac_key,update_mask\212\323\344\223\002\"\022 \n\020hmac_key.pr"
-          + "oject\022\014{project=**}\032\247\002\312A\026storage.googlea"
-          + "pis.com\322A\212\002https://www.googleapis.com/au"
-          + "th/cloud-platform,https://www.googleapis"
-          + ".com/auth/cloud-platform.read-only,https"
-          + "://www.googleapis.com/auth/devstorage.fu"
-          + "ll_control,https://www.googleapis.com/au"
-          + "th/devstorage.read_only,https://www.goog"
-          + "leapis.com/auth/devstorage.read_writeB\342\001"
-          + "\n\025com.google.storage.v2B\014StorageProtoP\001Z"
-          + ">cloud.google.com/go/storage/internal/ap"
-          + "iv2/storagepb;storagepb\352Ax\n!cloudkms.goo"
-          + "gleapis.com/CryptoKey\022Sprojects/{project"
-          + "}/locations/{location}/keyRings/{key_rin"
-          + "g}/cryptoKeys/{crypto_key}b\006proto3"
+          + "(\tB\003\340A\001\022\031\n\014soft_deleted\030\014 \001(\010B\003\340A\001\022(\n\033in"
+          + "clude_folders_as_prefixes\030\r \001(\010B\003\340A\001\022\027\n\n"
+          + "match_glob\030\016 \001(\tB\003\340A\001B\014\n\n_read_mask\"\205\001\n\027"
+          + "QueryWriteStatusRequest\022\026\n\tupload_id\030\001 \001"
+          + "(\tB\003\340A\002\022R\n\034common_object_request_params\030"
+          + "\002 \001(\0132,.google.storage.v2.CommonObjectRe"
+          + "questParams\"s\n\030QueryWriteStatusResponse\022"
+          + "\030\n\016persisted_size\030\001 \001(\003H\000\022-\n\010resource\030\002 "
+          + "\001(\0132\031.google.storage.v2.ObjectH\000B\016\n\014writ"
+          + "e_status\"\250\n\n\024RewriteObjectRequest\022 \n\020des"
+          + "tination_name\030\030 \001(\tB\006\340A\002\340A\005\022D\n\022destinati"
+          + "on_bucket\030\031 \001(\tB(\340A\002\340A\005\372A\037\n\035storage.goog"
+          + "leapis.com/Bucket\022C\n\023destination_kms_key"
+          + "\030\033 \001(\tB&\372A#\n!cloudkms.googleapis.com/Cry"
+          + "ptoKey\022.\n\013destination\030\001 \001(\0132\031.google.sto"
+          + "rage.v2.Object\022<\n\rsource_bucket\030\002 \001(\tB%\340"
+          + "A\002\372A\037\n\035storage.googleapis.com/Bucket\022\032\n\r"
+          + "source_object\030\003 \001(\tB\003\340A\002\022\031\n\021source_gener"
+          + "ation\030\004 \001(\003\022\025\n\rrewrite_token\030\005 \001(\t\022\"\n\032de"
+          + "stination_predefined_acl\030\034 \001(\t\022 \n\023if_gen"
+          + "eration_match\030\007 \001(\003H\000\210\001\001\022$\n\027if_generatio"
+          + "n_not_match\030\010 \001(\003H\001\210\001\001\022$\n\027if_metagenerat"
+          + "ion_match\030\t \001(\003H\002\210\001\001\022(\n\033if_metageneratio"
+          + "n_not_match\030\n \001(\003H\003\210\001\001\022\'\n\032if_source_gene"
+          + "ration_match\030\013 \001(\003H\004\210\001\001\022+\n\036if_source_gen"
+          + "eration_not_match\030\014 \001(\003H\005\210\001\001\022+\n\036if_sourc"
+          + "e_metageneration_match\030\r \001(\003H\006\210\001\001\022/\n\"if_"
+          + "source_metageneration_not_match\030\016 \001(\003H\007\210"
+          + "\001\001\022$\n\034max_bytes_rewritten_per_call\030\017 \001(\003"
+          + "\022(\n copy_source_encryption_algorithm\030\020 \001"
+          + "(\t\022(\n copy_source_encryption_key_bytes\030\025"
+          + " \001(\014\022/\n\'copy_source_encryption_key_sha25"
+          + "6_bytes\030\026 \001(\014\022R\n\034common_object_request_p"
+          + "arams\030\023 \001(\0132,.google.storage.v2.CommonOb"
+          + "jectRequestParams\022<\n\020object_checksums\030\035 "
+          + "\001(\0132\".google.storage.v2.ObjectChecksumsB"
+          + "\026\n\024_if_generation_matchB\032\n\030_if_generatio"
+          + "n_not_matchB\032\n\030_if_metageneration_matchB"
+          + "\036\n\034_if_metageneration_not_matchB\035\n\033_if_s"
+          + "ource_generation_matchB!\n\037_if_source_gen"
+          + "eration_not_matchB!\n\037_if_source_metagene"
+          + "ration_matchB%\n#_if_source_metageneratio"
+          + "n_not_match\"\227\001\n\017RewriteResponse\022\035\n\025total"
+          + "_bytes_rewritten\030\001 \001(\003\022\023\n\013object_size\030\002 "
+          + "\001(\003\022\014\n\004done\030\003 \001(\010\022\025\n\rrewrite_token\030\004 \001(\t"
+          + "\022+\n\010resource\030\005 \001(\0132\031.google.storage.v2.O"
+          + "bject\"\362\001\n\032StartResumableWriteRequest\022B\n\021"
+          + "write_object_spec\030\001 \001(\0132\".google.storage"
+          + ".v2.WriteObjectSpecB\003\340A\002\022R\n\034common_objec"
+          + "t_request_params\030\003 \001(\0132,.google.storage."
+          + "v2.CommonObjectRequestParams\022<\n\020object_c"
+          + "hecksums\030\005 \001(\0132\".google.storage.v2.Objec"
+          + "tChecksums\"0\n\033StartResumableWriteRespons"
+          + "e\022\021\n\tupload_id\030\001 \001(\t\"\357\003\n\023UpdateObjectReq"
+          + "uest\022.\n\006object\030\001 \001(\0132\031.google.storage.v2"
+          + ".ObjectB\003\340A\002\022 \n\023if_generation_match\030\002 \001("
+          + "\003H\000\210\001\001\022$\n\027if_generation_not_match\030\003 \001(\003H"
+          + "\001\210\001\001\022$\n\027if_metageneration_match\030\004 \001(\003H\002\210"
+          + "\001\001\022(\n\033if_metageneration_not_match\030\005 \001(\003H"
+          + "\003\210\001\001\022\026\n\016predefined_acl\030\n \001(\t\0224\n\013update_m"
+          + "ask\030\007 \001(\0132\032.google.protobuf.FieldMaskB\003\340"
+          + "A\002\022R\n\034common_object_request_params\030\010 \001(\013"
+          + "2,.google.storage.v2.CommonObjectRequest"
+          + "ParamsB\026\n\024_if_generation_matchB\032\n\030_if_ge"
+          + "neration_not_matchB\032\n\030_if_metageneration"
+          + "_matchB\036\n\034_if_metageneration_not_match\"`"
+          + "\n\030GetServiceAccountRequest\022D\n\007project\030\001 "
+          + "\001(\tB3\340A\002\372A-\n+cloudresourcemanager.google"
+          + "apis.com/Project\"\200\001\n\024CreateHmacKeyReques"
+          + "t\022D\n\007project\030\001 \001(\tB3\340A\002\372A-\n+cloudresourc"
+          + "emanager.googleapis.com/Project\022\"\n\025servi"
+          + "ce_account_email\030\002 \001(\tB\003\340A\002\"g\n\025CreateHma"
+          + "cKeyResponse\0224\n\010metadata\030\001 \001(\0132\".google."
+          + "storage.v2.HmacKeyMetadata\022\030\n\020secret_key"
+          + "_bytes\030\003 \001(\014\"t\n\024DeleteHmacKeyRequest\022\026\n\t"
+          + "access_id\030\001 \001(\tB\003\340A\002\022D\n\007project\030\002 \001(\tB3\340"
+          + "A\002\372A-\n+cloudresourcemanager.googleapis.c"
+          + "om/Project\"q\n\021GetHmacKeyRequest\022\026\n\tacces"
+          + "s_id\030\001 \001(\tB\003\340A\002\022D\n\007project\030\002 \001(\tB3\340A\002\372A-"
+          + "\n+cloudresourcemanager.googleapis.com/Pr"
+          + "oject\"\274\001\n\023ListHmacKeysRequest\022D\n\007project"
+          + "\030\001 \001(\tB3\340A\002\372A-\n+cloudresourcemanager.goo"
+          + "gleapis.com/Project\022\021\n\tpage_size\030\002 \001(\005\022\022"
+          + "\n\npage_token\030\003 \001(\t\022\035\n\025service_account_em"
+          + "ail\030\004 \001(\t\022\031\n\021show_deleted_keys\030\005 \001(\010\"f\n\024"
+          + "ListHmacKeysResponse\0225\n\thmac_keys\030\001 \003(\0132"
+          + "\".google.storage.v2.HmacKeyMetadata\022\027\n\017n"
+          + "ext_page_token\030\002 \001(\t\"\202\001\n\024UpdateHmacKeyRe"
+          + "quest\0229\n\010hmac_key\030\001 \001(\0132\".google.storage"
+          + ".v2.HmacKeyMetadataB\003\340A\002\022/\n\013update_mask\030"
+          + "\003 \001(\0132\032.google.protobuf.FieldMask\"|\n\031Com"
+          + "monObjectRequestParams\022\034\n\024encryption_alg"
+          + "orithm\030\001 \001(\t\022\034\n\024encryption_key_bytes\030\004 \001"
+          + "(\014\022#\n\033encryption_key_sha256_bytes\030\005 \001(\014\""
+          + "\312\005\n\020ServiceConstants\"\265\005\n\006Values\022\026\n\022VALUE"
+          + "S_UNSPECIFIED\020\000\022\033\n\024MAX_READ_CHUNK_BYTES\020"
+          + "\200\200\200\001\022\034\n\025MAX_WRITE_CHUNK_BYTES\020\200\200\200\001\022\031\n\022MA"
+          + "X_OBJECT_SIZE_MB\020\200\200\300\002\022)\n$MAX_CUSTOM_META"
+          + "DATA_FIELD_NAME_BYTES\020\200\010\022*\n%MAX_CUSTOM_M"
+          + "ETADATA_FIELD_VALUE_BYTES\020\200 \022)\n$MAX_CUST"
+          + "OM_METADATA_TOTAL_SIZE_BYTES\020\200@\022*\n$MAX_B"
+          + "UCKET_METADATA_TOTAL_SIZE_BYTES\020\200\240\001\022\'\n#M"
+          + "AX_NOTIFICATION_CONFIGS_PER_BUCKET\020d\022\"\n\036"
+          + "MAX_LIFECYCLE_RULES_PER_BUCKET\020d\022&\n\"MAX_"
+          + "NOTIFICATION_CUSTOM_ATTRIBUTES\020\005\0221\n,MAX_"
+          + "NOTIFICATION_CUSTOM_ATTRIBUTE_KEY_LENGTH"
+          + "\020\200\002\0223\n.MAX_NOTIFICATION_CUSTOM_ATTRIBUTE"
+          + "_VALUE_LENGTH\020\200\010\022\034\n\030MAX_LABELS_ENTRIES_C"
+          + "OUNT\020@\022\037\n\033MAX_LABELS_KEY_VALUE_LENGTH\020?\022"
+          + "\037\n\032MAX_LABELS_KEY_VALUE_BYTES\020\200\001\022.\n)MAX_"
+          + "OBJECT_IDS_PER_DELETE_OBJECTS_REQUEST\020\350\007"
+          + "\022\036\n\032SPLIT_TOKEN_MAX_VALID_DAYS\020\016\032\002\020\001\"\222\034\n"
+          + "\006Bucket\022\021\n\004name\030\001 \001(\tB\003\340A\005\022\026\n\tbucket_id\030"
+          + "\002 \001(\tB\003\340A\003\022\014\n\004etag\030\035 \001(\t\022D\n\007project\030\003 \001("
+          + "\tB3\340A\005\372A-\n+cloudresourcemanager.googleap"
+          + "is.com/Project\022\033\n\016metageneration\030\004 \001(\003B\003"
+          + "\340A\003\022\025\n\010location\030\005 \001(\tB\003\340A\005\022\032\n\rlocation_t"
+          + "ype\030\006 \001(\tB\003\340A\003\022\025\n\rstorage_class\030\007 \001(\t\022\013\n"
+          + "\003rpo\030\033 \001(\t\0223\n\003acl\030\010 \003(\0132&.google.storage"
+          + ".v2.BucketAccessControl\022B\n\022default_objec"
+          + "t_acl\030\t \003(\0132&.google.storage.v2.ObjectAc"
+          + "cessControl\0226\n\tlifecycle\030\n \001(\0132#.google."
+          + "storage.v2.Bucket.Lifecycle\0224\n\013create_ti"
+          + "me\030\013 \001(\0132\032.google.protobuf.TimestampB\003\340A"
+          + "\003\022,\n\004cors\030\014 \003(\0132\036.google.storage.v2.Buck"
+          + "et.Cors\0224\n\013update_time\030\r \001(\0132\032.google.pr"
+          + "otobuf.TimestampB\003\340A\003\022 \n\030default_event_b"
+          + "ased_hold\030\016 \001(\010\0225\n\006labels\030\017 \003(\0132%.google"
+          + ".storage.v2.Bucket.LabelsEntry\0222\n\007websit"
+          + "e\030\020 \001(\0132!.google.storage.v2.Bucket.Websi"
+          + "te\0228\n\nversioning\030\021 \001(\0132$.google.storage."
+          + "v2.Bucket.Versioning\0222\n\007logging\030\022 \001(\0132!."
+          + "google.storage.v2.Bucket.Logging\022,\n\005owne"
+          + "r\030\023 \001(\0132\030.google.storage.v2.OwnerB\003\340A\003\0228"
+          + "\n\nencryption\030\024 \001(\0132$.google.storage.v2.B"
+          + "ucket.Encryption\0222\n\007billing\030\025 \001(\0132!.goog"
+          + "le.storage.v2.Bucket.Billing\022C\n\020retentio"
+          + "n_policy\030\026 \001(\0132).google.storage.v2.Bucke"
+          + "t.RetentionPolicy\0227\n\niam_config\030\027 \001(\0132#."
+          + "google.storage.v2.Bucket.IamConfig\022\025\n\rsa"
+          + "tisfies_pzs\030\031 \001(\010\022P\n\027custom_placement_co"
+          + "nfig\030\032 \001(\0132/.google.storage.v2.Bucket.Cu"
+          + "stomPlacementConfig\0226\n\tautoclass\030\034 \001(\0132#"
+          + ".google.storage.v2.Bucket.Autoclass\022T\n\026h"
+          + "ierarchical_namespace\030  \001(\0132/.google.sto"
+          + "rage.v2.Bucket.HierarchicalNamespaceB\003\340A"
+          + "\001\022K\n\022soft_delete_policy\030\037 \001(\0132*.google.s"
+          + "torage.v2.Bucket.SoftDeletePolicyB\003\340A\001\032!"
+          + "\n\007Billing\022\026\n\016requester_pays\030\001 \001(\010\032X\n\004Cor"
+          + "s\022\016\n\006origin\030\001 \003(\t\022\016\n\006method\030\002 \003(\t\022\027\n\017res"
+          + "ponse_header\030\003 \003(\t\022\027\n\017max_age_seconds\030\004 "
+          + "\001(\005\032M\n\nEncryption\022?\n\017default_kms_key\030\001 \001"
+          + "(\tB&\372A#\n!cloudkms.googleapis.com/CryptoK"
+          + "ey\032\354\001\n\tIamConfig\022a\n\033uniform_bucket_level"
+          + "_access\030\001 \001(\0132<.google.storage.v2.Bucket"
+          + ".IamConfig.UniformBucketLevelAccess\022 \n\030p"
+          + "ublic_access_prevention\030\003 \001(\t\032Z\n\030Uniform"
+          + "BucketLevelAccess\022\017\n\007enabled\030\001 \001(\010\022-\n\tlo"
+          + "ck_time\030\002 \001(\0132\032.google.protobuf.Timestam"
+          + "p\032\363\005\n\tLifecycle\0226\n\004rule\030\001 \003(\0132(.google.s"
+          + "torage.v2.Bucket.Lifecycle.Rule\032\255\005\n\004Rule"
+          + "\022?\n\006action\030\001 \001(\0132/.google.storage.v2.Buc"
+          + "ket.Lifecycle.Rule.Action\022E\n\tcondition\030\002"
+          + " \001(\01322.google.storage.v2.Bucket.Lifecycl"
+          + "e.Rule.Condition\032-\n\006Action\022\014\n\004type\030\001 \001(\t"
+          + "\022\025\n\rstorage_class\030\002 \001(\t\032\355\003\n\tCondition\022\025\n"
+          + "\010age_days\030\001 \001(\005H\000\210\001\001\022)\n\016created_before\030\002"
+          + " \001(\0132\021.google.type.Date\022\024\n\007is_live\030\003 \001(\010"
+          + "H\001\210\001\001\022\037\n\022num_newer_versions\030\004 \001(\005H\002\210\001\001\022\035"
+          + "\n\025matches_storage_class\030\005 \003(\t\022#\n\026days_si"
+          + "nce_custom_time\030\007 \001(\005H\003\210\001\001\022-\n\022custom_tim"
+          + "e_before\030\010 \001(\0132\021.google.type.Date\022\'\n\032day"
+          + "s_since_noncurrent_time\030\t \001(\005H\004\210\001\001\0221\n\026no"
+          + "ncurrent_time_before\030\n \001(\0132\021.google.type"
+          + ".Date\022\026\n\016matches_prefix\030\013 \003(\t\022\026\n\016matches"
+          + "_suffix\030\014 \003(\tB\013\n\t_age_daysB\n\n\010_is_liveB\025"
+          + "\n\023_num_newer_versionsB\031\n\027_days_since_cus"
+          + "tom_timeB\035\n\033_days_since_noncurrent_time\032"
+          + "8\n\007Logging\022\022\n\nlog_bucket\030\001 \001(\t\022\031\n\021log_ob"
+          + "ject_prefix\030\002 \001(\t\032\217\001\n\017RetentionPolicy\0222\n"
+          + "\016effective_time\030\001 \001(\0132\032.google.protobuf."
+          + "Timestamp\022\021\n\tis_locked\030\002 \001(\010\0225\n\022retentio"
+          + "n_duration\030\004 \001(\0132\031.google.protobuf.Durat"
+          + "ion\032\261\001\n\020SoftDeletePolicy\022:\n\022retention_du"
+          + "ration\030\001 \001(\0132\031.google.protobuf.DurationH"
+          + "\000\210\001\001\0227\n\016effective_time\030\002 \001(\0132\032.google.pr"
+          + "otobuf.TimestampH\001\210\001\001B\025\n\023_retention_dura"
+          + "tionB\021\n\017_effective_time\032\035\n\nVersioning\022\017\n"
+          + "\007enabled\030\001 \001(\010\032;\n\007Website\022\030\n\020main_page_s"
+          + "uffix\030\001 \001(\t\022\026\n\016not_found_page\030\002 \001(\t\032/\n\025C"
+          + "ustomPlacementConfig\022\026\n\016data_locations\030\001"
+          + " \003(\t\032\213\002\n\tAutoclass\022\017\n\007enabled\030\001 \001(\010\0224\n\013t"
+          + "oggle_time\030\002 \001(\0132\032.google.protobuf.Times"
+          + "tampB\003\340A\003\022#\n\026terminal_storage_class\030\003 \001("
+          + "\tH\000\210\001\001\022P\n\"terminal_storage_class_update_"
+          + "time\030\004 \001(\0132\032.google.protobuf.TimestampB\003"
+          + "\340A\003H\001\210\001\001B\031\n\027_terminal_storage_classB%\n#_"
+          + "terminal_storage_class_update_time\032-\n\025Hi"
+          + "erarchicalNamespace\022\024\n\007enabled\030\001 \001(\010B\003\340A"
+          + "\001\032-\n\013LabelsEntry\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002"
+          + " \001(\t:\0028\001:G\352AD\n\035storage.googleapis.com/Bu"
+          + "cket\022#projects/{project}/buckets/{bucket"
+          + "}\"\316\001\n\023BucketAccessControl\022\014\n\004role\030\001 \001(\t\022"
+          + "\n\n\002id\030\002 \001(\t\022\016\n\006entity\030\003 \001(\t\022\027\n\nentity_al"
+          + "t\030\t \001(\tB\003\340A\003\022\021\n\tentity_id\030\004 \001(\t\022\014\n\004etag\030"
+          + "\010 \001(\t\022\r\n\005email\030\005 \001(\t\022\016\n\006domain\030\006 \001(\t\0224\n\014"
+          + "project_team\030\007 \001(\0132\036.google.storage.v2.P"
+          + "rojectTeam\"I\n\017ChecksummedData\022\026\n\007content"
+          + "\030\001 \001(\014B\005\010\001\340A\001\022\023\n\006crc32c\030\002 \001(\007H\000\210\001\001B\t\n\007_c"
+          + "rc32c\"C\n\017ObjectChecksums\022\023\n\006crc32c\030\001 \001(\007"
+          + "H\000\210\001\001\022\020\n\010md5_hash\030\002 \001(\014B\t\n\007_crc32c\"\255\002\n\017H"
+          + "macKeyMetadata\022\017\n\002id\030\001 \001(\tB\003\340A\005\022\026\n\tacces"
+          + "s_id\030\002 \001(\tB\003\340A\005\022D\n\007project\030\003 \001(\tB3\340A\005\372A-",
+      "\n+cloudresourcemanager.googleapis.com/Pr"
+          + "oject\022\"\n\025service_account_email\030\004 \001(\tB\003\340A"
+          + "\003\022\r\n\005state\030\005 \001(\t\0224\n\013create_time\030\006 \001(\0132\032."
+          + "google.protobuf.TimestampB\003\340A\003\0224\n\013update"
+          + "_time\030\007 \001(\0132\032.google.protobuf.TimestampB"
+          + "\003\340A\003\022\014\n\004etag\030\010 \001(\t\"\247\003\n\022NotificationConfi"
+          + "g\022\021\n\004name\030\001 \001(\tB\003\340A\002\022\022\n\005topic\030\002 \001(\tB\003\340A\002"
+          + "\022\014\n\004etag\030\007 \001(\t\022\023\n\013event_types\030\003 \003(\t\022V\n\021c"
+          + "ustom_attributes\030\004 \003(\0132;.google.storage."
+          + "v2.NotificationConfig.CustomAttributesEn"
+          + "try\022\032\n\022object_name_prefix\030\005 \001(\t\022\033\n\016paylo"
+          + "ad_format\030\006 \001(\tB\003\340A\002\0327\n\025CustomAttributes"
+          + "Entry\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\t:\0028\001:}\352"
+          + "Az\n)storage.googleapis.com/NotificationC"
+          + "onfig\022Mprojects/{project}/buckets/{bucke"
+          + "t}/notificationConfigs/{notification_con"
+          + "fig}\"L\n\022CustomerEncryption\022\034\n\024encryption"
+          + "_algorithm\030\001 \001(\t\022\030\n\020key_sha256_bytes\030\003 \001"
+          + "(\014\"\254\n\n\006Object\022\021\n\004name\030\001 \001(\tB\003\340A\005\0225\n\006buck"
+          + "et\030\002 \001(\tB%\340A\005\372A\037\n\035storage.googleapis.com"
+          + "/Bucket\022\014\n\004etag\030\033 \001(\t\022\027\n\ngeneration\030\003 \001("
+          + "\003B\003\340A\005\022\033\n\016metageneration\030\004 \001(\003B\003\340A\003\022\025\n\rs"
+          + "torage_class\030\005 \001(\t\022\021\n\004size\030\006 \001(\003B\003\340A\003\022\030\n"
+          + "\020content_encoding\030\007 \001(\t\022\033\n\023content_dispo"
+          + "sition\030\010 \001(\t\022\025\n\rcache_control\030\t \001(\t\0223\n\003a"
+          + "cl\030\n \003(\0132&.google.storage.v2.ObjectAcces"
+          + "sControl\022\030\n\020content_language\030\013 \001(\t\0224\n\013de"
+          + "lete_time\030\014 \001(\0132\032.google.protobuf.Timest"
+          + "ampB\003\340A\003\022\024\n\014content_type\030\r \001(\t\0224\n\013create"
+          + "_time\030\016 \001(\0132\032.google.protobuf.TimestampB"
+          + "\003\340A\003\022\034\n\017component_count\030\017 \001(\005B\003\340A\003\022:\n\tch"
+          + "ecksums\030\020 \001(\0132\".google.storage.v2.Object"
+          + "ChecksumsB\003\340A\003\0224\n\013update_time\030\021 \001(\0132\032.go"
+          + "ogle.protobuf.TimestampB\003\340A\003\0227\n\007kms_key\030"
+          + "\022 \001(\tB&\372A#\n!cloudkms.googleapis.com/Cryp"
+          + "toKey\022B\n\031update_storage_class_time\030\023 \001(\013"
+          + "2\032.google.protobuf.TimestampB\003\340A\003\022\026\n\016tem"
+          + "porary_hold\030\024 \001(\010\0229\n\025retention_expire_ti"
+          + "me\030\025 \001(\0132\032.google.protobuf.Timestamp\0229\n\010"
+          + "metadata\030\026 \003(\0132\'.google.storage.v2.Objec"
+          + "t.MetadataEntry\022\035\n\020event_based_hold\030\027 \001("
+          + "\010H\000\210\001\001\022,\n\005owner\030\030 \001(\0132\030.google.storage.v"
+          + "2.OwnerB\003\340A\003\022B\n\023customer_encryption\030\031 \001("
+          + "\0132%.google.storage.v2.CustomerEncryption"
+          + "\022/\n\013custom_time\030\032 \001(\0132\032.google.protobuf."
+          + "Timestamp\022>\n\020soft_delete_time\030\034 \001(\0132\032.go"
+          + "ogle.protobuf.TimestampB\003\340A\003H\001\210\001\001\022>\n\020har"
+          + "d_delete_time\030\035 \001(\0132\032.google.protobuf.Ti"
+          + "mestampB\003\340A\003H\002\210\001\001\032/\n\rMetadataEntry\022\013\n\003ke"
+          + "y\030\001 \001(\t\022\r\n\005value\030\002 \001(\t:\0028\001B\023\n\021_event_bas"
+          + "ed_holdB\023\n\021_soft_delete_timeB\023\n\021_hard_de"
+          + "lete_time\"\316\001\n\023ObjectAccessControl\022\014\n\004rol"
+          + "e\030\001 \001(\t\022\n\n\002id\030\002 \001(\t\022\016\n\006entity\030\003 \001(\t\022\027\n\ne"
+          + "ntity_alt\030\t \001(\tB\003\340A\003\022\021\n\tentity_id\030\004 \001(\t\022"
+          + "\014\n\004etag\030\010 \001(\t\022\r\n\005email\030\005 \001(\t\022\016\n\006domain\030\006"
+          + " \001(\t\0224\n\014project_team\030\007 \001(\0132\036.google.stor"
+          + "age.v2.ProjectTeam\"l\n\023ListObjectsRespons"
+          + "e\022*\n\007objects\030\001 \003(\0132\031.google.storage.v2.O"
+          + "bject\022\020\n\010prefixes\030\002 \003(\t\022\027\n\017next_page_tok"
+          + "en\030\003 \001(\t\"3\n\013ProjectTeam\022\026\n\016project_numbe"
+          + "r\030\001 \001(\t\022\014\n\004team\030\002 \001(\t\"\'\n\016ServiceAccount\022"
+          + "\025\n\remail_address\030\001 \001(\t\"*\n\005Owner\022\016\n\006entit"
+          + "y\030\001 \001(\t\022\021\n\tentity_id\030\002 \001(\t\"C\n\014ContentRan"
+          + "ge\022\r\n\005start\030\001 \001(\003\022\013\n\003end\030\002 \001(\003\022\027\n\017comple"
+          + "te_length\030\003 \001(\0032\252\'\n\007Storage\022r\n\014DeleteBuc"
+          + "ket\022&.google.storage.v2.DeleteBucketRequ"
+          + "est\032\026.google.protobuf.Empty\"\"\332A\004name\212\323\344\223"
+          + "\002\025\022\023\n\004name\022\013{bucket=**}\022o\n\tGetBucket\022#.g"
+          + "oogle.storage.v2.GetBucketRequest\032\031.goog"
+          + "le.storage.v2.Bucket\"\"\332A\004name\212\323\344\223\002\025\022\023\n\004n"
+          + "ame\022\013{bucket=**}\022\253\001\n\014CreateBucket\022&.goog"
+          + "le.storage.v2.CreateBucketRequest\032\031.goog"
+          + "le.storage.v2.Bucket\"X\332A\027parent,bucket,b"
+          + "ucket_id\212\323\344\223\0028\022\026\n\006parent\022\014{project=**}\022\036"
+          + "\n\016bucket.project\022\014{project=**}\022\205\001\n\013ListB"
+          + "uckets\022%.google.storage.v2.ListBucketsRe"
+          + "quest\032&.google.storage.v2.ListBucketsRes"
+          + "ponse\"\'\332A\006parent\212\323\344\223\002\030\022\026\n\006parent\022\014{proje"
+          + "ct=**}\022\223\001\n\031LockBucketRetentionPolicy\0223.g"
+          + "oogle.storage.v2.LockBucketRetentionPoli"
+          + "cyRequest\032\031.google.storage.v2.Bucket\"&\332A"
+          + "\006bucket\212\323\344\223\002\027\022\025\n\006bucket\022\013{bucket=**}\022u\n\014"
+          + "GetIamPolicy\022\".google.iam.v1.GetIamPolic"
+          + "yRequest\032\025.google.iam.v1.Policy\"*\332A\010reso"
+          + "urce\212\323\344\223\002\031\022\027\n\010resource\022\013{bucket=**}\022|\n\014S"
+          + "etIamPolicy\022\".google.iam.v1.SetIamPolicy"
+          + "Request\032\025.google.iam.v1.Policy\"1\332A\017resou"
+          + "rce,policy\212\323\344\223\002\031\022\027\n\010resource\022\013{bucket=**"
+          + "}\022\327\001\n\022TestIamPermissions\022(.google.iam.v1"
+          + ".TestIamPermissionsRequest\032).google.iam."
+          + "v1.TestIamPermissionsResponse\"l\332A\024resour"
+          + "ce,permissions\212\323\344\223\002O\022\027\n\010resource\022\013{bucke"
+          + "t=**}\0224\n\010resource\022({bucket=projects/*/bu"
+          + "ckets/*}/objects/**\022\212\001\n\014UpdateBucket\022&.g"
+          + "oogle.storage.v2.UpdateBucketRequest\032\031.g"
+          + "oogle.storage.v2.Bucket\"7\332A\022bucket,updat"
+          + "e_mask\212\323\344\223\002\034\022\032\n\013bucket.name\022\013{bucket=**}"
+          + "\022\237\001\n\030DeleteNotificationConfig\0222.google.s"
+          + "torage.v2.DeleteNotificationConfigReques"
+          + "t\032\026.google.protobuf.Empty\"7\332A\004name\212\323\344\223\002*"
+          + "\022(\n\004name\022 {bucket=projects/*/buckets/*}/"
+          + "**\022\250\001\n\025GetNotificationConfig\022/.google.st"
+          + "orage.v2.GetNotificationConfigRequest\032%."
+          + "google.storage.v2.NotificationConfig\"7\332A"
+          + "\004name\212\323\344\223\002*\022(\n\004name\022 {bucket=projects/*/"
+          + "buckets/*}/**\022\261\001\n\030CreateNotificationConf"
+          + "ig\0222.google.storage.v2.CreateNotificatio"
+          + "nConfigRequest\032%.google.storage.v2.Notif"
+          + "icationConfig\":\332A\032parent,notification_co"
+          + "nfig\212\323\344\223\002\027\022\025\n\006parent\022\013{bucket=**}\022\250\001\n\027Li"
+          + "stNotificationConfigs\0221.google.storage.v"
+          + "2.ListNotificationConfigsRequest\0322.googl"
+          + "e.storage.v2.ListNotificationConfigsResp"
+          + "onse\"&\332A\006parent\212\323\344\223\002\027\022\025\n\006parent\022\013{bucket"
+          + "=**}\022~\n\rComposeObject\022\'.google.storage.v"
+          + "2.ComposeObjectRequest\032\031.google.storage."
+          + "v2.Object\")\212\323\344\223\002#\022!\n\022destination.bucket\022"
+          + "\013{bucket=**}\022\230\001\n\014DeleteObject\022&.google.s"
+          + "torage.v2.DeleteObjectRequest\032\026.google.p"
+          + "rotobuf.Empty\"H\332A\rbucket,object\332A\030bucket"
+          + ",object,generation\212\323\344\223\002\027\022\025\n\006bucket\022\013{buc"
+          + "ket=**}\022\215\001\n\rRestoreObject\022\'.google.stora"
+          + "ge.v2.RestoreObjectRequest\032\031.google.stor"
+          + "age.v2.Object\"8\332A\030bucket,object,generati"
+          + "on\212\323\344\223\002\027\022\025\n\006bucket\022\013{bucket=**}\022\272\001\n\024Canc"
+          + "elResumableWrite\022..google.storage.v2.Can"
+          + "celResumableWriteRequest\032/.google.storag"
+          + "e.v2.CancelResumableWriteResponse\"A\332A\tup"
+          + "load_id\212\323\344\223\002/\022-\n\tupload_id\022 {bucket=proj"
+          + "ects/*/buckets/*}/**\022\225\001\n\tGetObject\022#.goo"
+          + "gle.storage.v2.GetObjectRequest\032\031.google"
+          + ".storage.v2.Object\"H\332A\rbucket,object\332A\030b"
+          + "ucket,object,generation\212\323\344\223\002\027\022\025\n\006bucket\022"
+          + "\013{bucket=**}\022\245\001\n\nReadObject\022$.google.sto"
+          + "rage.v2.ReadObjectRequest\032%.google.stora"
+          + "ge.v2.ReadObjectResponse\"H\332A\rbucket,obje"
+          + "ct\332A\030bucket,object,generation\212\323\344\223\002\027\022\025\n\006b"
+          + "ucket\022\013{bucket=**}0\001\022\214\001\n\014UpdateObject\022&."
+          + "google.storage.v2.UpdateObjectRequest\032\031."
+          + "google.storage.v2.Object\"9\332A\022object,upda"
+          + "te_mask\212\323\344\223\002\036\022\034\n\robject.bucket\022\013{bucket="
+          + "**}\022`\n\013WriteObject\022%.google.storage.v2.W"
+          + "riteObjectRequest\032&.google.storage.v2.Wr"
+          + "iteObjectResponse\"\000(\001\022n\n\017BidiWriteObject"
+          + "\022).google.storage.v2.BidiWriteObjectRequ"
+          + "est\032*.google.storage.v2.BidiWriteObjectR"
+          + "esponse\"\000(\0010\001\022\204\001\n\013ListObjects\022%.google.s"
+          + "torage.v2.ListObjectsRequest\032&.google.st"
+          + "orage.v2.ListObjectsResponse\"&\332A\006parent\212"
+          + "\323\344\223\002\027\022\025\n\006parent\022\013{bucket=**}\022\230\001\n\rRewrite"
+          + "Object\022\'.google.storage.v2.RewriteObject"
+          + "Request\032\".google.storage.v2.RewriteRespo"
+          + "nse\":\212\323\344\223\0024\022\017\n\rsource_bucket\022!\n\022destinat"
+          + "ion_bucket\022\013{bucket=**}\022\256\001\n\023StartResumab"
+          + "leWrite\022-.google.storage.v2.StartResumab"
+          + "leWriteRequest\032..google.storage.v2.Start"
+          + "ResumableWriteResponse\"8\212\323\344\223\0022\0220\n!write_"
+          + "object_spec.resource.bucket\022\013{bucket=**}"
+          + "\022\256\001\n\020QueryWriteStatus\022*.google.storage.v"
+          + "2.QueryWriteStatusRequest\032+.google.stora"
+          + "ge.v2.QueryWriteStatusResponse\"A\332A\tuploa"
+          + "d_id\212\323\344\223\002/\022-\n\tupload_id\022 {bucket=project"
+          + "s/*/buckets/*}/**\022\200\001\n\021GetServiceAccount\022"
+          + "+.google.storage.v2.GetServiceAccountReq"
+          + "uest\032!.google.storage.v2.ServiceAccount\""
+          + "\033\332A\007project\212\323\344\223\002\013\022\t\n\007project\022\225\001\n\rCreateH"
+          + "macKey\022\'.google.storage.v2.CreateHmacKey"
+          + "Request\032(.google.storage.v2.CreateHmacKe"
+          + "yResponse\"1\332A\035project,service_account_em"
+          + "ail\212\323\344\223\002\013\022\t\n\007project\022w\n\rDeleteHmacKey\022\'."
+          + "google.storage.v2.DeleteHmacKeyRequest\032\026"
+          + ".google.protobuf.Empty\"%\332A\021access_id,pro"
+          + "ject\212\323\344\223\002\013\022\t\n\007project\022}\n\nGetHmacKey\022$.go"
+          + "ogle.storage.v2.GetHmacKeyRequest\032\".goog"
+          + "le.storage.v2.HmacKeyMetadata\"%\332A\021access"
+          + "_id,project\212\323\344\223\002\013\022\t\n\007project\022|\n\014ListHmac"
+          + "Keys\022&.google.storage.v2.ListHmacKeysReq"
+          + "uest\032\'.google.storage.v2.ListHmacKeysRes"
+          + "ponse\"\033\332A\007project\212\323\344\223\002\013\022\t\n\007project\022\235\001\n\rU"
+          + "pdateHmacKey\022\'.google.storage.v2.UpdateH"
+          + "macKeyRequest\032\".google.storage.v2.HmacKe"
+          + "yMetadata\"?\332A\024hmac_key,update_mask\212\323\344\223\002\""
+          + "\022 \n\020hmac_key.project\022\014{project=**}\032\247\002\312A\026"
+          + "storage.googleapis.com\322A\212\002https://www.go"
+          + "ogleapis.com/auth/cloud-platform,https:/"
+          + "/www.googleapis.com/auth/cloud-platform."
+          + "read-only,https://www.googleapis.com/aut"
+          + "h/devstorage.full_control,https://www.go"
+          + "ogleapis.com/auth/devstorage.read_only,h"
+          + "ttps://www.googleapis.com/auth/devstorag"
+          + "e.read_writeB\342\001\n\025com.google.storage.v2B\014"
+          + "StorageProtoP\001Z>cloud.google.com/go/stor"
+          + "age/internal/apiv2/storagepb;storagepb\352A"
+          + "x\n!cloudkms.googleapis.com/CryptoKey\022Spr"
+          + "ojects/{project}/locations/{location}/ke"
+          + "yRings/{key_ring}/cryptoKeys/{crypto_key"
+          + "}b\006proto3"
     };
     descriptor =
         com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(
@@ -1261,6 +1270,7 @@ public final class StorageProto {
               "LexicographicStart",
               "LexicographicEnd",
               "SoftDeleted",
+              "IncludeFoldersAsPrefixes",
               "MatchGlob",
             });
     internal_static_google_storage_v2_QueryWriteStatusRequest_descriptor =
@@ -1459,6 +1469,7 @@ public final class StorageProto {
               "SatisfiesPzs",
               "CustomPlacementConfig",
               "Autoclass",
+              "HierarchicalNamespace",
               "SoftDeletePolicy",
             });
     internal_static_google_storage_v2_Bucket_Billing_descriptor =
@@ -1599,8 +1610,16 @@ public final class StorageProto {
             new java.lang.String[] {
               "Enabled", "ToggleTime", "TerminalStorageClass", "TerminalStorageClassUpdateTime",
             });
-    internal_static_google_storage_v2_Bucket_LabelsEntry_descriptor =
+    internal_static_google_storage_v2_Bucket_HierarchicalNamespace_descriptor =
         internal_static_google_storage_v2_Bucket_descriptor.getNestedTypes().get(12);
+    internal_static_google_storage_v2_Bucket_HierarchicalNamespace_fieldAccessorTable =
+        new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+            internal_static_google_storage_v2_Bucket_HierarchicalNamespace_descriptor,
+            new java.lang.String[] {
+              "Enabled",
+            });
+    internal_static_google_storage_v2_Bucket_LabelsEntry_descriptor =
+        internal_static_google_storage_v2_Bucket_descriptor.getNestedTypes().get(13);
     internal_static_google_storage_v2_Bucket_LabelsEntry_fieldAccessorTable =
         new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
             internal_static_google_storage_v2_Bucket_LabelsEntry_descriptor,
diff --git a/proto-google-cloud-storage-v2/src/main/proto/google/storage/v2/storage.proto b/proto-google-cloud-storage-v2/src/main/proto/google/storage/v2/storage.proto
index a8516a58..62922ead 100644
--- a/proto-google-cloud-storage-v2/src/main/proto/google/storage/v2/storage.proto
+++ b/proto-google-cloud-storage-v2/src/main/proto/google/storage/v2/storage.proto
@@ -1248,6 +1248,11 @@ message ListObjectsRequest {
   // Soft delete policy is required to set this option.
   bool soft_deleted = 12 [(google.api.field_behavior) = OPTIONAL];
 
+  // Optional. If true, will also include folders and managed folders (besides
+  // objects) in the returned `prefixes`. Requires `delimiter` to be set to '/'.
+  bool include_folders_as_prefixes = 13
+      [(google.api.field_behavior) = OPTIONAL];
+
   // Optional. Filter results to objects and prefixes that match this glob
   // pattern. See [List Objects Using
   // Glob](https://cloud.google.com/storage/docs/json_api/v1/objects/list#list-objects-and-prefixes-using-glob)
@@ -1988,6 +1993,12 @@ message Bucket {
         [(google.api.field_behavior) = OUTPUT_ONLY];
   }
 
+  // Configuration for a bucket's hierarchical namespace feature.
+  message HierarchicalNamespace {
+    // Optional. Enables the hierarchical namespace feature.
+    bool enabled = 1 [(google.api.field_behavior) = OPTIONAL];
+  }
+
   // Immutable. The name of the bucket.
   // Format: `projects/{project}/buckets/{bucket}`
   string name = 1 [(google.api.field_behavior) = IMMUTABLE];
@@ -2136,6 +2147,12 @@ message Bucket {
   // Autoclass feature will be disabled and have no effect on the bucket.
   Autoclass autoclass = 28;
 
+  // Optional. The bucket's hierarchical namespace configuration. If there is no
+  // configuration, the hierarchical namespace feature will be disabled and have
+  // no effect on the bucket.
+  HierarchicalNamespace hierarchical_namespace = 32
+      [(google.api.field_behavior) = OPTIONAL];
+
   // Optional. The bucket's soft delete policy. The soft delete policy prevents
   // soft-deleted objects from being permanently deleted.
   SoftDeletePolicy soft_delete_policy = 31
diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml
index 4603242f..2f8aca59 100644
--- a/samples/install-without-bom/pom.xml
+++ b/samples/install-without-bom/pom.xml
@@ -61,7 +61,7 @@
     <dependency>
       <groupId>com.google.cloud</groupId>
       <artifactId>google-cloud-pubsub</artifactId>
-      <version>1.127.1</version>
+      <version>1.127.2</version>
       <scope>test</scope>
     </dependency>
   </dependencies>
diff --git a/samples/native-image-sample/pom.xml b/samples/native-image-sample/pom.xml
index db9dad2f..2f4f14a4 100644
--- a/samples/native-image-sample/pom.xml
+++ b/samples/native-image-sample/pom.xml
@@ -61,7 +61,7 @@
     <dependency>
       <groupId>com.google.cloud</groupId>
       <artifactId>google-cloud-pubsub</artifactId>
-      <version>1.127.1</version>
+      <version>1.127.2</version>
       <scope>test</scope>
     </dependency>
   </dependencies>
diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml
index d875f8e6..6211bd42 100644
--- a/samples/snapshot/pom.xml
+++ b/samples/snapshot/pom.xml
@@ -52,7 +52,7 @@
     <dependency>
       <groupId>com.google.cloud</groupId>
       <artifactId>google-cloud-pubsub</artifactId>
-      <version>1.127.1</version>
+      <version>1.127.2</version>
       <scope>test</scope>
     </dependency>
   </dependencies>
diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml
index da562bc0..b9c0b93c 100644
--- a/samples/snippets/pom.xml
+++ b/samples/snippets/pom.xml
@@ -72,7 +72,7 @@
     <dependency>
       <groupId>com.google.cloud</groupId>
       <artifactId>google-cloud-pubsub</artifactId>
-      <version>1.127.1</version>
+      <version>1.127.2</version>
       <scope>test</scope>
     </dependency>
   </dependencies>


Test patch:
diff --git a/gapic-google-cloud-storage-v2/src/test/java/com/google/storage/v2/StorageClientTest.java b/gapic-google-cloud-storage-v2/src/test/java/com/google/storage/v2/StorageClientTest.java
index 82a4c7b9..0e97f7bb 100644
--- a/gapic-google-cloud-storage-v2/src/test/java/com/google/storage/v2/StorageClientTest.java
+++ b/gapic-google-cloud-storage-v2/src/test/java/com/google/storage/v2/StorageClientTest.java
@@ -202,6 +202,7 @@ public class StorageClientTest {
             .setSatisfiesPzs(true)
             .setCustomPlacementConfig(Bucket.CustomPlacementConfig.newBuilder().build())
             .setAutoclass(Bucket.Autoclass.newBuilder().build())
+            .setHierarchicalNamespace(Bucket.HierarchicalNamespace.newBuilder().build())
             .setSoftDeletePolicy(Bucket.SoftDeletePolicy.newBuilder().build())
             .build();
     mockStorage.addResponse(expectedResponse);
@@ -268,6 +269,7 @@ public class StorageClientTest {
             .setSatisfiesPzs(true)
             .setCustomPlacementConfig(Bucket.CustomPlacementConfig.newBuilder().build())
             .setAutoclass(Bucket.Autoclass.newBuilder().build())
+            .setHierarchicalNamespace(Bucket.HierarchicalNamespace.newBuilder().build())
             .setSoftDeletePolicy(Bucket.SoftDeletePolicy.newBuilder().build())
             .build();
     mockStorage.addResponse(expectedResponse);
@@ -334,6 +336,7 @@ public class StorageClientTest {
             .setSatisfiesPzs(true)
             .setCustomPlacementConfig(Bucket.CustomPlacementConfig.newBuilder().build())
             .setAutoclass(Bucket.Autoclass.newBuilder().build())
+            .setHierarchicalNamespace(Bucket.HierarchicalNamespace.newBuilder().build())
             .setSoftDeletePolicy(Bucket.SoftDeletePolicy.newBuilder().build())
             .build();
     mockStorage.addResponse(expectedResponse);
@@ -406,6 +409,7 @@ public class StorageClientTest {
             .setSatisfiesPzs(true)
             .setCustomPlacementConfig(Bucket.CustomPlacementConfig.newBuilder().build())
             .setAutoclass(Bucket.Autoclass.newBuilder().build())
+            .setHierarchicalNamespace(Bucket.HierarchicalNamespace.newBuilder().build())
             .setSoftDeletePolicy(Bucket.SoftDeletePolicy.newBuilder().build())
             .build();
     mockStorage.addResponse(expectedResponse);
@@ -566,6 +570,7 @@ public class StorageClientTest {
             .setSatisfiesPzs(true)
             .setCustomPlacementConfig(Bucket.CustomPlacementConfig.newBuilder().build())
             .setAutoclass(Bucket.Autoclass.newBuilder().build())
+            .setHierarchicalNamespace(Bucket.HierarchicalNamespace.newBuilder().build())
             .setSoftDeletePolicy(Bucket.SoftDeletePolicy.newBuilder().build())
             .build();
     mockStorage.addResponse(expectedResponse);
@@ -633,6 +638,7 @@ public class StorageClientTest {
             .setSatisfiesPzs(true)
             .setCustomPlacementConfig(Bucket.CustomPlacementConfig.newBuilder().build())
             .setAutoclass(Bucket.Autoclass.newBuilder().build())
+            .setHierarchicalNamespace(Bucket.HierarchicalNamespace.newBuilder().build())
             .setSoftDeletePolicy(Bucket.SoftDeletePolicy.newBuilder().build())
             .build();
     mockStorage.addResponse(expectedResponse);
@@ -954,6 +960,7 @@ public class StorageClientTest {
             .setSatisfiesPzs(true)
             .setCustomPlacementConfig(Bucket.CustomPlacementConfig.newBuilder().build())
             .setAutoclass(Bucket.Autoclass.newBuilder().build())
+            .setHierarchicalNamespace(Bucket.HierarchicalNamespace.newBuilder().build())
             .setSoftDeletePolicy(Bucket.SoftDeletePolicy.newBuilder().build())
             .build();
     mockStorage.addResponse(expectedResponse);