diff --git a/DEPS b/DEPS
index 3cc140a..956d148 100644
--- a/DEPS
+++ b/DEPS
@@ -312,15 +312,15 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '20632e09f6a27734d5e2fd0cd92457d87594ea0f',
+  'skia_revision': '6284b4f09e144d9f013e8c9e6242348af8d0fc70',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': '802e662c39e653c682f3e29264fe9a351b3f1a52',
+  'v8_revision': 'd268c90baf4871e123b61189f9b468aefeb8b7dc',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': 'a0962979c75102037ab975eed8db7ab2c2df5dd3',
+  'angle_revision': 'cdf407db5680b68da4471c82ba8846120c0a4d38',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -380,7 +380,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling CrossBench
   # and whatever else without interference from each other.
-  'crossbench_revision': '73f466f9f655c3e34aebd4b2539da8067a22cea4',
+  'crossbench_revision': '466ceaf0ebe84300da5cb707a74ad72267c21ee5',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling CrossBench
   # and whatever else without interference from each other.
@@ -400,7 +400,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling devtools-frontend
   # and whatever else without interference from each other.
-  'devtools_frontend_revision': 'b907f0cd3b5b2c3c55139f5be34df4051c172dd4',
+  'devtools_frontend_revision': 'e6f7849cc9357708125314dc792656839d291b72',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libprotobuf-mutator
   # and whatever else without interference from each other.
@@ -424,7 +424,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': '3df91a3161f81b61458f1e84480c2ac2d46f5df9',
+  'dawn_revision': '925b6df540472621b191a13aa7ba5f6234c52aac',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -532,7 +532,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling llvm-libc
   # and whatever else without interference from each other.
-  'compiler_rt_revision': '57b9b63b69bbf48fef87a9950298af30d7b64089',
+  'compiler_rt_revision': '1f18c887f7f08c2126e40c5547c08dcb0a96d1a2',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling clusterfuzz-data
   # and whatever else without interference from each other.
@@ -1115,10 +1115,10 @@
     'condition': 'non_git_source',
     'objects': [
       {
-        'object_name': 'meet-gpu-tests/834178322.tar.gz',
-        'sha256sum': 'bb5c995982acfe02ff603bedbd8442bbc0d5c60c6e723f558f856bbf6fac496d',
-        'size_bytes': 228340606,
-        'generation': 1763544366033092,
+        'object_name': 'meet-gpu-tests/834650544.tar.gz',
+        'sha256sum': 'bf9f9371cb7b1d31a6407693a9e48a86a381fb3c6393edb724e0f5484dc52ade',
+        'size_bytes': 228339804,
+        'generation': 1763630851181650,
       },
     ],
   },
@@ -1206,7 +1206,7 @@
       'packages': [
           {
               'package': 'chromium/chrome/android/orderfiles/arm64',
-              'version': 'qXhVsUwh0atT5ulnLXHd1NkS6kQ9u9NJpzgXkWVliWUC',
+              'version': '0kPkO11jgyhvNP41dI9zor1N-wTbEiRYuCkm2JJ4wt4C',
           },
       ],
       'condition': 'checkout_android and non_git_source',
@@ -1228,7 +1228,7 @@
       'packages': [
           {
               'package': 'chromium/android_webview/tools/orderfiles/arm64',
-              'version': '3qMtn9BQdVv5t18V40MjZ-iqrjOByz3cd8rZJdf3smAC',
+              'version': 'AImNFffGceRy94SGlNx_L1nOYs7CZfB5KBVcJUJ0PfkC',
           },
       ],
       'condition': 'checkout_android and non_git_source',
@@ -1613,7 +1613,7 @@
     'packages': [
       {
         'package': 'chromium/chrome/test/data/variations/cipd',
-        'version': '3PbuO1KSDy2vvM2QzEYKz3VnfHSV2K3jSi8ZfGggkrgC',
+        'version': 'U6p5NVwnGltdefU6a0PtZ_D-My9DyaeLx3bXwysQLasC',
       },
     ],
     'dep_type': 'cipd',
@@ -1624,12 +1624,12 @@
 
   'src/clank': {
     'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' +
-    '19a00310460af8fc9faf6db9a2fafd2ef4973037',
+    'fc0d2159fce5fec82a40f0e7684a715427917675',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
   'src/docs/website': {
-    'url': Var('chromium_git') + '/website.git' + '@' + '53291bf0602ed24ddf60848c6dd4423e8d129617',
+    'url': Var('chromium_git') + '/website.git' + '@' + '77b138bace45efd371ab1096fb98e96c34f908ec',
   },
 
   'src/ios/third_party/earl_grey2/src': {
@@ -1795,7 +1795,7 @@
       'packages': [
           {
                'package': 'chromium/third_party/android_build_tools/error_prone',
-               'version': 'ieA7yjKAyUzNopKZdvYrhpF7XVHrBDGsykAbiu2h83QC',
+               'version': '2NlHzICEPBy3pqjkWdRLE6wDGcrEK9_wmgIEA2Ctbv8C',
           },
       ],
       'condition': 'checkout_android and non_git_source',
@@ -1828,7 +1828,7 @@
       'packages': [
           {
                'package': 'chromium/third_party/android_build_tools/manifest_merger',
-               'version': 'xFZBRBJvCExrX-o8kv2T3lKXvbkSNSRlA2YnJt6QBkoC',
+               'version': '9Q76MVF7U2PQFjILnWjChzF8wYySml3fZp6Y6qZFMFgC',
           },
       ],
       'condition': 'checkout_android and non_git_source',
@@ -2308,7 +2308,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/kotlin_stdlib',
-              'version': 'eDgQH6vcE7X7iRSrBGsa31HsvsrdPJgHFHcbL68QXvIC',
+              'version': '0Fhcz3wRL7L4BVYTPD_aTqk9h47CKdb-AGAJSvr91wIC',
           },
       ],
       'condition': 'checkout_android and non_git_source',
@@ -2610,7 +2610,7 @@
     Var('pdfium_git') + '/pdfium.git' + '@' +  Var('pdfium_revision'),
 
   'src/third_party/perfetto':
-    Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + 'f331a746b1e24517977664389f835b3eab1ed155',
+    Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + '849737ab5aefa224f0d889a4888f395be5c0b6c1',
 
   'src/base/tracing/test/data': {
     'bucket': 'perfetto',
@@ -2801,7 +2801,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/r8',
-              'version': 'Uc4rt_n8kBmr9cA6KpB3ZC0PhMXeXQQLzIPM6Z4cMnoC',
+              'version': 'a4fVqbIycCDqs1714SLRqxEdz6P-sH-z1QT_eeeF0PcC',
           },
       ],
       'condition': 'checkout_android and non_git_source',
@@ -2981,7 +2981,7 @@
     Var('chromium_git') + '/webpagereplay.git' + '@' + Var('webpagereplay_revision'),
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '9af1a88de4f9451e72d22544347898ab76fa41ae',
+    Var('webrtc_git') + '/src.git' + '@' + 'd167fe92969adbb8f5bbafe147c4ab9ebcf73e76',
 
   # Wuffs' canonical repository is at github.com/google/wuffs, but we use
   # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file.
@@ -3103,7 +3103,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/boca_receiver_app/app',
-        'version': 'qxTUe-j_3iOpb0wh2cyj4Pb0aKV_ZEtdBTuW9sD_Z-8C',
+        'version': '0w9jXAXlNCbj3ewlwiCjOcddARals7sVbXLNBu2Pg0AC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -3114,7 +3114,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/boca_app/app',
-        'version': 'mQDFEV2slIKNReznz7wb0vWFoRPXhtdxaSq8k4eDOHMC',
+        'version': 'RyhhbDT-s9t9TrqVFlUW2UHO02WhAkqze7NAzkrv8YQC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -3169,7 +3169,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/projector_app/app',
-        'version': 'AjGJJh0ooYJFQLxqy3XKX_yHsGcMbIhlB2D7FKQdyjsC',
+        'version': 'F9QCq-oM2dc-rhHEhPYTElXRmz3mzlv9XuyIQH4xaGwC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -3488,7 +3488,7 @@
 
   'src/chrome/browser/cpu_performance_internal': {
       'url': Var('chrome_git') + '/chrome/browser/cpu_performance_internal.git' + '@' +
-        '535741498d440ae5518159e23b523553e3279974',
+        'dfe1ccf3c2a93128082bb1d955517b4a6489ba62',
       'condition': 'checkout_src_internal',
   },
 
@@ -3536,7 +3536,7 @@
 
   'src/chrome/browser/platform_experience/win': {
       'url': Var('chrome_git') + '/chrome/browser/platform_experience/win.git' + '@' +
-        'b3f70835c7141cb7310203882c719b9e24ed6101',
+        '54c7a572a3d3ec6ced4ca7485131a7c8d6c32540',
       'condition': 'checkout_src_internal',
   },
 
@@ -3763,7 +3763,7 @@
 
   'src/ios_internal':  {
       'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' +
-        'bcbdb6b7cd2a73025b424a1e1735fe13e47fe5b1',
+        '342cef18f756b0a68d9a51ed4ef6c361285af830',
       'condition': 'checkout_ios and checkout_src_internal',
   },
 
diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn
index 8573399..d51d083 100644
--- a/android_webview/BUILD.gn
+++ b/android_webview/BUILD.gn
@@ -464,7 +464,6 @@
   android_library("browser_java") {
     sources = [
       "java/src/org/chromium/android_webview/AndroidProtocolHandler.java",
-      "java/src/org/chromium/android_webview/AppDefinedDomains.java",
       "java/src/org/chromium/android_webview/AwActionModeCallback.java",
       "java/src/org/chromium/android_webview/AwBackForwardCacheSettings.java",
       "java/src/org/chromium/android_webview/AwBrowserContext.java",
@@ -1211,7 +1210,6 @@
 generate_jni("browser_jni_headers") {
   sources = [
     "java/src/org/chromium/android_webview/AndroidProtocolHandler.java",
-    "java/src/org/chromium/android_webview/AppDefinedDomains.java",
     "java/src/org/chromium/android_webview/AwBackForwardCacheSettings.java",
     "java/src/org/chromium/android_webview/AwBrowserContext.java",
     "java/src/org/chromium/android_webview/AwBrowserContextStore.java",
diff --git a/android_webview/browser/BUILD.gn b/android_webview/browser/BUILD.gn
index 26c9fbc6..5c339e2 100644
--- a/android_webview/browser/BUILD.gn
+++ b/android_webview/browser/BUILD.gn
@@ -26,10 +26,6 @@
     "android_protocol_handler.cc",
     "android_protocol_handler.h",
     "aw_apk_type.h",
-    "aw_app_defined_websites.cc",
-    "aw_app_defined_websites.h",
-    "aw_asset_domain_list_include_handler.cc",
-    "aw_asset_domain_list_include_handler.h",
     "aw_back_forward_cache_settings.cc",
     "aw_back_forward_cache_settings.h",
     "aw_backforward_cache_not_restored_reason.h",
diff --git a/android_webview/browser/aw_app_defined_websites.cc b/android_webview/browser/aw_app_defined_websites.cc
deleted file mode 100644
index c49097e..0000000
--- a/android_webview/browser/aw_app_defined_websites.cc
+++ /dev/null
@@ -1,268 +0,0 @@
-// Copyright 2024 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "android_webview/browser/aw_app_defined_websites.h"
-
-#include <algorithm>
-#include <iterator>
-#include <memory>
-#include <vector>
-
-#include "android_webview/browser/aw_asset_domain_list_include_handler.h"
-#include "android_webview/common/aw_features.h"
-#include "base/android/jni_android.h"
-#include "base/android/jni_array.h"
-#include "base/android/jni_string.h"
-#include "base/android/scoped_java_ref.h"
-#include "base/barrier_callback.h"
-#include "base/callback_list.h"
-#include "base/check.h"
-#include "base/containers/flat_set.h"
-#include "base/functional/bind.h"
-#include "base/functional/callback_forward.h"
-#include "base/memory/ptr_util.h"
-#include "base/no_destructor.h"
-#include "base/sequence_checker.h"
-#include "base/task/thread_pool.h"
-#include "content/public/browser/browser_thread.h"
-#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
-
-// Must come after all headers that specialize FromJniType() / ToJniType().
-#include "android_webview/browser_jni_headers/AppDefinedDomains_jni.h"
-#include "services/network/public/cpp/shared_url_loader_factory.h"
-
-namespace android_webview {
-
-namespace {
-
-inline void RemoveDuplicates(std::vector<std::string>& string_vec) {
-  // Remove duplicates following the example on
-  // https://en.cppreference.com/w/cpp/algorithm/unique.
-  std::sort(string_vec.begin(), string_vec.end());
-  auto last_unique = std::unique(string_vec.begin(), string_vec.end());
-  string_vec.erase(last_unique, string_vec.end());
-}
-
-std::vector<std::string> GetAppDefinedDomainsFromManifest(
-    AppDefinedDomainCriteria criteria) {
-  JNIEnv* env = base::android::AttachCurrentThread();
-  base::android::ScopedJavaLocalRef<jobjectArray> jobject_domains;
-  switch (criteria) {
-    case AppDefinedDomainCriteria::kNone: {
-      return {};
-    }
-    case AppDefinedDomainCriteria::kAndroidAssetStatements: {
-      jobject_domains =
-          Java_AppDefinedDomains_getDomainsFromAssetStatements(env);
-      break;
-    }
-    case AppDefinedDomainCriteria::kAndroidVerifiedAppLinks: {
-      jobject_domains =
-          Java_AppDefinedDomains_getVerifiedDomainsFromAppLinks(env);
-      break;
-    }
-    case AppDefinedDomainCriteria::kAndroidWebLinks: {
-      jobject_domains = Java_AppDefinedDomains_getDomainsFromWebLinks(env);
-      break;
-    }
-    case AppDefinedDomainCriteria::kAndroidAssetStatementsAndWebLinks: {
-      jobject_domains =
-          Java_AppDefinedDomains_getDomainsFromAssetStatementsAndWebLinks(env);
-      break;
-    }
-    default: {
-      return {};
-    }
-  }
-  std::vector<std::string> domains;
-  base::android::AppendJavaStringArrayToStringVector(env, jobject_domains,
-                                                     &domains);
-  RemoveDuplicates(domains);
-  return domains;
-}
-
-std::vector<std::string> GetAppDefinedIncludeLInksFromManifest() {
-  JNIEnv* env = base::android::AttachCurrentThread();
-  base::android::ScopedJavaLocalRef<jobjectArray> jobject_links =
-      Java_AppDefinedDomains_getIncludeLinksFromAssetStatements(env);
-  std::vector<std::string> links;
-  base::android::AppendJavaStringArrayToStringVector(env, jobject_links,
-                                                     &links);
-  RemoveDuplicates(links);
-  return links;
-}
-}  // namespace
-
-// static
-AppDefinedWebsites* AppDefinedWebsites::GetInstance() {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  static base::NoDestructor<AppDefinedWebsites> instance(
-      base::BindRepeating(&GetAppDefinedDomainsFromManifest),
-      base::BindRepeating(&GetAppDefinedIncludeLInksFromManifest));
-  return instance.get();
-}
-
-AppDefinedWebsites::AppDefinedWebsites(
-    AppDomainProvider provider,
-    IncludeLinkProvider include_link_provider)
-    : provider_(std::move(provider)),
-      include_link_provider_(std::move(include_link_provider)) {}
-AppDefinedWebsites::~AppDefinedWebsites() = default;
-
-void AppDefinedWebsites::GetAppDefinedDomains(AppDefinedDomainCriteria criteria,
-                                              AppDomainCallback callback) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  auto find_it = domains_cache_.find(criteria);
-  if (find_it != domains_cache_.end()) {
-    std::move(callback).Run(*find_it->second);
-    return;
-  }
-
-  AppDomainCallbackList& callback_list = GetCallbackList(criteria);
-  bool ongoing_request = !callback_list.empty();
-  callback_list.AddUnsafe(std::move(callback));
-  if (ongoing_request) {
-    return;
-  }
-
-  base::ThreadPool::PostTaskAndReplyWithResult(
-      FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT},
-      base::BindOnce(provider_, criteria),
-      base::BindOnce(&AppDefinedWebsites::DomainsReturnedFromManifest,
-                     weak_ptr_factory_.GetWeakPtr(), criteria));
-}
-
-void AppDefinedWebsites::GetAssetStatmentsWithIncludes(
-    std::unique_ptr<AssetDomainListIncludeHandler> domain_list_loader,
-    AppDomainSetCallback callback) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (asset_statements_with_includes_) {
-    std::move(callback).Run(*asset_statements_with_includes_);
-    return;
-  }
-
-  bool is_loading = !asset_statements_with_includes_callbacks_.empty();
-  asset_statements_with_includes_callbacks_.AddUnsafe(std::move(callback));
-
-  if (is_loading) {
-    return;
-  }
-
-  base::ThreadPool::PostTaskAndReplyWithResult(
-      FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT},
-      base::BindOnce(include_link_provider_),
-      base::BindOnce(&AppDefinedWebsites::AssetIncludeStatementsReturned,
-                     weak_ptr_factory_.GetWeakPtr(),
-                     std::move(domain_list_loader)));
-}
-
-void AppDefinedWebsites::AppDeclaresDomainInAssetStatements(
-    std::unique_ptr<AssetDomainListIncludeHandler> domain_list_loader,
-    const url::Origin& origin,
-    base::OnceCallback<void(bool)> callback) {
-  AppDomainCallback callback_wrapper = base::BindOnce(
-      [](const url::Origin origin,
-         base::OnceCallback<void(bool)> defined_callback,
-         const std::vector<std::string>& domains) {
-        bool is_defined = std::find_if(domains.begin(), domains.end(),
-                                       [&origin](const std::string& domain) {
-                                         return origin.DomainIs(domain);
-                                       }) != domains.end();
-        std::move(defined_callback).Run(is_defined);
-      },
-      origin, std::move(callback));
-  if (base::FeatureList::IsEnabled(
-          features::kWebViewDigitalAssetLinksLoadIncludes)) {
-    GetAssetStatmentsWithIncludes(std::move(domain_list_loader),
-                                  std::move(callback_wrapper));
-  } else {
-    GetAppDefinedDomains(AppDefinedDomainCriteria::kAndroidAssetStatements,
-                         std::move(callback_wrapper));
-  }
-}
-
-namespace {
-// Wrap in a callback that takes a const ref and simply makes a copy.
-inline AppDefinedWebsites::AppDomainCallback AsAppDomainCallback(
-    base::OnceCallback<void(std::vector<std::string>)> callback) {
-  return base::BindOnce(
-      [](base::OnceCallback<void(std::vector<std::string>)> callback,
-         const std::vector<std::string>& data_ref) {
-        std::move(callback).Run(data_ref);
-      },
-      std::move(callback));
-}
-}  // namespace
-
-void AppDefinedWebsites::AssetIncludeStatementsReturned(
-    std::unique_ptr<AssetDomainListIncludeHandler> domain_list_loader,
-    std::vector<std::string> include_urls) {
-  // The barrier callback should be called once to load domains directly from
-  // the manifest, and once per include_url.
-  int call_count = 1 + include_urls.size();
-
-  // Grab a direct pointer to call methods on the loader, then move it
-  // into the barrier callback to keep it alive until all assets have been
-  // loaded.
-  AssetDomainListIncludeHandler* raw_loader = domain_list_loader.get();
-  base::RepeatingCallback<void(std::vector<std::string>)> barrier_callback =
-      base::BarrierCallback<std::vector<std::string>>(
-          call_count,
-          base::BindOnce(
-              &AppDefinedWebsites::OnAssetStatementsWithIncludesLoaded,
-              weak_ptr_factory_.GetWeakPtr(), std::move(domain_list_loader)));
-
-  GetAppDefinedDomains(AppDefinedDomainCriteria::kAndroidAssetStatements,
-                       AsAppDomainCallback(barrier_callback));
-
-  for (const std::string& include_url : include_urls) {
-    raw_loader->LoadAppDefinedDomainIncludes(
-        GURL(include_url), AsAppDomainCallback(barrier_callback));
-  }
-}
-
-AppDefinedWebsites::AppDomainCallbackList& AppDefinedWebsites::GetCallbackList(
-    AppDefinedDomainCriteria criteria) {
-  auto callback_list_it = on_domains_returned_callbacks_.find(criteria);
-  if (callback_list_it == on_domains_returned_callbacks_.end() ||
-      !callback_list_it->second) {
-    callback_list_it =
-        on_domains_returned_callbacks_
-            .insert_or_assign(criteria,
-                              std::make_unique<AppDomainCallbackList>())
-            .first;
-  }
-  return *callback_list_it->second;
-}
-
-void AppDefinedWebsites::DomainsReturnedFromManifest(
-    AppDefinedDomainCriteria criteria,
-    const std::vector<std::string>& data) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  domains_cache_[criteria] = std::make_unique<std::vector<std::string>>(data);
-
-  AppDomainCallbackList& callback_list = GetCallbackList(criteria);
-  callback_list.Notify(*domains_cache_[criteria]);
-  DCHECK(callback_list.empty());
-}
-
-void AppDefinedWebsites::OnAssetStatementsWithIncludesLoaded(
-    std::unique_ptr<AssetDomainListIncludeHandler> domain_list_handler,
-    std::vector<std::vector<std::string>> all_domains) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  asset_statements_with_includes_ =
-      std::make_unique<std::vector<std::string>>();
-  for (std::vector<std::string>& domain_list : all_domains) {
-    asset_statements_with_includes_->insert(
-        asset_statements_with_includes_->end(),
-        std::make_move_iterator(domain_list.begin()),
-        std::make_move_iterator(domain_list.end()));
-  }
-  RemoveDuplicates(*asset_statements_with_includes_);
-  asset_statements_with_includes_callbacks_.Notify(
-      *asset_statements_with_includes_);
-  DCHECK(asset_statements_with_includes_callbacks_.empty());
-}
-
-}  // namespace android_webview
diff --git a/android_webview/browser/aw_app_defined_websites.h b/android_webview/browser/aw_app_defined_websites.h
deleted file mode 100644
index 7808eb1..0000000
--- a/android_webview/browser/aw_app_defined_websites.h
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright 2024 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ANDROID_WEBVIEW_BROWSER_AW_APP_DEFINED_WEBSITES_H_
-#define ANDROID_WEBVIEW_BROWSER_AW_APP_DEFINED_WEBSITES_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "android_webview/browser/aw_asset_domain_list_include_handler.h"
-#include "base/callback_list.h"
-#include "base/functional/callback.h"
-#include "base/functional/callback_forward.h"
-#include "base/memory/scoped_refptr.h"
-#include "base/memory/weak_ptr.h"
-#include "base/no_destructor.h"
-#include "base/sequence_checker.h"
-#include "services/network/public/cpp/shared_url_loader_factory.h"
-#include "url/origin.h"
-
-namespace android_webview {
-
-// Used to determine which sources to retrieve related websites from.
-enum class AppDefinedDomainCriteria {
-  // Return nothing.
-  kNone = 0,
-  // Return domains defined in the `asset_statements` meta-data tag in the
-  // app's manifest.
-  kAndroidAssetStatements = 1,
-  // For API >= 31, return domains defined in Android App Links and verified
-  // by DomainVerificationManager.
-  // For API < 31, return nothing.
-  kAndroidVerifiedAppLinks = 2,
-  // For API >= 31, return domains defined in Web Links (including Android
-  // App Links).
-  // For API < 31, return nothing.
-  kAndroidWebLinks = 3,
-  // Union of kAndroidAssetStatements, kAndroidVerifiedAppLinks and
-  // kAndroidVerifiedAppLinks.
-  kAndroidAssetStatementsAndWebLinks = 4,
-};
-
-// AppDefinedWebsites provides access to domain lists defined in the embedding
-// app's manifest file. As the domain lists are static, they will be cached for
-// future access once they have been loaded once.
-// This class should only be accessed on the UI thread.
-class AppDefinedWebsites {
- public:
-  using AppDomainCallbackFunctionType = void(const std::vector<std::string>&);
-  using AppDomainCallback = base::OnceCallback<AppDomainCallbackFunctionType>;
-  using AppDomainSetCallback =
-      base::OnceCallback<void(const std::vector<std::string>&)>;
-
-  // Get the global instance of AppDefinedWebsites.
-  // May only be called on the UI thread.
-  static AppDefinedWebsites* GetInstance();
-
-  // Get the specified list of domains from the app manifest.
-  // The list will be fetched on a background thread if it is not already
-  // cached. The `callback` will be executed on the calling sequence.
-  void GetAppDefinedDomains(AppDefinedDomainCriteria criteria,
-                            AppDomainCallback callback);
-
-  // Get the list of Android Asset Statement domains, including any domains
-  // refenced through "include" statements.
-  // This method may cause network requests if there are any include statements
-  // in the asset list and they have not been loaded yet.
-  // The `domain_list_loader` will be used to load included references from the
-  // network. The `callback` is executed on the calling sequence.
-  void GetAssetStatmentsWithIncludes(
-      std::unique_ptr<AssetDomainListIncludeHandler> domain_list_loader,
-      AppDomainSetCallback callback);
-
-  // Check if the provided `origin` is defined by the app's asset statement
-  // domains. This method may cause network requests if there are any include
-  // statements in the asset list and they have not been loaded yet. The
-  // `domain_list_loader` will be used to load included references from the
-  // network. The `callback` is executed on the calling sequence.
-  void AppDeclaresDomainInAssetStatements(
-      std::unique_ptr<AssetDomainListIncludeHandler> domain_list_loader,
-      const url::Origin& origin,
-      base::OnceCallback<void(bool)> callback);
-
- private:
-  friend class base::NoDestructor<AppDefinedWebsites>;
-  friend class AppDefinedWebsitesTest;
-
-  using AppDomainProvider = base::RepeatingCallback<std::vector<std::string>(
-      AppDefinedDomainCriteria)>;
-  using IncludeLinkProvider =
-      base::RepeatingCallback<std::vector<std::string>()>;
-  using AppDomainCallbackList =
-      base::OnceCallbackList<AppDomainCallbackFunctionType>;
-
-  AppDefinedWebsites(AppDomainProvider provider,
-                     IncludeLinkProvider include_link_provider);
-  ~AppDefinedWebsites();
-
-  AppDomainCallbackList& GetCallbackList(AppDefinedDomainCriteria criteria);
-
-  void DomainsReturnedFromManifest(AppDefinedDomainCriteria criteria,
-                                   const std::vector<std::string>& data);
-
-  void AssetIncludeStatementsReturned(
-      std::unique_ptr<AssetDomainListIncludeHandler> domain_list_loader,
-      std::vector<std::string> data);
-
-  void OnAssetStatementsWithIncludesLoaded(
-      std::unique_ptr<AssetDomainListIncludeHandler> domain_list_handler,
-      std::vector<std::vector<std::string>> all_domains);
-
-  SEQUENCE_CHECKER(sequence_checker_);
-  AppDomainProvider provider_;
-  IncludeLinkProvider include_link_provider_;
-  // Cache of already-fetched domains. A nullptr value means the domains have
-  // not been fetched yet.
-  base::flat_map<AppDefinedDomainCriteria,
-                 std::unique_ptr<std::vector<std::string>>>
-      domains_cache_;
-
-  // Lists of callbacks that wait for a particular criteria to be fetched.
-  // Using OnceCallbackList to handle multiple concurrent calls waiting.
-  base::flat_map<AppDefinedDomainCriteria,
-                 std::unique_ptr<AppDomainCallbackList>>
-      on_domains_returned_callbacks_;
-
-  std::unique_ptr<std::vector<std::string>> asset_statements_with_includes_;
-  AppDomainCallbackList asset_statements_with_includes_callbacks_;
-
-  base::WeakPtrFactory<AppDefinedWebsites> weak_ptr_factory_{this};
-};
-
-}  // namespace android_webview
-
-#endif  // ANDROID_WEBVIEW_BROWSER_AW_APP_DEFINED_WEBSITES_H_
diff --git a/android_webview/browser/aw_app_defined_websites_unittest.cc b/android_webview/browser/aw_app_defined_websites_unittest.cc
deleted file mode 100644
index af3ad6da..0000000
--- a/android_webview/browser/aw_app_defined_websites_unittest.cc
+++ /dev/null
@@ -1,512 +0,0 @@
-// Copyright 2024 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "android_webview/browser/aw_app_defined_websites.h"
-
-#include <memory>
-
-#include "android_webview/browser/aw_asset_domain_list_include_handler.h"
-#include "android_webview/common/aw_features.h"
-#include "base/barrier_closure.h"
-#include "base/functional/bind.h"
-#include "base/functional/callback_forward.h"
-#include "base/logging.h"
-#include "base/memory/ptr_util.h"
-#include "base/run_loop.h"
-#include "base/test/bind.h"
-#include "base/test/scoped_feature_list.h"
-#include "base/test/task_environment.h"
-#include "base/test/test_waitable_event.h"
-#include "base/threading/thread_restrictions.h"
-#include "net/http/http_status_code.h"
-#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
-#include "services/network/test/test_url_loader_factory.h"
-#include "testing/gmock/include/gmock/gmock-matchers.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace android_webview {
-
-class AppDefinedWebsitesTest : public testing::Test {
- public:
-  AppDefinedWebsitesTest()
-      : unit_under_test_(AppDefinedWebsites(
-            base::BindRepeating(&AppDefinedWebsitesTest::DomainProvider,
-                                base::Unretained(this)),
-            base::BindRepeating(
-                &AppDefinedWebsitesTest::AppIncludeLinksProvider,
-                base::Unretained(this)))) {}
-
-  AppDefinedWebsitesTest(const AppDefinedWebsitesTest&) = delete;
-  AppDefinedWebsitesTest& operator=(const AppDefinedWebsitesTest&) = delete;
-  ~AppDefinedWebsitesTest() override = default;
-
-  void GetAppDefinedDomains(AppDefinedDomainCriteria criteria,
-                            AppDefinedWebsites::AppDomainCallback callback) {
-    unit_under_test_.GetAppDefinedDomains(criteria, std::move(callback));
-  }
-
-  // Call GetAppDefinedDomains and block until the `callback` has been executed.
-  void GetAppDefinedDomainsSync(
-      AppDefinedDomainCriteria criteria,
-      AppDefinedWebsites::AppDomainCallback callback) {
-    base::RunLoop runloop;
-    GetAppDefinedDomains(
-        criteria, base::BindOnce(
-                      [](base::OnceClosure runloop_callback,
-                         AppDefinedWebsites::AppDomainCallback result_callback,
-                         const std::vector<std::string>& domains) {
-                        std::move(result_callback).Run(domains);
-                        std::move(runloop_callback).Run();
-                      },
-                      runloop.QuitClosure(), std::move(callback)));
-    runloop.Run();
-  }
-
-  void SetProviderResult(AppDefinedDomainCriteria criteria,
-                         std::vector<std::string> results) {
-    provider_results_[criteria] = std::move(results);
-  }
-
-  void SetAppIncludeLinksResults(const std::vector<std::string>& results) {
-    app_include_links_results_ = results;
-  }
-
-  base::TestWaitableEvent* WaitForSignalBeforeProvidingDomains(
-      AppDefinedDomainCriteria criteria) {
-    if (!provider_waits_.contains(criteria)) {
-      provider_waits_[criteria] = std::make_unique<base::TestWaitableEvent>(
-          base::WaitableEvent::ResetPolicy::AUTOMATIC);
-    }
-    return provider_waits_[criteria].get();
-  }
-
-  int GetProviderCallCount(AppDefinedDomainCriteria criteria) {
-    return provider_call_counts_[criteria];
-  }
-
-  std::unique_ptr<AssetDomainListIncludeHandler> GetDomainListIncludeHandler() {
-    return std::make_unique<AssetDomainListIncludeHandler>(
-        test_url_loader_factory_.GetSafeWeakWrapper());
-  }
-
- protected:
-  std::vector<std::string> DomainProvider(AppDefinedDomainCriteria criteria) {
-    if (provider_waits_.contains(criteria)) {
-      provider_waits_[criteria]->Wait();
-    }
-    provider_call_counts_[criteria]++;
-    auto find_it = provider_results_.find(criteria);
-    if (find_it == provider_results_.end()) {
-      return {};
-    }
-    return find_it->second;
-  }
-
-  std::vector<std::string> AppIncludeLinksProvider() {
-    return app_include_links_results_;
-  }
-
-  base::test::TaskEnvironment task_environment_;
-
-  // These maps are access both from background threads and the main test
-  // thread. Test cases should not attempt to modify these while interacting
-  // with the unit under test.
-  base::flat_map<AppDefinedDomainCriteria, int> provider_call_counts_;
-  base::flat_map<AppDefinedDomainCriteria, std::vector<std::string>>
-      provider_results_;
-
-  std::vector<std::string> app_include_links_results_;
-
-  base::flat_map<AppDefinedDomainCriteria,
-                 std::unique_ptr<base::TestWaitableEvent>>
-      provider_waits_;
-
-  AppDefinedWebsites unit_under_test_;
-
-  network::TestURLLoaderFactory test_url_loader_factory_;
-};
-
-namespace {
-
-const char kOriginIncludeUrl[] = "https://example.com/includestatements.json";
-const char kOriginIncludeResponse[] =
-    ("["
-     "{\n"
-     "  \"relation\": [\"delegate_permission/common.handle_all_urls\"],\n"
-     "  \"target\": {\n"
-     "    \"namespace\": \"web\",\n"
-     "    \"site\": \"https://assetsite.example\"\n"
-     "  }\n"
-     "}\n"
-     "]");
-const char kOriginIncludeUrlDoesNotResolve[] =
-    "https://example.com/doesnotresolve";
-
-TEST_F(AppDefinedWebsitesTest, ProvidedDomainsAreReturned) {
-  // Since the test fixture is responsible for providing the results, this test
-  // is as much a validation test for the test fixture itself.
-  SetProviderResult(AppDefinedDomainCriteria::kAndroidAssetStatements,
-                    {"asset-statement.example"});
-  GetAppDefinedDomainsSync(
-      AppDefinedDomainCriteria::kAndroidAssetStatements,
-      base::BindOnce([](const std::vector<std::string>& domains) {
-        EXPECT_THAT(domains, testing::ElementsAre("asset-statement.example"));
-      }));
-
-  SetProviderResult(AppDefinedDomainCriteria::kAndroidVerifiedAppLinks,
-                    {"verified-app-link.example"});
-  GetAppDefinedDomainsSync(
-      AppDefinedDomainCriteria::kAndroidVerifiedAppLinks,
-      base::BindOnce([](const std::vector<std::string>& domains) {
-        EXPECT_THAT(domains, testing::ElementsAre("verified-app-link.example"));
-      }));
-
-  SetProviderResult(AppDefinedDomainCriteria::kAndroidWebLinks,
-                    {"android-web-link.example"});
-  GetAppDefinedDomainsSync(
-      AppDefinedDomainCriteria::kAndroidWebLinks,
-      base::BindOnce([](const std::vector<std::string>& domains) {
-        EXPECT_THAT(domains, testing::ElementsAre("android-web-link.example"));
-      }));
-
-  SetProviderResult(
-      AppDefinedDomainCriteria::kAndroidAssetStatementsAndWebLinks,
-      {"asset-statement.example", "android-web-link.example"});
-  GetAppDefinedDomainsSync(
-      AppDefinedDomainCriteria::kAndroidAssetStatementsAndWebLinks,
-      base::BindOnce([](const std::vector<std::string>& domains) {
-        EXPECT_THAT(domains, testing::ElementsAre("asset-statement.example",
-                                                  "android-web-link.example"));
-      }));
-}
-
-TEST_F(AppDefinedWebsitesTest, RepeatedCallsAreCached) {
-  SetProviderResult(AppDefinedDomainCriteria::kAndroidAssetStatements,
-                    {"asset-statement.example"});
-
-  GetAppDefinedDomainsSync(
-      AppDefinedDomainCriteria::kAndroidAssetStatements,
-      base::BindOnce([](const std::vector<std::string>& domains) {
-        EXPECT_THAT(domains, testing::ElementsAre("asset-statement.example"));
-      }));
-  // We expect the provider to have been called once.
-  EXPECT_EQ(1, GetProviderCallCount(
-                   AppDefinedDomainCriteria::kAndroidAssetStatements));
-
-  // Try to get the same list of domains a second time and observe that the
-  // provider is not called again.
-  GetAppDefinedDomainsSync(
-      AppDefinedDomainCriteria::kAndroidAssetStatements,
-      base::BindOnce([](const std::vector<std::string>& domains) {
-        EXPECT_THAT(domains, testing::ElementsAre("asset-statement.example"));
-      }));
-  EXPECT_EQ(1, GetProviderCallCount(
-                   AppDefinedDomainCriteria::kAndroidAssetStatements));
-}
-
-TEST_F(AppDefinedWebsitesTest, RacingCallsAreNotDuplicated) {
-  SetProviderResult(AppDefinedDomainCriteria::kAndroidAssetStatements,
-                    {"asset-statement.example"});
-  // Set up a runloop and a barrier that waits for both calls to have their
-  // callbacks invoked.
-  base::RunLoop runloop;
-  base::RepeatingClosure done_closure =
-      base::BarrierClosure(2, runloop.QuitClosure());
-  base::TestWaitableEvent* provider_trigger =
-      WaitForSignalBeforeProvidingDomains(
-          AppDefinedDomainCriteria::kAndroidAssetStatements);
-
-  // Call twice right after each other to get a race
-  GetAppDefinedDomains(
-      AppDefinedDomainCriteria::kAndroidAssetStatements,
-      base::BindOnce(
-          [](base::OnceClosure on_done,
-             const std::vector<std::string>& domains) {
-            EXPECT_THAT(domains,
-                        testing::ElementsAre("asset-statement.example"));
-            std::move(on_done).Run();
-          },
-          done_closure));
-  GetAppDefinedDomains(
-      AppDefinedDomainCriteria::kAndroidAssetStatements,
-      base::BindOnce(
-          [](base::OnceClosure on_done,
-             const std::vector<std::string>& domains) {
-            EXPECT_THAT(domains,
-                        testing::ElementsAre("asset-statement.example"));
-            std::move(on_done).Run();
-          },
-          done_closure));
-
-  // Allow the provider to run.
-  provider_trigger->Signal();
-
-  runloop.Run();
-  EXPECT_EQ(1, GetProviderCallCount(
-                   AppDefinedDomainCriteria::kAndroidAssetStatements));
-}
-
-TEST_F(AppDefinedWebsitesTest, CanLoadAssetStatementsWithIncludes) {
-  SetProviderResult(AppDefinedDomainCriteria::kAndroidAssetStatements,
-                    {"asset-statement.example"});
-
-  SetAppIncludeLinksResults({kOriginIncludeUrl});
-  test_url_loader_factory_.AddResponse(kOriginIncludeUrl,
-                                       kOriginIncludeResponse);
-  base::RunLoop runloop;
-  unit_under_test_.GetAssetStatmentsWithIncludes(
-      GetDomainListIncludeHandler(),
-      base::BindLambdaForTesting(
-          [&runloop](const std::vector<std::string>& domains) {
-            EXPECT_THAT(domains,
-                        testing::UnorderedElementsAre("asset-statement.example",
-                                                      "assetsite.example"));
-
-            runloop.Quit();
-          }));
-
-  runloop.Run();
-}
-
-TEST_F(AppDefinedWebsitesTest, CanLoadAssetStatementsWithEmptyIncludeList) {
-  SetProviderResult(AppDefinedDomainCriteria::kAndroidAssetStatements,
-                    {"asset-statement.example"});
-
-  SetAppIncludeLinksResults({});
-  base::RunLoop runloop;
-  unit_under_test_.GetAssetStatmentsWithIncludes(
-      GetDomainListIncludeHandler(),
-      base::BindLambdaForTesting([&runloop](
-                                     const std::vector<std::string>& domains) {
-        EXPECT_THAT(domains,
-                    testing::UnorderedElementsAre("asset-statement.example"));
-
-        runloop.Quit();
-      }));
-
-  runloop.Run();
-}
-
-TEST_F(AppDefinedWebsitesTest,
-       CanLoadAssetStatementsWithIncludes_oneUrlIsNotFound) {
-  SetProviderResult(AppDefinedDomainCriteria::kAndroidAssetStatements,
-                    {"asset-statement.example"});
-
-  SetAppIncludeLinksResults(
-      {kOriginIncludeUrl, kOriginIncludeUrlDoesNotResolve});
-  test_url_loader_factory_.AddResponse(kOriginIncludeUrl,
-                                       kOriginIncludeResponse);
-
-  test_url_loader_factory_.AddResponse(kOriginIncludeUrlDoesNotResolve, "",
-                                       net::HTTP_NOT_FOUND);
-
-  base::RunLoop runloop;
-  unit_under_test_.GetAssetStatmentsWithIncludes(
-      GetDomainListIncludeHandler(),
-      base::BindLambdaForTesting(
-          [&runloop](const std::vector<std::string>& domains) {
-            EXPECT_THAT(domains,
-                        testing::UnorderedElementsAre("asset-statement.example",
-                                                      "assetsite.example"));
-
-            runloop.Quit();
-          }));
-
-  runloop.Run();
-}
-
-TEST_F(AppDefinedWebsitesTest,
-       CanLoadAssetStatementsWithIncludes_oneUrlDoesNotResolve) {
-  SetProviderResult(AppDefinedDomainCriteria::kAndroidAssetStatements,
-                    {"asset-statement.example"});
-
-  SetAppIncludeLinksResults(
-      {kOriginIncludeUrl, kOriginIncludeUrlDoesNotResolve});
-  test_url_loader_factory_.AddResponse(kOriginIncludeUrl,
-                                       kOriginIncludeResponse);
-
-  // Set up a mock response that fails due to an invalid redirect for
-  // `kOriginIncludeUrlDoesNotResolve`.
-  auto head = network::mojom::URLResponseHead::New();
-  head->headers = base::MakeRefCounted<net::HttpResponseHeaders>(
-      net::HttpUtil::AssembleRawHeaders(""));
-  head->headers->GetMimeType(&head->mime_type);
-  network::URLLoaderCompletionStatus status(net::Error::ERR_INVALID_REDIRECT);
-  status.decoded_body_length = 0;
-  test_url_loader_factory_.AddResponse(GURL(kOriginIncludeUrlDoesNotResolve),
-                                       std::move(head), "", status);
-
-  base::RunLoop runloop;
-  unit_under_test_.GetAssetStatmentsWithIncludes(
-      GetDomainListIncludeHandler(),
-      base::BindLambdaForTesting(
-          [&runloop](const std::vector<std::string>& domains) {
-            EXPECT_THAT(domains,
-                        testing::UnorderedElementsAre("asset-statement.example",
-                                                      "assetsite.example"));
-
-            runloop.Quit();
-          }));
-
-  runloop.Run();
-}
-
-TEST_F(AppDefinedWebsitesTest, IsAppDefinedDomainWithoutIncludes) {
-  base::test::ScopedFeatureList feature_list_;
-  feature_list_.InitAndDisableFeature(
-      features::kWebViewDigitalAssetLinksLoadIncludes);
-
-  SetProviderResult(AppDefinedDomainCriteria::kAndroidAssetStatements,
-                    {"asset-statement.example"});
-  url::Origin top_level_origin =
-      url::Origin::Create(GURL("https://asset-statement.example"));
-  base::RunLoop runloop;
-  unit_under_test_.AppDeclaresDomainInAssetStatements(
-      GetDomainListIncludeHandler(), top_level_origin,
-      base::BindLambdaForTesting([&runloop](bool is_app_defined) {
-        EXPECT_TRUE(is_app_defined);
-        runloop.Quit();
-      }));
-
-  runloop.Run();
-}
-
-TEST_F(AppDefinedWebsitesTest,
-       IsAppDefinedDomainWithoutIncludes_emptyListIsNotAppDefined) {
-  base::test::ScopedFeatureList feature_list_;
-  feature_list_.InitAndDisableFeature(
-      features::kWebViewDigitalAssetLinksLoadIncludes);
-
-  SetProviderResult(AppDefinedDomainCriteria::kAndroidAssetStatements, {});
-  url::Origin top_level_origin =
-      url::Origin::Create(GURL("https://asset-statement.example"));
-  base::RunLoop runloop;
-  unit_under_test_.AppDeclaresDomainInAssetStatements(
-      GetDomainListIncludeHandler(), top_level_origin,
-      base::BindLambdaForTesting([&runloop](bool is_app_defined) {
-        EXPECT_FALSE(is_app_defined);
-        runloop.Quit();
-      }));
-
-  runloop.Run();
-}
-
-TEST_F(AppDefinedWebsitesTest,
-       IsAppDefinedDomainWithoutIncludes_otherDomainIsNotRelated) {
-  base::test::ScopedFeatureList feature_list_;
-  feature_list_.InitAndDisableFeature(
-      features::kWebViewDigitalAssetLinksLoadIncludes);
-
-  SetProviderResult(AppDefinedDomainCriteria::kAndroidAssetStatements,
-                    {"other.domain.example"});
-  url::Origin top_level_origin =
-      url::Origin::Create(GURL("https://asset-statement.example"));
-  base::RunLoop runloop;
-  unit_under_test_.AppDeclaresDomainInAssetStatements(
-      GetDomainListIncludeHandler(), top_level_origin,
-      base::BindLambdaForTesting([&runloop](bool is_app_defined) {
-        EXPECT_FALSE(is_app_defined);
-        runloop.Quit();
-      }));
-
-  runloop.Run();
-}
-
-TEST_F(AppDefinedWebsitesTest, IsAppDefinedDomainWithIncludes) {
-  base::test::ScopedFeatureList feature_list_;
-  feature_list_.InitAndEnableFeature(
-      features::kWebViewDigitalAssetLinksLoadIncludes);
-
-  SetProviderResult(AppDefinedDomainCriteria::kAndroidAssetStatements, {});
-  SetAppIncludeLinksResults({kOriginIncludeUrl});
-  test_url_loader_factory_.AddResponse(kOriginIncludeUrl,
-                                       kOriginIncludeResponse);
-
-  url::Origin top_level_origin =
-      url::Origin::Create(GURL("https://assetsite.example"));
-  base::RunLoop runloop;
-  unit_under_test_.AppDeclaresDomainInAssetStatements(
-      GetDomainListIncludeHandler(), top_level_origin,
-      base::BindLambdaForTesting([&runloop](bool is_app_defined) {
-        EXPECT_TRUE(is_app_defined);
-        runloop.Quit();
-      }));
-
-  runloop.Run();
-}
-
-TEST_F(AppDefinedWebsitesTest,
-       IsAppDefinedDomainWithIncludes_loadFromManifestDirectly) {
-  base::test::ScopedFeatureList feature_list_;
-  feature_list_.InitAndEnableFeature(
-      features::kWebViewDigitalAssetLinksLoadIncludes);
-
-  SetProviderResult(AppDefinedDomainCriteria::kAndroidAssetStatements,
-                    {"asset-statement.example"});
-  SetAppIncludeLinksResults({kOriginIncludeUrl});
-  test_url_loader_factory_.AddResponse(kOriginIncludeUrl,
-                                       kOriginIncludeResponse);
-
-  url::Origin top_level_origin =
-      url::Origin::Create(GURL("https://asset-statement.example"));
-  base::RunLoop runloop;
-  unit_under_test_.AppDeclaresDomainInAssetStatements(
-      GetDomainListIncludeHandler(), top_level_origin,
-      base::BindLambdaForTesting([&runloop](bool is_app_defined) {
-        EXPECT_TRUE(is_app_defined);
-        runloop.Quit();
-      }));
-
-  runloop.Run();
-}
-
-TEST_F(AppDefinedWebsitesTest,
-       IsAppDefinedDomainWithIncludes_emptyListIsNotAppDefined) {
-  base::test::ScopedFeatureList feature_list_;
-  feature_list_.InitAndEnableFeature(
-      features::kWebViewDigitalAssetLinksLoadIncludes);
-
-  SetProviderResult(AppDefinedDomainCriteria::kAndroidAssetStatements, {});
-  SetAppIncludeLinksResults({kOriginIncludeUrl});
-  test_url_loader_factory_.AddResponse(kOriginIncludeUrl, "");
-
-  url::Origin top_level_origin =
-      url::Origin::Create(GURL("https://assetsite.example"));
-  base::RunLoop runloop;
-  unit_under_test_.AppDeclaresDomainInAssetStatements(
-      GetDomainListIncludeHandler(), top_level_origin,
-      base::BindLambdaForTesting([&runloop](bool is_app_defined) {
-        EXPECT_FALSE(is_app_defined);
-        runloop.Quit();
-      }));
-
-  runloop.Run();
-}
-
-TEST_F(AppDefinedWebsitesTest,
-       IsAppDefinedDomainWithIncludes_otherDomainIsNotRelated) {
-  base::test::ScopedFeatureList feature_list_;
-  feature_list_.InitAndEnableFeature(
-      features::kWebViewDigitalAssetLinksLoadIncludes);
-
-  SetProviderResult(AppDefinedDomainCriteria::kAndroidAssetStatements, {});
-  SetAppIncludeLinksResults({kOriginIncludeUrl});
-  test_url_loader_factory_.AddResponse(kOriginIncludeUrl,
-                                       kOriginIncludeResponse);
-
-  url::Origin top_level_origin =
-      url::Origin::Create(GURL("https://unrelated.example"));
-  base::RunLoop runloop;
-  unit_under_test_.AppDeclaresDomainInAssetStatements(
-      GetDomainListIncludeHandler(), top_level_origin,
-      base::BindLambdaForTesting([&runloop](bool is_app_defined) {
-        EXPECT_FALSE(is_app_defined);
-        runloop.Quit();
-      }));
-
-  runloop.Run();
-}
-
-}  // namespace
-}  // namespace android_webview
diff --git a/android_webview/browser/aw_asset_domain_list_include_handler.cc b/android_webview/browser/aw_asset_domain_list_include_handler.cc
deleted file mode 100644
index d947219..0000000
--- a/android_webview/browser/aw_asset_domain_list_include_handler.cc
+++ /dev/null
@@ -1,232 +0,0 @@
-// Copyright 2024 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "android_webview/browser/aw_asset_domain_list_include_handler.h"
-
-#include <algorithm>
-#include <iterator>
-#include <vector>
-
-#include "base/functional/bind.h"
-#include "base/memory/scoped_refptr.h"
-#include "base/metrics/histogram_functions.h"
-#include "net/base/net_errors.h"
-#include "net/http/http_response_headers.h"
-#include "net/http/http_status_code.h"
-#include "services/network/public/cpp/is_potentially_trustworthy.h"
-#include "services/network/public/cpp/resource_request.h"
-#include "services/network/public/cpp/shared_url_loader_factory.h"
-#include "services/network/public/cpp/simple_url_loader.h"
-#include "services/network/public/mojom/url_response_head.mojom.h"
-
-namespace android_webview {
-
-namespace {
-const int kNumNetworkRetries = 1;
-
-constexpr net::NetworkTrafficAnnotationTag kTrafficAnnotation =
-    net::DefineNetworkTrafficAnnotation("digital_asset_links_include", R"(
-      semantics {
-        sender: "Digital Asset Links Include Resolver"
-        description:
-          "Digital Asset Links APIs allows any caller to check pre declared "
-          "relationships between two assets which can be either web domains "
-          "or native applications. These relationships can be defined "
-          "directly within an app's manifest or remotely and downloaded "
-          "via an 'include' statement. This request downloads the statements "
-          "from the specfied include and returns the web domains "
-          "specifically. Fetching these URLS requires no user data."
-        trigger:
-          "When an application needs to download the domains from an "
-          "'include' statement."
-        data: "None"
-        destination: WEBSITE
-        internal {
-          contacts {
-            owners: "//android_webview/OWNERS"
-          }
-        }
-        user_data {
-          type: NONE
-        }
-        last_reviewed: "2024-08-03"
-      }
-      policy {
-        cookies_allowed: NO
-        setting: "Not user controlled."
-        policy_exception_justification:
-          "Not implemented, considered not useful as no content is being "
-          "uploaded; this request merely downloads the resources on the web."
-      })");
-}  // namespace
-
-AssetDomainListIncludeHandler::AssetDomainListIncludeHandler(
-    scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory)
-    : url_loader_factory_(std::move(url_loader_factory)) {}
-
-AssetDomainListIncludeHandler::~AssetDomainListIncludeHandler() = default;
-
-void AssetDomainListIncludeHandler::LoadAppDefinedDomainIncludes(
-    const GURL& include_url,
-    AssetDomainListIncludeHandler::LoadCallback callback) {
-  if (!include_url.is_valid()) {
-    std::move(callback).Run({});
-    return;
-  }
-
-  std::unique_ptr<network::ResourceRequest> request =
-      std::make_unique<network::ResourceRequest>();
-  request->url = include_url;
-  // Exclude credentials (cookies and client certs) from the request.
-  request->credentials_mode =
-      network::mojom::CredentialsMode::kOmitBug_775438_Workaround;
-
-  std::unique_ptr<network::SimpleURLLoader> url_loader =
-      network::SimpleURLLoader::Create(std::move(request), kTrafficAnnotation);
-  url_loader->SetRetryOptions(
-      kNumNetworkRetries,
-      network::SimpleURLLoader::RetryMode::RETRY_ON_NETWORK_CHANGE);
-
-  // Get a raw pointer so we can move the unique_ptr into the callback and still
-  // call a method on the underlying object.
-  network::SimpleURLLoader* raw_url_loader = url_loader.get();
-
-  raw_url_loader->DownloadToStringOfUnboundedSizeUntilCrashAndDie(
-      url_loader_factory_.get(),
-      base::BindOnce(&AssetDomainListIncludeHandler::OnNetworkRequestComplete,
-                     weak_ptr_factory_.GetWeakPtr(), std::move(url_loader),
-                     std::move(callback)));
-}
-
-namespace {
-void LogNetworkLoadResult(bool success) {
-  base::UmaHistogramBoolean(
-      "Android.WebView.DigitalAssetLinks.AssetIncludes.NetworkLoadResult",
-      success);
-}
-}  // namespace
-
-void AssetDomainListIncludeHandler::OnNetworkRequestComplete(
-    std::unique_ptr<network::SimpleURLLoader> url_loader,
-    AssetDomainListIncludeHandler::LoadCallback callback,
-    std::unique_ptr<std::string> response_body) {
-  int net_error = url_loader->NetError();
-  if (net_error != net::OK) {
-    DLOG(WARNING) << "Digital Asset Links fetch from include connection failed "
-                     "with error "
-                  << net::ErrorToString(net_error);
-    LogNetworkLoadResult(false);
-    std::move(callback).Run({});
-    return;
-  }
-
-  int response_code = -1;
-  if (url_loader->ResponseInfo() && url_loader->ResponseInfo()->headers) {
-    response_code = url_loader->ResponseInfo()->headers->response_code();
-  }
-
-  if (!response_body || response_code != net::HTTP_OK) {
-    DLOG(WARNING)
-        << "Digital Asset Links include domain endpoint responded with code "
-        << response_code;
-    LogNetworkLoadResult(false);
-    std::move(callback).Run({});
-    return;
-  }
-  LogNetworkLoadResult(true);
-
-  // Log response size up to 1M bytes.
-  // Anything beyond that for a JSON list of small objects is a lot.
-  base::UmaHistogramCounts1M(
-      "Android.WebView.DigitalAssetLinks.AssetIncludes.FileSize",
-      response_body->size());
-
-  data_decoder::DataDecoder::ParseJsonIsolated(
-      *response_body,
-      base::BindOnce(&AssetDomainListIncludeHandler::OnJsonParseResult,
-                     weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
-}
-
-namespace {
-// Helper method to find the relevant `target->site` value in an asset link
-// include statement.
-const std::string* GetSiteFromWebRelationStatement(
-    const base::Value& statement) {
-  // Statements are expected to be on the form
-  //   {
-  //     "relation": ["delegate_permission/common.handle_all_urls"],
-  //     "target": {
-  //       "namespace": "web",
-  //       "site": "site_root_url"
-  //   }
-  const base::Value::Dict* statement_dict = statement.GetIfDict();
-  if (!statement_dict) {
-    return nullptr;
-  }
-  const base::Value::Dict* target = statement_dict->FindDict("target");
-  if (!target) {
-    return nullptr;
-  }
-
-  const std::string* ns = target->FindString("namespace");
-  if (!ns || *ns != "web") {
-    return nullptr;
-  }
-
-  return target->FindString("site");
-}
-
-void LogStatementListParseResult(bool success) {
-  base::UmaHistogramBoolean(
-      "Android.WebView.DigitalAssetLinks.AssetIncludes.ParseSuccess", success);
-}
-}  // namespace
-
-void AssetDomainListIncludeHandler::OnJsonParseResult(
-    AssetDomainListIncludeHandler::LoadCallback callback,
-    data_decoder::DataDecoder::ValueOrError result) {
-  base::UmaHistogramBoolean(
-      "Android.WebView.DigitalAssetLinks.AssetIncludes.ValidJson",
-      result.has_value());
-  if (!result.has_value()) {
-    DLOG(WARNING) << "Digital Asset Links fetch from include response "
-                     "parsing failed with message: " +
-                         result.error();
-    std::move(callback).Run({});
-    return;
-  }
-
-  base::Value::List* statement_list = result->GetIfList();
-  if (!statement_list) {
-    DLOG(WARNING) << "Statement List is not a list.";
-    LogStatementListParseResult(false);
-    std::move(callback).Run({});
-    return;
-  }
-
-  std::vector<std::string> domains;
-
-  for (const base::Value& statement : *statement_list) {
-    const std::string* domain = GetSiteFromWebRelationStatement(statement);
-    if (domain && !domain->empty()) {
-      GURL parsed_domain = GURL(*domain);
-      if (parsed_domain.is_valid() &&
-          network::IsUrlPotentiallyTrustworthy(parsed_domain) &&
-          !parsed_domain.GetHost().empty()) {
-        domains.push_back(parsed_domain.GetHost());
-      }
-    }
-  }
-
-  // Sort and remove duplicates
-  std::sort(domains.begin(), domains.end());
-  domains.erase(std::unique(domains.begin(), domains.end()), domains.end());
-
-  // If we didn't get at least a single domain then this was a big waste of
-  // time.
-  LogStatementListParseResult(!domains.empty());
-  std::move(callback).Run(domains);
-}
-
-}  // namespace android_webview
diff --git a/android_webview/browser/aw_asset_domain_list_include_handler.h b/android_webview/browser/aw_asset_domain_list_include_handler.h
deleted file mode 100644
index cdb0de7..0000000
--- a/android_webview/browser/aw_asset_domain_list_include_handler.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2024 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ANDROID_WEBVIEW_BROWSER_AW_ASSET_DOMAIN_LIST_INCLUDE_HANDLER_H_
-#define ANDROID_WEBVIEW_BROWSER_AW_ASSET_DOMAIN_LIST_INCLUDE_HANDLER_H_
-
-#include <memory>
-
-#include "base/memory/scoped_refptr.h"
-#include "base/memory/weak_ptr.h"
-#include "services/data_decoder/public/cpp/data_decoder.h"
-#include "services/network/public/cpp/shared_url_loader_factory.h"
-#include "services/network/public/cpp/simple_url_loader.h"
-#include "url/gurl.h"
-
-namespace android_webview {
-
-// Class to handle "include" links in app asset statements by fetching the
-// referenced file over the network and parsing the JSON structure.
-// See
-// https://developers.google.com/digital-asset-links/v1/statements#scaling-to-dozens-of-statements-or-more
-class AssetDomainListIncludeHandler {
- public:
-  using LoadCallback =
-      base::OnceCallback<void(const std::vector<std::string>&)>;
-
-  explicit AssetDomainListIncludeHandler(
-      scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory);
-  ~AssetDomainListIncludeHandler();
-
-  // Load the specified `include_url` and return the domain names found in "web"
-  // targets. The URL is assumed to point to a JSON file with the syntax
-  // described here:
-  // https://developers.google.com/digital-asset-links/v1/statements.
-  // This method will make a network call to fetch the file.
-  // The `callback` will be executed on the calling sequence.
-  void LoadAppDefinedDomainIncludes(const GURL& include_url,
-                                    LoadCallback callback);
-
- private:
-  // Callback for the network response.
-  void OnNetworkRequestComplete(
-      std::unique_ptr<network::SimpleURLLoader> url_loader,
-      LoadCallback callback,
-      std::unique_ptr<std::string> response_body);
-
-  // Callback for the parse result of the JSON file.
-  void OnJsonParseResult(LoadCallback callback,
-                         data_decoder::DataDecoder::ValueOrError result);
-
-  scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
-
-  base::WeakPtrFactory<AssetDomainListIncludeHandler> weak_ptr_factory_{this};
-};
-
-}  // namespace android_webview
-
-#endif  // ANDROID_WEBVIEW_BROWSER_AW_ASSET_DOMAIN_LIST_INCLUDE_HANDLER_H_
diff --git a/android_webview/browser/aw_asset_domain_list_include_handler_unittest.cc b/android_webview/browser/aw_asset_domain_list_include_handler_unittest.cc
deleted file mode 100644
index e24b0471..0000000
--- a/android_webview/browser/aw_asset_domain_list_include_handler_unittest.cc
+++ /dev/null
@@ -1,191 +0,0 @@
-// Copyright 2024 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "android_webview/browser/aw_asset_domain_list_include_handler.h"
-
-#include "android_webview/browser/aw_app_defined_websites.h"
-#include "base/functional/callback_forward.h"
-#include "base/test/bind.h"
-#include "base/test/task_environment.h"
-#include "services/network/public/cpp/shared_url_loader_factory.h"
-#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
-#include "services/network/test/test_url_loader_factory.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "url/gurl.h"
-
-namespace android_webview {
-namespace {
-
-const char kOriginIncludeUrl[] = "https://example.com/includestatements.json";
-
-const char kOriginIncludeResponse[] =
-    R"([
-     {
-       "relation": ["delegate_permission/common.handle_all_urls"],
-       "target": {
-         "namespace": "web",
-         "site": "https://example.com"
-       }
-     },
-     {
-       "relation": ["delegate_permission/common.handle_all_urls"],
-       "target": {
-         "namespace": "web",
-         "site": "https://assetsite.example"
-       }
-     }
-     ])";
-
-const char kOriginIncludeResponseWithDuplicate[] =
-    R"([
-     {
-       "relation": ["delegate_permission/common.handle_all_urls"],
-       "target": {
-         "namespace": "web",
-         "site": "https://example.com"
-       }
-     },
-     {
-       "relation": ["delegate_permission/common.handle_all_urls"],
-       "target": {
-         "namespace": "web",
-         "site": "https://example.com"
-       }
-     }
-     ])";
-
-// Valid schema response that also includes android_app targets (which is not
-// expected, but should be ignored).
-// The sha256 fingerprint is not valid. It has been shortened to respect line
-// width. It is only here as dummy data to be ignored.
-const char kMixedTargetTypeIncludeResponse[] =
-    R"([
-     {
-       "relation": ["delegate_permission/common.handle_all_urls"],
-       "target": {
-         "namespace": "android_app",
-         "package_name": "com.example.notarealapp",
-         "sha256_cert_fingerprints":
-           ["14:6D:E9:83:C5:73:06::04:96:B2:3F:CF:44:E5"]
-       }
-     },
-     {
-       "relation": ["delegate_permission/common.handle_all_urls"],
-       "target": {
-         "namespace": "web",
-         "site": "https://example.com"
-       }
-     }
-     ])";
-
-const char kMalformedIncludeResponse[] =
-    "This is just a string and not a JSON list of objects.";
-
-const char kOtherJsonObjectIncludeResponse[] = "{\"key\": \"value\"}";
-
-class AssetDomainListIncludeHandlerTest : public testing::Test {
- public:
-  AssetDomainListIncludeHandlerTest()
-      : unit_under_test_(test_url_loader_factory_.GetSafeWeakWrapper()) {}
-
-  void LoadDomainsBlocking(
-      GURL url,
-      AssetDomainListIncludeHandler::LoadCallback callback) {
-    base::RunLoop runloop;
-    unit_under_test_.LoadAppDefinedDomainIncludes(
-        url, base::BindOnce(
-                 [](base::OnceClosure done_closure,
-                    AssetDomainListIncludeHandler::LoadCallback callback,
-                    const std::vector<std::string>& origins) {
-                   std::move(callback).Run(origins);
-                   std::move(done_closure).Run();
-                 },
-                 runloop.QuitClosure(), std::move(callback)));
-    runloop.Run();
-  }
-
- protected:
-  base::test::TaskEnvironment task_environment_;
-  network::TestURLLoaderFactory test_url_loader_factory_;
-  AssetDomainListIncludeHandler unit_under_test_;
-};
-
-TEST_F(AssetDomainListIncludeHandlerTest, CanLoadDomainList) {
-  test_url_loader_factory_.AddResponse(kOriginIncludeUrl,
-                                       kOriginIncludeResponse);
-  LoadDomainsBlocking(
-      GURL(kOriginIncludeUrl),
-      base::BindOnce([](const std::vector<std::string>& origins) {
-        EXPECT_THAT(origins, testing::UnorderedElementsAre(
-                                 "example.com", "assetsite.example"));
-      }));
-}
-
-TEST_F(AssetDomainListIncludeHandlerTest, CanLoadDomainListWithDuplicates) {
-  test_url_loader_factory_.AddResponse(kOriginIncludeUrl,
-                                       kOriginIncludeResponseWithDuplicate);
-  LoadDomainsBlocking(
-      GURL(kOriginIncludeUrl),
-      base::BindOnce([](const std::vector<std::string>& origins) {
-        EXPECT_THAT(origins, testing::UnorderedElementsAre("example.com"));
-      }));
-}
-
-TEST_F(AssetDomainListIncludeHandlerTest, CanLoadDomainListWithIrrelevantData) {
-  test_url_loader_factory_.AddResponse(kOriginIncludeUrl,
-                                       kMixedTargetTypeIncludeResponse);
-  LoadDomainsBlocking(
-      GURL(kOriginIncludeUrl),
-      base::BindOnce([](const std::vector<std::string>& origins) {
-        EXPECT_THAT(origins, testing::ElementsAre("example.com"));
-      }));
-}
-
-TEST_F(AssetDomainListIncludeHandlerTest, GetsEmptyListIfInvalidAddress) {
-  auto head = network::mojom::URLResponseHead::New();
-  network::URLLoaderCompletionStatus status(net::Error::ERR_ADDRESS_INVALID);
-  test_url_loader_factory_.AddResponse(GURL(kOriginIncludeUrl), std::move(head),
-                                       "", status);
-
-  LoadDomainsBlocking(
-      GURL(kOriginIncludeUrl),
-      base::BindOnce([](const std::vector<std::string>& origins) {
-        EXPECT_THAT(origins, testing::IsEmpty());
-      }));
-}
-
-TEST_F(AssetDomainListIncludeHandlerTest, GetsEmptyListIfEmptyResponse) {
-  test_url_loader_factory_.AddResponse(kOriginIncludeUrl, "");
-
-  LoadDomainsBlocking(
-      GURL(kOriginIncludeUrl),
-      base::BindOnce([](const std::vector<std::string>& origins) {
-        EXPECT_THAT(origins, testing::IsEmpty());
-      }));
-}
-
-TEST_F(AssetDomainListIncludeHandlerTest, GetsEmptyListIfMalformedResponse) {
-  test_url_loader_factory_.AddResponse(kOriginIncludeUrl,
-                                       kMalformedIncludeResponse);
-
-  LoadDomainsBlocking(
-      GURL(kOriginIncludeUrl),
-      base::BindOnce([](const std::vector<std::string>& origins) {
-        EXPECT_THAT(origins, testing::IsEmpty());
-      }));
-}
-TEST_F(AssetDomainListIncludeHandlerTest, GetsEmptyListIfUnexpectedJSONSchema) {
-  test_url_loader_factory_.AddResponse(kOriginIncludeUrl,
-                                       kOtherJsonObjectIncludeResponse);
-
-  LoadDomainsBlocking(
-      GURL(kOriginIncludeUrl),
-      base::BindOnce([](const std::vector<std::string>& origins) {
-        EXPECT_THAT(origins, testing::IsEmpty());
-      }));
-}
-}  // namespace
-
-}  // namespace android_webview
diff --git a/android_webview/browser/aw_browser_permission_request_delegate.h b/android_webview/browser/aw_browser_permission_request_delegate.h
index 99eb7144..c3d525c 100644
--- a/android_webview/browser/aw_browser_permission_request_delegate.h
+++ b/android_webview/browser/aw_browser_permission_request_delegate.h
@@ -10,10 +10,6 @@
 
 class GURL;
 
-namespace url {
-class Origin;
-}
-
 namespace android_webview {
 
 // Delegate interface to handle the permission requests from |BrowserContext|.
@@ -41,9 +37,6 @@
 
   virtual void CancelMIDISysexPermissionRequests(const GURL& origin) = 0;
 
-  virtual void RequestStorageAccess(const url::Origin& top_level_origin,
-                                    PermissionCallback callback) = 0;
-
  protected:
   AwBrowserPermissionRequestDelegate() {}
 };
diff --git a/android_webview/browser/aw_contents.cc b/android_webview/browser/aw_contents.cc
index f5e829f..fe91106 100644
--- a/android_webview/browser/aw_contents.cc
+++ b/android_webview/browser/aw_contents.cc
@@ -10,7 +10,6 @@
 #include <string_view>
 #include <utility>
 
-#include "android_webview/browser/aw_app_defined_websites.h"
 #include "android_webview/browser/aw_browser_context.h"
 #include "android_webview/browser/aw_browser_main_parts.h"
 #include "android_webview/browser/aw_browser_permission_request_delegate.h"
@@ -114,7 +113,6 @@
 #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
 #include "net/cert/x509_certificate.h"
 #include "net/cert/x509_util.h"
-#include "services/network/public/cpp/wrapper_shared_url_loader_factory.h"
 #include "third_party/blink/public/common/navigation/navigation_params.h"
 #include "third_party/blink/public/common/web_preferences/web_preferences.h"
 #include "third_party/skia/include/core/SkPicture.h"
@@ -169,14 +167,6 @@
   return locale_list.get();
 }
 
-// These values are persisted to logs. Entries should not be renumbered and
-// numeric values should never be reused
-enum class StorageAccessAppDefinedType {
-  kAppDefined = 0,
-  kExternal = 1,
-  kMaxValue = kExternal,
-};
-
 const void* const kAwContentsUserDataKey = &kAwContentsUserDataKey;
 const void* const kComputedRendererPriorityUserDataKey =
     &kComputedRendererPriorityUserDataKey;
@@ -318,19 +308,6 @@
   permission_request_handler_ =
       std::make_unique<PermissionRequestHandler>(this, web_contents_.get());
 
-  auto* browser_context =
-      AwBrowserContext::FromWebContents(web_contents_.get());
-
-  // Using a separate URLLoaderFactory is preferable as this is an internal
-  // request made by Android WebView that should not be subject to attribution
-  // and interception logic common for navigation-related network activity.
-  storage_access_url_loader_factory_ = network::SharedURLLoaderFactory::Create(
-      std::make_unique<network::WrapperPendingSharedURLLoaderFactory>(
-          browser_context->CreateURLLoaderFactory()));
-  asset_link_handler_ = std::make_unique<
-      content_relationship_verification::DigitalAssetLinksHandler>(
-      storage_access_url_loader_factory_);
-
   content::SynchronousCompositor::SetClientForWebContents(
       web_contents_.get(), &browser_view_renderer_);
   AwContentsLifecycleNotifier::GetInstance().OnWebViewCreated(this);
@@ -776,67 +753,6 @@
       origin, AwPermissionRequest::AwPermissionRequest::MIDISysex);
 }
 
-
-void AwContents::RequestStorageAccess(const url::Origin& top_level_origin,
-                                      PermissionCallback callback) {
-  base::TimeTicks time_requested = base::TimeTicks::Now();
-
-  AppDefinedWebsites::GetInstance()->AppDeclaresDomainInAssetStatements(
-      std::make_unique<AssetDomainListIncludeHandler>(
-          storage_access_url_loader_factory_),
-      top_level_origin,
-      base::BindOnce(&AwContents::GrantRequestStorageAccessIfOriginIsAppDefined,
-                     weak_ptr_factory_.GetWeakPtr(), top_level_origin,
-                     time_requested, std::move(callback)));
-}
-
-void AwContents::GrantRequestStorageAccessIfOriginIsAppDefined(
-    const url::Origin top_level_origin,
-    base::TimeTicks time_requested,
-    PermissionCallback callback,
-    bool is_defined) {
-  base::UmaHistogramEnumeration("Android.WebView.StorageAccessRelation2",
-                                is_defined
-                                    ? StorageAccessAppDefinedType::kAppDefined
-                                    : StorageAccessAppDefinedType::kExternal);
-
-  if (!base::FeatureList::IsEnabled(features::kWebViewAutoSAA)) {
-    NOTIMPLEMENTED()
-        << "RequestPermissions is not implemented for storage access";
-    std::move(callback).Run(false);
-    return;
-  }
-
-  if (!is_defined) {
-    std::move(callback).Run(false);
-    return;
-  }
-
-  // TODO(crbug.com/355460995): We should investigate if we should have a
-  // particular relation string from the android app side as well. For the
-  // moment, we will just accept any string that the app declares, and then
-  // verify the relation on the website's side.
-  constexpr char kRelationship[] = "delegate_permission/common.handle_all_urls";
-  asset_link_handler_->CheckDigitalAssetLinkRelationshipForAndroidApp(
-      top_level_origin, kRelationship,
-      std::vector<std::string>{
-          base::android::apk_info::host_signing_cert_sha256()},
-      base::android::apk_info::host_package_name(),
-      base::BindOnce(
-          [](base::TimeTicks time_requested, PermissionCallback callback,
-             content_relationship_verification::RelationshipCheckResult
-                 result) {
-            const base::TimeTicks time_answered = base::TimeTicks::Now();
-            base::UmaHistogramTimes(
-                "Android.WebView.StorageAccessAutoGrantTime",
-                time_answered - time_requested);
-            std::move(callback).Run(result ==
-                                    content_relationship_verification::
-                                        RelationshipCheckResult::kSuccess);
-          },
-          time_requested, std::move(callback)));
-}
-
 void AwContents::FindAllAsync(JNIEnv* env,
                               const JavaParamRef<jstring>& search_string) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
@@ -1682,44 +1598,20 @@
 
 namespace {
 
-// Returns true if any of the `domains` match the `etld_plus1`.
-bool IncludesETLDPlusOne(const std::string& etld_plus1,
-                         const std::vector<std::string>& domains) {
-  return std::find_if(
-             domains.begin(), domains.end(), [&](const std::string& domain) {
-               return etld_plus1 ==
-                      net::registry_controlled_domains::GetDomainAndRegistry(
-                          domain, net::registry_controlled_domains::
-                                      INCLUDE_PRIVATE_REGISTRIES);
-             }) != domains.end();
-}
-
 // Post a task to a background thread to log a site visit.
-void LogSiteVisitOnBackgroundThread(jlong site_hash, bool is_related_site) {
+void LogSiteVisitOnBackgroundThread(jlong site_hash) {
   // Logging a site visit involves writing to shared preferences, which should
   // not be done on the main thread.
-  base::ThreadPool::PostTask(FROM_HERE,
-                             base::BindOnce(
-                                 [](jlong site_hash, bool is_related_site) {
-                                   JNIEnv* env = AttachCurrentThread();
-                                   Java_AwSiteVisitLogger_logVisit(
-                                       env, site_hash, is_related_site);
-                                 },
-                                 site_hash, is_related_site));
+  base::ThreadPool::PostTask(
+      FROM_HERE, base::BindOnce(
+                     [](jlong site_hash) {
+                       JNIEnv* env = AttachCurrentThread();
+                       Java_AwSiteVisitLogger_logVisit(env, site_hash);
+                     },
+                     site_hash));
 }
-}  // namespace
 
-void LogSiteVisit(std::string etld_plus1, jlong site_hash) {
-  AppDefinedWebsites::GetInstance()->GetAppDefinedDomains(
-      AppDefinedDomainCriteria::kAndroidAssetStatementsAndWebLinks,
-      base::BindOnce(
-          [](std::string etld_plus1, jlong site_hash,
-             const std::vector<std::string>& domains) {
-            LogSiteVisitOnBackgroundThread(
-                site_hash, IncludesETLDPlusOne(etld_plus1, domains));
-          },
-          std::move(etld_plus1), site_hash));
-}
+}  // namespace
 
 void AwContents::PrimaryPageChanged(content::Page& page) {
   // TODO(https://crbug.com/378601799): Consider allowing prerendered pages
@@ -1751,7 +1643,7 @@
 
       Java_AwContents_logOriginVisit(env, j_ref, j_origin_hash);
 
-      LogSiteVisit(std::move(etld_plus1), j_etld_plus1_hash);
+      LogSiteVisitOnBackgroundThread(j_etld_plus1_hash);
     }
   }
 
@@ -1896,4 +1788,12 @@
       NotRestoredReason::kWebViewSafeBrowsingAllowlistChanged);
 }
 
+void AwContents::OnPerformanceMark(std::string mark_name,
+                                   const base::TimeDelta& mark_time) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_AwContents_onPerformanceMark(
+      env, java_ref_.get(env), web_contents_->GetPrimaryPage().GetJavaPage(),
+      ConvertUTF8ToJavaString(env, mark_name), mark_time.InMilliseconds());
+}
+
 }  // namespace android_webview
diff --git a/android_webview/browser/aw_contents.h b/android_webview/browser/aw_contents.h
index 5ffef33..fbce205 100644
--- a/android_webview/browser/aw_contents.h
+++ b/android_webview/browser/aw_contents.h
@@ -248,8 +248,6 @@
   void RequestMIDISysexPermission(const GURL& origin,
                                   PermissionCallback callback) override;
   void CancelMIDISysexPermissionRequests(const GURL& origin) override;
-  void RequestStorageAccess(const url::Origin& top_level_origin,
-                            PermissionCallback callback) override;
 
   // Find-in-page API and related methods.
   void FindAllAsync(JNIEnv* env,
@@ -349,6 +347,10 @@
   // AwSafeBrowsingAllowlistSetObserver overrides
   void OnSafeBrowsingAllowListSet() override;
 
+  // AwWebPerformanceMetricsObserver related methods
+  void OnPerformanceMark(std::string mark_name,
+                         const base::TimeDelta& mark_time);
+
  private:
   // Geolocation API support
   void ShowGeolocationPrompt(const GURL& origin, PermissionCallback);
@@ -356,14 +358,6 @@
 
   void SetDipScaleInternal(float dip_scale);
 
-  // Callback for RequestStorageAccess to continue once the app_domain_list has
-  // been loaded.
-  void GrantRequestStorageAccessIfOriginIsAppDefined(
-      const url::Origin top_level_origin,
-      base::TimeTicks time_requested,
-      PermissionCallback callback,
-      bool is_app_defined);
-
   JavaObjectWeakGlobalRef java_ref_;
   BrowserViewRenderer browser_view_renderer_;  // Must outlive |web_contents_|.
   std::unique_ptr<content::WebContents> web_contents_;
@@ -378,10 +372,6 @@
   std::unique_ptr<AwPdfExporter> pdf_exporter_;
   std::unique_ptr<PermissionRequestHandler> permission_request_handler_;
   std::unique_ptr<js_injection::JsCommunicationHost> js_communication_host_;
-  scoped_refptr<network::SharedURLLoaderFactory>
-      storage_access_url_loader_factory_;
-  std::unique_ptr<content_relationship_verification::DigitalAssetLinksHandler>
-      asset_link_handler_;
 
   base::circular_deque<std::unique_ptr<content::PrerenderHandle>>
       prerender_handles_;
diff --git a/android_webview/browser/aw_permission_manager.cc b/android_webview/browser/aw_permission_manager.cc
index 7a1f38c..01da764 100644
--- a/android_webview/browser/aw_permission_manager.cc
+++ b/android_webview/browser/aw_permission_manager.cc
@@ -9,7 +9,6 @@
 #include <unordered_map>
 #include <utility>
 
-#include "android_webview/browser/aw_app_defined_websites.h"
 #include "android_webview/browser/aw_browser_permission_request_delegate.h"
 #include "android_webview/browser/aw_contents.h"
 #include "android_webview/browser/aw_context_permissions_delegate.h"
@@ -73,7 +72,6 @@
 
     switch (permission) {
       case PermissionType::PROTECTED_MEDIA_IDENTIFIER:
-      case PermissionType::STORAGE_ACCESS_GRANT:
       case PermissionType::TOP_LEVEL_STORAGE_ACCESS:
         break;
       // Other permissions are not cached.
@@ -104,13 +102,12 @@
         blink::PermissionDescriptorToPermissionType(permission_descriptor);
     switch (permission) {
       case PermissionType::PROTECTED_MEDIA_IDENTIFIER:
-      case PermissionType::STORAGE_ACCESS_GRANT:
       case PermissionType::TOP_LEVEL_STORAGE_ACCESS:
         break;
       // Other permissions are not cached.
       default:
         NOTREACHED()
-            << "Results are only cached for PROTECTED_MEDIA_IDENTIFIER AND SAA";
+            << "Results are only cached for PROTECTED_MEDIA_IDENTIFIER";
     }
 
     std::string key = GetCacheKey(requesting_origin, embedding_origin);
@@ -248,18 +245,10 @@
   bool cancelled_;
 };
 
-// Regarding the saa_cache_ size: 99% of WebView site visits fall
-// into this count (based on Android.WebView.SitesVisitedWeekly) in a week so we
-// will cache those for revisits but not going above it to avoid using up too
-// much memory for any heavy case. This will cache in memory so every app reload
-// will require a new request. This will also be duplicated across profiles
-// which may be a useful property in the future so we aren't going to design
-// around that.
 AwPermissionManager::AwPermissionManager(
     const AwContextPermissionsDelegate& context_delegate)
     : context_delegate_(context_delegate),
-      result_cache_(new LastRequestResultCache),
-      saa_cache_(10) {}
+      result_cache_(new LastRequestResultCache) {}
 
 AwPermissionManager::~AwPermissionManager() {
   CancelPermissionRequests();
@@ -383,38 +372,14 @@
       case PermissionType::POINTER_LOCK:
       case PermissionType::AUTOMATIC_FULLSCREEN:
       case PermissionType::WEB_APP_INSTALLATION:
+      case PermissionType::STORAGE_ACCESS_GRANT:
+      case PermissionType::TOP_LEVEL_STORAGE_ACCESS:
         NOTIMPLEMENTED() << "RequestPermissions is not implemented for "
                          << static_cast<int>(permissions[i]);
         pending_request_raw->SetPermissionResult(
             permissions[i],
             content::PermissionResult(PermissionStatus::DENIED));
         break;
-      case PermissionType::STORAGE_ACCESS_GRANT:
-      case PermissionType::TOP_LEVEL_STORAGE_ACCESS: {
-        const url::Origin& outer_origin =
-            render_frame_host->GetOutermostMainFrame()
-                ->GetLastCommittedOrigin();
-
-        auto cached_value = saa_cache_->Get(outer_origin.Serialize());
-        if (cached_value != saa_cache_->end()) {
-          auto is_granted = cached_value->second ? PermissionStatus::GRANTED
-                                                 : PermissionStatus::DENIED;
-          pending_request_raw->SetPermissionResult(
-              permissions[i], content::PermissionResult(is_granted));
-          break;
-        }
-
-        auto on_saa_response =
-            base::BindOnce(&CacheAutoSAA, weak_ptr_factory_.GetWeakPtr(),
-                           outer_origin)
-                .Then(base::BindOnce(&OnRequestResponse,
-                                     weak_ptr_factory_.GetWeakPtr(), request_id,
-                                     permissions[i]));
-
-        delegate->RequestStorageAccess(outer_origin,
-                                       std::move(on_saa_response));
-        break;
-      }
       case PermissionType::MIDI:
       case PermissionType::SENSORS:
       case PermissionType::WAKE_LOCK_SCREEN:
@@ -465,27 +430,6 @@
 }
 
 // static
-bool AwPermissionManager::CacheAutoSAA(
-    const base::WeakPtr<AwPermissionManager>& manager,
-    const url::Origin& origin,
-    bool allowed) {
-  // All delegate functions should be cancelled when the manager runs
-  // destructor. Therefore |manager| should be always valid here.
-  CHECK(manager);
-  DCHECK_CALLED_ON_VALID_SEQUENCE(manager->sequence_checker_);
-
-  DVLOG(1) << "Caching auto granted SAA result " << allowed << " for origin "
-           << origin;
-
-  manager->saa_cache_->Put({
-      origin.Serialize(),
-      allowed,
-  });
-
-  return allowed;
-}
-
-// static
 void AwPermissionManager::OnRequestResponse(
     const base::WeakPtr<AwPermissionManager>& manager,
     int request_id,
@@ -565,16 +509,6 @@
   const blink::PermissionType permission_type =
       blink::PermissionDescriptorToPermissionType(permission_descriptor);
   switch (permission_type) {
-    // Setting results is called outside the Permissions API only for these
-    // permissions.
-    case blink::PermissionType::STORAGE_ACCESS_GRANT:
-    case blink::PermissionType::TOP_LEVEL_STORAGE_ACCESS: {
-      if (!base::FeatureList::IsEnabled(features::kWebViewAutoSAA)) {
-        return PermissionStatus::DENIED;
-      }
-      return result_cache_->GetResult(permission_descriptor, requesting_origin,
-                                      embedding_origin);
-    }
     case blink::PermissionType::PROTECTED_MEDIA_IDENTIFIER:
       return result_cache_->GetResult(permission_descriptor, requesting_origin,
                                       embedding_origin);
@@ -622,6 +556,8 @@
     case blink::PermissionType::WEB_APP_INSTALLATION:
     case blink::PermissionType::WEB_PRINTING:
     case blink::PermissionType::WINDOW_MANAGEMENT:
+    case blink::PermissionType::STORAGE_ACCESS_GRANT:
+    case blink::PermissionType::TOP_LEVEL_STORAGE_ACCESS:
       return PermissionStatus::DENIED;
   }
   NOTREACHED() << "Unhandled permission type: "
diff --git a/android_webview/browser/aw_permission_manager.h b/android_webview/browser/aw_permission_manager.h
index 84813164..744b054 100644
--- a/android_webview/browser/aw_permission_manager.h
+++ b/android_webview/browser/aw_permission_manager.h
@@ -10,7 +10,6 @@
 
 #include "android_webview/browser/aw_context_permissions_delegate.h"
 #include "base/containers/id_map.h"
-#include "base/containers/lru_cache.h"
 #include "base/functional/callback_forward.h"
 #include "base/memory/raw_ref.h"
 #include "base/memory/weak_ptr.h"
@@ -116,15 +115,6 @@
       blink::PermissionType permission,
       bool allowed);
 
-  // A little helper func to cache storage access API grants. It will associate
-  // them with the top level origin since we currently only grant SAA results
-  // based off of top level DALs.
-  // The bool |allowed| is returned again by this function so that we can
-  // chain it with OnRequestResponse to resolve permission requests.
-  static bool CacheAutoSAA(const base::WeakPtr<AwPermissionManager>& manager,
-                           const url::Origin& origin,
-                           bool allowed);
-
   base::raw_ref<const AwContextPermissionsDelegate> context_delegate_;
   PendingRequestsMap pending_requests_;
   std::unique_ptr<LastRequestResultCache> result_cache_;
@@ -132,10 +122,6 @@
   // The pair is ordered as (Audio, Video).
   std::map<url::Origin, std::pair<bool, bool>> enumerate_devices_labels_cache_;
 
-  // Given that the status of the grant is unlikely to change in an app's
-  // lifecycle, we cache this result after retrieving it from the
-  // delegate.
-  base::NoDestructor<base::LRUCache<std::string, bool>> saa_cache_;
   SEQUENCE_CHECKER(sequence_checker_);
 
   base::WeakPtrFactory<AwPermissionManager> weak_ptr_factory_{this};
diff --git a/android_webview/browser/aw_permission_manager_unittest.cc b/android_webview/browser/aw_permission_manager_unittest.cc
index 56bbfd5..8089f0f2 100644
--- a/android_webview/browser/aw_permission_manager_unittest.cc
+++ b/android_webview/browser/aw_permission_manager_unittest.cc
@@ -64,11 +64,6 @@
     RequestPermission(origin, PermissionType::GEOLOCATION, std::move(callback));
   }
 
-  void RequestStorageAccess(const url::Origin& origin,
-                            PermissionCallback callback) override {
-    NOTREACHED();
-  }
-
   void CancelGeolocationPermissionRequests(const GURL& origin) override {
     CancelPermission(origin, PermissionType::GEOLOCATION);
   }
diff --git a/android_webview/browser/page_load_metrics/aw_web_performance_metrics_observer.cc b/android_webview/browser/page_load_metrics/aw_web_performance_metrics_observer.cc
index 2a309a73..b16fb60 100644
--- a/android_webview/browser/page_load_metrics/aw_web_performance_metrics_observer.cc
+++ b/android_webview/browser/page_load_metrics/aw_web_performance_metrics_observer.cc
@@ -4,6 +4,8 @@
 
 #include "android_webview/browser/page_load_metrics/aw_web_performance_metrics_observer.h"
 
+#include "android_webview/browser/aw_contents.h"
+
 namespace android_webview {
 
 const char* AwWebPerformanceMetricsObserver::GetObserverName() const {
@@ -26,4 +28,50 @@
   return STOP_OBSERVING;
 }
 
+void AwWebPerformanceMetricsObserver::OnUserTimingMarkFullyLoaded(
+    const page_load_metrics::mojom::PageLoadTiming& timing) {
+  // TODO: crbug.com/461774316 - Clean up check
+  DCHECK(timing.user_timing_mark_fully_loaded);
+  if (!timing.user_timing_mark_fully_loaded) {
+    return;
+  }
+  AwContents::FromWebContents(GetDelegate().GetWebContents())
+      ->OnPerformanceMark(kMarkFullyLoaded,
+                          timing.user_timing_mark_fully_loaded.value());
+}
+
+void AwWebPerformanceMetricsObserver::OnUserTimingMarkFullyVisible(
+    const page_load_metrics::mojom::PageLoadTiming& timing) {
+  // TODO: crbug.com/461774316 - Clean up check
+  DCHECK(timing.user_timing_mark_fully_visible);
+  if (!timing.user_timing_mark_fully_visible) {
+    return;
+  }
+  AwContents::FromWebContents(GetDelegate().GetWebContents())
+      ->OnPerformanceMark(kMarkFullyVisible,
+                          timing.user_timing_mark_fully_visible.value());
+}
+
+void AwWebPerformanceMetricsObserver::OnUserTimingMarkInteractive(
+    const page_load_metrics::mojom::PageLoadTiming& timing) {
+  // TODO: crbug.com/461774316 - Clean up check
+  DCHECK(timing.user_timing_mark_interactive);
+  if (!timing.user_timing_mark_interactive) {
+    return;
+  }
+  AwContents::FromWebContents(GetDelegate().GetWebContents())
+      ->OnPerformanceMark(kMarkInteractive,
+                          timing.user_timing_mark_interactive.value());
+}
+
+void AwWebPerformanceMetricsObserver::OnCustomUserTimingMarkObserved(
+    const std::vector<page_load_metrics::mojom::CustomUserTimingMarkPtr>&
+        timings) {
+  AwContents* aw_contents =
+      AwContents::FromWebContents(GetDelegate().GetWebContents());
+  for (const auto& mark : timings) {
+    aw_contents->OnPerformanceMark(mark->mark_name, mark->start_time);
+  }
+}
+
 }  // namespace android_webview
diff --git a/android_webview/browser/page_load_metrics/aw_web_performance_metrics_observer.h b/android_webview/browser/page_load_metrics/aw_web_performance_metrics_observer.h
index d877231d..2a0e1540 100644
--- a/android_webview/browser/page_load_metrics/aw_web_performance_metrics_observer.h
+++ b/android_webview/browser/page_load_metrics/aw_web_performance_metrics_observer.h
@@ -10,6 +10,12 @@
 
 namespace android_webview {
 
+// See https://www.w3.org/TR/user-timing/#recommended-mark-names
+// and third_party/blink/renderer/core/timing/performance.cc
+inline constexpr const char kMarkFullyLoaded[] = "mark_fully_loaded";
+inline constexpr const char kMarkFullyVisible[] = "mark_fully_visible";
+inline constexpr const char kMarkInteractive[] = "mark_interactive";
+
 // Forwards Web Performance metrics for a page load in WebView
 // to the Java side of WebView.
 class AwWebPerformanceMetricsObserver
@@ -31,6 +37,16 @@
   ObservePolicy OnFencedFramesStart(
       content::NavigationHandle* navigation_handle,
       const GURL& currently_committed_url) override;
+
+  void OnUserTimingMarkFullyLoaded(
+      const page_load_metrics::mojom::PageLoadTiming& timing) override;
+  void OnUserTimingMarkFullyVisible(
+      const page_load_metrics::mojom::PageLoadTiming& timing) override;
+  void OnUserTimingMarkInteractive(
+      const page_load_metrics::mojom::PageLoadTiming& timing) override;
+  void OnCustomUserTimingMarkObserved(
+      const std::vector<page_load_metrics::mojom::CustomUserTimingMarkPtr>&
+          timings) override;
 };
 
 }  // namespace android_webview
diff --git a/android_webview/browser/page_load_metrics/page_load_metrics_initialize.cc b/android_webview/browser/page_load_metrics/page_load_metrics_initialize.cc
index 4d0df33..f2009de2 100644
--- a/android_webview/browser/page_load_metrics/page_load_metrics_initialize.cc
+++ b/android_webview/browser/page_load_metrics/page_load_metrics_initialize.cc
@@ -5,6 +5,7 @@
 #include "android_webview/browser/page_load_metrics/page_load_metrics_initialize.h"
 
 #include "android_webview/browser/page_load_metrics/aw_gws_page_load_metrics_observer.h"
+#include "android_webview/browser/page_load_metrics/aw_web_performance_metrics_observer.h"
 #include "android_webview/browser/page_load_metrics/service_level_page_load_metrics_observer.h"
 #include "components/page_load_metrics/browser/features.h"
 #include "components/page_load_metrics/browser/metrics_web_contents_observer.h"
@@ -59,6 +60,7 @@
   tracker->AddObserver(std::make_unique<GWSAbandonedPageLoadMetricsObserver>());
   tracker->AddObserver(std::make_unique<AwGWSPageLoadMetricsObserver>());
   tracker->AddObserver(std::make_unique<ServiceLevelPageLoadMetricsObserver>());
+  tracker->AddObserver(std::make_unique<AwWebPerformanceMetricsObserver>());
 }
 
 bool PageLoadMetricsEmbedder::IsNewTabPageUrl(const GURL& url) {
diff --git a/android_webview/common/aw_feature_map.cc b/android_webview/common/aw_feature_map.cc
index 680a7943..f3ef07ca 100644
--- a/android_webview/common/aw_feature_map.cc
+++ b/android_webview/common/aw_feature_map.cc
@@ -43,7 +43,6 @@
     &features::kWebViewCacheBoundaryInterfaceMethods,
     &features::kWebViewCacheSizeLimitDerivedFromAppCacheQuota,
     &features::kWebViewConnectToComponentProviderInBackground,
-    &features::kWebViewDoNotSendAccessibilityEventsOnGSU,
     &features::kWebViewEarlyPerfettoInit,
     &features::kWebViewEarlyStartupTracing,
     &features::kWebViewEnableCrash,
diff --git a/android_webview/common/aw_features.cc b/android_webview/common/aw_features.cc
index 8261dc0..046804a 100644
--- a/android_webview/common/aw_features.cc
+++ b/android_webview/common/aw_features.cc
@@ -14,10 +14,6 @@
 // Kill switch for Profile.addQuicHints.
 BASE_FEATURE(kWebViewAddQuicHints, base::FEATURE_ENABLED_BY_DEFAULT);
 
-// Enable auto granting storage access API requests. This will be done
-// if a relationship is detected between the app and the website.
-BASE_FEATURE(kWebViewAutoSAA, base::FEATURE_DISABLED_BY_DEFAULT);
-
 // Enable back/forward cache support in WebView. Note that this will only take
 // effect iff both this feature flag and the content/public kBackForwardCache
 // flag is enabled.
@@ -34,10 +30,6 @@
 BASE_FEATURE(kWebViewConfigurableLibraryPrefetch,
              base::FEATURE_ENABLED_BY_DEFAULT);
 
-// Enable loading include statements when checking digital asset links
-BASE_FEATURE(kWebViewDigitalAssetLinksLoadIncludes,
-             base::FEATURE_DISABLED_BY_DEFAULT);
-
 // Enable JS FileSystemAccess API.
 // This flag is set by WebView internal code based on an app's targetSdkVersion.
 // It is enabled for version B+. The default value here is not relevant, and is
@@ -118,15 +110,6 @@
 const base::FeatureParam<bool> kWebViewPrefetchFromRenderer{
     &kWebViewPrefetchNativeLibrary, "WebViewPrefetchFromRenderer", true};
 
-// If enabled TYPE_SCROLLED accessibility events are sent every 100ms when user
-// is scrolling irrespective of GestureScrollUpdate being consumed or not.
-// If disabled events are sent on GSU consumed ack.
-// Planning to keep it as kill switch in case we need to revert back to old
-// default behavior.
-// TODO(b/328601354): Cleanup after the change has been in stable for some time.
-BASE_FEATURE(kWebViewDoNotSendAccessibilityEventsOnGSU,
-             base::FEATURE_ENABLED_BY_DEFAULT);
-
 // This enables WebView's hyperlink context menu.
 BASE_FEATURE(kWebViewHyperlinkContextMenu, base::FEATURE_DISABLED_BY_DEFAULT);
 
diff --git a/android_webview/common/aw_features.h b/android_webview/common/aw_features.h
index e39db6f1..9e34164 100644
--- a/android_webview/common/aw_features.h
+++ b/android_webview/common/aw_features.h
@@ -16,12 +16,10 @@
 
 // Alphabetical:
 BASE_DECLARE_FEATURE(kWebViewAddQuicHints);
-BASE_DECLARE_FEATURE(kWebViewAutoSAA);
 BASE_DECLARE_FEATURE(kWebViewBackForwardCache);
 // TODO(crbug.com/455296998): Remove this code for M145.
 BASE_DECLARE_FEATURE(kWebViewBypassHttpCacheForPrefetchFromHeader);
 BASE_DECLARE_FEATURE(kWebViewConfigurableLibraryPrefetch);
-BASE_DECLARE_FEATURE(kWebViewDigitalAssetLinksLoadIncludes);
 BASE_DECLARE_FEATURE(kWebViewFileSystemAccess);
 BASE_DECLARE_FEATURE(kWebViewIgnoreDuplicateNavs);
 BASE_DECLARE_FEATURE(kWebViewInvokeZoomPickerOnGSU);
@@ -42,7 +40,6 @@
 BASE_DECLARE_FEATURE(kWebViewPrefetchNativeLibrary);
 extern const base::FeatureParam<bool> kWebViewPrefetchFromRenderer;
 BASE_DECLARE_FEATURE(kWebViewSkipInterceptsForPrefetch);
-BASE_DECLARE_FEATURE(kWebViewDoNotSendAccessibilityEventsOnGSU);
 BASE_DECLARE_FEATURE(kWebViewHyperlinkContextMenu);
 BASE_DECLARE_FEATURE(kCreateSpareRendererOnBrowserContextCreation);
 BASE_DECLARE_FEATURE(kWebViewWebauthn);
diff --git a/android_webview/java/src/org/chromium/android_webview/AppDefinedDomains.java b/android_webview/java/src/org/chromium/android_webview/AppDefinedDomains.java
deleted file mode 100644
index 67ea4a0..0000000
--- a/android_webview/java/src/org/chromium/android_webview/AppDefinedDomains.java
+++ /dev/null
@@ -1,356 +0,0 @@
-// Copyright 2024 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.android_webview;
-
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.pm.verify.domain.DomainVerificationManager;
-import android.content.pm.verify.domain.DomainVerificationUserState;
-import android.content.res.Resources;
-import android.content.res.XmlResourceParser;
-import android.net.Uri;
-import android.os.Build;
-
-import androidx.annotation.RequiresApi;
-
-import org.jni_zero.CalledByNative;
-import org.jni_zero.JNINamespace;
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import org.chromium.base.ContextUtils;
-import org.chromium.base.metrics.RecordHistogram;
-import org.chromium.build.annotations.NullMarked;
-import org.chromium.build.annotations.Nullable;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Utility class for fetching different kinds of lists containing domains embedding apps have some
- * of relationship with (e.g. digital asset links, or web links).
- */
-@JNINamespace("android_webview")
-@NullMarked
-public class AppDefinedDomains {
-
-    private static final String ASSET_STATEMENTS_IDENTIFIER = "asset_statements";
-    private static final String TARGET_IDENTIFIER = "target";
-    private static final String DOMAIN_IDENTIFIER = "site";
-    private static final String INCLUDE_IDENTIFIER = "include";
-
-    private static final String APP_MANIFEST = "AndroidManifest.xml";
-    private static final String INTENT_ATTRIBUTE_ACTION = "action";
-    private static final String INTENT_ATTRIBUTE_CATEGORY = "category";
-    private static final String INTENT_ATTRIBUTE_DATA = "data";
-    private static final String INTENT_ATTRIBUTE_SCHEME = "scheme";
-    private static final String INTENT_ATTRIBUTE_HOST = "host";
-    private static final String INTENT_ATTRIBUTE_NAME = "name";
-
-    private static final String ACTION_VIEW = "android.intent.action.VIEW";
-    private static final String CATEGORY_DEFAULT = "android.intent.category.DEFAULT";
-    private static final String CATEGORY_BROWSABLE = "android.intent.category.BROWSABLE";
-    private static final String SCHEME_HTTP = "http";
-    private static final String SCHEME_HTTPS = "https";
-    private static final String TAG_INTENT_FILTER = "intent-filter";
-    private static final String TAG_MANIFEST = "manifest";
-    private static final String ATTRIBUTE_PACKAGE = "package";
-    private static final int MAX_COOKIE_VALUE = 20;
-
-    @CalledByNative
-    private static String[] getDomainsFromAssetStatements() {
-        List<String> domains = fetchAssetStatementDomainsForApp();
-        return domains.toArray(new String[0]);
-    }
-
-    @CalledByNative
-    private static String[] getVerifiedDomainsFromAppLinks() {
-        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
-            // Cannot provide Android App Links information for API < 31
-            return new String[0];
-        }
-        List<String> domains =
-                fetchDomainsFromDomainVerificationManager(/* needsVerification= */ true);
-        return domains.toArray(new String[0]);
-    }
-
-    @CalledByNative
-    private static String[] getDomainsFromWebLinks() {
-        List<String> domains;
-        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
-            domains = fetchDomainsFromParsedManifest();
-        } else {
-            domains = fetchDomainsFromDomainVerificationManager(/* needsVerification= */ false);
-        }
-        return domains.toArray(new String[0]);
-    }
-
-    @CalledByNative
-    private static String[] getDomainsFromAssetStatementsAndWebLinks() {
-        List<String> domains = fetchAssetStatementDomainsForApp();
-        // Includes both Web Links and Android App Links
-        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
-            domains.addAll(fetchDomainsFromParsedManifest());
-        } else {
-            domains.addAll(
-                    fetchDomainsFromDomainVerificationManager(/* needsVerification= */ false));
-        }
-        return domains.toArray(new String[0]);
-    }
-
-    @CalledByNative
-    private static String[] getIncludeLinksFromAssetStatements() {
-        JSONArray statements = fetchAssetStatementsFromManifest();
-        List<String> domains = new ArrayList<>();
-
-        for (int i = 0; i < statements.length(); i++) {
-            try {
-                JSONObject statement = statements.getJSONObject(i);
-                if (statement.has(INCLUDE_IDENTIFIER)) {
-                    domains.add(statement.getString(INCLUDE_IDENTIFIER));
-                }
-            } catch (JSONException ignored) {
-                // If an element is not an object, just ignore it.
-            }
-        }
-        RecordHistogram.recordCount100Histogram(
-                "Android.WebView.DigitalAssetLinks.AssetIncludes.LinksInManifest", domains.size());
-        // Include statements should be limit to a maximum of 10 as per
-        // https://developers.google.com/digital-asset-links/v1/statements#scaling-to-dozens-of-statements-or-more
-        return domains.subList(0, Math.min(domains.size(), 10)).toArray(new String[0]);
-    }
-
-    private static Set<String> getHostsFromIntentFilter(XmlResourceParser parser)
-            throws XmlPullParserException, IOException {
-        Set<String> actions = new HashSet<>();
-        Set<String> categories = new HashSet<>();
-        Set<String> schemes = new HashSet<>();
-        Set<String> hosts = new HashSet<>();
-        int currDepth = parser.getDepth();
-
-        while (parser.next() != XmlPullParser.END_DOCUMENT && parser.getDepth() > currDepth) {
-            if (parser.getName() != null && parser.getName().equals(INTENT_ATTRIBUTE_ACTION)) {
-                for (int i = 0; i < parser.getAttributeCount(); i++) {
-                    if (parser.getAttributeName(i).equals(INTENT_ATTRIBUTE_NAME)) {
-                        actions.add(parser.getAttributeValue(i));
-                    }
-                }
-            }
-            if (parser.getName() != null && parser.getName().equals(INTENT_ATTRIBUTE_CATEGORY)) {
-                for (int i = 0; i < parser.getAttributeCount(); i++) {
-                    if (parser.getAttributeName(i).equals(INTENT_ATTRIBUTE_NAME)) {
-                        categories.add(parser.getAttributeValue(i));
-                    }
-                }
-            }
-            if (parser.getName() != null && parser.getName().equals(INTENT_ATTRIBUTE_DATA)) {
-                for (int i = 0; i < parser.getAttributeCount(); i++) {
-                    if (parser.getAttributeName(i).equals(INTENT_ATTRIBUTE_SCHEME)) {
-                        schemes.add(parser.getAttributeValue(i));
-                    }
-                    if (parser.getAttributeName(i).equals(INTENT_ATTRIBUTE_HOST)) {
-                        hosts.add(parser.getAttributeValue(i));
-                    }
-                }
-            }
-        }
-        // Check if intent-filter satisfies the conditions for being a Web Link
-        if (actions.contains(ACTION_VIEW)
-                && categories.contains(CATEGORY_DEFAULT)
-                && categories.contains(CATEGORY_BROWSABLE)
-                && (schemes.contains(SCHEME_HTTP) || schemes.contains(SCHEME_HTTPS))) {
-            return hosts;
-        }
-        return new HashSet<>();
-    }
-
-    private static boolean matchesPackageName(XmlResourceParser parserAtManifestTag) {
-        for (int i = 0; i < parserAtManifestTag.getAttributeCount(); i++) {
-            if (parserAtManifestTag.getAttributeName(i).equals(ATTRIBUTE_PACKAGE)) {
-                // <manifest> tag is expected to have only one "package" attribute
-                return parserAtManifestTag.getAttributeValue(i).equals(getPackageName());
-            }
-        }
-        return false;
-    }
-
-    // Finds and returns the parser for the embedding app's AndroidManifest.
-    // Iterates over a finite range of cookies to find the correct manifest. Returns null if
-    // no manifest matches the package name of the embedding app.
-    private static @Nullable XmlResourceParser getManifestParser() {
-        for (int assetCookie = 1; assetCookie < MAX_COOKIE_VALUE; assetCookie++) {
-            XmlResourceParser parser;
-            try {
-                parser =
-                        ContextUtils.getApplicationContext()
-                                .getAssets()
-                                .openXmlResourceParser(assetCookie, APP_MANIFEST);
-            } catch (IOException e) {
-                // try next assetCookie
-                continue;
-            }
-            try {
-                int type;
-                while ((type = parser.next()) != XmlPullParser.END_DOCUMENT) {
-                    if (parser.getDepth() == 1
-                            && type == XmlPullParser.START_TAG
-                            && parser.getName() != null
-                            && parser.getName().equals(TAG_MANIFEST)) {
-                        if (matchesPackageName(parser)) {
-                            // return the open parser at the <manifest> tag
-                            return parser;
-                        } else {
-                            // manifest can have only one <manifest> tag
-                            break;
-                        }
-                    }
-                }
-            } catch (XmlPullParserException | IOException e) {
-                // try next assetCookie
-            }
-            parser.close();
-        }
-        // could not find manifest with correct package name
-        return null;
-    }
-
-    // Parse raw xml manifest and extract the web links from intent-filters. This is a
-    // best effort solution for extracting web links for API < 31.
-    // Returned list may not contain all Web Links if XML parsing fails midway.
-    private static List<String> fetchDomainsFromParsedManifest() {
-        XmlResourceParser parser = getManifestParser();
-        if (parser == null) {
-            return new ArrayList<>();
-        }
-        Set<String> hostDomains = new HashSet<>();
-        int type;
-        try {
-            while ((type = parser.next()) != XmlPullParser.END_DOCUMENT) {
-                if (type == XmlPullParser.START_TAG
-                        && parser.getName() != null
-                        && parser.getName().equals(TAG_INTENT_FILTER)) {
-                    hostDomains.addAll(getHostsFromIntentFilter(parser));
-                }
-            }
-        } catch (XmlPullParserException | IOException e) {
-            // Return partially populated list
-        }
-        parser.close();
-        return new ArrayList<>(hostDomains);
-    }
-
-    private static List<String> fetchAssetStatementDomainsForApp() {
-        JSONArray statements;
-        try {
-            statements = fetchAssetStatementsFromManifest();
-        } catch (Resources.NotFoundException e) {
-            return new ArrayList<>();
-        }
-        List<String> domains = new ArrayList<>();
-        for (int i = 0; i < statements.length(); i++) {
-            String site;
-            try {
-                site =
-                        statements
-                                .getJSONObject(i)
-                                .getJSONObject(TARGET_IDENTIFIER)
-                                .getString(DOMAIN_IDENTIFIER);
-            } catch (JSONException e) {
-                // If an element is not an object, just ignore it.
-                continue;
-            }
-            if (site != null) {
-                String host = Uri.parse(site).getHost();
-                if (host != null) {
-                    domains.add(host);
-                }
-            }
-        }
-        return domains;
-    }
-
-    private static JSONArray fetchAssetStatementsFromManifest() {
-        ApplicationInfo appInfo;
-        try {
-            appInfo = getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
-        } catch (NameNotFoundException e) {
-            return new JSONArray();
-        }
-        if (appInfo == null || appInfo.metaData == null) {
-            return new JSONArray();
-        }
-
-        int resourceIdentifier = appInfo.metaData.getInt(ASSET_STATEMENTS_IDENTIFIER);
-        if (resourceIdentifier == 0) {
-            return new JSONArray();
-        }
-        Resources resources;
-        try {
-            resources = getResourcesForApplication(appInfo);
-        } catch (NameNotFoundException e) {
-            return new JSONArray();
-        }
-        JSONArray statements;
-        try {
-            statements = new JSONArray(resources.getString(resourceIdentifier));
-        } catch (Resources.NotFoundException | JSONException e) {
-            return new JSONArray();
-        }
-        return statements;
-    }
-
-    @RequiresApi(Build.VERSION_CODES.S)
-    private static List<String> fetchDomainsFromDomainVerificationManager(
-            boolean needsVerification) {
-        DomainVerificationManager manager =
-                ContextUtils.getApplicationContext()
-                        .getSystemService(DomainVerificationManager.class);
-        if (manager == null) {
-            return new ArrayList<>();
-        }
-        DomainVerificationUserState userState;
-        try {
-            userState = manager.getDomainVerificationUserState(getPackageName());
-        } catch (NameNotFoundException e) {
-            return new ArrayList<>();
-        }
-        if (userState == null) {
-          return new ArrayList<>();
-        }
-        Map<String, Integer> hostToStateMap = userState.getHostToStateMap();
-        if (needsVerification) {
-            hostToStateMap
-                    .values()
-                    .removeIf(value -> value != DomainVerificationUserState.DOMAIN_STATE_VERIFIED);
-        }
-        return new ArrayList<>(hostToStateMap.keySet());
-    }
-
-    private static String getPackageName() {
-        return ContextUtils.getApplicationContext().getPackageName();
-    }
-
-    private static ApplicationInfo getApplicationInfo(String packageName, int flags)
-            throws NameNotFoundException {
-        return ContextUtils.getApplicationContext()
-                .getPackageManager()
-                .getApplicationInfo(packageName, flags);
-    }
-
-    private static Resources getResourcesForApplication(ApplicationInfo appInfo)
-            throws NameNotFoundException {
-        return ContextUtils.getApplicationContext()
-                .getPackageManager()
-                .getResourcesForApplication(appInfo);
-    }
-}
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java
index b263512..400f1a8 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwContents.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java
@@ -119,6 +119,7 @@
 import org.chromium.content_public.browser.NavigationController;
 import org.chromium.content_public.browser.NavigationHandle;
 import org.chromium.content_public.browser.NavigationHistory;
+import org.chromium.content_public.browser.Page;
 import org.chromium.content_public.browser.RenderFrameHost;
 import org.chromium.content_public.browser.SelectionClient;
 import org.chromium.content_public.browser.SelectionPopupController;
@@ -828,10 +829,6 @@
 
         @Override
         public void onScrollUpdateGestureConsumed() {
-            if (!AwFeatureMap.isEnabled(
-                    AwFeatures.WEBVIEW_DO_NOT_SEND_ACCESSIBILITY_EVENTS_ON_GSU)) {
-                mScrollAccessibilityHelper.postViewScrolledAccessibilityEventCallback();
-            }
             if (AwFeatureMap.isEnabled(AwFeatures.WEBVIEW_INVOKE_ZOOM_PICKER_ON_GSU)) {
                 mZoomControls.invokeZoomPicker();
             }
@@ -846,10 +843,7 @@
                 mZoomControls.setAutoDismissed(false);
             }
             mZoomControls.invokeZoomPicker();
-            if (AwFeatureMap.isEnabled(
-                    AwFeatures.WEBVIEW_DO_NOT_SEND_ACCESSIBILITY_EVENTS_ON_GSU)) {
-                mScrollAccessibilityHelper.setIsInAScroll(true);
-            }
+            mScrollAccessibilityHelper.setIsInAScroll(true);
         }
 
         @Override
@@ -860,10 +854,7 @@
                 // android.
                 mZoomControls.invokeZoomPicker();
             }
-            if (AwFeatureMap.isEnabled(
-                    AwFeatures.WEBVIEW_DO_NOT_SEND_ACCESSIBILITY_EVENTS_ON_GSU)) {
-                mScrollAccessibilityHelper.setIsInAScroll(false);
-            }
+            mScrollAccessibilityHelper.setIsInAScroll(false);
         }
 
         @Override
@@ -4121,6 +4112,11 @@
         return AwContentsJni.get().fromWebContents(webContents);
     }
 
+    @CalledByNative
+    private void onPerformanceMark(Page page, String markName, long markTimeMs) {
+        mNavigationClient.onPerformanceMark(page, markName, markTimeMs);
+    }
+
     // -------------------------------------------------------------------------------------------
     // Helper methods
     // -------------------------------------------------------------------------------------------
diff --git a/android_webview/java/src/org/chromium/android_webview/AwNavigationClient.java b/android_webview/java/src/org/chromium/android_webview/AwNavigationClient.java
index e3d77b9..d0cde9db 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwNavigationClient.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwNavigationClient.java
@@ -138,6 +138,13 @@
         }
     }
 
+    public void onPerformanceMark(Page page, String markName, long markTimeMs) {
+        AwPage awPage = getAwPageFor(page);
+        for (AwNavigationListener listener : mNavigationListeners) {
+            listener.onPerformanceMark(awPage, markName, markTimeMs);
+        }
+    }
+
     public AwNavigation getOrUpdateAwNavigationFor(NavigationHandle navigation) {
         WeakReference<AwNavigation> awNavigationRef = mNavigationMap.get(navigation);
         AwPage awPage =
diff --git a/android_webview/java/src/org/chromium/android_webview/AwNavigationListener.java b/android_webview/java/src/org/chromium/android_webview/AwNavigationListener.java
index 189c0c63..e7b2589 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwNavigationListener.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwNavigationListener.java
@@ -28,4 +28,6 @@
     void onPageDOMContentLoadedEventFired(AwPage page);
 
     void onFirstContentfulPaint(AwPage page, long loadTimeUs);
+
+    void onPerformanceMark(AwPage page, String markName, long markNameMs);
 }
diff --git a/android_webview/java/src/org/chromium/android_webview/ScrollAccessibilityHelper.java b/android_webview/java/src/org/chromium/android_webview/ScrollAccessibilityHelper.java
index a8d0a35..c443dfe0 100644
--- a/android_webview/java/src/org/chromium/android_webview/ScrollAccessibilityHelper.java
+++ b/android_webview/java/src/org/chromium/android_webview/ScrollAccessibilityHelper.java
@@ -72,20 +72,6 @@
         mHandler = new Handler(new HandlerCallback(eventSender));
     }
 
-    /**
-     * Post a callback to send a {@link AccessibilityEvent#TYPE_VIEW_SCROLLED} event.
-     * This event is sent at most once every
-     * {@link android.view.ViewConfiguration#getSendRecurringAccessibilityEventsInterval()}
-     */
-    public void postViewScrolledAccessibilityEventCallback() {
-        if (mMsgViewScrolledQueued) return;
-        mMsgViewScrolledQueued = true;
-        mEventSentByViewBaseClass = false;
-
-        Message msg = mHandler.obtainMessage(HandlerCallback.MSG_VIEW_SCROLLED);
-        mHandler.sendMessageDelayed(msg, SEND_RECURRING_ACCESSIBILITY_EVENTS_INTERVAL_MILLIS);
-    }
-
     public void setIsInAScroll(boolean isScrolling) {
         mIsInAScroll = isScrolling;
         if (isScrolling) {
diff --git a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
index b44bb9e..0f9bb8f 100644
--- a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
+++ b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
@@ -602,10 +602,6 @@
                 "Enables a browser intervention which silently ignores input events "
                         + "targeting a cross-origin iframe which has moved within its "
                         + "embedding page recently."),
-        Flag.baseFeature(
-                AwFeatures.WEBVIEW_AUTO_SAA,
-                "Enable auto granting storage access API requests. This will be done "
-                        + "if a relationship is detected between the app and the website."),
         Flag.baseFeature(GwpAsanFeatures.GWP_ASAN_MALLOC, "GWP-ASan for `malloc()`."),
         Flag.baseFeature(GwpAsanFeatures.GWP_ASAN_PARTITION_ALLOC, "GWP-ASan for PartitionAlloc."),
         Flag.baseFeature(
@@ -768,10 +764,6 @@
         Flag.baseFeature(
                 GfxSwitches.USE_SMART_REF_FOR_GPU_FENCE_HANDLE,
                 "Avoids cloning of gpu fences when possible"),
-        Flag.baseFeature(
-                AwFeatures.WEBVIEW_DO_NOT_SEND_ACCESSIBILITY_EVENTS_ON_GSU,
-                "Do not send TYPE_VIEW_SCROLLED accessibility events on kGestureScrollUpdate acks,"
-                        + " instead send them every 100ms when in a scroll gesture."),
         Flag.baseFeature(BlinkFeatures.STREAMLINE_RENDERER_INIT),
         Flag.baseFeature("LazyBindJsInjection"),
         Flag.baseFeature("WebViewVizUseThreadPool"),
@@ -840,9 +832,6 @@
                 "Enables Write-Ahead Logging (WAL) mode for the SQLite database used by the"
                         + " Chromium components that WebView relies on"),
         Flag.baseFeature("ServiceWorkerAvoidMainThreadForInitialization"),
-        Flag.baseFeature(
-                AwFeatures.WEBVIEW_DIGITAL_ASSET_LINKS_LOAD_INCLUDES,
-                "Enable loading include statements when checking digital asset links."),
         Flag.baseFeature("DirectCompositorThreadIpc"),
         Flag.baseFeature(
                 AwFeatures.WEBVIEW_WEBAUTHN,
diff --git a/android_webview/java/src/org/chromium/android_webview/metrics/AwSiteVisitLogger.java b/android_webview/java/src/org/chromium/android_webview/metrics/AwSiteVisitLogger.java
index e72c005..8e64600cf 100644
--- a/android_webview/java/src/org/chromium/android_webview/metrics/AwSiteVisitLogger.java
+++ b/android_webview/java/src/org/chromium/android_webview/metrics/AwSiteVisitLogger.java
@@ -34,7 +34,6 @@
 
     private static final String KEY_VISITED_WEEKLY_TIME = "sites_visited_weekly_time";
     private static final String KEY_VISITED_WEEKLY_SET = "sites_visited_weekly_set";
-    private static final String KEY_RELATED_VISITED_WEEKLY_SET = "related_sites_visited_weekly_set";
 
     private static final long MILLIS_PER_WEEK = (TimeUtils.SECONDS_PER_DAY * 7) * 1000;
 
@@ -46,7 +45,7 @@
      */
     @CalledByNative
     @WorkerThread
-    public static void logVisit(long siteHash, boolean isSiteRelated) {
+    public static void logVisit(long siteHash) {
         try (StrictModeContext ignored = StrictModeContext.allowDiskReads()) {
             SharedPreferences prefs =
                     ContextUtils.getApplicationContext()
@@ -61,42 +60,21 @@
                     new HashSet<>(
                             prefs.getStringSet(KEY_VISITED_WEEKLY_SET, Collections.emptySet()));
 
-            Set<String> relatedSitesVisited =
-                    new HashSet<>(
-                            prefs.getStringSet(
-                                    KEY_RELATED_VISITED_WEEKLY_SET, Collections.emptySet()));
-
             // If there are any stored site hashes from the previous week, then their count must be
             // logged exactly once and the set cleared before we start storing hashes for this week.
-            if (now > expiryTime) {
-                if (!sitesVisited.isEmpty()) {
-                    RecordHistogram.recordLinearCountHistogram(
-                            "Android.WebView.SitesVisitedWeekly", sitesVisited.size(), 1, 99, 100);
-                    sitesVisited.clear();
-                    storedTime = now;
-                }
-                if (!relatedSitesVisited.isEmpty()) {
-                    RecordHistogram.recordLinearCountHistogram(
-                            "Android.WebView.RelatedSitesVisitedWeekly",
-                            relatedSitesVisited.size(),
-                            1,
-                            99,
-                            100);
-                    relatedSitesVisited.clear();
-                    storedTime = now;
-                }
+            if (now > expiryTime && !sitesVisited.isEmpty()) {
+                RecordHistogram.recordLinearCountHistogram(
+                        "Android.WebView.SitesVisitedWeekly", sitesVisited.size(), 1, 99, 100);
+                sitesVisited.clear();
+                storedTime = now;
             }
 
             // Store the time and site to be logged after a week has passed.
             sitesVisited.add(Long.toString(siteHash));
-            if (isSiteRelated) {
-                relatedSitesVisited.add(Long.toString(siteHash));
-            }
 
             prefs.edit()
                     .putLong(KEY_VISITED_WEEKLY_TIME, storedTime)
                     .putStringSet(KEY_VISITED_WEEKLY_SET, sitesVisited)
-                    .putStringSet(KEY_RELATED_VISITED_WEEKLY_SET, relatedSitesVisited)
                     .apply();
         }
     }
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwNavigationClientTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwNavigationClientTest.java
new file mode 100644
index 0000000..9d034b1
--- /dev/null
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwNavigationClientTest.java
@@ -0,0 +1,145 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.android_webview.test;
+
+import androidx.test.filters.SmallTest;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.UseParametersRunnerFactory;
+
+import org.chromium.base.test.util.DoNotBatch;
+import org.chromium.base.test.util.Feature;
+import org.chromium.net.test.util.TestWebServer;
+
+import java.util.List;
+
+/** Tests for the AwNavigationClient class. */
+@RunWith(Parameterized.class)
+@UseParametersRunnerFactory(AwJUnit4ClassRunnerWithParameters.Factory.class)
+@DoNotBatch(reason = "Tests that need browser start are incompatible with @Batch")
+public class AwNavigationClientTest extends AwParameterizedTest {
+    @Rule public AwActivityTestRule mActivityTestRule;
+
+    private TestAwContentsClient mContentsClient;
+    private TestAwNavigationListener mNavigationListener;
+    private AwTestContainerView mTestContainerView;
+    private TestWebServer mWebServer;
+
+    private static final String JS_OBJECT_NAME = "testListener";
+    private static final String WEB_PERFORMANCE_METRICS_HTML =
+            """
+                <html>
+                <head>
+                <title>Hello, World!</title>
+                <script>
+                        // Start the overall measurement
+                        performance.mark('mark0');
+
+                        /**
+                         * Simulates a heavy task
+                         */
+                        function runHeavyTask() {
+                            performance.mark('mark1');
+                            setTimeout(() => {
+                                performance.mark('mark2');
+                                let marks = performance.getEntriesByType("mark");
+                                testListener.postMessage(JSON.stringify(marks));
+                            }, 1000);
+                        }
+
+                        // Run the task once the DOM is ready
+                        document.addEventListener('DOMContentLoaded', runHeavyTask);
+                </script>
+                </head>
+                <body>
+                Hello, World!
+                </body>
+                </html>
+            """;
+
+    public AwNavigationClientTest(AwSettingsMutation param) {
+        this.mActivityTestRule = new AwActivityTestRule(param.getMutation());
+    }
+
+    @Before
+    public void setUp() throws Exception {
+        mContentsClient = new TestAwContentsClient();
+        mNavigationListener = new TestAwNavigationListener();
+        mTestContainerView = mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient);
+        mTestContainerView.getAwContents().getNavigationClient().addListener(mNavigationListener);
+        mWebServer = TestWebServer.start();
+    }
+
+    @After
+    public void tearDown() {
+        if (mWebServer != null) {
+            mWebServer.shutdown();
+        }
+    }
+
+    @Test
+    @SmallTest
+    @Feature({"AndroidWebView"})
+    public void testPerformanceMark() throws Throwable {
+        mActivityTestRule
+                .getAwSettingsOnUiThread(mTestContainerView.getAwContents())
+                .setJavaScriptEnabled(true);
+
+        TestWebMessageListener listener = new TestWebMessageListener();
+        TestWebMessageListener.addWebMessageListenerOnUiThread(
+                mTestContainerView.getAwContents(), JS_OBJECT_NAME, new String[] {"*"}, listener);
+
+        String testPage =
+                mWebServer.setResponse(
+                        "/web_performance_metrics.html", WEB_PERFORMANCE_METRICS_HTML, null);
+
+        mActivityTestRule.loadUrlSync(
+                mTestContainerView.getAwContents(),
+                mContentsClient.getOnPageFinishedHelper(),
+                testPage);
+
+        // Wait for performance marks data to be returned via postmessage
+        TestWebMessageListener.Data data = listener.waitForOnPostMessage();
+        JSONArray jsPerformanceMarks = new JSONArray(data.getAsString());
+        List<TestAwNavigationListener.PerformanceMark> listenerPerformanceMarks =
+                mNavigationListener.getPerformanceMarks();
+
+        int expectedNumMarks = 3;
+        Assert.assertEquals(
+                "Number of marks observered via js is incorrect",
+                expectedNumMarks,
+                jsPerformanceMarks.length());
+        Assert.assertEquals(
+                "Number of marks observered via listener is incorrect",
+                expectedNumMarks,
+                listenerPerformanceMarks.size());
+
+        for (int i = 0; i < expectedNumMarks; i++) {
+            JSONObject jsMark = jsPerformanceMarks.getJSONObject(i);
+            TestAwNavigationListener.PerformanceMark listenerMark = listenerPerformanceMarks.get(i);
+            String expectedMarkName = "mark" + i;
+            Assert.assertEquals(
+                    "Name of mark observered via js is incorrect",
+                    expectedMarkName,
+                    jsMark.getString("name"));
+            Assert.assertEquals(
+                    "Name of mark observered via listener is incorrect",
+                    expectedMarkName,
+                    listenerMark.markName);
+            Assert.assertEquals(
+                    "Time of mark differs between js and listener",
+                    jsMark.getLong("startTime"),
+                    listenerMark.markTimeMs);
+        }
+    }
+}
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwPermissionManagerTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwPermissionManagerTest.java
index 5ae8af0..f57af8519 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwPermissionManagerTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwPermissionManagerTest.java
@@ -7,7 +7,6 @@
 import android.content.pm.PackageManager;
 import android.os.Handler;
 import android.os.Looper;
-import android.util.Pair;
 
 import androidx.annotation.Nullable;
 import androidx.test.filters.SmallTest;
@@ -24,28 +23,19 @@
 import org.junit.runners.Parameterized.UseParametersRunnerFactory;
 
 import org.chromium.android_webview.AwContents;
-import org.chromium.android_webview.common.AwFeatures;
 import org.chromium.android_webview.permission.AwPermissionRequest;
 import org.chromium.android_webview.test.util.CommonResources;
-import org.chromium.base.ApkInfo;
 import org.chromium.base.ContextUtils;
+import org.chromium.base.test.util.Batch;
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.base.test.util.DoNotBatch;
 import org.chromium.base.test.util.Feature;
-import org.chromium.base.test.util.Features;
-import org.chromium.base.test.util.HistogramWatcher;
 import org.chromium.content_public.browser.test.util.DomAutomationController;
 import org.chromium.content_public.browser.test.util.JavaScriptUtils;
 import org.chromium.content_public.common.ContentSwitches;
 import org.chromium.net.test.util.TestWebServer;
 
-import java.util.List;
-
 /** Test AwPermissionManager. */
-@DoNotBatch(
-        reason =
-                "Storage Access tests load from manifest and have global state. Run them separately"
-                        + " to avoid state flowing between tests.")
+@Batch(Batch.PER_CLASS)
 @RunWith(Parameterized.class)
 @UseParametersRunnerFactory(AwJUnit4ClassRunnerWithParameters.Factory.class)
 public class AwPermissionManagerTest extends AwParameterizedTest {
@@ -66,18 +56,6 @@
 
     private static final String IFRAME_PARENT_PAGE = "<html><iframe></iframe><body></body></html>";
 
-    private static final String REQUEST_STORAGE_ACCESS_PAGE =
-            """
-            <html>
-            <body>
-            <script>
-            document.requestStorageAccess()
-                .then(() => window.parent.postMessage('granted', '*'))
-                .catch((e) => window.parent.postMessage('not granted', '*'));
-            </script>
-            </body>
-            </html>""";
-
     private static final String GUM_JS =
             "navigator.mediaDevices.getUserMedia({video: true, audio: true})"
                     + ".then((_) => domAutomationController.send('success'))"
@@ -88,35 +66,6 @@
                     + "(devices) => domAutomationController.send(devices.map("
                     + "  (d) => `${d['label']}`)));";
 
-    private static final String ASSET_STATEMENT_TEMPLATE =
-            """
-                [{
-                        "relation": ["delegate_permission/common.handle_all_urls"],
-                        "target": {
-                                "namespace": "android_app",
-                                "package_name": "%s",
-                                "sha256_cert_fingerprints": ["%s"]
-                        }
-                }]
-        """;
-
-    private static final String ASSET_STATEMENT_INCLUDE_CONTENT =
-            """
-        [{
-            "relation": ["delegate_permission/common.handle_all_urls"],
-            "target": {
-              "namespace": "web",
-              "site": "http://127.0.0.1"
-            }
-        }]
-        """;
-
-    private static final String ASSET_STATEMENT_PATH = "/.well-known/assetlinks.json";
-    private static final int ASSET_STATEMENT_INCLUDE_PORT = 2024;
-    private static final String ASSET_STATEMENT_INCLUDE_PATH = "/includedstatements.json";
-    private static final String SAA_GRANT_TIME_HISTOGRAM =
-            "Android.WebView.StorageAccessAutoGrantTime";
-
     private final DomAutomationController mDomAutomationController = new DomAutomationController();
     private TestWebServer mTestWebServer;
     private String mPage;
@@ -361,177 +310,6 @@
         assertDeviceLabels(devices, true);
     }
 
-    @Test
-    @Feature({"AndroidWebView"})
-    @SmallTest
-    @Features.EnableFeatures({AwFeatures.WEBVIEW_AUTO_SAA})
-    public void testAutoGrantSAA_trusted() throws Exception {
-        String result;
-
-        // We add an asset statement to always trust the test app for auto granting.
-        mTestWebServer.setResponse(
-                ASSET_STATEMENT_PATH,
-                String.format(
-                        ASSET_STATEMENT_TEMPLATE,
-                        ApkInfo.getHostPackageName(),
-                        ApkInfo.getHostSigningCertSha256()),
-                null);
-
-        try (var histogramWatcher =
-                HistogramWatcher.newBuilder().expectAnyRecord(SAA_GRANT_TIME_HISTOGRAM).build()) {
-            result = requestEmbeddedStorageAccess(/* useLocalhostOrigin= */ true);
-            Assert.assertEquals("\"granted\"", result);
-            histogramWatcher.pollInstrumentationThreadUntilSatisfied();
-        }
-        // Confirm this is resolved against the test server the first time
-        Assert.assertEquals(1, mTestWebServer.getRequestCount(ASSET_STATEMENT_PATH));
-
-        result = requestEmbeddedStorageAccess(/* useLocalhostOrigin= */ true);
-        Assert.assertEquals("\"granted\"", result);
-        // Confirm that subsequent calls are from cached results
-        Assert.assertEquals(1, mTestWebServer.getRequestCount(ASSET_STATEMENT_PATH));
-    }
-
-    @Test
-    @Feature({"AndroidWebView"})
-    @SmallTest
-    @Features.EnableFeatures({
-        AwFeatures.WEBVIEW_AUTO_SAA,
-        AwFeatures.WEBVIEW_DIGITAL_ASSET_LINKS_LOAD_INCLUDES
-    })
-    public void testAutoGrantSAA_trustedViaInclude() throws Exception {
-        // We add an asset statement to always trust the test app for auto granting.
-        mTestWebServer.setResponse(
-                ASSET_STATEMENT_PATH,
-                String.format(
-                        ASSET_STATEMENT_TEMPLATE,
-                        ApkInfo.getHostPackageName(),
-                        ApkInfo.getHostSigningCertSha256()),
-                null);
-        String result;
-
-        try (var histogramWatcher =
-                        HistogramWatcher.newBuilder()
-                                .expectAnyRecord(SAA_GRANT_TIME_HISTOGRAM)
-                                .build();
-                TestWebServer includeServer =
-                        TestWebServer.startAdditional(ASSET_STATEMENT_INCLUDE_PORT)) {
-            // We make sure that the include path returns an include for "http://127.0.0.1
-            includeServer.setResponse(
-                    ASSET_STATEMENT_INCLUDE_PATH,
-                    ASSET_STATEMENT_INCLUDE_CONTENT,
-                    List.of(Pair.create("Content-Type", "application/json")));
-
-            result = requestEmbeddedStorageAccess(/* useLocalhostOrigin= */ false);
-
-            Assert.assertEquals("\"granted\"", result);
-            histogramWatcher.pollInstrumentationThreadUntilSatisfied();
-
-            // Confirm this is resolved against the test server the first time
-            Assert.assertEquals(1, mTestWebServer.getRequestCount(ASSET_STATEMENT_PATH));
-
-            result = requestEmbeddedStorageAccess(/* useLocalhostOrigin= */ false);
-            Assert.assertEquals("\"granted\"", result);
-            // Confirm that subsequent calls are from cached results
-            Assert.assertEquals(1, mTestWebServer.getRequestCount(ASSET_STATEMENT_PATH));
-            // Confirm we only load the include path once
-            Assert.assertEquals(1, includeServer.getRequestCount(ASSET_STATEMENT_INCLUDE_PATH));
-        }
-    }
-
-    @Test
-    @Feature({"AndroidWebView"})
-    @SmallTest
-    @Features.EnableFeatures({AwFeatures.WEBVIEW_AUTO_SAA})
-    @CommandLineFlags.Add({
-        "enable-features=" + AwFeatures.WEBVIEW_DIGITAL_ASSET_LINKS_LOAD_INCLUDES
-    })
-    public void testAutoGrantSAA_untrustedDomain() throws Exception {
-        // We add an asset statement to always trust the test app for auto granting.
-        mTestWebServer.setResponse(
-                ASSET_STATEMENT_PATH,
-                String.format(
-                        ASSET_STATEMENT_TEMPLATE,
-                        ApkInfo.getHostPackageName(),
-                        ApkInfo.getHostSigningCertSha256()),
-                null);
-
-        try (var histogramWatcher =
-                HistogramWatcher.newBuilder().expectNoRecords(SAA_GRANT_TIME_HISTOGRAM).build()) {
-            String result = requestEmbeddedStorageAccess(/* useLocalhostOrigin= */ false);
-            Assert.assertEquals("\"not granted\"", result);
-            histogramWatcher.pollInstrumentationThreadUntilSatisfied();
-        }
-    }
-
-    @Test
-    @Feature({"AndroidWebView"})
-    @SmallTest
-    @Features.EnableFeatures({AwFeatures.WEBVIEW_AUTO_SAA})
-    @CommandLineFlags.Add({
-        "enable-features=" + AwFeatures.WEBVIEW_DIGITAL_ASSET_LINKS_LOAD_INCLUDES
-    })
-    public void testAutoGrantSAA_untrustedApp() throws Exception {
-        // In this test's case, we make the site only trust an app we are not.
-        mTestWebServer.setResponse(
-                ASSET_STATEMENT_PATH,
-                String.format(ASSET_STATEMENT_TEMPLATE, "some other app", "some hash"),
-                null);
-        try (var histogramWatcher =
-                HistogramWatcher.newBuilder().expectAnyRecord(SAA_GRANT_TIME_HISTOGRAM).build()) {
-            String result = requestEmbeddedStorageAccess(/* useLocalhostOrigin= */ true);
-            Assert.assertEquals("\"not granted\"", result);
-            histogramWatcher.pollInstrumentationThreadUntilSatisfied();
-        }
-    }
-
-    /**
-     * Run the test for embedded storage access auto grant.
-     *
-     * @param useLocalhostOrigin {@code true} means that the web site will be loaded using {@code
-     *     http://localhost}, {@code false} means that the WebView will instead load {@code
-     *     http://127.0.0.1}.
-     * @return String sent to {@code domAutomationController}.
-     */
-    private String requestEmbeddedStorageAccess(boolean useLocalhostOrigin) throws Exception {
-        var contentsClient = new TestAwContentsClient();
-        final AwContents awContents =
-                mActivityTestRule
-                        .createAwTestContainerViewOnMainSync(contentsClient)
-                        .getAwContents();
-
-        AwActivityTestRule.enableJavaScriptOnUiThread(awContents);
-
-        // We need to request storage access from within an iframe, otherwise it will
-        // just auto resolve to granted.
-        // The iframe will load, request storage access, and post the result back.
-        var storagePage = mTestWebServer.setResponse("/storage", REQUEST_STORAGE_ACCESS_PAGE, null);
-        var parentPage = mTestWebServer.setResponse("/", IFRAME_PARENT_PAGE, null);
-
-        // The test app trusts localhost. To test a flow where we don't have
-        // the website in our apps asset statement, we can just use a IP address
-        // that the app hasn't declared but still resolves.
-        if (!useLocalhostOrigin) {
-            storagePage = storagePage.replace("localhost", "127.0.0.1");
-            parentPage = parentPage.replace("localhost", "127.0.0.1");
-        }
-
-        mActivityTestRule.loadUrlSync(
-                awContents, contentsClient.getOnPageFinishedHelper(), parentPage);
-
-        // We add an event listener for the result from the iframe and then initiate the page
-        // load.
-        return JavaScriptUtils.runJavascriptWithUserGestureAndAsyncResult(
-                awContents.getWebContents(),
-                String.format(
-                        """
-                                window.addEventListener('message', (e) => {
-                                        domAutomationController.send(e.data)
-                                });
-                                document.querySelector('iframe').src = "%s";""",
-                        storagePage));
-    }
-
     private void pollTitleAs(final String title, final AwContents awContents) {
         AwActivityTestRule.pollInstrumentationThread(
                 () -> title.equals(mActivityTestRule.getTitleOnUiThread(awContents)));
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwPermissionQueryApiTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwPermissionQueryApiTest.java
index c3e0548..ec203409 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwPermissionQueryApiTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwPermissionQueryApiTest.java
@@ -17,7 +17,6 @@
 
 import org.chromium.android_webview.AwContents;
 import org.chromium.android_webview.AwGeolocationPermissions;
-import org.chromium.android_webview.common.AwFeatures;
 import org.chromium.android_webview.test.TestWebMessageListener.Data;
 import org.chromium.android_webview.test.util.CommonResources;
 import org.chromium.base.ResettersForTesting;
@@ -40,7 +39,7 @@
  */
 @RunWith(Parameterized.class)
 @UseParametersRunnerFactory(AwJUnit4ClassRunnerWithParameters.Factory.class)
-@Features.EnableFeatures({ContentFeatures.WEB_PERMISSIONS_API, AwFeatures.WEBVIEW_AUTO_SAA})
+@Features.EnableFeatures({ContentFeatures.WEB_PERMISSIONS_API})
 @Batch(Batch.PER_CLASS)
 public class AwPermissionQueryApiTest extends AwParameterizedTest {
 
@@ -48,23 +47,24 @@
     @SuppressWarnings("InlineFormatString")
     private static final String QUERY_API_PERMISSION =
             """
-          <html>
-          <script>
-          navigator.permissions.query(%s).then((result) => {
-            resultListener.postMessage(result.state);
-          }).catch(e => {
-            if (e instanceof TypeError && e.message.includes("is not enabled")) {
-                resultListener.postMessage("not_enabled");
-            }
-            else if (e instanceof TypeError && e.message.includes("isn't available on Android")) {
-                resultListener.postMessage("not_available");
-            }
-            else {
-                resultListener.postMessage("" + e);
-            }
-          });
-          </script>
-      """;
+                <html>
+                <script>
+                navigator.permissions.query(%s).then((result) => {
+                  resultListener.postMessage(result.state);
+                }).catch(e => {
+                  if (e instanceof TypeError && e.message.includes("is not enabled")) {
+                      resultListener.postMessage("not_enabled");
+                  }
+                  else if (e instanceof TypeError &&
+                           e.message.includes("isn't available on Android")) {
+                      resultListener.postMessage("not_available");
+                  }
+                  else {
+                      resultListener.postMessage("" + e);
+                  }
+                });
+                </script>
+            """;
 
     /**
      * A page that queries geolocation, asks for a position, and then queries the permission state
@@ -72,32 +72,33 @@
      */
     private static final String GEOLOCATION_PAGE_HTML =
             """
-        <!DOCTYPE html>
-        <html>
-          <head>
-            <title>Geolocation</title>
-            <script>
-              function gotPos(position) {
-                resultListener.postMessage("position");
-                navigator.permissions.query({"name": "geolocation"}).then((result) => {
+            <!DOCTYPE html>
+            <html>
+              <head>
+                <title>Geolocation</title>
+                <script>
+                  function gotPos(position) {
+                    resultListener.postMessage("position");
+                    navigator.permissions.query({"name": "geolocation"}).then((result) => {
+                        resultListener.postMessage(result.state);
+                    }).catch(e => resultListener.postMessage("" + e));
+                  }
+                  function errorCallback(error){
+                    resultListener.postMessage("" + error);
+                  }
+                  function initiate_getCurrentPosition() {
+                    navigator.geolocation.getCurrentPosition(gotPos, errorCallback, { });
+                  }
+                  navigator.permissions.query({"name": "geolocation"}).then((result) => {
                     resultListener.postMessage(result.state);
-                }).catch(e => resultListener.postMessage("" + e));
-              }
-              function errorCallback(error){
-                resultListener.postMessage("" + error);
-              }
-              function initiate_getCurrentPosition() {
-                navigator.geolocation.getCurrentPosition(gotPos, errorCallback, { });
-              }
-              navigator.permissions.query({"name": "geolocation"}).then((result) => {
-                resultListener.postMessage(result.state);
-                initiate_getCurrentPosition();
-              }).catch(e => resultListener.postMessage("" + e));
-            </script>
-          </head>
-          <body>
-          </body>
-        </html>""";
+                    initiate_getCurrentPosition();
+                  }).catch(e => resultListener.postMessage("" + e));
+                </script>
+              </head>
+              <body>
+              </body>
+            </html>
+            """;
 
     @Rule public AwActivityTestRule mActivityTestRule;
 
@@ -191,12 +192,6 @@
         runTestCase("geolocation", "prompt");
         runTestCase("microphone", "prompt");
         runTestCase("midi-sysex", "prompt", "{\"name\": \"midi\", \"sysex\": true}");
-        runTestCase("storage-access", "prompt");
-        runTestCase(
-                "top-level-storage-access",
-                "prompt",
-                "{\"name\": \"top-level-storage-access\", \"requestedOrigin\":"
-                        + " \"https://example.com\"}");
     }
 
     @Test
@@ -222,6 +217,12 @@
                 "fullscreen",
                 "denied",
                 "{\"name\": \"fullscreen\", \"allowWithoutGesture\": true}");
+        runTestCase("storage-access", "denied");
+        runTestCase(
+                "top-level-storage-access",
+                "denied",
+                "{\"name\": \"top-level-storage-access\", \"requestedOrigin\":"
+                        + " \"https://example.com\"}");
     }
 
     @Test
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerDisabledPartitioningTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerDisabledPartitioningTest.java
index 91346e9..f0d1785 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerDisabledPartitioningTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerDisabledPartitioningTest.java
@@ -21,12 +21,10 @@
 
 import org.chromium.android_webview.AwContents;
 import org.chromium.android_webview.AwCookieManager;
-import org.chromium.android_webview.common.AwFeatures;
 import org.chromium.android_webview.test.CookieManagerTest.IframeCookieSupplier;
 import org.chromium.android_webview.test.util.CookieUtils;
 import org.chromium.base.test.util.DoNotBatch;
 import org.chromium.base.test.util.Feature;
-import org.chromium.base.test.util.Features;
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.net.test.util.TestWebServer;
 
@@ -189,14 +187,14 @@
 
             String iframeWithNetRequest =
                     """
-                <html>
-                <body>
-                <!-- Force a network request to happen from the iframe with a navigation so -->
-                <!-- that we can intercept it and see which cookies were attached -->
-                <img src="/path_to_intercept" >
-                </body>
-                </html>
-                """;
+                    <html>
+                    <body>
+                    <!-- Force a network request to happen from the iframe with a navigation so -->
+                    <!-- that we can intercept it and see which cookies were attached -->
+                    <img src="/path_to_intercept" >
+                    </body>
+                    </html>
+                    """;
             String iframeUrl = webServer.setResponse("/", iframeWithNetRequest, responseHeaders);
             // We don't need this to do anything fancy, we just need the path to exist
             webServer.setResponse("/path_to_intercept", "hello", responseHeaders);
@@ -238,7 +236,6 @@
     @Test
     @MediumTest
     @Feature({"AndroidWebView", "Privacy"})
-    @Features.EnableFeatures({AwFeatures.WEBVIEW_AUTO_SAA})
     public void testDisabledPartitionedJSCookies() throws Throwable {
         String partitionedCookie = "partitioned-cookie=123";
         String unpartitionedCookie = "regular-cookie=456";
@@ -266,13 +263,12 @@
                     "cookieResults");
 
             IframeCookieSupplier iframeCookiesSupplier =
-                    (boolean requestStorageAccess) -> {
+                    () -> {
                         String iframeUrl =
                                 CookieManagerTest.toThirdPartyUrl(
                                         CookieManagerTest.makeCookieScriptResultsUrl(
                                                 webServer,
                                                 "/iframe.html",
-                                                requestStorageAccess,
                                                 partitionedCookie
                                                         + "; Secure; Path=/; SameSite=None;"
                                                         + " Partitioned;",
@@ -301,24 +297,19 @@
             Assert.assertEquals(
                     "Partitioned cookies should not be returned while CHIPS is disabled",
                     "",
-                    iframeCookiesSupplier.get(/* requestStorageAccess= */ false));
-
-            Assert.assertEquals(
-                    "All cookies should be returned when SAA is requested.",
-                    partitionedCookie + "; " + unpartitionedCookie,
-                    iframeCookiesSupplier.get(/* requestStorageAccess= */ true));
+                    iframeCookiesSupplier.get());
 
             allowThirdPartyCookies(mAwContents);
             Assert.assertEquals(
                     "All cookies should be returned when 3PCs are enabled",
                     partitionedCookie + "; " + unpartitionedCookie,
-                    iframeCookiesSupplier.get(/* requestStorageAccess= */ false));
+                    iframeCookiesSupplier.get());
 
             blockAllCookies();
             Assert.assertEquals(
                     "No cookies should ever be returned if all cookies are disabled",
                     "",
-                    iframeCookiesSupplier.get(/* requestStorageAccess= */ false));
+                    iframeCookiesSupplier.get());
         } finally {
             webServer.shutdown();
         }
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerTest.java
index 7cc6ebc..09b67a06 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerTest.java
@@ -30,7 +30,6 @@
 import org.chromium.android_webview.AwContents;
 import org.chromium.android_webview.AwCookieManager;
 import org.chromium.android_webview.AwSettings;
-import org.chromium.android_webview.common.AwFeatures;
 import org.chromium.android_webview.common.AwSwitches;
 import org.chromium.android_webview.test.util.CookieUtils;
 import org.chromium.android_webview.test.util.CookieUtils.TestCallback;
@@ -41,7 +40,6 @@
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.DoNotBatch;
 import org.chromium.base.test.util.Feature;
-import org.chromium.base.test.util.Features;
 import org.chromium.base.test.util.HistogramWatcher;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.content_public.browser.test.util.JavaScriptUtils;
@@ -1340,7 +1338,6 @@
     @Test
     @MediumTest
     @Feature({"AndroidWebView", "Privacy"})
-    @Features.EnableFeatures({AwFeatures.WEBVIEW_AUTO_SAA})
     public void testPartitionedJSCookies() throws Throwable {
         String partitionedCookie = "partitioned-cookie=123";
         String unpartitionedCookie = "regular-cookie=456";
@@ -1368,13 +1365,12 @@
                     "cookieResults");
 
             IframeCookieSupplier iframeCookiesSupplier =
-                    (boolean requestStorageAccess) -> {
+                    () -> {
                         String iframeUrl =
                                 toThirdPartyUrl(
                                         makeCookieScriptResultsUrl(
                                                 webServer,
                                                 "/iframe.html",
-                                                requestStorageAccess,
                                                 partitionedCookie
                                                         + "; Secure; Path=/; SameSite=None;"
                                                         + " Partitioned;",
@@ -1401,195 +1397,19 @@
             Assert.assertEquals(
                     "Only partitioned cookies should be returned when 3PCs are disabled",
                     partitionedCookie,
-                    iframeCookiesSupplier.get(/* requestStorageAccess= */ false));
-
-            Assert.assertEquals(
-                    "All cookies should be returned when SAA requested",
-                    partitionedCookie + "; " + unpartitionedCookie,
-                    iframeCookiesSupplier.get(/* requestStorageAccess= */ true));
+                    iframeCookiesSupplier.get());
 
             allowThirdPartyCookies(mAwContents);
             Assert.assertEquals(
                     "All cookies should be returned when 3PCs are enabled",
                     partitionedCookie + "; " + unpartitionedCookie,
-                    iframeCookiesSupplier.get(/* requestStorageAccess= */ false));
+                    iframeCookiesSupplier.get());
 
             blockAllCookies();
             Assert.assertEquals(
                     "No cookies should ever be returned if all cookies are disabled",
                     "",
-                    iframeCookiesSupplier.get(/* requestStorageAccess= */ false));
-        } finally {
-            webServer.shutdown();
-        }
-    }
-
-    @Test
-    @MediumTest
-    @Feature({"AndroidWebView", "Privacy"})
-    @Features.EnableFeatures({AwFeatures.WEBVIEW_AUTO_SAA})
-    public void testAutoStorageAccessNetCookies() throws Throwable {
-        TestWebServer webServer = TestWebServer.start();
-        addServerAssetLinks(webServer);
-
-        // This test suite relies on an image to force a network request that has cookies attached.
-        // The AwParameterizedTest will disable this setting so force enabling it again so that
-        // we can still test the rest of the parameterized test settings.
-        mAwContents.getSettings().setImagesEnabled(true);
-
-        try {
-            // We want to wait for the page to first have access
-            // to SAA and make a net request before we check for anything
-            // so we will add this API to let us know when the test
-            // has tried the net request.
-            var pageLoadFuture = SettableFuture.create();
-            AwActivityTestRule.addJavascriptInterfaceOnUiThread(
-                    mAwContents,
-                    new Object() {
-                        @JavascriptInterface
-                        public void done() {
-                            pageLoadFuture.set(null);
-                        }
-                    },
-                    "pageLoader");
-
-            // This iframe will request SAA, then try set a cookie, and then
-            // finally initiate a network request where we should see the 3PC
-            // attached.
-            // We listen for the onerror event on the image because we are making
-            // a request to a resource that doesn't actually exist, all we care about
-            // is the outgoing request.
-            String iframeWithNetRequest =
-                    """
-                    <html>
-                    <body>
-                    <img>
-                    <script>
-
-                    document.requestStorageAccess().then(() => {
-                        const image = document.querySelector("img");
-                        document.cookie = "foo=bar;";
-                        image.onerror = () => {
-                            pageLoader.done();
-                        };
-                        image.src = "/path_to_intercept";
-                    });
-                    </script>
-                    </body>
-                    </html>
-                    """;
-            String iframeUrl =
-                    toThirdPartyUrl(webServer.setResponse("/", iframeWithNetRequest, null));
-            // We don't need this to do anything fancy, we just need the path to exist
-            webServer.setResponse("/path_to_intercept", "hello", null);
-
-            String url = makeIframeUrl(webServer, "/parent.html", iframeUrl);
-
-            allowFirstPartyCookies();
-            blockThirdPartyCookies(mAwContents);
-
-            mActivityTestRule.loadUrlSync(
-                    mAwContents, mContentsClient.getOnPageFinishedHelper(), url);
-
-            AwActivityTestRule.waitForFuture(pageLoadFuture);
-
-            Assert.assertEquals(
-                    "Cookies should have been attached to the request after receiving storage"
-                            + " access.",
-                    "foo=bar",
-                    webServer.getLastRequest("/path_to_intercept").headerValue("Cookie"));
-        } finally {
-            webServer.shutdown();
-        }
-    }
-
-    @Test
-    @MediumTest
-    @Feature({"AndroidWebView", "Privacy"})
-    @Features.EnableFeatures({AwFeatures.WEBVIEW_AUTO_SAA})
-    public void testAutoStorageAccessNotAllFrames() throws Throwable {
-        // This test confirms that when one frame is granted storage access,
-        // it is not granted to all frames from that site.
-        // It does this by:
-        // - loading an iframe
-        //   - requesting storage access in this frame
-        //   - then triggering a new iframe to be loaded at the top level
-        // - from the new iframe of the same site, try set a 3PC and report it
-        //
-        // That 3PC is expected to not be set because the second iframe should
-        // not have storage access granted.
-        TestWebServer webServer = TestWebServer.start();
-        SettableFuture<Void> storageAccessFuture = SettableFuture.create();
-        SettableFuture<String> secondFrameCookieFuture = SettableFuture.create();
-        addServerAssetLinks(webServer);
-
-        AwActivityTestRule.addJavascriptInterfaceOnUiThread(
-                mAwContents,
-                new Object() {
-                    @JavascriptInterface
-                    public void done() {
-                        storageAccessFuture.set(null);
-                    }
-
-                    @JavascriptInterface
-                    public void reportCookies(String cookie) {
-                        secondFrameCookieFuture.set(cookie);
-                    }
-                },
-                "testInterface");
-
-        try {
-            String iframeWithNetRequest =
-                    """
-                    <html><body><script>
-                    document.requestStorageAccess().then(() => {
-                        testInterface.done();
-                    });
-                    </script></body></html>
-                    """;
-            String iframeUrl =
-                    toThirdPartyUrl(webServer.setResponse("/", iframeWithNetRequest, null));
-            String url = makeIframeUrl(webServer, "/parent.html", iframeUrl);
-
-            allowFirstPartyCookies();
-            blockThirdPartyCookies(mAwContents);
-
-            mActivityTestRule.loadUrlSync(
-                    mAwContents, mContentsClient.getOnPageFinishedHelper(), url);
-
-            // Wait until the first iframe has storage access granted...
-            AwActivityTestRule.waitForFuture(storageAccessFuture);
-
-            // Once we have granted storage access to one frame, we then load another frame to
-            // ensure that we don't share storage access across all frames.
-            // This frame should not have access to unpartitioned cookies
-            // and so should not report any cookies after attempting to set them.
-            String reportCookies =
-                    """
-                    <html><body><script>
-                    document.cookie="blah=hello;";
-                    testInterface.reportCookies(document.cookie);
-                    </script></body></html>
-                    """;
-
-            String secondFrameUrl =
-                    toThirdPartyUrl(webServer.setResponse("/", reportCookies, null));
-
-            JavaScriptUtils.executeJavaScript(
-                    mAwContents.getWebContents(),
-                    String.format(
-                            """
-                        const secondFrame = document.createElement("iframe");
-                        secondFrame.src="%s";
-                        document.body.appendChild(secondFrame);""",
-                            secondFrameUrl));
-
-            String secondFrameCookieString =
-                    AwActivityTestRule.waitForFuture(secondFrameCookieFuture);
-            Assert.assertEquals(
-                    "Second frame should not have storage access granted.",
-                    "",
-                    secondFrameCookieString);
+                    iframeCookiesSupplier.get());
         } finally {
             webServer.shutdown();
         }
@@ -2062,23 +1882,14 @@
      * @return the url which gets the response
      */
     public static String makeCookieScriptResultsUrl(
-            TestWebServer webServer, String path, boolean requestStorageAccess, String... cookies) {
+            TestWebServer webServer, String path, String... cookies) {
         String response = "<html><body><script>";
 
-        if (requestStorageAccess) {
-            response += "document.requestStorageAccess().then(() => {";
-        }
-
         for (String cookie : cookies) {
             response += String.format("document.cookie='%s';", cookie);
         }
 
         response += "cookieResults.report(document.cookie);";
-
-        if (requestStorageAccess) {
-            response += "}).catch((e) => cookieResults.report('Failed to retrieve ' + e));";
-        }
-
         response += "</script></body></html>";
 
         return webServer.setResponse(path, response, null);
@@ -2300,6 +2111,6 @@
     }
 
     interface IframeCookieSupplier {
-        String get(boolean requestStorageAccess);
+        String get();
     }
 }
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/TestAwNavigationListener.java b/android_webview/javatests/src/org/chromium/android_webview/test/TestAwNavigationListener.java
index 1e01340..13b577f 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/TestAwNavigationListener.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/TestAwNavigationListener.java
@@ -24,6 +24,7 @@
     private final List<AwPage> mPagesWithLoadEventFired = new ArrayList<AwPage>();
     private final List<AwPage> mPagesWithDOMContentLoadEventFired = new ArrayList<AwPage>();
     private final List<Long> mFirstContentfulPaintLoadTimes = new ArrayList<Long>();
+    private final List<PerformanceMark> mPerformanceMarks = new ArrayList<PerformanceMark>();
 
     public TestAwNavigationListener() {}
 
@@ -77,6 +78,10 @@
         return mFirstContentfulPaintLoadTimes.get(mFirstContentfulPaintLoadTimes.size() - 1);
     }
 
+    @Nullable List<PerformanceMark> getPerformanceMarks() {
+        return mPerformanceMarks;
+    }
+
     @Override
     public /* WebViewNavigationClient */ InvocationHandler getSupportLibInvocationHandler() {
         return null;
@@ -146,4 +151,19 @@
     public void onFirstContentfulPaint(AwPage page, long loadTimeUs) {
         mFirstContentfulPaintLoadTimes.add(loadTimeUs);
     }
+
+    @Override
+    public void onPerformanceMark(AwPage page, String markName, long markTimeMs) {
+        mPerformanceMarks.add(new PerformanceMark(markName, markTimeMs));
+    }
+
+    public static class PerformanceMark {
+        public String markName;
+        public long markTimeMs;
+
+        public PerformanceMark(String name, long timeMs) {
+            markName = name;
+            markTimeMs = timeMs;
+        }
+    }
 }
diff --git a/android_webview/junit/src/org/chromium/android_webview/robolectric/metrics/AwSiteVisitLoggerTest.java b/android_webview/junit/src/org/chromium/android_webview/robolectric/metrics/AwSiteVisitLoggerTest.java
index c0fe8d4..150de941 100644
--- a/android_webview/junit/src/org/chromium/android_webview/robolectric/metrics/AwSiteVisitLoggerTest.java
+++ b/android_webview/junit/src/org/chromium/android_webview/robolectric/metrics/AwSiteVisitLoggerTest.java
@@ -21,7 +21,6 @@
 import org.chromium.base.TimeUtils;
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.base.test.util.Feature;
-import org.chromium.base.test.util.HistogramWatcher;
 
 /** Unit tests for {@link AwSiteVisitLogger}. */
 @RunWith(BaseRobolectricTestRunner.class)
@@ -34,8 +33,6 @@
     private static final long SITE_HASH_B = 3169559102L;
     private static final long SITE_HASH_C = 1894809809L;
     private static final String HISTOGRAM_NAME = "Android.WebView.SitesVisitedWeekly";
-    private static final String RELATED_HISTOGRAM_NAME =
-            "Android.WebView.RelatedSitesVisitedWeekly";
 
     @Rule public FakeTimeTestRule mFakeTimeTestRule = new FakeTimeTestRule();
 
@@ -44,13 +41,12 @@
     @Feature({"AndroidWebView"})
     public void testOneVisit() {
         // Visiting one distinct site does not trigger histogram recording.
-        AwSiteVisitLogger.logVisit(SITE_HASH_A, false);
+        AwSiteVisitLogger.logVisit(SITE_HASH_A);
         assertEquals(0, getHistogramTotalCountForTesting(HISTOGRAM_NAME));
 
         // Next week when an site is visited the previous visits are counted and recorded.
         mFakeTimeTestRule.advanceMillis(MILLIS_PER_WEEK);
-        AwSiteVisitLogger.logVisit(SITE_HASH_B, false);
-        assertEquals(0, getHistogramTotalCountForTesting(RELATED_HISTOGRAM_NAME));
+        AwSiteVisitLogger.logVisit(SITE_HASH_B);
         assertEquals(1, getHistogramTotalCountForTesting(HISTOGRAM_NAME));
     }
 
@@ -58,21 +54,16 @@
     @SmallTest
     @Feature({"AndroidWebView"})
     public void testTwoVisits() {
-        HistogramWatcher relatedExpectation =
-                HistogramWatcher.newSingleRecordWatcher(RELATED_HISTOGRAM_NAME, 1);
-
         // Visiting two distinct sites does not trigger histogram recording.
-        AwSiteVisitLogger.logVisit(SITE_HASH_A, false);
-        AwSiteVisitLogger.logVisit(SITE_HASH_B, true);
+        AwSiteVisitLogger.logVisit(SITE_HASH_A);
+        AwSiteVisitLogger.logVisit(SITE_HASH_B);
         assertEquals(0, getHistogramTotalCountForTesting(HISTOGRAM_NAME));
 
         // Next week when an site is visited the previous visits are counted and recorded.
         mFakeTimeTestRule.advanceMillis(MILLIS_PER_WEEK);
-        AwSiteVisitLogger.logVisit(SITE_HASH_A, false);
+        AwSiteVisitLogger.logVisit(SITE_HASH_A);
         assertEquals(1, getHistogramTotalCountForTesting(HISTOGRAM_NAME));
         assertEquals(1, getHistogramValueCountForTesting(HISTOGRAM_NAME, 2));
-
-        relatedExpectation.assertExpected();
     }
 
     @Test
@@ -80,14 +71,14 @@
     @Feature({"AndroidWebView"})
     public void testRepeatVisits() {
         // Visiting one distinct site repeatedly does not trigger histogram recording.
-        AwSiteVisitLogger.logVisit(SITE_HASH_A, false);
-        AwSiteVisitLogger.logVisit(SITE_HASH_A, false);
+        AwSiteVisitLogger.logVisit(SITE_HASH_A);
+        AwSiteVisitLogger.logVisit(SITE_HASH_A);
         assertEquals(0, getHistogramTotalCountForTesting(HISTOGRAM_NAME));
 
         // Next day when an site is visited the previous visits are counted and recorded.
         // Only one unique visit will be recorded.
         mFakeTimeTestRule.advanceMillis(MILLIS_PER_WEEK);
-        AwSiteVisitLogger.logVisit(SITE_HASH_B, false);
+        AwSiteVisitLogger.logVisit(SITE_HASH_B);
         assertEquals(1, getHistogramTotalCountForTesting(HISTOGRAM_NAME));
         assertEquals(1, getHistogramValueCountForTesting(HISTOGRAM_NAME, 1));
     }
@@ -97,13 +88,13 @@
     @Feature({"AndroidWebView"})
     public void testMultipleWeeksHavePassed() {
         // Visiting one distinct site does not trigger histogram recording.
-        AwSiteVisitLogger.logVisit(SITE_HASH_A, false);
+        AwSiteVisitLogger.logVisit(SITE_HASH_A);
         assertEquals(0, getHistogramTotalCountForTesting(HISTOGRAM_NAME));
 
         // It does not matter how much time passes, it could be multiple days. The logic is that the
         // first time any site is visited after a week has passed, the histogram is recorded.
         mFakeTimeTestRule.advanceMillis(MILLIS_PER_WEEK * 3);
-        AwSiteVisitLogger.logVisit(SITE_HASH_B, false);
+        AwSiteVisitLogger.logVisit(SITE_HASH_B);
         assertEquals(1, getHistogramTotalCountForTesting(HISTOGRAM_NAME));
         assertEquals(1, getHistogramValueCountForTesting(HISTOGRAM_NAME, 1));
     }
@@ -113,28 +104,28 @@
     @Feature({"AndroidWebView"})
     public void testMultipleWeeksOfUsage() {
         // Visit one site.
-        AwSiteVisitLogger.logVisit(SITE_HASH_A, false);
+        AwSiteVisitLogger.logVisit(SITE_HASH_A);
         assertEquals(0, getHistogramTotalCountForTesting(HISTOGRAM_NAME));
 
         // One week passes, and three sites are visited.
         mFakeTimeTestRule.advanceMillis(MILLIS_PER_WEEK);
-        AwSiteVisitLogger.logVisit(SITE_HASH_A, false);
-        AwSiteVisitLogger.logVisit(SITE_HASH_B, false);
-        AwSiteVisitLogger.logVisit(SITE_HASH_C, false);
+        AwSiteVisitLogger.logVisit(SITE_HASH_A);
+        AwSiteVisitLogger.logVisit(SITE_HASH_B);
+        AwSiteVisitLogger.logVisit(SITE_HASH_C);
         assertEquals(1, getHistogramTotalCountForTesting(HISTOGRAM_NAME));
         assertEquals(1, getHistogramValueCountForTesting(HISTOGRAM_NAME, 1));
 
         // A second week passes, and one site is visited.
         mFakeTimeTestRule.advanceMillis(MILLIS_PER_WEEK);
-        AwSiteVisitLogger.logVisit(SITE_HASH_A, false);
+        AwSiteVisitLogger.logVisit(SITE_HASH_A);
         assertEquals(2, getHistogramTotalCountForTesting(HISTOGRAM_NAME));
         assertEquals(1, getHistogramValueCountForTesting(HISTOGRAM_NAME, 1));
         assertEquals(1, getHistogramValueCountForTesting(HISTOGRAM_NAME, 3));
 
         // A third week passes, and two sites are visited.
         mFakeTimeTestRule.advanceMillis(MILLIS_PER_WEEK);
-        AwSiteVisitLogger.logVisit(SITE_HASH_A, false);
-        AwSiteVisitLogger.logVisit(SITE_HASH_B, false);
+        AwSiteVisitLogger.logVisit(SITE_HASH_A);
+        AwSiteVisitLogger.logVisit(SITE_HASH_B);
         assertEquals(3, getHistogramTotalCountForTesting(HISTOGRAM_NAME));
         assertEquals(2, getHistogramValueCountForTesting(HISTOGRAM_NAME, 1));
         assertEquals(1, getHistogramValueCountForTesting(HISTOGRAM_NAME, 3));
diff --git a/android_webview/support_library/boundary_interfaces/AndroidManifest.xml b/android_webview/support_library/boundary_interfaces/AndroidManifest.xml
new file mode 100644
index 0000000..c451914
--- /dev/null
+++ b/android_webview/support_library/boundary_interfaces/AndroidManifest.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2012 The Chromium Authors
+  Use of this source code is governed by a BSD-style license that can be
+  found in the LICENSE file.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="no.manifest.configured"
+    android:versionCode="1"
+    android:versionName="1.0">
+    <!--
+      This is to verify that the boundary interfaces compile and lint correctly
+      against the minSdkVersion of the webkit AndroidX module. This needs to be
+      hardcoded to exactly match whatever AndroidX uses for their minSdkVersion,
+      and we should update this number as AndroidX changes their minSdkVersion.
+      See http://crbug.com/828184 for more details.
+    -->
+    <uses-sdk android:minSdkVersion="23"/>
+</manifest>
diff --git a/android_webview/support_library/boundary_interfaces/BUILD.gn b/android_webview/support_library/boundary_interfaces/BUILD.gn
index d1e4f1df..c121bab 100644
--- a/android_webview/support_library/boundary_interfaces/BUILD.gn
+++ b/android_webview/support_library/boundary_interfaces/BUILD.gn
@@ -80,15 +80,8 @@
 android_apk("boundary_interface_example_apk") {
   apk_name = "BoundaryInterfaceExample"
 
-  # Use a placeholder android manifest since this code is copied to androidx.
-  android_manifest = "//build/android/AndroidManifest.xml"
-
-  # This is to verify that the boundary interfaces compile and lint correctly
-  # against the minSdkVersion of the webkit AndroidX module. This needs to be
-  # hardcoded to exactly match whatever AndroidX uses for their minSdkVersion,
-  # and we should update this number as AndroidX changes their minSdkVersion.
-  # See http://crbug.com/828184 for more details.
-  lint_min_sdk_version = 23
+  # Use a custom AndroidManifest.xml to specify minSdkVersion.
+  android_manifest = "AndroidManifest.xml"
 
   # Explicitly enable lint for this apk.
   enable_lint = true
diff --git a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewNavigationClientAdapter.java b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewNavigationClientAdapter.java
index 9906599..85d08be 100644
--- a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewNavigationClientAdapter.java
+++ b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewNavigationClientAdapter.java
@@ -114,4 +114,8 @@
                 BoundaryInterfaceReflectionUtil.createInvocationHandlerFor(
                         new SupportLibWebViewPageAdapter(page)));
     }
+
+    // TODO: crbug.com/432696062 - Implement AndroidX methods
+    @Override
+    public void onPerformanceMark(AwPage page, String markName, long markNameMs) {}
 }
diff --git a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewNavigationListenerAdapter.java b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewNavigationListenerAdapter.java
index c9c0d4124..f3028a9 100644
--- a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewNavigationListenerAdapter.java
+++ b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewNavigationListenerAdapter.java
@@ -145,4 +145,8 @@
                                         new SupportLibWebViewPageAdapter(page)),
                                 loadTimeUs));
     }
+
+    // TODO: crbug.com/432696062 - Implement AndroidX methods
+    @Override
+    public void onPerformanceMark(AwPage page, String markName, long markNameMs) {}
 }
diff --git a/android_webview/test/BUILD.gn b/android_webview/test/BUILD.gn
index df34019..475b848d 100644
--- a/android_webview/test/BUILD.gn
+++ b/android_webview/test/BUILD.gn
@@ -465,6 +465,7 @@
     "../javatests/src/org/chromium/android_webview/test/AwMediaIntegrityApiTest.java",
     "../javatests/src/org/chromium/android_webview/test/AwMetricsIntegrationTest.java",
     "../javatests/src/org/chromium/android_webview/test/AwMetricsLogUploaderTest.java",
+    "../javatests/src/org/chromium/android_webview/test/AwNavigationClientTest.java",
     "../javatests/src/org/chromium/android_webview/test/AwNetworkConfigurationTest.java",
     "../javatests/src/org/chromium/android_webview/test/AwPacProcessorTest.java",
     "../javatests/src/org/chromium/android_webview/test/AwPageLoadMetricsTest.java",
@@ -842,8 +843,6 @@
   data = [ "data/" ]
 
   sources = [
-    "../browser/aw_app_defined_websites_unittest.cc",
-    "../browser/aw_asset_domain_list_include_handler_unittest.cc",
     "../browser/aw_browser_context_unittest.cc",
     "../browser/aw_client_hints_controller_delegate_unittest.cc",
     "../browser/aw_content_browser_client_unittest.cc",
diff --git a/android_webview/test/data/web_tests/webexposed/global-interface-listing-expected.txt b/android_webview/test/data/web_tests/webexposed/global-interface-listing-expected.txt
index 0b5d1ee..7826e37 100644
--- a/android_webview/test/data/web_tests/webexposed/global-interface-listing-expected.txt
+++ b/android_webview/test/data/web_tests/webexposed/global-interface-listing-expected.txt
@@ -7856,6 +7856,7 @@
     getter fingerprint
     getter fingerprintDigestAlgorithm
     getter onicecandidate
+    getter onwritablechange
     method addRemoteCandidate
     method constructor
     method getReceivedPackets
@@ -7863,6 +7864,7 @@
     method setRemoteDtlsParameters
     method writable
     setter onicecandidate
+    setter onwritablechange
 interface RtcTransportIceCandidate
     attribute @@toStringTag
     getter address
diff --git a/android_webview/tools/system_webview_shell/lint-baseline.xml b/android_webview/tools/system_webview_shell/lint-baseline.xml
index 141e4a5..9505cba 100644
--- a/android_webview/tools/system_webview_shell/lint-baseline.xml
+++ b/android_webview/tools/system_webview_shell/lint-baseline.xml
@@ -35,14 +35,98 @@
     </issue>
 
     <issue
-        id="HardcodedDebugMode"
-        message="Avoid hardcoding the debug mode; leaving it out allows debug and release builds to automatically assign one"
-        errorLine1="  &lt;application android:icon=&quot;@drawable/ic_launcher&quot; android:label=&quot;@string/app_name&quot; android:theme=&quot;@style/ShellTheme&quot; android:enableOnBackInvokedCallback=&quot;true&quot; android:networkSecurityConfig=&quot;@xml/network_security_config&quot; android:debuggable=&quot;true&quot;>"
-        errorLine2="                                                                                                                                                                                                                               ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        id="UnusedResources"
+        message="The resource `R.xml.ad_services_config` appears to be unused"
+        errorLine1="&lt;ad-services-config>"
+        errorLine2="^">
         <location
-            file="gen/android_webview/tools/system_webview_shell/system_webview_shell_apk__lint/AndroidManifest.xml"
-            line="117"
-            column="224"/>
+            file="../../android_webview/tools/system_webview_shell/apk/res/xml/ad_services_config.xml"
+            line="8"
+            column="1"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.drawable.ic_launcher` appears to be unused">
+        <location
+            file="../../android_webview/tools/system_webview_shell/apk/res/drawable-mdpi/ic_launcher.png"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.xml.network_security_config` appears to be unused"
+        errorLine1="&lt;network-security-config>"
+        errorLine2="^">
+        <location
+            file="../../android_webview/tools/system_webview_shell/apk/res/xml/network_security_config.xml"
+            line="6"
+            column="1"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.app_name` appears to be unused"
+        errorLine1="    &lt;string name=&quot;app_name&quot;>WebView Shell&lt;/string>"
+        errorLine2="            ~~~~~~~~~~~~~~~">
+        <location
+            file="../../android_webview/tools/system_webview_shell/apk/res/values/strings.xml"
+            line="8"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.title_activity_browser_second_process` appears to be unused"
+        errorLine1="    &lt;string name=&quot;title_activity_browser_second_process&quot;>Second Process Browser Tester&lt;/string>"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../android_webview/tools/system_webview_shell/apk/res/values/strings.xml"
+            line="13"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.title_activity_layout_test` appears to be unused"
+        errorLine1="    &lt;string name=&quot;title_activity_layout_test&quot;>WebView Layout Test&lt;/string>"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../android_webview/tools/system_webview_shell/apk/res/values/strings.xml"
+            line="14"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.title_activity_thread_test` appears to be unused"
+        errorLine1="    &lt;string name=&quot;title_activity_thread_test&quot;>WebView Thread Test&lt;/string>"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../android_webview/tools/system_webview_shell/apk/res/values/strings.xml"
+            line="16"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.title_activity_page_cycler` appears to be unused"
+        errorLine1="    &lt;string name=&quot;title_activity_page_cycler&quot;>WebView Page Cycler Test&lt;/string>"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../android_webview/tools/system_webview_shell/apk/res/values/strings.xml"
+            line="17"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.style.ShellTheme` appears to be unused"
+        errorLine1="  &lt;style name=&quot;ShellTheme&quot; parent=&quot;Theme.AppCompat.DayNight.NoActionBar&quot;>"
+        errorLine2="         ~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../android_webview/tools/system_webview_shell/apk/res/values-v17/styles.xml"
+            line="7"
+            column="10"/>
     </issue>
 
     <issue
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb
index 3ba40a9..911836f 100644
--- a/ash/strings/ash_strings_ar.xtb
+++ b/ash/strings/ash_strings_ar.xtb
@@ -1266,7 +1266,7 @@
 <translation id="5229343007215035173">تفعيل/إيقاف شاشة الخصوصية</translation>
 <translation id="5229860525743792999">إزالة <ph name="ITEM_LABEL" /> من المجموعة المقترَحة</translation>
 <translation id="5230516054153933099">نافذة</translation>
-<translation id="5234764350956374838">تجاهل</translation>
+<translation id="5234764350956374838">إغلاق</translation>
 <translation id="523505283826916779">إعدادات إمكانية الدخول</translation>
 <translation id="5238719049014159442">فتح/إغلاق مشغّل التطبيقات</translation>
 <translation id="5240725217819182328">الوصول سريعًا إلى صفحات أو إجراءات معيّنة ضمن التطبيقات المثبَّتة</translation>
diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb
index be13b95..3b56db2 100644
--- a/ash/strings/ash_strings_fr.xtb
+++ b/ash/strings/ash_strings_fr.xtb
@@ -2475,7 +2475,7 @@
 <translation id="954052413789300507">Espace insuffisant pour <ph name="FILENAME" />. Libérez de l'espace.</translation>
 <translation id="954520015070501466">30 min</translation>
 <translation id="956452277966142925">Paramètres du tableau de bord Jeux</translation>
-<translation id="961856697154696964">Supprimer les données de navigation</translation>
+<translation id="961856697154696964">Suppr. données navigation</translation>
 <translation id="974545358917229949">Affichage de <ph name="RESULT_COUNT" /> résultats pour <ph name="QUERY" /></translation>
 <translation id="981011780479609956">Aucune date limite</translation>
 <translation id="98120814841227350">Accéder à la fin du document</translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb
index dcf4f64..5a1f9a7b 100644
--- a/ash/strings/ash_strings_pt-BR.xtb
+++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -1058,7 +1058,7 @@
 <translation id="4545950850562423083">Salvar a página atual como favorita</translation>
 <translation id="4548482551627849548">Mover a janela ativa para o espaço de trabalho à esquerda</translation>
 <translation id="4552748006424994716">Para evitar eco, ouça o microfone apenas quando estiver usando um fone de ouvido com fio.</translation>
-<translation id="4556953949326137018">Quando você usa ações sugeridas, como "adicionar à Agenda" ou "criar um Documentos Google", o conteúdo da área selecionada é enviado aos servidores do Google para sugerir ações e está sujeito aos <ph name="LINK_TO_SERVICE_TERMS" />. Não inclua informações pessoais, sensíveis ou confidenciais.</translation>
+<translation id="4556953949326137018">Quando você usa ações sugeridas, como "adicionar à Agenda" ou "criar um Google Docs", o conteúdo da área selecionada é enviado aos servidores do Google para sugerir ações e está sujeito aos <ph name="LINK_TO_SERVICE_TERMS" />. Não inclua informações pessoais, sensíveis ou confidenciais.</translation>
 <translation id="4560576029703263363">Ativado</translation>
 <translation id="4561267230861221837">3G</translation>
 <translation id="4565377596337484307">Ocultar senha</translation>
@@ -2375,7 +2375,7 @@
 <translation id="8926951137623668982">Estante sempre oculta</translation>
 <translation id="8929566928381252430">Quer usar a tecla Caps Lock? Use</translation>
 <translation id="8929623844713377237">Contato criado</translation>
-<translation id="8934418770423095813">Criar um arquivo do Documentos Google</translation>
+<translation id="8934418770423095813">Criar um arquivo do Google Docs</translation>
 <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 arquivo}one{# arquivo}other{# arquivos}}</translation>
 <translation id="8936501819958976551">desativado</translation>
 <translation id="8938800817013097409">Dispositivo USB-C (porta traseira da direita)</translation>
@@ -2444,7 +2444,7 @@
 <translation id="9168436347345867845">Mais tarde</translation>
 <translation id="9178475906033259337">Exibindo 1 resultado para <ph name="QUERY" /></translation>
 <translation id="9179259655489829027">Este recurso permite acessar rapidamente qualquer usuário conectado sem a necessidade de uma senha. Use esse recurso somente com contas em que você confia.</translation>
-<translation id="9183302530794969518">Documentos Google</translation>
+<translation id="9183302530794969518">Google Docs</translation>
 <translation id="9183456764293710005">Lupa de tela cheia</translation>
 <translation id="9192133205265227850">Usar "<ph name="DEVICE_NAME" />"</translation>
 <translation id="9193626018745640770">Transmitindo para um destinatário desconhecido</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb
index 6397e3a..47b66acd4 100644
--- a/ash/strings/ash_strings_th.xtb
+++ b/ash/strings/ash_strings_th.xtb
@@ -192,7 +192,7 @@
 <translation id="1607312127821884567">ปิดการตั้งค่าการดูแอปของโทรศัพท์</translation>
 <translation id="1610778689852195798">"เลิกทำ"</translation>
 <translation id="1611993646327628135">เปิด</translation>
-<translation id="1612679292338846734">เมื่อเปิดใช้ฟีเจอร์เหล่านี้ ระบบอาจส่งข้อความที่ป้อน เนื้อหาเอกสาร และ URL ของหน้าเว็บไปยังเซิร์ฟเวอร์ AI ของ Google ข้อมูลนี้ใช้เพื่อสร้างคำแนะนำในการเขียน สร้างข้อมูลสรุป ตอบคำถาม และปรับปรุงผลิตภัณฑ์โดยเป็นไปตาม<ph name="LINK_TO_SERVICE_TERMS" /> อย่าระบุสิ่งที่เป็นเรื่องส่วนตัว ข้อมูลที่ละเอียดอ่อน หรือข้อมูลที่เป็นความลับ</translation>
+<translation id="1612679292338846734">เมื่อเปิดใช้ฟีเจอร์เหล่านี้ ระบบอาจส่งข้อความที่ป้อน เนื้อหาเอกสาร และ URL ของหน้าเว็บไปยังเซิร์ฟเวอร์ Google AI ข้อมูลนี้ใช้เพื่อสร้างคำแนะนำในการเขียน สร้างข้อมูลสรุป ตอบคำถาม และปรับปรุงผลิตภัณฑ์โดยเป็นไปตาม<ph name="LINK_TO_SERVICE_TERMS" /> อย่าระบุสิ่งที่เป็นเรื่องส่วนตัว ข้อมูลที่ละเอียดอ่อน หรือข้อมูลที่เป็นความลับ</translation>
 <translation id="1620510694547887537">กล้องถ่ายรูป</translation>
 <translation id="1623768535032616219">ยุบ Google Classroom</translation>
 <translation id="163032029566320584"><ph name="UNAVAILABLE_DLC" /> ไม่พร้อมใช้งาน</translation>
diff --git a/ash/webui/common/resources/bluetooth/bluetooth_pairing_request_code_page.ts b/ash/webui/common/resources/bluetooth/bluetooth_pairing_request_code_page.ts
index 038b3c0..10ad7202 100644
--- a/ash/webui/common/resources/bluetooth/bluetooth_pairing_request_code_page.ts
+++ b/ash/webui/common/resources/bluetooth/bluetooth_pairing_request_code_page.ts
@@ -110,7 +110,6 @@
   private onPairClicked_(event: Event): void {
     event.stopPropagation();
 
-    // TODO(crbug.com/1010321): Show spinner while pairing.
     if (!this.pinCode_) {
       return;
     }
diff --git a/ash/webui/common/resources/sea_pen/sea_pen_recent_wallpapers_element.ts b/ash/webui/common/resources/sea_pen/sea_pen_recent_wallpapers_element.ts
index a4d64fd..7c4d43e 100644
--- a/ash/webui/common/resources/sea_pen/sea_pen_recent_wallpapers_element.ts
+++ b/ash/webui/common/resources/sea_pen/sea_pen_recent_wallpapers_element.ts
@@ -344,8 +344,6 @@
   private async onClickDeleteWallpaper_(event: Event&{
     model: {index: number, image: SeaPenImageId},
   }) {
-    // TODO (b/315069374): confirm if currently set Sea Pen wallpaper can be
-    // removed.
     assert(
         isSeaPenImageId(event.model.image),
         'selected Sea Pen image is a positive number');
diff --git a/ash/webui/media_app_ui/resources/js/launch.ts b/ash/webui/media_app_ui/resources/js/launch.ts
index aaa44ec..28a4213 100644
--- a/ash/webui/media_app_ui/resources/js/launch.ts
+++ b/ash/webui/media_app_ui/resources/js/launch.ts
@@ -123,7 +123,6 @@
 
 /**
  * The current sort order.
- * TODO(crbug.com/40384768): Match the file manager order when launched that way.
  * Note currently this is reassigned in tests.
  */
 
diff --git a/ash/wm/desks/root_window_desk_switch_animator.cc b/ash/wm/desks/root_window_desk_switch_animator.cc
index a1ca307..20d82876 100644
--- a/ash/wm/desks/root_window_desk_switch_animator.cc
+++ b/ash/wm/desks/root_window_desk_switch_animator.cc
@@ -706,8 +706,6 @@
 }
 
 int RootWindowDeskSwitchAnimator::GetXPositionOfScreenshot(int index) {
-  // TODO(crbug.com/1223866): Investigate if we can prevent this higher in the
-  // call stack.
   if (index < 0 || index >= static_cast<int>(screenshot_layers_.size()))
     return 0;
   ui::Layer* layer = screenshot_layers_[index];
diff --git a/ash/wm/lock_state_controller.cc b/ash/wm/lock_state_controller.cc
index a21b99e..9234b6e 100644
--- a/ash/wm/lock_state_controller.cc
+++ b/ash/wm/lock_state_controller.cc
@@ -933,7 +933,6 @@
     return;
   }
 
-  // TODO(b/319921650): Finalize the expected behavior on multi-display.
   auto* root = Shell::GetRootWindowForNewWindows();
 
   // Create a new layer that mirrors the painted wallpaper view layer. Adds it
diff --git a/ash/wm/overview/birch/tab_app_selection_view.h b/ash/wm/overview/birch/tab_app_selection_view.h
index 0ebb15d..d14ef6b3 100644
--- a/ash/wm/overview/birch/tab_app_selection_view.h
+++ b/ash/wm/overview/birch/tab_app_selection_view.h
@@ -17,7 +17,6 @@
 // A selection view that allows users to pick which tabs and apps they want to
 // move to a new desk. Its main child is a scroll view that contains many
 // `TabAppSelectionItemView`'s representing tabs and apps.
-// TODO(http://b/361326120): Add the experimental features view.
 class ASH_EXPORT TabAppSelectionView : public views::BoxLayoutView {
   METADATA_HEADER(TabAppSelectionView, views::BoxLayoutView)
 
diff --git a/ash/wm/overview/overview_session.cc b/ash/wm/overview/overview_session.cc
index 771add6..38945ce 100644
--- a/ash/wm/overview/overview_session.cc
+++ b/ash/wm/overview/overview_session.cc
@@ -277,12 +277,6 @@
                                    OverviewTransition::kEnter);
   }
 
-  // TODO(http://b/326091611): In the case of dragging a window from the shelf
-  // with one window total, this will create the no windows widget. Then, we
-  // will be notified the drag has started and a drop target will be added,
-  // hiding the no windows widget. This all happens before the frame is
-  // presented so it looks ok from the users perspective, but we should avoid
-  // creating it in the first place.
   const bool is_continuous_enter =
       enter_exit_overview_type_ ==
       OverviewEnterExitType::kContinuousAnimationEnterOnScrollUpdate;
diff --git a/ash/wm/overview/overview_session_unittest.cc b/ash/wm/overview/overview_session_unittest.cc
index 7684a6e..9c8aa67 100644
--- a/ash/wm/overview/overview_session_unittest.cc
+++ b/ash/wm/overview/overview_session_unittest.cc
@@ -9389,8 +9389,6 @@
   SnapOneTestWindow(w1.get(), chromeos::WindowStateType::kPrimarySnapped,
                     chromeos::kDefaultSnapRatio);
   VerifySplitViewOverviewSession(w1.get());
-
-  // TODO(b/313505530): Determine when to show the widget.
   EXPECT_FALSE(GetOverviewGridForRoot(root_windows[0])->no_windows_widget());
   EXPECT_FALSE(GetOverviewGridForRoot(root_windows[1])->no_windows_widget());
 
@@ -9405,8 +9403,6 @@
   ASSERT_EQ(chromeos::WindowStateType::kPrimarySnapped,
             window_state->GetStateType());
   VerifySplitViewOverviewSession(w1.get());
-
-  // TODO(b/313505530): Determine when to show the widget.
   EXPECT_FALSE(GetOverviewGridForRoot(root_windows[0])->no_windows_widget());
   EXPECT_FALSE(GetOverviewGridForRoot(root_windows[1])->no_windows_widget());
 }
@@ -9710,7 +9706,6 @@
   std::unique_ptr<aura::Window> w2(CreateAppWindow(gfx::Rect(0, 0, 200, 200)));
   ToggleOverview();
   ASSERT_TRUE(IsInOverviewSession());
-  // TODO(b/313505530): Determine whether to show the widget.
   auto* grid0 = GetOverviewGridForRoot(root_windows[0]);
   auto* grid1 = GetOverviewGridForRoot(root_windows[1]);
   EXPECT_FALSE(grid0->no_windows_widget());
diff --git a/base/allocator/partition_allocator/PRESUBMIT.py b/base/allocator/partition_allocator/PRESUBMIT.py
index 0ea7eee5..5e7e038 100644
--- a/base/allocator/partition_allocator/PRESUBMIT.py
+++ b/base/allocator/partition_allocator/PRESUBMIT.py
@@ -129,23 +129,8 @@
                 (f.LocalPath(), line_number + 1, import_path)))
     return errors;
 
-# partition_alloc still supports C++17, because Skia still uses C++17.
-def CheckCpp17CompatibleHeaders(input_api, output_api):
-    CPP_20_HEADERS = [
-        "barrier",
-        "bit",
-        #"compare",  Three-way comparison may be used under appropriate guards.
-        "format",
-        "numbers",
-        "ranges",
-        "semaphore",
-        "source_location",
-        "span",
-        "stop_token",
-        "syncstream",
-        "version",
-    ]
-
+# partition_alloc uses C++20.
+def CheckCpp20CompatibleHeaders(input_api, output_api):
     CPP_23_HEADERS = [
         "expected",
         "flat_map",
@@ -171,13 +156,6 @@
     for f in input_api.AffectedSourceFiles(sources):
         # for line_number, line in f.ChangedContents():
         for line_number, line in enumerate(f.NewContents()):
-            for header in CPP_20_HEADERS:
-                if not "#include <%s>" % header in line:
-                    continue
-                errors.append(
-                    output_api.PresubmitError(
-                        '%s:%d\nPartitionAlloc disallows C++20 headers: <%s>'
-                        % (f.LocalPath(), line_number + 1, header)))
             for header in CPP_23_HEADERS:
                 if not "#include <%s>" % header in line:
                     continue
@@ -187,50 +165,6 @@
                         % (f.LocalPath(), line_number + 1, header)))
     return errors
 
-def CheckCpp17CompatibleKeywords(input_api, output_api):
-    CPP_20_KEYWORDS = [
-        "concept",
-        "consteval",
-        "constinit",
-        "co_await",
-        "co_return",
-        "co_yield",
-        "requires",
-        "std::hardware_",
-        "std::is_constant_evaluated",
-        "std::bit_cast",
-        "std::midpoint",
-        "std::to_array",
-    ]
-    # Note: C++23 doesn't introduce new keywords.
-
-    sources = lambda affected_file: input_api.FilterSourceFile(
-        affected_file,
-        # compiler_specific.h may use these keywords in guarded macros.
-        files_to_skip=[r'.*partition_alloc_base/compiler_specific\.h'],
-        files_to_check=[_SOURCE_FILE_PATTERN])
-
-    errors = []
-    for f in input_api.AffectedSourceFiles(sources):
-        for line_number, line in f.ChangedContents():
-            for keyword in CPP_20_KEYWORDS:
-                if not keyword in line:
-                    continue
-                # Skip if part of a comment
-                if '//' in line and line.index('//') < line.index(keyword):
-                    continue
-
-                # Make sure there are word separators around the keyword:
-                regex = r'\b%s\b' % keyword
-                if not input_api.re.search(regex, line):
-                    continue
-
-                errors.append(
-                    output_api.PresubmitError(
-                        '%s:%d\nPartitionAlloc disallows C++20 keywords: %s'
-                        % (f.LocalPath(), line_number + 1, keyword)))
-    return errors
-
 # Check `NDEBUG` is not used inside partition_alloc. We prefer to use the
 # buildflags `#if PA_BUILDFLAG(IS_DEBUG)` instead.
 def CheckNoNDebug(input_api, output_api):
diff --git a/base/allocator/partition_allocator/build_config.md b/base/allocator/partition_allocator/build_config.md
index 84951d5..a19b0d8 100644
--- a/base/allocator/partition_allocator/build_config.md
+++ b/base/allocator/partition_allocator/build_config.md
@@ -23,7 +23,7 @@
 ***
 
 *** promo
-PartitionAlloc targets C++17. As the team develops standalone
+PartitionAlloc targets C++20. As the team develops standalone
 PartitionAlloc, this may diverge from what the rest of Chrome browser
 does, as we will be obligated to support external clients that
 may not yet support newer C++ standards.
diff --git a/base/allocator/partition_allocator/external_builds.md b/base/allocator/partition_allocator/external_builds.md
index 34e2c51..aa1d2da 100644
--- a/base/allocator/partition_allocator/external_builds.md
+++ b/base/allocator/partition_allocator/external_builds.md
@@ -48,16 +48,12 @@
 
 External clients create constraints on PartitionAlloc's implementation.
 
-### C++17
+### C++20
 
-PartitionAlloc targets C++17. This is aligned with our first external
-client, PDFium, and may be further constrained by other clients. These
-impositions prevent us from moving in lockstep with Chrome's target
-C++ version.
-
-We do not even have guarantees of backported future features, e.g.
-C++20's designated initializers. Therefore, these cannot ship with
-PartitionAlloc.
+PartitionAlloc targets C++20. This is the lowest common denominator in between
+chrome, pdfium, dawn, angle, v8, skia.
+These impositions prevent us from moving in lockstep with Chrome's target C++
+version.
 
 ### MSVC Support
 
diff --git a/base/allocator/partition_allocator/gn/partition_alloc/BUILD.gn b/base/allocator/partition_allocator/gn/partition_alloc/BUILD.gn
index bdbc217..12b434d2 100644
--- a/base/allocator/partition_allocator/gn/partition_alloc/BUILD.gn
+++ b/base/allocator/partition_allocator/gn/partition_alloc/BUILD.gn
@@ -13,7 +13,7 @@
     "-fvisibility=hidden",
   ]
   cflags_cc = [
-    "-std=c++17",
+    "-std=c++20",
     "-fvisibility-inlines-hidden",
   ]
   cflags_objcc = cflags_cc
diff --git a/base/allocator/partition_allocator/src/partition_alloc/BUILD.gn b/base/allocator/partition_allocator/src/partition_alloc/BUILD.gn
index f475c56..09b5d69 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/BUILD.gn
+++ b/base/allocator/partition_allocator/src/partition_alloc/BUILD.gn
@@ -629,8 +629,6 @@
       "partition_alloc_base/containers/flat_tree.h",
       "partition_alloc_base/cpu.cc",
       "partition_alloc_base/cpu.h",
-      "partition_alloc_base/cxx20_identity.h",
-      "partition_alloc_base/cxx20_is_constant_evaluated.h",
       "partition_alloc_base/cxx_wrapper/algorithm.h",
       "partition_alloc_base/cxx_wrapper/optional.h",
       "partition_alloc_base/debug/alias.cc",
@@ -667,9 +665,6 @@
       "partition_alloc_base/process/process_handle.h",
       "partition_alloc_base/rand_util.cc",
       "partition_alloc_base/rand_util.h",
-      "partition_alloc_base/ranges/algorithm.h",
-      "partition_alloc_base/ranges/functional.h",
-      "partition_alloc_base/ranges/ranges.h",
       "partition_alloc_base/scoped_clear_last_error.h",
       "partition_alloc_base/strings/cstring_builder.cc",
       "partition_alloc_base/strings/cstring_builder.h",
@@ -1025,9 +1020,6 @@
         "partition_alloc_base/logging_pa_unittest.cc",
         "partition_alloc_base/no_destructor_pa_unittest.cc",
         "partition_alloc_base/rand_util_pa_unittest.cc",
-        "partition_alloc_base/ranges/algorithm_pa_unittest.cc",
-        "partition_alloc_base/ranges/functional_pa_unittest.cc",
-        "partition_alloc_base/ranges/ranges_pa_unittest.cc",
         "partition_alloc_base/scoped_clear_last_error_pa_unittest.cc",
         "partition_alloc_base/strings/cstring_builder_pa_unittest.cc",
         "partition_alloc_base/strings/safe_sprintf_pa_unittest.cc",
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/containers/flat_map.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/containers/flat_map.h
index 180c73a2..32d494db 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/containers/flat_map.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/containers/flat_map.h
@@ -18,7 +18,6 @@
 
 #include "partition_alloc/partition_alloc_base/check.h"
 #include "partition_alloc/partition_alloc_base/containers/flat_tree.h"
-#include "partition_alloc/partition_alloc_base/cxx20_identity.h"
 #include "partition_alloc/partition_alloc_base/template_util.h"
 
 namespace partition_alloc::internal::base {
@@ -380,15 +379,15 @@
           class KeyCompare = std::less<>,
           class Container = std::vector<std::pair<Key, Mapped>>,
           class InputContainer,
-          class Projection = base::identity>
+          class Projection = std::identity>
 constexpr flat_map<Key, Mapped, KeyCompare, Container> MakeFlatMap(
     const InputContainer& unprojected_elements,
     const KeyCompare& comp = KeyCompare(),
     const Projection& proj = Projection()) {
   Container elements;
   internal::ReserveIfSupported(elements, unprojected_elements);
-  base::ranges::transform(unprojected_elements, std::back_inserter(elements),
-                          proj);
+  std::ranges::transform(unprojected_elements, std::back_inserter(elements),
+                         proj);
   return flat_map<Key, Mapped, KeyCompare, Container>(std::move(elements),
                                                       comp);
 }
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/containers/flat_map_pa_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/containers/flat_map_pa_unittest.cc
index db1d1b6..7992722c 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/containers/flat_map_pa_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/containers/flat_map_pa_unittest.cc
@@ -9,7 +9,6 @@
 #include <vector>
 
 #include "partition_alloc/partition_alloc_base/containers/flat_map.h"
-#include "partition_alloc/partition_alloc_base/ranges/algorithm.h"
 #include "partition_alloc/partition_alloc_base/test/move_only_int.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/containers/flat_tree.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/containers/flat_tree.h
index 6f86246..16285e5 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/containers/flat_tree.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/containers/flat_tree.h
@@ -20,7 +20,6 @@
 
 #include "partition_alloc/partition_alloc_base/check.h"
 #include "partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "partition_alloc/partition_alloc_base/ranges/algorithm.h"
 
 namespace partition_alloc::internal::base {
 
@@ -41,7 +40,8 @@
   // Being unique implies that there are no adjacent elements that
   // compare equal. So this checks that each element is strictly less
   // than the element after it.
-  return ranges::adjacent_find(range, std::not_fn(comp)) == ranges::end(range);
+  return std::ranges::adjacent_find(range, std::not_fn(comp)) ==
+         std::ranges::end(range);
 }
 
 // This is a convenience trait inheriting from std::true_type if Iterator is at
@@ -678,7 +678,7 @@
 template <class Key, class GetKeyFromValue, class KeyCompare, class Container>
 constexpr auto flat_tree<Key, GetKeyFromValue, KeyCompare, Container>::begin()
     const -> const_iterator {
-  return ranges::begin(body_);
+  return std::ranges::begin(body_);
 }
 
 template <class Key, class GetKeyFromValue, class KeyCompare, class Container>
@@ -695,7 +695,7 @@
 template <class Key, class GetKeyFromValue, class KeyCompare, class Container>
 constexpr auto flat_tree<Key, GetKeyFromValue, KeyCompare, Container>::end()
     const -> const_iterator {
-  return ranges::end(body_);
+  return std::ranges::end(body_);
 }
 
 template <class Key, class GetKeyFromValue, class KeyCompare, class Container>
@@ -1027,7 +1027,7 @@
 auto flat_tree<Key, GetKeyFromValue, KeyCompare, Container>::lower_bound(
     const Key& key) const -> const_iterator {
   KeyValueCompare comp(comp_);
-  return ranges::lower_bound(*this, key, comp);
+  return std::ranges::lower_bound(*this, key, comp);
 }
 
 template <class Key, class GetKeyFromValue, class KeyCompare, class Container>
@@ -1048,7 +1048,7 @@
   const KeyTypeOrK<K>& key_ref = key;
 
   KeyValueCompare comp(comp_);
-  return ranges::lower_bound(*this, key_ref, comp);
+  return std::ranges::lower_bound(*this, key_ref, comp);
 }
 
 template <class Key, class GetKeyFromValue, class KeyCompare, class Container>
@@ -1061,7 +1061,7 @@
 auto flat_tree<Key, GetKeyFromValue, KeyCompare, Container>::upper_bound(
     const Key& key) const -> const_iterator {
   KeyValueCompare comp(comp_);
-  return ranges::upper_bound(*this, key, comp);
+  return std::ranges::upper_bound(*this, key, comp);
 }
 
 template <class Key, class GetKeyFromValue, class KeyCompare, class Container>
@@ -1082,7 +1082,7 @@
   const KeyTypeOrK<K>& key_ref = key;
 
   KeyValueCompare comp(comp_);
-  return ranges::upper_bound(*this, key_ref, comp);
+  return std::ranges::upper_bound(*this, key_ref, comp);
 }
 
 // ----------------------------------------------------------------------------
@@ -1140,6 +1140,7 @@
 // Free functions.
 
 // Erases all elements that match predicate. It has O(size) complexity.
+// Erases all elements that match predicate. It has O(size) complexity.
 template <class Key,
           class GetKeyFromValue,
           class KeyCompare,
@@ -1149,10 +1150,10 @@
     base::internal::flat_tree<Key, GetKeyFromValue, KeyCompare, Container>&
         container,
     Predicate pred) {
-  auto it = ranges::remove_if(container, pred);
-  size_t removed = std::distance(it, container.end());
-  container.erase(it, container.end());
-  return removed;
+  auto removed = std::ranges::remove_if(container, pred);
+  size_t num_removed = removed.size();
+  container.erase(removed.begin(), removed.end());
+  return num_removed;
 }
 
 }  // namespace partition_alloc::internal::base
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/containers/flat_tree_pa_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/containers/flat_tree_pa_unittest.cc
index 8307c82d..d5f9c72 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/containers/flat_tree_pa_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/containers/flat_tree_pa_unittest.cc
@@ -3,7 +3,6 @@
 // found in the LICENSE file.
 
 #include "partition_alloc/partition_alloc_base/containers/flat_tree.h"
-#include "partition_alloc/partition_alloc_base/cxx20_identity.h"
 
 // Following tests are ported and extended tests from libcpp for std::set.
 // They can be found here:
@@ -29,6 +28,7 @@
 // * No tests with min_allocator and no tests counting allocations.
 //   Flat sets currently don't support allocators.
 
+#include <algorithm>
 #include <deque>
 #include <forward_list>
 #include <functional>
@@ -37,7 +37,6 @@
 #include <string>
 #include <vector>
 
-#include "partition_alloc/partition_alloc_base/ranges/algorithm.h"
 #include "partition_alloc/partition_alloc_base/template_util.h"
 #include "partition_alloc/partition_alloc_base/test/gtest_util.h"
 #include "partition_alloc/partition_alloc_base/test/move_only_int.h"
@@ -152,28 +151,28 @@
 // Common test trees.
 template <typename ContainerT>
 using TypedTree = flat_tree<typename ContainerT::value_type,
-                            base::identity,
+                            std::identity,
                             std::less<>,
                             ContainerT>;
 using IntTree = TypedTree<std::vector<int>>;
 using IntPair = std::pair<int, int>;
 using IntPairTree = flat_tree<IntPair,
-                              base::identity,
+                              std::identity,
                               LessByFirst<IntPair>,
                               std::vector<IntPair>>;
 using MoveOnlyTree = flat_tree<MoveOnlyInt,
-                               base::identity,
+                               std::identity,
                                std::less<>,
                                std::vector<MoveOnlyInt>>;
 using EmplaceableTree = flat_tree<Emplaceable,
-                                  base::identity,
+                                  std::identity,
                                   std::less<>,
                                   std::vector<Emplaceable>>;
 using ReversedTree =
-    flat_tree<int, base::identity, std::greater<>, std::vector<int>>;
+    flat_tree<int, std::identity, std::greater<>, std::vector<int>>;
 
 using TreeWithStrangeCompare = flat_tree<int,
-                                         base::identity,
+                                         std::identity,
                                          NonDefaultConstructibleCompare,
                                          std::vector<int>>;
 
@@ -194,7 +193,7 @@
     MoveThrows& operator=(MoveThrows&&) noexcept(false) { return *this; }
   };
 
-  using MoveThrowsTree = flat_tree<MoveThrows, base::identity, std::less<>,
+  using MoveThrowsTree = flat_tree<MoveThrows, std::identity, std::less<>,
                                    std::array<MoveThrows, 1>>;
 
   static_assert(std::is_nothrow_move_constructible_v<IntTree>,
@@ -216,7 +215,7 @@
 
 TEST(PAFlatTree, IncompleteType) {
   struct A {
-    using Tree = flat_tree<A, base::identity, std::less<>, std::vector<A>>;
+    using Tree = flat_tree<A, std::identity, std::less<>, std::vector<A>>;
     int data;
     Tree set_with_incomplete_type;
     Tree::iterator it;
@@ -232,7 +231,7 @@
   using Pair = std::pair<int, int>;
 
   using Tree =
-      flat_tree<Pair, base::identity, LessByFirst<Pair>, std::vector<Pair>>;
+      flat_tree<Pair, std::identity, LessByFirst<Pair>, std::vector<Pair>>;
 
   // Constructors are stable.
   Tree cont({{0, 0}, {1, 0}, {0, 1}, {2, 0}, {0, 2}, {1, 1}});
@@ -380,7 +379,7 @@
   storage.push_back(Pair(2, MoveOnlyInt(1)));
 
   using Tree =
-      flat_tree<Pair, base::identity, LessByFirst<Pair>, std::vector<Pair>>;
+      flat_tree<Pair, std::identity, LessByFirst<Pair>, std::vector<Pair>>;
   Tree tree(std::move(storage));
 
   // The list should be two items long, with only the first "2" saved.
@@ -463,7 +462,7 @@
   storage.push_back(Pair(2, MoveOnlyInt(0)));
 
   using Tree =
-      flat_tree<Pair, base::identity, LessByFirst<Pair>, std::vector<Pair>>;
+      flat_tree<Pair, std::identity, LessByFirst<Pair>, std::vector<Pair>>;
   Tree tree(sorted_unique, std::move(storage));
 
   ASSERT_EQ(2u, tree.size());
@@ -990,7 +989,7 @@
   {
     using T = TemplateConstructor;
 
-    flat_tree<T, base::identity, std::less<>, std::vector<T>> cont;
+    flat_tree<T, std::identity, std::less<>, std::vector<T>> cont;
     T v(0);
 
     auto it = cont.find(v);
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cxx20_identity.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cxx20_identity.h
deleted file mode 100644
index e4b679c..0000000
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cxx20_identity.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2025 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40284755): Remove this and spanify to fix the errors.
-#pragma allow_unsafe_buffers
-#endif
-#ifndef PARTITION_ALLOC_PARTITION_ALLOC_BASE_CXX20_IDENTITY_H_
-#define PARTITION_ALLOC_PARTITION_ALLOC_BASE_CXX20_IDENTITY_H_
-
-#include <iterator>
-#include <type_traits>
-
-// An implementation of C++20 `std::identity` functor object.
-//
-// https://en.cppreference.com/w/cpp/utility/functional/identity.html
-
-namespace partition_alloc::internal::base {
-
-struct identity {
-  template <typename T>
-  constexpr T&& operator()(T&& t) const noexcept {
-    return std::forward<T>(t);
-  }
-
-  using is_transparent = void;
-};
-
-}  // namespace partition_alloc::internal::base
-
-#endif  // PARTITION_ALLOC_PARTITION_ALLOC_BASE_CXX20_IDENTITY_H_
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cxx20_is_constant_evaluated.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cxx20_is_constant_evaluated.h
deleted file mode 100644
index cdacb7f..0000000
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cxx20_is_constant_evaluated.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PARTITION_ALLOC_PARTITION_ALLOC_BASE_CXX20_IS_CONSTANT_EVALUATED_H_
-#define PARTITION_ALLOC_PARTITION_ALLOC_BASE_CXX20_IS_CONSTANT_EVALUATED_H_
-
-#include <type_traits>
-
-namespace partition_alloc::internal::base {
-
-// std::is_constant_evaluated was introduced in C++20. PartitionAlloc's minimum
-// supported C++ version is C++17.
-#if defined(__cpp_lib_is_constant_evaluated) && \
-    __cpp_lib_is_constant_evaluated >= 201811L
-
-using std::is_constant_evaluated;
-
-#else
-
-// Implementation of C++20's std::is_constant_evaluated.
-//
-// References:
-// - https://en.cppreference.com/w/cpp/types/is_constant_evaluated
-// - https://wg21.link/meta.const.eval
-constexpr bool is_constant_evaluated() noexcept {
-  return __builtin_is_constant_evaluated();
-}
-
-#endif
-
-}  // namespace partition_alloc::internal::base
-
-#endif  // PARTITION_ALLOC_PARTITION_ALLOC_BASE_CXX20_IS_CONSTANT_EVALUATED_H_
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ranges/README.md b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ranges/README.md
deleted file mode 100644
index 0e39649..0000000
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ranges/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# `partition_alloc::internal::base::ranges`
-
-This directory aims to implement a C++14 version of the new `std::ranges`
-algorithms that were introduced in C++20.
-These implementations has been already removed from chromium, because
-chromium has already allowed C++20.
-However PartitionAllocator still needs the implementations because it has not
-allowed yet.
-Once PartitionAllocator allows C++20, the implementations will be removed.
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ranges/algorithm.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ranges/algorithm.h
deleted file mode 100644
index 4560dd5a..0000000
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ranges/algorithm.h
+++ /dev/null
@@ -1,580 +0,0 @@
-// Copyright 2020 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40284755): Remove this and spanify to fix the errors.
-#pragma allow_unsafe_buffers
-#endif
-
-#ifndef PARTITION_ALLOC_PARTITION_ALLOC_BASE_RANGES_ALGORITHM_H_
-#define PARTITION_ALLOC_PARTITION_ALLOC_BASE_RANGES_ALGORITHM_H_
-
-#include <algorithm>
-#include <functional>
-#include <initializer_list>
-#include <iterator>
-#include <type_traits>
-#include <utility>
-
-#include "partition_alloc/partition_alloc_base/check.h"
-#include "partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "partition_alloc/partition_alloc_base/cxx20_identity.h"
-#include "partition_alloc/partition_alloc_base/cxx20_is_constant_evaluated.h"
-#include "partition_alloc/partition_alloc_base/ranges/functional.h"
-#include "partition_alloc/partition_alloc_base/ranges/ranges.h"
-
-namespace partition_alloc::internal::base {
-
-namespace internal {
-
-// Returns a transformed version of the unary predicate `pred` applying `proj`
-// to its argument before invoking `pred` on it.
-// Ensures that the return type of `invoke(pred, ...)` is convertible to bool.
-template <typename Pred, typename Proj>
-constexpr auto ProjectedUnaryPredicate(Pred& pred, Proj& proj) noexcept {
-  return [&pred, &proj](auto&& arg) -> bool {
-    return std::invoke(pred,
-                       std::invoke(proj, std::forward<decltype(arg)>(arg)));
-  };
-}
-
-// Returns a transformed version of the binary predicate `pred` applying `proj1`
-// and `proj2` to its arguments before invoking `pred` on them.
-//
-// Provides an opt-in to considers all four permutations of projections and
-// argument types. This is sometimes necessary to allow usage with legacy
-// non-ranges std:: algorithms that don't support projections.
-//
-// These permutations are assigned different priorities to break ambiguities in
-// case several permutations are possible, e.g. when Proj1 and Proj2 are the
-// same type.
-//
-// Note that even when opting in to using all permutations of projections,
-// calling code should still ensure that the canonical mapping of {Proj1, Proj2}
-// to {LHS, RHS} compiles for all members of the range. This can be done by
-// adding the following constraint:
-//
-//   typename =
-//       std::indirect_result_t<Pred&,
-//                              base::projected<iterator_t<Range1>, Proj1>,
-//                              base::projected<iterator_t<Range2>, Proj2>>
-//
-// Ensures that the return type of `invoke(pred, ...)` is convertible to bool.
-template <typename Pred, typename Proj1, typename Proj2, bool kPermute = false>
-class BinaryPredicateProjector {
- public:
-  constexpr BinaryPredicateProjector(Pred& pred, Proj1& proj1, Proj2& proj2)
-      : pred_(pred), proj1_(proj1), proj2_(proj2) {}
-
- private:
-  template <typename ProjT, typename ProjU, typename T, typename U>
-  using InvokeResult = std::invoke_result_t<Pred&,
-                                            std::invoke_result_t<ProjT&, T&&>,
-                                            std::invoke_result_t<ProjU&, U&&>>;
-
-  template <typename T, typename U, typename = InvokeResult<Proj1, Proj2, T, U>>
-  constexpr std::pair<Proj1&, Proj2&> GetProjs(priority_tag<3>) const {
-    return {proj1_, proj2_};
-  }
-
-  template <typename T,
-            typename U,
-            bool LazyPermute = kPermute,
-            typename = std::enable_if_t<LazyPermute>,
-            typename = InvokeResult<Proj2, Proj1, T, U>>
-  constexpr std::pair<Proj2&, Proj1&> GetProjs(priority_tag<2>) const {
-    return {proj2_, proj1_};
-  }
-
-  template <typename T,
-            typename U,
-            bool LazyPermute = kPermute,
-            typename = std::enable_if_t<LazyPermute>,
-            typename = InvokeResult<Proj1, Proj1, T, U>>
-  constexpr std::pair<Proj1&, Proj1&> GetProjs(priority_tag<1>) const {
-    return {proj1_, proj1_};
-  }
-
-  template <typename T,
-            typename U,
-            bool LazyPermute = kPermute,
-            typename = std::enable_if_t<LazyPermute>,
-            typename = InvokeResult<Proj2, Proj2, T, U>>
-  constexpr std::pair<Proj2&, Proj2&> GetProjs(priority_tag<0>) const {
-    return {proj2_, proj2_};
-  }
-
- public:
-  template <typename T, typename U>
-  constexpr bool operator()(T&& lhs, U&& rhs) const {
-    auto projs = GetProjs<T, U>(priority_tag<3>());
-    return std::invoke(pred_, std::invoke(projs.first, std::forward<T>(lhs)),
-                       std::invoke(projs.second, std::forward<U>(rhs)));
-  }
-
- private:
-  // This field is not a raw_ref<> because it was filtered by the rewriter for:
-  // #constexpr-ctor-field-initializer
-  Pred& pred_;
-  // This field is not a raw_ref<> because it was filtered by the rewriter for:
-  // #constexpr-ctor-field-initializer
-  Proj1& proj1_;
-  // This field is not a raw_ref<> because it was filtered by the rewriter for:
-  // #constexpr-ctor-field-initializer
-  Proj2& proj2_;
-};
-
-// Small wrappers around BinaryPredicateProjector to make the calling side more
-// readable.
-template <typename Pred, typename Proj1, typename Proj2>
-constexpr auto ProjectedBinaryPredicate(Pred& pred,
-                                        Proj1& proj1,
-                                        Proj2& proj2) noexcept {
-  return BinaryPredicateProjector<Pred, Proj1, Proj2>(pred, proj1, proj2);
-}
-
-// This alias is used below to restrict iterator based APIs to types for which
-// `iterator_category` and the pre-increment and post-increment operators are
-// defined. This is required in situations where otherwise an undesired overload
-// would be chosen, e.g. copy_if. In spirit this is similar to C++20's
-// std::input_or_output_iterator, a concept that each iterator should satisfy.
-template <typename Iter,
-          typename = decltype(++std::declval<Iter&>()),
-          typename = decltype(std::declval<Iter&>()++)>
-using iterator_category_t =
-    typename std::iterator_traits<Iter>::iterator_category;
-
-// This alias is used below to restrict range based APIs to types for which
-// `iterator_category_t` is defined for the underlying iterator. This is
-// required in situations where otherwise an undesired overload would be chosen,
-// e.g. transform. In spirit this is similar to C++20's std::ranges::range, a
-// concept that each range should satisfy.
-template <typename Range>
-using range_category_t = iterator_category_t<ranges::iterator_t<Range>>;
-
-}  // namespace internal
-
-namespace ranges {
-
-// [alg.adjacent.find] Adjacent find
-// Reference: https://wg21.link/alg.adjacent.find
-
-// Let `E(i)` be `bool(invoke(pred, invoke(proj, *i), invoke(proj, *(i + 1))))`.
-//
-// Returns: The first iterator `i` such that both `i` and `i + 1` are in the
-// range `[first, last)` for which `E(i)` holds. Returns `last` if no such
-// iterator is found.
-//
-// Complexity: Exactly `min((i - first) + 1, (last - first) - 1)` applications
-// of the corresponding predicate, where `i` is `adjacent_find`'s return value.
-//
-// Reference:
-// https://wg21.link/alg.adjacent.find#:~:text=ranges::adjacent_find(I
-template <typename ForwardIterator,
-          typename Pred = ranges::equal_to,
-          typename Proj = base::identity,
-          typename = internal::iterator_category_t<ForwardIterator>>
-constexpr auto adjacent_find(ForwardIterator first,
-                             ForwardIterator last,
-                             Pred pred = {},
-                             Proj proj = {}) {
-  // Implementation inspired by cppreference.com:
-  // https://en.cppreference.com/w/cpp/algorithm/adjacent_find
-  //
-  // A reimplementation is required, because std::adjacent_find is not constexpr
-  // prior to C++20. Once we have C++20, we should switch to standard library
-  // implementation.
-  if (first == last) {
-    return last;
-  }
-
-  for (ForwardIterator next = first; ++next != last; ++first) {
-    if (std::invoke(pred, std::invoke(proj, *first),
-                    std::invoke(proj, *next))) {
-      return first;
-    }
-  }
-
-  return last;
-}
-
-// Let `E(i)` be `bool(invoke(pred, invoke(proj, *i), invoke(proj, *(i + 1))))`.
-//
-// Returns: The first iterator `i` such that both `i` and `i + 1` are in the
-// range `range` for which `E(i)` holds. Returns `end(range)` if no such
-// iterator is found.
-//
-// Complexity: Exactly `min((i - begin(range)) + 1, size(range) - 1)`
-// applications of the corresponding predicate, where `i` is `adjacent_find`'s
-// return value.
-//
-// Reference:
-// https://wg21.link/alg.adjacent.find#:~:text=ranges::adjacent_find(R
-template <typename Range,
-          typename Pred = ranges::equal_to,
-          typename Proj = base::identity,
-          typename = internal::range_category_t<Range>>
-constexpr auto adjacent_find(Range&& range, Pred pred = {}, Proj proj = {}) {
-  return ranges::adjacent_find(ranges::begin(range), ranges::end(range),
-                               std::move(pred), std::move(proj));
-}
-
-// [alg.transform] Transform
-// Reference: https://wg21.link/alg.transform
-
-// Let `N` be `last1 - first1`,
-// `E(i)` be `invoke(op, invoke(proj, *(first1 + (i - result))))`.
-//
-// Preconditions: `op` does not invalidate iterators or subranges, nor modify
-// elements in the ranges `[first1, first1 + N]`, and `[result, result + N]`.
-//
-// Effects: Assigns through every iterator `i` in the range
-// `[result, result + N)` a new corresponding value equal to `E(i)`.
-//
-// Returns: `result + N`
-//
-// Complexity: Exactly `N` applications of `op` and any projections.
-//
-// Remarks: result may be equal to `first1`.
-//
-// Reference: https://wg21.link/alg.transform#:~:text=ranges::transform(I
-template <typename InputIterator,
-          typename OutputIterator,
-          typename UnaryOperation,
-          typename Proj = base::identity,
-          typename = internal::iterator_category_t<InputIterator>,
-          typename = internal::iterator_category_t<OutputIterator>
-// This constraint ensures that the return type of `invoke(binary_op, ...)`
-// is convertible to the type of `*result`.
-// Unfortunately, we cannot fully express this constraint in C++17.
-#if __cplusplus >= 202002L
-          ,
-          typename = std::indirect_result_t<UnaryOperation&,
-                                            std::projected<InputIterator, Proj>>
-#endif
-          >
-constexpr auto transform(InputIterator first1,
-                         InputIterator last1,
-                         OutputIterator result,
-                         UnaryOperation op,
-                         Proj proj = {}) {
-  return std::transform(first1, last1, result, [&op, &proj](auto&& arg) {
-    return std::invoke(op, std::invoke(proj, std::forward<decltype(arg)>(arg)));
-  });
-}
-
-// Let `N` be `size(range)`,
-// `E(i)` be `invoke(op, invoke(proj, *(begin(range) + (i - result))))`.
-//
-// Preconditions: `op` does not invalidate iterators or subranges, nor modify
-// elements in the ranges `[begin(range), end(range)]`, and
-// `[result, result + N]`.
-//
-// Effects: Assigns through every iterator `i` in the range
-// `[result, result + N)` a new corresponding value equal to `E(i)`.
-//
-// Returns: `result + N`
-//
-// Complexity: Exactly `N` applications of `op` and any projections.
-//
-// Remarks: result may be equal to `begin(range)`.
-//
-// Reference: https://wg21.link/alg.transform#:~:text=ranges::transform(R
-template <
-    typename Range,
-    typename OutputIterator,
-    typename UnaryOperation,
-    typename Proj = base::identity,
-    typename = internal::range_category_t<Range>,
-    typename = internal::iterator_category_t<OutputIterator>
-// This constraint ensures that the return type of `invoke(binary_op, ...)`
-// is convertible to the type of `*result`.
-// Unfortunately, we cannot fully express this constraint in C++17.
-#if __cplusplus >= 202002L
-    ,
-    typename = std::indirect_result_t<UnaryOperation&,
-                                      std::projected<iterator_t<Range>, Proj>>
-#endif
-    >
-constexpr auto transform(Range&& range,
-                         OutputIterator result,
-                         UnaryOperation op,
-                         Proj proj = {}) {
-  return ranges::transform(ranges::begin(range), ranges::end(range), result,
-                           std::move(op), std::move(proj));
-}
-
-// Let:
-// `N` be `min(last1 - first1, last2 - first2)`,
-// `E(i)` be `invoke(binary_op, invoke(proj1, *(first1 + (i - result))),
-//                              invoke(proj2, *(first2 + (i - result))))`.
-//
-// Preconditions: `binary_op` does not invalidate iterators or subranges, nor
-// modify elements in the ranges `[first1, first1 + N]`, `[first2, first2 + N]`,
-// and `[result, result + N]`.
-//
-// Effects: Assigns through every iterator `i` in the range
-// `[result, result + N)` a new corresponding value equal to `E(i)`.
-//
-// Returns: `result + N`
-//
-// Complexity: Exactly `N` applications of `binary_op`, and any projections.
-//
-// Remarks: `result` may be equal to `first1` or `first2`.
-//
-// Reference: https://wg21.link/alg.transform#:~:text=ranges::transform(I1
-template <
-    typename ForwardIterator1,
-    typename ForwardIterator2,
-    typename OutputIterator,
-    typename BinaryOperation,
-    typename Proj1 = base::identity,
-    typename Proj2 = base::identity,
-    typename = internal::iterator_category_t<ForwardIterator1>,
-    typename = internal::iterator_category_t<ForwardIterator2>,
-    typename = internal::iterator_category_t<OutputIterator>
-// This constraint ensures that the return type of `invoke(binary_op, ...)`
-// is convertible to the type of `*result`.
-// Unfortunately, we cannot fully express this constraint in C++17.
-#if __cplusplus >= 202002L
-    ,
-    typename = std::indirect_result_t<BinaryOperation&,
-                                      std::projected<ForwardIterator1, Proj1>,
-                                      std::projected<ForwardIterator2, Proj2>>
-#endif
-    >
-constexpr auto transform(ForwardIterator1 first1,
-                         ForwardIterator1 last1,
-                         ForwardIterator2 first2,
-                         ForwardIterator2 last2,
-                         OutputIterator result,
-                         BinaryOperation binary_op,
-                         Proj1 proj1 = {},
-                         Proj2 proj2 = {}) {
-  // std::transform does not have a `last2` overload. Thus we need to adjust
-  // `last1` to ensure to not read past `last2`.
-  last1 = std::next(first1, std::min(std::distance(first1, last1),
-                                     std::distance(first2, last2)));
-  return std::transform(
-      first1, last1, first2, result,
-      [&binary_op, &proj1, &proj2](auto&& lhs, auto&& rhs) {
-        return std::invoke(
-            binary_op, std::invoke(proj1, std::forward<decltype(lhs)>(lhs)),
-            std::invoke(proj2, std::forward<decltype(rhs)>(rhs)));
-      });
-}
-
-// Let:
-// `N` be `min(size(range1), size(range2)`,
-// `E(i)` be `invoke(binary_op, invoke(proj1, *(begin(range1) + (i - result))),
-//                              invoke(proj2, *(begin(range2) + (i - result))))`
-//
-// Preconditions: `binary_op` does not invalidate iterators or subranges, nor
-// modify elements in the ranges `[begin(range1), end(range1)]`,
-// `[begin(range2), end(range2)]`, and `[result, result + N]`.
-//
-// Effects: Assigns through every iterator `i` in the range
-// `[result, result + N)` a new corresponding value equal to `E(i)`.
-//
-// Returns: `result + N`
-//
-// Complexity: Exactly `N` applications of `binary_op`, and any projections.
-//
-// Remarks: `result` may be equal to `begin(range1)` or `begin(range2)`.
-//
-// Reference: https://wg21.link/alg.transform#:~:text=ranges::transform(R1
-template <
-    typename Range1,
-    typename Range2,
-    typename OutputIterator,
-    typename BinaryOperation,
-    typename Proj1 = base::identity,
-    typename Proj2 = base::identity,
-    typename = internal::range_category_t<Range1>,
-    typename = internal::range_category_t<Range2>,
-    typename = internal::iterator_category_t<OutputIterator>
-// This constraint ensures that the return type of `invoke(binary_op, ...)`
-// is convertible to the type of `*result`.
-// Unfortunately, we cannot fully express this constraint in C++17.
-#if __cplusplus >= 202002L
-    ,
-    typename = std::indirect_result_t<BinaryOperation&,
-                                      std::projected<iterator_t<Range1>, Proj1>,
-                                      std::projected<iterator_t<Range2>, Proj2>>
-#endif
-    >
-constexpr auto transform(Range1&& range1,
-                         Range2&& range2,
-                         OutputIterator result,
-                         BinaryOperation binary_op,
-                         Proj1 proj1 = {},
-                         Proj2 proj2 = {}) {
-  return ranges::transform(ranges::begin(range1), ranges::end(range1),
-                           ranges::begin(range2), ranges::end(range2), result,
-                           std::move(binary_op), std::move(proj1),
-                           std::move(proj2));
-}
-
-// Let `E(i)` be `bool(invoke(pred, invoke(proj, *i)))`.
-//
-// Effects: Eliminates all the elements referred to by iterator `i` in the range
-// `[first, last)` for which `E(i)` holds.
-//
-// Returns: The end of the resulting range.
-//
-// Remarks: Stable.
-//
-// Complexity: Exactly `last - first` applications of the corresponding
-// predicate and any projection.
-//
-// Reference: https://wg21.link/alg.remove#:~:text=ranges::remove_if(I
-template <typename ForwardIterator,
-          typename Predicate,
-          typename Proj = base::identity,
-          typename = internal::iterator_category_t<ForwardIterator>>
-constexpr auto remove_if(ForwardIterator first,
-                         ForwardIterator last,
-                         Predicate pred,
-                         Proj proj = {}) {
-  return std::remove_if(first, last,
-                        internal::ProjectedUnaryPredicate(pred, proj));
-}
-
-// Let `E(i)` be `bool(invoke(pred, invoke(proj, *i)))`.
-//
-// Effects: Eliminates all the elements referred to by iterator `i` in `range`.
-//
-// Returns: The end of the resulting range.
-//
-// Remarks: Stable.
-//
-// Complexity: Exactly `size(range)` applications of the corresponding predicate
-// and any projection.
-//
-// Reference: https://wg21.link/alg.remove#:~:text=ranges::remove_if(R
-template <typename Range,
-          typename Predicate,
-          typename Proj = base::identity,
-          typename = internal::range_category_t<Range>>
-constexpr auto remove_if(Range&& range, Predicate pred, Proj proj = {}) {
-  return ranges::remove_if(ranges::begin(range), ranges::end(range),
-                           std::move(pred), std::move(proj));
-}
-
-// [alg.binary.search] Binary search
-// Reference: https://wg21.link/alg.binary.search
-
-// [lower.bound] lower_bound
-// Reference: https://wg21.link/lower.bound
-
-// Preconditions: The elements `e` of `[first, last)` are partitioned with
-// respect to the expression `bool(invoke(comp, invoke(proj, e), value))`.
-//
-// Returns: The furthermost iterator `i` in the range `[first, last]` such that
-// for every iterator `j` in the range `[first, i)`,
-// `bool(invoke(comp, invoke(proj, *j), value))` is true.
-//
-// Complexity: At most `log_2(last - first) + O(1)` comparisons and projections.
-//
-// Reference: https://wg21.link/lower.bound#:~:text=ranges::lower_bound(I
-template <typename ForwardIterator,
-          typename T,
-          typename Comp = ranges::less,
-          typename Proj = base::identity,
-          typename = internal::iterator_category_t<ForwardIterator>>
-constexpr auto lower_bound(ForwardIterator first,
-                           ForwardIterator last,
-                           const T& value,
-                           Comp comp = {},
-                           Proj proj = {}) {
-  // The second arg is guaranteed to be `value`, so we'll simply apply the
-  // base::identity projection.
-  base::identity value_proj;
-  return std::lower_bound(
-      first, last, value,
-      internal::ProjectedBinaryPredicate(comp, proj, value_proj));
-}
-
-// Preconditions: The elements `e` of `range` are partitioned with respect to
-// the expression `bool(invoke(comp, invoke(proj, e), value))`.
-//
-// Returns: The furthermost iterator `i` in the range
-// `[begin(range), end(range)]` such that for every iterator `j` in the range
-// `[begin(range), i)`, `bool(invoke(comp, invoke(proj, *j), value))` is true.
-//
-// Complexity: At most `log_2(size(range)) + O(1)` comparisons and projections.
-//
-// Reference: https://wg21.link/lower.bound#:~:text=ranges::lower_bound(R
-template <typename Range,
-          typename T,
-          typename Comp = ranges::less,
-          typename Proj = base::identity,
-          typename = internal::range_category_t<Range>>
-constexpr auto lower_bound(Range&& range,
-                           const T& value,
-                           Comp comp = {},
-                           Proj proj = {}) {
-  return ranges::lower_bound(ranges::begin(range), ranges::end(range), value,
-                             std::move(comp), std::move(proj));
-}
-
-// [upper.bound] upper_bound
-// Reference: https://wg21.link/upper.bound
-
-// Preconditions: The elements `e` of `[first, last)` are partitioned with
-// respect to the expression `!bool(invoke(comp, value, invoke(proj, e)))`.
-//
-// Returns: The furthermost iterator `i` in the range `[first, last]` such that
-// for every iterator `j` in the range `[first, i)`,
-// `!bool(invoke(comp, value, invoke(proj, *j)))` is true.
-//
-// Complexity: At most `log_2(last - first) + O(1)` comparisons and projections.
-//
-// Reference: https://wg21.link/upper.bound#:~:text=ranges::upper_bound(I
-template <typename ForwardIterator,
-          typename T,
-          typename Comp = ranges::less,
-          typename Proj = base::identity,
-          typename = internal::iterator_category_t<ForwardIterator>>
-constexpr auto upper_bound(ForwardIterator first,
-                           ForwardIterator last,
-                           const T& value,
-                           Comp comp = {},
-                           Proj proj = {}) {
-  // The first arg is guaranteed to be `value`, so we'll simply apply the
-  // base::identity projection.
-  base::identity value_proj;
-  return std::upper_bound(
-      first, last, value,
-      internal::ProjectedBinaryPredicate(comp, value_proj, proj));
-}
-
-// Preconditions: The elements `e` of `range` are partitioned with
-// respect to the expression `!bool(invoke(comp, value, invoke(proj, e)))`.
-//
-// Returns: The furthermost iterator `i` in the range
-// `[begin(range), end(range)]` such that for every iterator `j` in the range
-// `[begin(range), i)`, `!bool(invoke(comp, value, invoke(proj, *j)))` is true.
-//
-// Complexity: At most `log_2(size(range)) + O(1)` comparisons and projections.
-//
-// Reference: https://wg21.link/upper.bound#:~:text=ranges::upper_bound(R
-template <typename Range,
-          typename T,
-          typename Comp = ranges::less,
-          typename Proj = base::identity,
-          typename = internal::range_category_t<Range>>
-constexpr auto upper_bound(Range&& range,
-                           const T& value,
-                           Comp comp = {},
-                           Proj proj = {}) {
-  return ranges::upper_bound(ranges::begin(range), ranges::end(range), value,
-                             std::move(comp), std::move(proj));
-}
-
-}  // namespace ranges
-
-}  // namespace partition_alloc::internal::base
-
-#endif  // PARTITION_ALLOC_PARTITION_ALLOC_BASE_RANGES_ALGORITHM_H_
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ranges/algorithm_pa_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ranges/algorithm_pa_unittest.cc
deleted file mode 100644
index 0d460dd6..0000000
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ranges/algorithm_pa_unittest.cc
+++ /dev/null
@@ -1,222 +0,0 @@
-// Copyright 2020 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <algorithm>
-#include <functional>
-#include <initializer_list>
-#include <iterator>
-#include <random>
-#include <utility>
-
-#include "partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "partition_alloc/partition_alloc_base/ranges/algorithm.h"
-#include "partition_alloc/partition_alloc_base/ranges/functional.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::ElementsAre;
-using ::testing::Field;
-using ::testing::Ge;
-using ::testing::Gt;
-using ::testing::Le;
-using ::testing::Lt;
-using ::testing::Pair;
-
-namespace partition_alloc::internal::base {
-
-namespace {
-
-// A macro to work around the fact that lambdas are not constexpr in C++14.
-// This will define an unnamed struct with a constexpr call operator, similarly
-// to how lambdas behave in C++17+.
-// Note that this does not support capture groups, so all lambdas defined like
-// this must be stateless.
-// Example Usage: `CONSTEXPR_LAMBDA((int i, int j) { return i + j; }) lambda;`
-// TODO(crbug.com/40533712): Remove once we have constexpr lambdas for real.
-#define CONSTEXPR_LAMBDA(fun)     \
-  constexpr struct {              \
-    constexpr bool operator() fun \
-  }
-
-struct Int {
-  constexpr Int() = default;
-  constexpr Int(int value) : value(value) {}
-
-  int value = 0;
-};
-
-constexpr bool operator==(Int lhs, Int rhs) {
-  return lhs.value == rhs.value;
-}
-
-// Move-only int that clears `value` when moving out.
-struct MoveOnlyInt {
-  MoveOnlyInt(int value) : value(value) {}
-  MoveOnlyInt(MoveOnlyInt&& other) : value(std::exchange(other.value, 0)) {}
-
-  MoveOnlyInt& operator=(MoveOnlyInt&& other) {
-    value = std::exchange(other.value, 0);
-    return *this;
-  }
-
-  int value = 0;
-};
-
-constexpr bool is_even(int i) {
-  return i % 2 == 0;
-}
-
-template <typename Iter>
-auto make_vector(Iter begin, Iter end) {
-  using T = typename std::iterator_traits<Iter>::value_type;
-  return std::vector<T>(begin, end);
-}
-
-}  // namespace
-
-TEST(RangesTest, AdjacentFind) {
-  constexpr int array[] = {1, 2, 3, 3};
-  static_assert(PA_UNSAFE_TODO(array + 2) ==
-                    ranges::adjacent_find(array, ranges::end(array)),
-                "");
-  static_assert(
-      array == ranges::adjacent_find(array, ranges::end(array), ranges::less{}),
-      "");
-
-  constexpr Int ints[] = {{6}, {6}, {5}, {4}};
-  static_assert(
-      ints == ranges::adjacent_find(ints, ranges::equal_to{}, &Int::value), "");
-  static_assert(ranges::end(ints) ==
-                    ranges::adjacent_find(ints, ranges::less{}, &Int::value),
-                "");
-}
-
-TEST(RangesTest, UnaryTransform) {
-  int input[] = {1, 2, 3, 4, 5};
-  auto plus_1 = [](int i) { return i + 1; };
-  auto times_2 = [](int i) { return i * 2; };
-
-  PA_UNSAFE_TODO(EXPECT_EQ(
-      input + 4, ranges::transform(input + 1, input + 4, input + 1, plus_1)));
-  EXPECT_THAT(input, ElementsAre(1, 3, 4, 5, 5));
-
-  int output[] = {0, 0, 0, 0, 0};
-  PA_UNSAFE_TODO(EXPECT_EQ(
-      output + 3, ranges::transform(input + 1, input + 4, output, times_2)));
-  EXPECT_THAT(output, ElementsAre(6, 8, 10, 0, 0));
-
-  Int values[] = {{0}, {2}, {4}, {5}};
-  PA_UNSAFE_TODO(EXPECT_EQ(
-      values + 4, ranges::transform(values, values, times_2, &Int::value)));
-  EXPECT_THAT(values, ElementsAre(Int{0}, Int{4}, Int{8}, Int{10}));
-}
-
-TEST(RangesTest, BinaryTransform) {
-  int input[] = {1, 2, 3, 4, 5};
-  int output[] = {0, 0, 0, 0, 0};
-
-  PA_UNSAFE_TODO(EXPECT_EQ(
-      output + 2, ranges::transform(input, input + 2, input + 3, input + 5,
-                                    output, std::plus<>{})));
-  EXPECT_THAT(output, ElementsAre(5, 7, 0, 0, 0));
-
-  PA_UNSAFE_TODO(EXPECT_EQ(output + 5, ranges::transform(input, input, output,
-                                                         std::multiplies<>{})));
-  EXPECT_THAT(output, ElementsAre(1, 4, 9, 16, 25));
-
-  Int values[] = {{0}, {2}, {4}, {5}};
-  PA_UNSAFE_TODO(EXPECT_EQ(
-      values + 4, ranges::transform(values, values, values, std::minus<>{},
-                                    &Int::value, &Int::value)));
-  EXPECT_THAT(values, ElementsAre(Int{0}, Int{0}, Int{0}, Int{0}));
-}
-
-TEST(RangesTest, RemoveIf) {
-  int input[] = {0, 1, 2, 3, 4};
-
-  PA_UNSAFE_TODO(
-      EXPECT_EQ(input + 2, ranges::remove_if(input, input + 4, is_even)));
-  EXPECT_EQ(input[0], 1);
-  EXPECT_EQ(input[1], 3);
-  EXPECT_EQ(input[4], 4);
-
-  Int ints[] = {2, 2, 1, 1, 2, 2};
-  PA_UNSAFE_TODO(
-      EXPECT_EQ(ints + 2, ranges::remove_if(ints, is_even, &Int::value)));
-  EXPECT_EQ(ints[0], 1);
-  EXPECT_EQ(ints[1], 1);
-}
-
-TEST(RangesTest, LowerBound) {
-  int array[] = {0, 0, 1, 1, 2, 2};
-
-  PA_UNSAFE_TODO(EXPECT_EQ(array, ranges::lower_bound(array, array + 6, -1)));
-  PA_UNSAFE_TODO(EXPECT_EQ(array, ranges::lower_bound(array, array + 6, 0)));
-  PA_UNSAFE_TODO(
-      EXPECT_EQ(array + 2, ranges::lower_bound(array, array + 6, 1)));
-  PA_UNSAFE_TODO(
-      EXPECT_EQ(array + 4, ranges::lower_bound(array, array + 6, 2)));
-  PA_UNSAFE_TODO(
-      EXPECT_EQ(array + 6, ranges::lower_bound(array, array + 6, 3)));
-
-  Int ints[] = {0, 0, 1, 1, 2, 2};
-
-  EXPECT_EQ(ints, ranges::lower_bound(ints, -1, {}, &Int::value));
-  EXPECT_EQ(ints, ranges::lower_bound(ints, 0, {}, &Int::value));
-  PA_UNSAFE_TODO(
-      EXPECT_EQ(ints + 2, ranges::lower_bound(ints, 1, {}, &Int::value)));
-  PA_UNSAFE_TODO(
-      EXPECT_EQ(ints + 4, ranges::lower_bound(ints, 2, {}, &Int::value)));
-  PA_UNSAFE_TODO(
-      EXPECT_EQ(ints + 6, ranges::lower_bound(ints, 3, {}, &Int::value)));
-
-  const auto proj = [](const Int& i) { return 2 - i.value; };
-  EXPECT_EQ(ints, ranges::lower_bound(ints, 3, ranges::greater{}, proj));
-  EXPECT_EQ(ints, ranges::lower_bound(ints, 2, ranges::greater{}, proj));
-  PA_UNSAFE_TODO(EXPECT_EQ(
-      ints + 2, ranges::lower_bound(ints, 1, ranges::greater{}, proj)));
-  PA_UNSAFE_TODO(EXPECT_EQ(
-      ints + 4, ranges::lower_bound(ints, 0, ranges::greater{}, proj)));
-  PA_UNSAFE_TODO(EXPECT_EQ(
-      ints + 6, ranges::lower_bound(ints, -1, ranges::greater{}, proj)));
-}
-
-TEST(RangesTest, UpperBound) {
-  int array[] = {0, 0, 1, 1, 2, 2};
-
-  PA_UNSAFE_TODO(EXPECT_EQ(array, ranges::upper_bound(array, array + 6, -1)));
-  PA_UNSAFE_TODO(
-      EXPECT_EQ(array + 2, ranges::upper_bound(array, array + 6, 0)));
-  PA_UNSAFE_TODO(
-      EXPECT_EQ(array + 4, ranges::upper_bound(array, array + 6, 1)));
-  PA_UNSAFE_TODO(
-      EXPECT_EQ(array + 6, ranges::upper_bound(array, array + 6, 2)));
-  PA_UNSAFE_TODO(
-      EXPECT_EQ(array + 6, ranges::upper_bound(array, array + 6, 3)));
-
-  Int ints[] = {0, 0, 1, 1, 2, 2};
-
-  EXPECT_EQ(ints, ranges::upper_bound(ints, -1, {}, &Int::value));
-  PA_UNSAFE_TODO(
-      EXPECT_EQ(ints + 2, ranges::upper_bound(ints, 0, {}, &Int::value)));
-  PA_UNSAFE_TODO(
-      EXPECT_EQ(ints + 4, ranges::upper_bound(ints, 1, {}, &Int::value)));
-  PA_UNSAFE_TODO(
-      EXPECT_EQ(ints + 6, ranges::upper_bound(ints, 2, {}, &Int::value)));
-  PA_UNSAFE_TODO(
-      EXPECT_EQ(ints + 6, ranges::upper_bound(ints, 3, {}, &Int::value)));
-
-  const auto proj = [](const Int& i) { return 2 - i.value; };
-  EXPECT_EQ(ints, ranges::upper_bound(ints, 3, ranges::greater{}, proj));
-  PA_UNSAFE_TODO(EXPECT_EQ(
-      ints + 2, ranges::upper_bound(ints, 2, ranges::greater{}, proj)));
-  PA_UNSAFE_TODO(EXPECT_EQ(
-      ints + 4, ranges::upper_bound(ints, 1, ranges::greater{}, proj)));
-  PA_UNSAFE_TODO(EXPECT_EQ(
-      ints + 6, ranges::upper_bound(ints, 0, ranges::greater{}, proj)));
-  PA_UNSAFE_TODO(EXPECT_EQ(
-      ints + 6, ranges::upper_bound(ints, -1, ranges::greater{}, proj)));
-}
-
-}  // namespace partition_alloc::internal::base
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ranges/functional.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ranges/functional.h
deleted file mode 100644
index 5346002a..0000000
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ranges/functional.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2020 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40284755): Remove this and spanify to fix the errors.
-#pragma allow_unsafe_buffers
-#endif
-
-#ifndef PARTITION_ALLOC_PARTITION_ALLOC_BASE_RANGES_FUNCTIONAL_H_
-#define PARTITION_ALLOC_PARTITION_ALLOC_BASE_RANGES_FUNCTIONAL_H_
-
-#include <functional>
-#include <type_traits>
-#include <utility>
-
-namespace partition_alloc::internal::base::ranges {
-
-// Simplified implementations of C++20's std::ranges comparison function
-// objects. As opposed to the std::ranges implementation, these versions do not
-// constrain the passed-in types.
-//
-// Reference: https://wg21.link/range.cmp
-using equal_to = std::equal_to<>;
-using not_equal_to = std::not_equal_to<>;
-using greater = std::greater<>;
-using less = std::less<>;
-using greater_equal = std::greater_equal<>;
-using less_equal = std::less_equal<>;
-
-}  // namespace partition_alloc::internal::base::ranges
-
-#endif  // PARTITION_ALLOC_PARTITION_ALLOC_BASE_RANGES_FUNCTIONAL_H_
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ranges/functional_pa_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ranges/functional_pa_unittest.cc
deleted file mode 100644
index f40a08d..0000000
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ranges/functional_pa_unittest.cc
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2020 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "partition_alloc/partition_alloc_base/ranges/functional.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace partition_alloc::internal::base {
-
-TEST(RangesTest, EqualTo) {
-  ranges::equal_to eq;
-  EXPECT_TRUE(eq(0, 0));
-  EXPECT_FALSE(eq(0, 1));
-  EXPECT_FALSE(eq(1, 0));
-}
-
-TEST(RangesTest, Less) {
-  ranges::less lt;
-  EXPECT_FALSE(lt(0, 0));
-  EXPECT_TRUE(lt(0, 1));
-  EXPECT_FALSE(lt(1, 0));
-}
-
-}  // namespace partition_alloc::internal::base
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ranges/ranges.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ranges/ranges.h
deleted file mode 100644
index e9722f45..0000000
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ranges/ranges.h
+++ /dev/null
@@ -1,151 +0,0 @@
-// Copyright 2020 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40284755): Remove this and spanify to fix the errors.
-#pragma allow_unsafe_buffers
-#endif
-
-// Since PartitionAlloc disallows c++20 ranges, use base::ranges instead.
-#ifndef PARTITION_ALLOC_PARTITION_ALLOC_BASE_RANGES_RANGES_H_
-#define PARTITION_ALLOC_PARTITION_ALLOC_BASE_RANGES_RANGES_H_
-
-#include <array>
-#include <iterator>
-#include <type_traits>
-#include <utility>
-
-#include "partition_alloc/partition_alloc_base/cxx20_identity.h"
-#include "partition_alloc/partition_alloc_base/template_util.h"
-
-namespace partition_alloc::internal::base {
-
-namespace internal {
-
-// Overload for C array.
-template <typename T, size_t N>
-constexpr T* begin(T (&array)[N], priority_tag<2>) {
-  return array;
-}
-
-// Overload for mutable std::array. Required since std::array::begin is not
-// constexpr prior to C++17. Needs to dispatch to the const overload since only
-// const operator[] is constexpr in C++14.
-template <typename T, size_t N>
-constexpr T* begin(std::array<T, N>& array, priority_tag<2> tag) {
-  return const_cast<T*>(begin(const_cast<const std::array<T, N>&>(array), tag));
-}
-
-// Overload for const std::array. Required since std::array::begin is not
-// constexpr prior to C++17.
-template <typename T, size_t N>
-constexpr const T* begin(const std::array<T, N>& array, priority_tag<2>) {
-  return N != 0 ? &array[0] : nullptr;
-}
-
-// Generic container overload.
-template <typename Range>
-constexpr auto begin(Range&& range, priority_tag<1>)
-    -> decltype(std::forward<Range>(range).begin()) {
-  return std::forward<Range>(range).begin();
-}
-
-// Overload for free begin() function.
-template <typename Range>
-constexpr auto begin(Range&& range, priority_tag<0>)
-    -> decltype(begin(std::forward<Range>(range))) {
-  return begin(std::forward<Range>(range));
-}
-
-// Overload for C array.
-template <typename T, size_t N>
-constexpr T* end(T (&array)[N], priority_tag<2>) {
-  return array + N;
-}
-
-// Overload for mutable std::array. Required since std::array::end is not
-// constexpr prior to C++17. Needs to dispatch to the const overload since only
-// const operator[] is constexpr in C++14.
-template <typename T, size_t N>
-constexpr T* end(std::array<T, N>& array, priority_tag<2> tag) {
-  return const_cast<T*>(end(const_cast<const std::array<T, N>&>(array), tag));
-}
-
-// Overload for const std::array. Required since std::array::end is not
-// constexpr prior to C++17.
-template <typename T, size_t N>
-constexpr const T* end(const std::array<T, N>& array, priority_tag<2>) {
-  return N != 0 ? (&array[0]) + N : nullptr;
-}
-
-// Generic container overload.
-template <typename Range>
-constexpr auto end(Range&& range, priority_tag<1>)
-    -> decltype(std::forward<Range>(range).end()) {
-  return std::forward<Range>(range).end();
-}
-
-// Overload for free end() function.
-template <typename Range>
-constexpr auto end(Range&& range, priority_tag<0>)
-    -> decltype(end(std::forward<Range>(range))) {
-  return end(std::forward<Range>(range));
-}
-
-}  // namespace internal
-
-namespace ranges {
-
-// Simplified implementation of C++20's std::ranges::begin.
-// As opposed to std::ranges::begin, this implementation does does not check
-// whether begin() returns an iterator and does not inhibit ADL.
-//
-// The trailing return type and dispatch to the internal implementation is
-// necessary to be SFINAE friendly.
-//
-// Reference: https://wg21.link/range.access.begin
-template <typename Range>
-constexpr auto begin(Range&& range) noexcept
-    -> decltype(internal::begin(std::forward<Range>(range),
-                                internal::priority_tag<2>())) {
-  return internal::begin(std::forward<Range>(range),
-                         internal::priority_tag<2>());
-}
-
-// Simplified implementation of C++20's std::ranges::end.
-// As opposed to std::ranges::end, this implementation does does not check
-// whether end() returns an iterator and does not inhibit ADL.
-//
-// The trailing return type and dispatch to the internal implementation is
-// necessary to be SFINAE friendly.
-//
-// Reference: - https://wg21.link/range.access.end
-template <typename Range>
-constexpr auto end(Range&& range) noexcept
-    -> decltype(internal::end(std::forward<Range>(range),
-                              internal::priority_tag<2>())) {
-  return internal::end(std::forward<Range>(range), internal::priority_tag<2>());
-}
-
-// Implementation of C++20's std::ranges::iterator_t.
-//
-// Reference: https://wg21.link/ranges.syn#:~:text=iterator_t
-template <typename Range>
-using iterator_t = decltype(ranges::begin(std::declval<Range&>()));
-
-// Implementation of C++20's std::iter_value_t.
-template <typename Iterator>
-using iter_value_t = typename std::iterator_traits<Iterator>::value_type;
-
-// Implementation of C++20's std::ranges::range_value_t.
-//
-// Reference: https://wg21.link/ranges.syn#:~:text=range_value_t
-template <typename Range>
-using range_value_t = iter_value_t<iterator_t<Range>>;
-
-}  // namespace ranges
-
-}  // namespace partition_alloc::internal::base
-
-#endif  // PARTITION_ALLOC_PARTITION_ALLOC_BASE_RANGES_RANGES_H_
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ranges/ranges_pa_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ranges/ranges_pa_unittest.cc
deleted file mode 100644
index d881ee8..0000000
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ranges/ranges_pa_unittest.cc
+++ /dev/null
@@ -1,120 +0,0 @@
-// Copyright 2020 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <array>
-#include <initializer_list>
-#include <vector>
-
-#include "partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "partition_alloc/partition_alloc_base/ranges/ranges.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace partition_alloc::internal::base {
-
-namespace {
-
-// Test struct with free function overloads for begin and end. Tests whether the
-// free functions are found.
-struct S {
-  std::vector<int> v;
-};
-
-auto begin(const S& s) {
-  return s.v.begin();
-}
-
-auto end(const S& s) {
-  return s.v.end();
-}
-
-// Test struct with both member and free function overloads for begin and end.
-// Tests whether the member function is preferred.
-struct T {
-  constexpr int begin() const { return 1; }
-  constexpr int end() const { return 1; }
-};
-
-constexpr int begin(const T& t) {
-  return 2;
-}
-
-constexpr int end(const T& t) {
-  return 2;
-}
-
-// constexpr utility to generate a std::array. Ensures that a mutable array can
-// be used in a constexpr context.
-template <size_t N>
-constexpr std::array<int, N> GenerateArray() {
-  std::array<int, N> arr{};
-  int i = 0;
-  for (auto* it = ranges::begin(arr); it != ranges::end(arr);
-       PA_UNSAFE_TODO(++it)) {
-    *it = i++;
-  }
-
-  return arr;
-}
-
-}  // namespace
-
-TEST(RangesTest, BeginPrefersMember) {
-  constexpr T t;
-  static_assert(ranges::begin(t) == 1, "");
-}
-
-TEST(RangesTest, BeginConstexprContainers) {
-  int arr[1]{};
-  static_assert(arr == ranges::begin(arr), "");
-
-  static constexpr std::initializer_list<int> il = {1, 2, 3};
-  static_assert(il.begin() == ranges::begin(il), "");
-
-  static constexpr std::array<int, 3> array = {1, 2, 3};
-  static_assert(&array[0] == ranges::begin(array), "");
-}
-
-TEST(RangesTest, BeginRegularContainers) {
-  std::vector<int> vec;
-  S s;
-
-  EXPECT_EQ(vec.begin(), ranges::begin(vec));
-  EXPECT_EQ(s.v.begin(), ranges::begin(s));
-}
-
-TEST(RangesTest, EndPrefersMember) {
-  constexpr T t;
-  static_assert(ranges::end(t) == 1, "");
-}
-
-TEST(RangesTest, EndConstexprContainers) {
-  int arr[1]{};
-  static_assert(PA_UNSAFE_TODO(arr + 1) == ranges::end(arr), "");
-
-  static constexpr std::initializer_list<int> il = {1, 2, 3};
-  static_assert(il.end() == ranges::end(il), "");
-
-  static constexpr std::array<int, 3> array = {1, 2, 3};
-  static_assert(PA_UNSAFE_TODO(&array[0] + 3) == ranges::end(array), "");
-}
-
-TEST(RangesTest, EndRegularContainers) {
-  std::vector<int> vec;
-  S s;
-
-  EXPECT_EQ(vec.end(), ranges::end(vec));
-  EXPECT_EQ(s.v.end(), ranges::end(s));
-}
-
-TEST(RangesTest, BeginEndStdArray) {
-  static constexpr std::array<int, 0> null_array = GenerateArray<0>();
-  static_assert(ranges::begin(null_array) == ranges::end(null_array), "");
-
-  static constexpr std::array<int, 3> array = GenerateArray<3>();
-  static_assert(array[0] == 0, "");
-  static_assert(array[1] == 1, "");
-  static_assert(array[2] == 2, "");
-}
-
-}  // namespace partition_alloc::internal::base
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/safe_sprintf.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/safe_sprintf.cc
index b3958451..0bc00fd 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/safe_sprintf.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/safe_sprintf.cc
@@ -118,14 +118,9 @@
   // the trailing NUL that will be added by the destructor. The buffer also
   // must be smaller or equal to kSSizeMax in size.
   Buffer(char* buffer, size_t size) : buffer_(buffer), size_(size - 1) {
-// MSVS2013's standard library doesn't mark max() as constexpr yet. cl.exe
-// supports static_cast but doesn't really implement constexpr yet so it doesn't
-// complain, but clang does.
-#if __cplusplus >= 201103 && !(defined(__clang__) && PA_BUILDFLAG(IS_WIN))
     static_assert(kSSizeMaxConst ==
                       static_cast<size_t>(std::numeric_limits<ssize_t>::max()),
                   "kSSizeMaxConst should be the max value of an ssize_t");
-#endif
     DEBUG_CHECK(size > 0);
     DEBUG_CHECK(size <= kSSizeMax);
   }
diff --git a/base/allocator/partition_allocator/src/partition_alloc/pointers/instance_tracer.h b/base/allocator/partition_allocator/src/partition_alloc/pointers/instance_tracer.h
index 7612e41..810b3329 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/pointers/instance_tracer.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/pointers/instance_tracer.h
@@ -23,7 +23,6 @@
 #include <vector>
 
 #include "partition_alloc/partition_alloc_base/component_export.h"
-#include "partition_alloc/partition_alloc_base/cxx20_is_constant_evaluated.h"
 #endif
 
 namespace base::internal {
@@ -49,15 +48,13 @@
   constexpr static void Trace(uint64_t owner_id,
                               bool may_dangle,
                               uintptr_t address) {
-    if (partition_alloc::internal::base::is_constant_evaluated() ||
-        owner_id == 0) {
+    if (std::is_constant_evaluated() || owner_id == 0) {
       return;
     }
     TraceImpl(owner_id, may_dangle, address);
   }
   constexpr static void Untrace(uint64_t owner_id) {
-    if (partition_alloc::internal::base::is_constant_evaluated() ||
-        owner_id == 0) {
+    if (std::is_constant_evaluated() || owner_id == 0) {
       return;
     }
     UntraceImpl(owner_id);
@@ -77,7 +74,7 @@
   PA_COMPONENT_EXPORT(RAW_PTR) static void UntraceImpl(uint64_t owner_id);
 
   constexpr uint64_t CreateOwnerId() {
-    if (partition_alloc::internal::base::is_constant_evaluated()) {
+    if (std::is_constant_evaluated()) {
       return 0;
     }
     return ++counter_;
diff --git a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr.h b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr.h
index 550bfad0..00e8b56 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr.h
@@ -21,7 +21,6 @@
 #include "partition_alloc/partition_alloc_base/augmentations/compiler_specific.h"
 #include "partition_alloc/partition_alloc_base/compiler_specific.h"
 #include "partition_alloc/partition_alloc_base/component_export.h"
-#include "partition_alloc/partition_alloc_base/cxx20_is_constant_evaluated.h"
 #include "partition_alloc/partition_alloc_base/types/same_as_any.h"
 #include "partition_alloc/partition_alloc_config.h"
 #include "partition_alloc/partition_alloc_forward.h"
diff --git a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_asan_unowned_impl.h b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_asan_unowned_impl.h
index c0bac52..c3235f1 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_asan_unowned_impl.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_asan_unowned_impl.h
@@ -15,7 +15,6 @@
 
 #include "partition_alloc/buildflags.h"
 #include "partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "partition_alloc/partition_alloc_base/cxx20_is_constant_evaluated.h"
 #include "partition_alloc/partition_alloc_forward.h"
 
 #if !PA_BUILDFLAG(USE_RAW_PTR_ASAN_UNOWNED_IMPL)
@@ -44,7 +43,7 @@
   // Notifies the allocator when a wrapped pointer is being removed or replaced.
   template <typename T>
   PA_ALWAYS_INLINE static constexpr void ReleaseWrappedPtr(T* wrapped_ptr) {
-    if (!partition_alloc::internal::base::is_constant_evaluated()) {
+    if (!std::is_constant_evaluated()) {
       ProbeForLowSeverityLifetimeIssue(wrapped_ptr);
     }
   }
@@ -63,7 +62,7 @@
   template <typename T>
   PA_ALWAYS_INLINE static constexpr T* SafelyUnwrapPtrForExtraction(
       T* wrapped_ptr) {
-    if (!partition_alloc::internal::base::is_constant_evaluated()) {
+    if (!std::is_constant_evaluated()) {
       ProbeForLowSeverityLifetimeIssue(wrapped_ptr);
     }
     return wrapped_ptr;
diff --git a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_backup_ref_impl.h b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_backup_ref_impl.h
index b5ba695..4adcc17 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_backup_ref_impl.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_backup_ref_impl.h
@@ -13,7 +13,6 @@
 #include "partition_alloc/partition_address_space.h"
 #include "partition_alloc/partition_alloc_base/compiler_specific.h"
 #include "partition_alloc/partition_alloc_base/component_export.h"
-#include "partition_alloc/partition_alloc_base/cxx20_is_constant_evaluated.h"
 #include "partition_alloc/partition_alloc_config.h"
 #include "partition_alloc/partition_alloc_constants.h"
 #include "partition_alloc/partition_alloc_forward.h"
@@ -153,7 +152,7 @@
   // Wraps a pointer.
   template <typename T>
   PA_ALWAYS_INLINE static constexpr T* WrapRawPtr(T* ptr) {
-    if (partition_alloc::internal::base::is_constant_evaluated()) {
+    if (std::is_constant_evaluated()) {
       return ptr;
     }
     uintptr_t address = partition_alloc::UntagPtr(UnpoisonPtr(ptr));
@@ -188,7 +187,7 @@
   // Notifies the allocator when a wrapped pointer is being removed or replaced.
   template <typename T>
   PA_ALWAYS_INLINE static constexpr void ReleaseWrappedPtr(T* wrapped_ptr) {
-    if (partition_alloc::internal::base::is_constant_evaluated()) {
+    if (std::is_constant_evaluated()) {
       return;
     }
     uintptr_t address = partition_alloc::UntagPtr(UnpoisonPtr(wrapped_ptr));
@@ -214,7 +213,7 @@
   template <typename T>
   PA_ALWAYS_INLINE static constexpr T* SafelyUnwrapPtrForDereference(
       T* wrapped_ptr) {
-    if (partition_alloc::internal::base::is_constant_evaluated()) {
+    if (std::is_constant_evaluated()) {
       return wrapped_ptr;
     }
 #if PA_BUILDFLAG(DCHECKS_ARE_ON) || \
@@ -237,7 +236,7 @@
   template <typename T>
   PA_ALWAYS_INLINE static constexpr T* SafelyUnwrapPtrForExtraction(
       T* wrapped_ptr) {
-    if (partition_alloc::internal::base::is_constant_evaluated()) {
+    if (std::is_constant_evaluated()) {
       return wrapped_ptr;
     }
     T* unpoisoned_ptr = UnpoisonPtr(wrapped_ptr);
@@ -263,7 +262,7 @@
   template <typename T>
   PA_ALWAYS_INLINE static constexpr T* UnsafelyUnwrapPtrForComparison(
       T* wrapped_ptr) {
-    if (partition_alloc::internal::base::is_constant_evaluated()) {
+    if (std::is_constant_evaluated()) {
       return wrapped_ptr;
     }
     // This may be used for unwrapping an end-of-allocation pointer to be used
@@ -345,7 +344,7 @@
   PA_UNSAFE_BUFFER_USAGE PA_ALWAYS_INLINE static constexpr T*
   Advance(T* wrapped_ptr, Z delta_elems, bool is_in_pointer_modification) {
     // SAFETY: Preconditions enforced by PA_UNSAFE_BUFFER_USAGE.
-    if (partition_alloc::internal::base::is_constant_evaluated()) {
+    if (std::is_constant_evaluated()) {
       return PA_UNSAFE_BUFFERS(wrapped_ptr + delta_elems);
     }
     T* unpoisoned_ptr = UnpoisonPtr(wrapped_ptr);
@@ -375,7 +374,7 @@
           std::enable_if_t<partition_alloc::internal::is_offset_type<Z>, void>>
   PA_UNSAFE_BUFFER_USAGE PA_ALWAYS_INLINE static constexpr T*
   Retreat(T* wrapped_ptr, Z delta_elems, bool is_in_pointer_modification) {
-    if (partition_alloc::internal::base::is_constant_evaluated()) {
+    if (std::is_constant_evaluated()) {
       // SAFETY: Preconditions enforced by PA_UNSAFE_BUFFER_USAGE.
       return PA_UNSAFE_BUFFERS(wrapped_ptr - delta_elems);
     }
@@ -397,14 +396,14 @@
   template <typename T>
   PA_ALWAYS_INLINE static constexpr ptrdiff_t GetDeltaElems(T* wrapped_ptr1,
                                                             T* wrapped_ptr2) {
-    if (partition_alloc::internal::base::is_constant_evaluated()) {
+    if (std::is_constant_evaluated()) {
       return wrapped_ptr1 - wrapped_ptr2;
     }
 
     T* unpoisoned_ptr1 = UnpoisonPtr(wrapped_ptr1);
     T* unpoisoned_ptr2 = UnpoisonPtr(wrapped_ptr2);
 #if PA_BUILDFLAG(ENABLE_POINTER_SUBTRACTION_CHECK)
-    if (partition_alloc::internal::base::is_constant_evaluated()) {
+    if (std::is_constant_evaluated()) {
       return unpoisoned_ptr1 - unpoisoned_ptr2;
     }
     uintptr_t address1 = partition_alloc::UntagPtr(unpoisoned_ptr1);
@@ -428,7 +427,7 @@
   // This method increments the reference count of the allocation slot.
   template <typename T>
   PA_ALWAYS_INLINE static constexpr T* Duplicate(T* wrapped_ptr) {
-    if (partition_alloc::internal::base::is_constant_evaluated()) {
+    if (std::is_constant_evaluated()) {
       return wrapped_ptr;
     }
     return WrapRawPtr(wrapped_ptr);
@@ -444,7 +443,7 @@
   // to create a new raw_ptr<T> from another raw_ptr<T> of a different flavor.
   template <typename T>
   PA_ALWAYS_INLINE static constexpr T* WrapRawPtrForDuplication(T* ptr) {
-    if (partition_alloc::internal::base::is_constant_evaluated()) {
+    if (std::is_constant_evaluated()) {
       return ptr;
     } else {
       return WrapRawPtr(ptr);
@@ -454,7 +453,7 @@
   template <typename T>
   PA_ALWAYS_INLINE static constexpr T* UnsafelyUnwrapPtrForDuplication(
       T* wrapped_ptr) {
-    if (partition_alloc::internal::base::is_constant_evaluated()) {
+    if (std::is_constant_evaluated()) {
       return wrapped_ptr;
     } else {
       return UnpoisonPtr(wrapped_ptr);
@@ -464,7 +463,7 @@
 #if PA_BUILDFLAG(ENABLE_BACKUP_REF_PTR_INSTANCE_TRACER)
   template <typename T>
   static constexpr void Trace(uint64_t owner_id, T* wrapped_ptr) {
-    if (partition_alloc::internal::base::is_constant_evaluated()) {
+    if (std::is_constant_evaluated()) {
       return;
     }
 
@@ -478,7 +477,7 @@
   }
 
   static constexpr void Untrace(uint64_t owner_id) {
-    if (partition_alloc::internal::base::is_constant_evaluated()) {
+    if (std::is_constant_evaluated()) {
       return;
     }
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_hookable_impl.h b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_hookable_impl.h
index 2e28fec..1152f07 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_hookable_impl.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_hookable_impl.h
@@ -11,7 +11,6 @@
 #include "partition_alloc/buildflags.h"
 #include "partition_alloc/partition_alloc_base/compiler_specific.h"
 #include "partition_alloc/partition_alloc_base/component_export.h"
-#include "partition_alloc/partition_alloc_base/cxx20_is_constant_evaluated.h"
 #include "partition_alloc/partition_alloc_forward.h"
 
 #if !PA_BUILDFLAG(USE_RAW_PTR_HOOKABLE_IMPL)
@@ -56,7 +55,7 @@
   // Wraps a pointer.
   template <typename T>
   PA_ALWAYS_INLINE static constexpr T* WrapRawPtr(T* ptr) {
-    if (!partition_alloc::internal::base::is_constant_evaluated()) {
+    if (!std::is_constant_evaluated()) {
       if (EnableHooks) {
         GetRawPtrHooks()->wrap_ptr(reinterpret_cast<uintptr_t>(ptr));
       }
@@ -67,7 +66,7 @@
   // Notifies the allocator when a wrapped pointer is being removed or replaced.
   template <typename T>
   PA_ALWAYS_INLINE static constexpr void ReleaseWrappedPtr(T* ptr) {
-    if (!partition_alloc::internal::base::is_constant_evaluated()) {
+    if (!std::is_constant_evaluated()) {
       if (EnableHooks) {
         GetRawPtrHooks()->release_wrapped_ptr(reinterpret_cast<uintptr_t>(ptr));
       }
@@ -79,7 +78,7 @@
   template <typename T>
   PA_ALWAYS_INLINE static constexpr T* SafelyUnwrapPtrForDereference(
       T* wrapped_ptr) {
-    if (!partition_alloc::internal::base::is_constant_evaluated()) {
+    if (!std::is_constant_evaluated()) {
       if (EnableHooks) {
         GetRawPtrHooks()->safely_unwrap_for_dereference(
             reinterpret_cast<uintptr_t>(wrapped_ptr));
@@ -93,7 +92,7 @@
   template <typename T>
   PA_ALWAYS_INLINE static constexpr T* SafelyUnwrapPtrForExtraction(
       T* wrapped_ptr) {
-    if (!partition_alloc::internal::base::is_constant_evaluated()) {
+    if (!std::is_constant_evaluated()) {
       if (EnableHooks) {
         GetRawPtrHooks()->safely_unwrap_for_extraction(
             reinterpret_cast<uintptr_t>(wrapped_ptr));
@@ -107,7 +106,7 @@
   template <typename T>
   PA_ALWAYS_INLINE static constexpr T* UnsafelyUnwrapPtrForComparison(
       T* wrapped_ptr) {
-    if (!partition_alloc::internal::base::is_constant_evaluated()) {
+    if (!std::is_constant_evaluated()) {
       if (EnableHooks) {
         GetRawPtrHooks()->unsafely_unwrap_for_comparison(
             reinterpret_cast<uintptr_t>(wrapped_ptr));
@@ -137,7 +136,7 @@
   PA_UNSAFE_BUFFER_USAGE PA_ALWAYS_INLINE static constexpr T*
   Advance(T* wrapped_ptr, Z delta_elems, bool /*is_in_pointer_modification*/) {
     // SAFETY: required from caller, enforced by PA_UNSAFE_BUFFER_USAGE.
-    if (!partition_alloc::internal::base::is_constant_evaluated()) {
+    if (!std::is_constant_evaluated()) {
       if (EnableHooks) {
         GetRawPtrHooks()->advance(reinterpret_cast<uintptr_t>(wrapped_ptr),
                                   reinterpret_cast<uintptr_t>(PA_UNSAFE_BUFFERS(
@@ -158,7 +157,7 @@
   PA_UNSAFE_BUFFER_USAGE PA_ALWAYS_INLINE static constexpr T*
   Retreat(T* wrapped_ptr, Z delta_elems, bool /*is_in_pointer_modification*/) {
     // SAFETY: required from caller, enforced by PA_UNSAFE_BUFFER_USAGE.
-    if (!partition_alloc::internal::base::is_constant_evaluated()) {
+    if (!std::is_constant_evaluated()) {
       if (EnableHooks) {
         GetRawPtrHooks()->advance(reinterpret_cast<uintptr_t>(wrapped_ptr),
                                   reinterpret_cast<uintptr_t>(PA_UNSAFE_BUFFERS(
@@ -178,7 +177,7 @@
   // memory was freed or not.
   template <typename T>
   PA_ALWAYS_INLINE static constexpr T* Duplicate(T* wrapped_ptr) {
-    if (!partition_alloc::internal::base::is_constant_evaluated()) {
+    if (!std::is_constant_evaluated()) {
       if (EnableHooks) {
         GetRawPtrHooks()->duplicate(reinterpret_cast<uintptr_t>(wrapped_ptr));
       }
@@ -190,7 +189,7 @@
   // to create a new raw_ptr<T> from another raw_ptr<T> of a different flavor.
   template <typename T>
   PA_ALWAYS_INLINE static constexpr T* WrapRawPtrForDuplication(T* ptr) {
-    if (!partition_alloc::internal::base::is_constant_evaluated()) {
+    if (!std::is_constant_evaluated()) {
       if (EnableHooks) {
         GetRawPtrHooks()->wrap_ptr_for_duplication(
             reinterpret_cast<uintptr_t>(ptr));
@@ -202,7 +201,7 @@
   template <typename T>
   PA_ALWAYS_INLINE static constexpr T* UnsafelyUnwrapPtrForDuplication(
       T* wrapped_ptr) {
-    if (!partition_alloc::internal::base::is_constant_evaluated()) {
+    if (!std::is_constant_evaluated()) {
       if (EnableHooks) {
         GetRawPtrHooks()->unsafely_unwrap_for_duplication(
             reinterpret_cast<uintptr_t>(wrapped_ptr));
diff --git a/build/android/gyp/lint.py b/build/android/gyp/lint.py
index 9204cc9..a9120ee8 100755
--- a/build/android/gyp/lint.py
+++ b/build/android/gyp/lint.py
@@ -15,7 +15,6 @@
 from xml.etree import ElementTree
 
 from util import build_utils
-from util import manifest_utils
 from util import server_utils
 import action_helpers  # build_utils adds //build to sys.path.
 
@@ -54,7 +53,6 @@
 
 _RES_ZIP_DIR = 'RESZIPS'
 _SRCJAR_DIR = 'SRCJARS'
-_AAR_DIR = 'AARS'
 
 
 def _SrcRelative(path):
@@ -94,8 +92,10 @@
   main_module.set('partial-results-dir', partials_dir)
   if android_sdk_version:
     main_module.set('compile_sdk_version', android_sdk_version)
-  manifest = ElementTree.SubElement(main_module, 'manifest')
-  manifest.set('file', android_manifest)
+  # Cache task has no manifest.
+  if android_manifest:
+    manifest = ElementTree.SubElement(main_module, 'merged-manifest')
+    manifest.set('file', android_manifest)
   if srcjar_sources:
     srcjar_sources = sorted(set(srcjar_sources))  # Ensure these are unique.
     for srcjar_file in srcjar_sources:
@@ -155,46 +155,6 @@
   return root_node
 
 
-def _GenerateAndroidManifest(manifest_paths, min_sdk_version,
-                             android_sdk_version):
-
-  if not manifest_paths:
-    root_manifest = os.path.join(build_utils.DIR_SOURCE_ROOT, 'build',
-                                 'android', 'AndroidManifest.xml')
-  else:
-    root_manifest = manifest_paths[0]
-    manifest_paths = manifest_paths[1:]
-  # Set minSdkVersion in the manifest to the correct value.
-  doc, manifest, app_node = manifest_utils.ParseManifest(root_manifest)
-
-  # TODO(crbug.com/40148088): Should this be done using manifest merging?
-  # Add anything in the application node of the extra manifests to the main
-  # manifest to prevent unused resource errors.
-  for path in manifest_paths:
-    _, _, extra_app_node = manifest_utils.ParseManifest(path)
-    for node in extra_app_node:
-      app_node.append(node)
-
-  # Remove FingerprintDialogActivity, since it is not used. A hack until
-  # https://crbug.com/457436186 is fixed in a better way.
-  for activity in app_node.findall('activity'):
-    if activity.get(
-        '{%s}name' %
-        manifest_utils.ANDROID_NAMESPACE) == ('androidx.biometric.internal.ui'
-                                              '.FingerprintDialogActivity'):
-      app_node.remove(activity)
-
-  uses_sdk = manifest.find('./uses-sdk')
-  if uses_sdk is None:
-    uses_sdk = ElementTree.Element('uses-sdk')
-    manifest.insert(0, uses_sdk)
-  uses_sdk.set('{%s}minSdkVersion' % manifest_utils.ANDROID_NAMESPACE,
-               min_sdk_version)
-  uses_sdk.set('{%s}targetSdkVersion' % manifest_utils.ANDROID_NAMESPACE,
-               android_sdk_version)
-  return doc
-
-
 def _WriteXmlFile(root, path):
   logging.info('Writing xml file %s', path)
   build_utils.MakeDirectory(os.path.dirname(path))
@@ -209,20 +169,19 @@
 def _RunLint(lint_jar_path,
              backported_methods_path,
              config_path,
-             manifest_paths,
              sources,
              classpath,
              cache_dir,
              android_sdk_version,
              aars,
              srcjars,
-             min_sdk_version,
              resource_sources,
              resource_zips,
              android_sdk_root,
              lint_gen_dir,
              baseline,
              create_cache,
+             manifest_path,
              warnings_as_errors=False):
   logging.info('Lint starting')
   if not cache_dir:
@@ -242,8 +201,7 @@
     creating_baseline = False
     lint_xmx = '4G'
 
-  # Lint requires this directory to exist and be cleared.
-  # See b/324598620
+  # Lint requires this directory to exist and be cleared. See b/324598620.
   partials_dir = os.path.join(lint_gen_dir, 'partials')
   shutil.rmtree(partials_dir, ignore_errors=True)
   os.makedirs(partials_dir)
@@ -287,16 +245,6 @@
   _WriteXmlFile(config_xml_node, generated_config_path)
   cmd.extend(['--config', generated_config_path])
 
-  logging.info('Generating Android manifest file')
-  android_manifest_tree = _GenerateAndroidManifest(manifest_paths,
-                                                   min_sdk_version,
-                                                   android_sdk_version)
-  # Just use a hardcoded name, since we may have different target names (and
-  # thus different manifest_paths) using the same lint baseline. Eg.
-  # trichrome_chrome_bundle and trichrome_chrome_32_64_bundle.
-  lint_android_manifest_path = os.path.join(lint_gen_dir, 'AndroidManifest.xml')
-  _WriteXmlFile(android_manifest_tree.getroot(), lint_android_manifest_path)
-
   resource_root_dir = os.path.join(lint_gen_dir, _RES_ZIP_DIR)
   shutil.rmtree(resource_root_dir, True)
   # These are zip files with generated resources (e. g. strings from GRD).
@@ -325,11 +273,11 @@
       srcjar_sources.extend(build_utils.ExtractAll(srcjar, path=srcjar_dir))
 
   logging.info('Generating project file')
-  project_file_root = _GenerateProjectFile(lint_android_manifest_path,
-                                           android_sdk_root, cache_dir,
-                                           partials_dir, sources, classpath,
-                                           srcjar_sources, resource_sources,
-                                           aars, android_sdk_version, baseline)
+  project_file_root = _GenerateProjectFile(manifest_path, android_sdk_root,
+                                           cache_dir, partials_dir, sources,
+                                           classpath, srcjar_sources,
+                                           resource_sources, aars,
+                                           android_sdk_version, baseline)
 
   project_xml_path = os.path.join(lint_gen_dir, 'project.xml')
   _WriteXmlFile(project_file_root, project_xml_path)
@@ -349,13 +297,6 @@
     ]
     return build_utils.FilterLines(output, '|'.join(filter_patterns))
 
-  def stderr_filter(output):
-    output = build_utils.FilterReflectiveAccessJavaWarnings(output)
-    # Presumably a side-effect of our manual manifest merging, but does not
-    # seem to actually break anything:
-    # "Manifest merger failed with multiple errors, see logs"
-    return build_utils.FilterLines(output, 'Manifest merger failed')
-
   start = time.time()
   failed = False
 
@@ -369,7 +310,6 @@
     build_utils.CheckOutput(cmd,
                             print_stdout=True,
                             stdout_filter=stdout_filter,
-                            stderr_filter=stderr_filter,
                             fail_on_output=warnings_as_errors,
                             fail_func=fail_func)
   except build_utils.CalledProcessError as e:
@@ -425,9 +365,6 @@
   parser.add_argument('--android-sdk-version',
                       help='Version (API level) of the Android SDK used for '
                       'building.')
-  parser.add_argument('--min-sdk-version',
-                      required=True,
-                      help='Minimal SDK version to lint against.')
   parser.add_argument('--android-sdk-root',
                       required=True,
                       help='Lint needs an explicit path to the android sdk.')
@@ -442,9 +379,8 @@
                       'files.')
   parser.add_argument('--aars', help='GN list of included aars.')
   parser.add_argument('--srcjars', help='GN list of included srcjars.')
-  parser.add_argument('--manifest-paths',
-                      action='append',
-                      help='GYP-list of manifest paths, with base being first')
+  parser.add_argument('--manifest',
+                      help='Path to the merged AndroidManifest.xml.')
   parser.add_argument('--resource-sources',
                       default=[],
                       action='append',
@@ -466,7 +402,6 @@
   args.aars = action_helpers.parse_gn_list(args.aars)
   args.srcjars = action_helpers.parse_gn_list(args.srcjars)
   args.resource_sources = action_helpers.parse_gn_list(args.resource_sources)
-  args.manifest_paths = action_helpers.parse_gn_list(args.manifest_paths)
   args.resource_zips = action_helpers.parse_gn_list(args.resource_zips)
   args.classpath = action_helpers.parse_gn_list(args.classpath)
 
@@ -491,16 +426,12 @@
     resource_sources.extend(build_utils.ReadSourcesList(resource_sources_file))
 
   possible_depfile_deps = (args.srcjars + args.resource_zips + sources +
-                           resource_sources + args.manifest_paths + [
-                               args.baseline,
-                           ])
+                           resource_sources + [args.baseline, args.manifest])
   depfile_deps = [p for p in possible_depfile_deps if p]
 
   if args.depfile:
     action_helpers.write_depfile(args.depfile, args.stamp, depfile_deps)
 
-  # TODO(wnwen): Consider removing lint cache now that there are only two lint
-  #              invocations.
   # Avoid parallelizing cache creation since lint runs without the cache defeat
   # the purpose of creating the cache in the first place. Forward the command
   # after the depfile has been written as siso requires it.
@@ -514,20 +445,19 @@
   _RunLint(args.lint_jar_path,
            args.backported_methods,
            args.config_path,
-           args.manifest_paths,
            sources,
            args.classpath,
            args.cache_dir,
            args.android_sdk_version,
            args.aars,
            args.srcjars,
-           args.min_sdk_version,
            resource_sources,
            args.resource_zips,
            args.android_sdk_root,
            args.lint_gen_dir,
            args.baseline,
            args.create_cache,
+           args.manifest,
            warnings_as_errors=args.warnings_as_errors)
   logging.info('Creating stamp file')
   server_utils.MaybeTouch(args.stamp)
diff --git a/build/android/gyp/lint.pydeps b/build/android/gyp/lint.pydeps
index 84bafde..31e0023 100644
--- a/build/android/gyp/lint.pydeps
+++ b/build/android/gyp/lint.pydeps
@@ -5,5 +5,4 @@
 lint.py
 util/__init__.py
 util/build_utils.py
-util/manifest_utils.py
 util/server_utils.py
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni
index 8f13674..9d355f22e 100644
--- a/build/config/android/internal_rules.gni
+++ b/build/config/android/internal_rules.gni
@@ -1119,7 +1119,6 @@
         "--lint-gen-dir",
         rebase_path(_lint_gen_dir, root_build_dir),
         "--android-sdk-version=${lint_android_sdk_version}",
-        "--min-sdk-version=$_min_sdk_version",
         "--android-sdk-root",
         rebase_path(lint_android_sdk_root, root_build_dir),
         "--backported-methods",
@@ -1192,8 +1191,10 @@
         inputs += [ _lint_json ]
         _rebased_lint_json = rebase_path(_lint_json, root_build_dir)
 
+        inputs += [ invoker.manifest ]
         args += [
-          "--manifest-paths=@FileArg($_rebased_lint_json:android_manifests)",
+          "--manifest",
+          rebase_path(invoker.manifest, root_build_dir),
 
           # Lint requires all source and all resource files to be passed in the
           # same invocation for checks like UnusedResources.
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni
index 3ef508b4..2aebf6c 100644
--- a/build/config/android/rules.gni
+++ b/build/config/android/rules.gni
@@ -3257,22 +3257,22 @@
                                  "lint_gen_dir",
                                  "lint_jar_path",
                                  "lint_suppressions_file",
-                                 "min_sdk_version",
                                ])
         build_config = _build_config
         build_config_dep = ":$_build_config_target"
+        manifest = _android_manifest
 
         # This will use library subtargets under-the-hood
-        deps = [ ":$_java_target_name" ]
+        deps = [
+          ":$_java_target_name",
+          ":$_merge_manifest_target",
+        ]
         if (defined(invoker.lint_suppressions_dep)) {
           deps += [ invoker.lint_suppressions_dep ]
         }
         if (defined(invoker.asset_deps)) {
           deps += invoker.asset_deps
         }
-        if (defined(invoker.lint_min_sdk_version)) {
-          min_sdk_version = invoker.lint_min_sdk_version
-        }
       }
     } else {
       not_needed(invoker,
@@ -3280,7 +3280,6 @@
                    "lint_baseline_file",
                    "lint_gen_dir",
                    "lint_jar_path",
-                   "lint_min_sdk_version",
                    "lint_suppressions_dep",
                    "lint_suppressions_file",
                  ])
@@ -5241,39 +5240,6 @@
       }
     }
 
-    if (_enable_lint) {
-      android_lint("${target_name}__lint") {
-        forward_variables_from(invoker,
-                               [
-                                 "lint_baseline_file",
-                                 "lint_gen_dir",
-                                 "lint_jar_path",
-                                 "lint_suppressions_file",
-                               ])
-        build_config = _build_config
-        build_config_dep = _build_config_target
-        deps = _module_java_targets
-        if (defined(invoker.lint_suppressions_dep)) {
-          deps += [ invoker.lint_suppressions_dep ]
-        }
-        if (defined(invoker.lint_min_sdk_version)) {
-          min_sdk_version = invoker.lint_min_sdk_version
-        } else {
-          min_sdk_version = _min_sdk_version
-        }
-      }
-    } else {
-      not_needed(invoker,
-                 [
-                   "lint_baseline_file",
-                   "lint_gen_dir",
-                   "lint_jar_path",
-                   "lint_min_sdk_version",
-                   "lint_suppressions_dep",
-                   "lint_suppressions_file",
-                 ])
-    }
-
     group(_target_name) {
       public_deps = [
         ":$_bundle_target_name",
diff --git a/chrome/VERSION b/chrome/VERSION
index 144e438..fb05264 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=144
 MINOR=0
-BUILD=7536
+BUILD=7537
 PATCH=0
diff --git a/chrome/android/expectations/lint-baseline.xml b/chrome/android/expectations/lint-baseline.xml
index 283b0ebb..4e9457a1 100644
--- a/chrome/android/expectations/lint-baseline.xml
+++ b/chrome/android/expectations/lint-baseline.xml
@@ -598,12 +598,12 @@
     <issue
         id="DataExtractionRules"
         message="The attribute `android:allowBackup` is deprecated from Android 12 and higher and may be removed in future versions. Consider adding the attribute `android:dataExtractionRules` specifying an `@xml` resource which configures cloud backups and device transfers on Android 12 and higher."
-        errorLine1="  &lt;application android:name=&quot;org.chromium.chrome.browser.base.SplitChromeApplication&quot; android:icon=&quot;@drawable/ic_launcher&quot; android:roundIcon=&quot;@drawable/ic_launcher_round&quot; android:label=&quot;@string/app_name&quot; android:memtagMode=&quot;async&quot; android:largeHeap=&quot;false&quot; android:manageSpaceActivity=&quot;@string/manage_space_activity&quot; android:supportsRtl=&quot;true&quot; android:zygotePreloadName=&quot;org.chromium.content_public.app.ZygotePreload&quot; android:allowBackup=&quot;false&quot; android:networkSecurityConfig=&quot;@xml/network_security_config&quot; android:allowAudioPlaybackCapture=&quot;false&quot; android:appComponentFactory=&quot;org.chromium.chrome.browser.base.SplitCompatAppComponentFactory&quot; android:enableOnBackInvokedCallback=&quot;true&quot;>"
-        errorLine2="  ^">
+        errorLine1="    &lt;application />"
+        errorLine2="    ~~~~~~~~~~~~~~~">
         <location
-            file="gen/chrome/android/chrome_public_apk__lint/AndroidManifest.xml"
-            line="274"
-            column="3"/>
+            file="android_lint_cache/aars/lottie.aar/AndroidManifest.xml"
+            line="7"
+            column="5"/>
     </issue>
 
     <issue
@@ -839,6 +839,211 @@
 
     <issue
         id="UnusedResources"
+        message="The resource `R.xml.ad_services_config` appears to be unused"
+        errorLine1="&lt;ad-services-config>"
+        errorLine2="^">
+        <location
+            file="../../chrome/android/java/res/xml/ad_services_config.xml"
+            line="8"
+            column="1"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.fre_activity_label` appears to be unused"
+        errorLine1="&lt;string name=&quot;fre_activity_label&quot;>&quot;Chrome se eerste laatloopervaring&quot;&lt;/string>"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="gen/chrome/android/chrome_public_apk__lint/RESZIPS/obj/chrome/browser/ui/android/strings/ui_strings_grd.resources.zip/values-af/android_chrome_strings.xml"
+            line="1141"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.bookmark_choose_folder` appears to be unused"
+        errorLine1="&lt;string name=&quot;bookmark_choose_folder&quot;>&quot;Kies vouer&quot;&lt;/string>"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="gen/chrome/android/chrome_public_apk__lint/RESZIPS/obj/chrome/browser/ui/android/strings/ui_strings_grd.resources.zip/values-af/android_chrome_strings.xml"
+            line="1463"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.bookmark_widget_description` appears to be unused"
+        errorLine1="&lt;string name=&quot;bookmark_widget_description&quot;>&quot;Kry maklik toegang tot jou boekmerke&quot;&lt;/string>"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="gen/chrome/android/chrome_public_apk__lint/RESZIPS/obj/chrome/browser/ui/android/strings/ui_strings_grd.resources.zip/values-af/android_chrome_strings.xml"
+            line="1480"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.content_provider_search_description` appears to be unused"
+        errorLine1="&lt;string name=&quot;content_provider_search_description&quot;>&quot;Boekmerke en webgeskiedenis&quot;&lt;/string>"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="gen/chrome/android/chrome_public_apk__lint/RESZIPS/obj/chrome/browser/ui/android/strings/ui_strings_grd.resources.zip/values-af/android_chrome_strings.xml"
+            line="1576"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.webapp_activity_title` appears to be unused"
+        errorLine1="&lt;string name=&quot;webapp_activity_title&quot;>&quot;Webprogram&quot;&lt;/string>"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="gen/chrome/android/chrome_public_apk__lint/RESZIPS/obj/chrome/browser/ui/android/strings/ui_strings_grd.resources.zip/values-af/android_chrome_strings.xml"
+            line="1736"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.search_widget_description` appears to be unused"
+        errorLine1="&lt;string name=&quot;search_widget_description&quot;>&quot;Begin vinnig ’n soektog in Chrome&quot;&lt;/string>"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="gen/chrome/android/chrome_public_apk__lint/RESZIPS/obj/chrome/browser/ui/android/strings/ui_strings_grd.resources.zip/values-af/android_chrome_strings.xml"
+            line="1985"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.quick_action_search_widget_description` appears to be unused"
+        errorLine1="&lt;string name=&quot;quick_action_search_widget_description&quot;>&quot;Soek met behulp van sleutelbord, stem, Incognito of kamera&quot;&lt;/string>"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="gen/chrome/android/chrome_public_apk__lint/RESZIPS/obj/chrome/browser/ui/android/strings/ui_strings_grd.resources.zip/values-af/android_chrome_strings.xml"
+            line="1991"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.dino_widget_description` appears to be unused"
+        errorLine1="&lt;string name=&quot;dino_widget_description&quot;>&quot;Spring in ’n lekker Dino-speletjie&quot;&lt;/string>"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="gen/chrome/android/chrome_public_apk__lint/RESZIPS/obj/chrome/browser/ui/android/strings/ui_strings_grd.resources.zip/values-af/android_chrome_strings.xml"
+            line="1993"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.disabled_incognito_launcher_shortcut_message` appears to be unused"
+        errorLine1="&lt;string name=&quot;disabled_incognito_launcher_shortcut_message&quot;>&quot;Verwyder hierdie kortpad en skep dit weer&quot;&lt;/string>"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="gen/chrome/android/chrome_public_apk__lint/RESZIPS/obj/chrome/browser/ui/android/strings/ui_strings_grd.resources.zip/values-af/android_chrome_strings.xml"
+            line="1994"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.xml.app_restrictions` appears to be unused"
+        errorLine1="&lt;restrictions xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;>"
+        errorLine2="^">
+        <location
+            file="gen/chrome/app/policy/android/xml-v21/app_restrictions.xml"
+            line="8"
+            column="1"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.xml.bookmark_widget_info` appears to be unused"
+        errorLine1="&lt;appwidget-provider"
+        errorLine2="^">
+        <location
+            file="../../chrome/android/java/res/xml/bookmark_widget_info.xml"
+            line="9"
+            column="1"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.drawable.bookmark_widget_layout_preview` appears to be unused"
+        errorLine1="&lt;vector xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; xmlns:aapt=&quot;http://schemas.android.com/aapt&quot;"
+        errorLine2="^">
+        <location
+            file="../../chrome/android/java/res/drawable/bookmark_widget_layout_preview.xml"
+            line="8"
+            column="1"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.drawable.bookmark_widget_preview` appears to be unused">
+        <location
+            file="../../chrome/android/java/res/drawable-nodpi/bookmark_widget_preview.png"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.layout.bookmark_widget_preview_layout` appears to be unused"
+        errorLine1="&lt;FrameLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
+        errorLine2="^">
+        <location
+            file="../../chrome/android/java/res/layout/bookmark_widget_preview_layout.xml"
+            line="8"
+            column="1"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.decoder_description` appears to be unused"
+        errorLine1="&lt;string name=&quot;decoder_description&quot;>&quot;Prentdekodeerder&quot;&lt;/string>"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="gen/chrome/android/chrome_public_apk__lint/RESZIPS/obj/components/browser_ui/strings/android/browser_ui_strings_grd.resources.zip/values-af/browser_ui_strings.xml"
+            line="653"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.bookmark_widget_title` appears to be unused"
+        errorLine1="    &lt;string name=&quot;bookmark_widget_title&quot; translatable=&quot;false&quot;>Chromium bookmarks&lt;/string>"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../chrome/android/java/res_chromium_base/values/channel_constants.xml"
+            line="11"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.search_widget_title` appears to be unused"
+        errorLine1="    &lt;string name=&quot;search_widget_title&quot; translatable=&quot;false&quot;>Chromium search&lt;/string>"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../chrome/android/java/res_chromium_base/values/channel_constants.xml"
+            line="12"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.quick_action_search_widget_title` appears to be unused"
+        errorLine1="    &lt;string name=&quot;quick_action_search_widget_title&quot; translatable=&quot;false&quot;>Chromium quick action search&lt;/string>"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../chrome/android/java/res_chromium_base/values/channel_constants.xml"
+            line="13"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
         message="The resource `R.drawable.color_button_background` appears to be unused"
         errorLine1="&lt;layer-list xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;>"
         errorLine2="^">
@@ -960,6 +1165,39 @@
 
     <issue
         id="UnusedResources"
+        message="The resource `R.color.dark_action_bar_color` appears to be unused"
+        errorLine1="    &lt;color name=&quot;dark_action_bar_color&quot;>@color/google_blue_grey_900&lt;/color>"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../chrome/android/java/res/values/colors.xml"
+            line="13"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.color.dark_status_bar_color` appears to be unused"
+        errorLine1="    &lt;color name=&quot;dark_status_bar_color&quot;>#161E21&lt;/color>"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../chrome/android/java/res/values/colors.xml"
+            line="14"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.dimen.quick_action_search_widget_width` appears to be unused"
+        errorLine1="    &lt;dimen name=&quot;quick_action_search_widget_width&quot;>300dp&lt;/dimen>"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../chrome/browser/ui/android/quickactionsearchwidget/java/res/values/dimens.xml"
+            line="10"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
         message="The resource `R.dimen.autofill_dropdown_icon_margin` appears to be unused"
         errorLine1="    &lt;dimen name=&quot;autofill_dropdown_icon_margin&quot;>8dp&lt;/dimen>"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -1059,6 +1297,17 @@
 
     <issue
         id="UnusedResources"
+        message="The resource `R.dimen.quick_action_search_widget_dino_min_size` appears to be unused"
+        errorLine1="    &lt;dimen name=&quot;quick_action_search_widget_dino_min_size&quot;>110dp&lt;/dimen>"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../chrome/browser/ui/android/quickactionsearchwidget/java/res/values/dimens.xml"
+            line="82"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
         message="The resource `R.dimen.list_menu_popup_min_width` appears to be unused"
         errorLine1="    &lt;dimen name=&quot;list_menu_popup_min_width&quot;>112dp&lt;/dimen>"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -1092,6 +1341,28 @@
 
     <issue
         id="UnusedResources"
+        message="The resource `R.xml.file_paths` appears to be unused"
+        errorLine1="&lt;paths xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;>"
+        errorLine2="^">
+        <location
+            file="gen/chrome/android/chrome_public_apk__lint/RESZIPS/obj/chrome/android/chrome_public_apk_template_resources.resources.zip/xml/file_paths.xml"
+            line="11"
+            column="1"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.drawable.hairline_border` appears to be unused"
+        errorLine1="&lt;shape xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;>"
+        errorLine2="^">
+        <location
+            file="../../chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/hairline_border.xml"
+            line="8"
+            column="1"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
         message="The resource `R.drawable.ic_apps_blue_24dp` appears to be unused"
         errorLine1="&lt;vector xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
         errorLine2="^">
@@ -1103,6 +1374,86 @@
 
     <issue
         id="UnusedResources"
+        message="The resource `R.drawable.ic_launcher` appears to be unused"
+        errorLine1="&lt;adaptive-icon xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; >"
+        errorLine2="^">
+        <location
+            file="../../chrome/android/java/res_base/drawable/ic_launcher.xml"
+            line="8"
+            column="1"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.drawable.ic_launcher_round` appears to be unused"
+        errorLine1="&lt;adaptive-icon xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; >"
+        errorLine2="^">
+        <location
+            file="../../chrome/android/java/res_base/drawable/ic_launcher_round.xml"
+            line="8"
+            column="1"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.xml.launchershortcuts` appears to be unused"
+        errorLine1="&lt;shortcuts xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; >"
+        errorLine2="^">
+        <location
+            file="gen/chrome/android/chrome_public_apk__lint/RESZIPS/obj/chrome/android/chrome_public_apk_template_resources.resources.zip/xml/launchershortcuts.xml"
+            line="8"
+            column="1"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.mipmap.layered_app_icon` appears to be unused">
+        <location
+            file="../../chrome/android/java/res_chromium_base/mipmap-hdpi/layered_app_icon.png"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.mipmap.layered_app_icon_background` appears to be unused">
+        <location
+            file="../../chrome/android/java/res_chromium_base/mipmap-hdpi/layered_app_icon_background.png"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.mipmap.layered_app_icon_foreground` appears to be unused"
+        errorLine1="&lt;shape xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;>"
+        errorLine2="^">
+        <location
+            file="../../chrome/android/java/res_chromium_base/mipmap-nodpi/layered_app_icon_foreground.xml"
+            line="8"
+            column="1"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.drawable.list_divider` appears to be unused"
+        errorLine1="&lt;shape"
+        errorLine2="^">
+        <location
+            file="../../components/browser_ui/settings/android/java/res/drawable/list_divider.xml"
+            line="11"
+            column="1"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.xml.network_security_config` appears to be unused"
+        errorLine1="&lt;network-security-config>"
+        errorLine2="^">
+        <location
+            file="../../chrome/android/java/res_base/xml/network_security_config.xml"
+            line="8"
+            column="1"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
         message="The resource `R.color.green_50` appears to be unused"
         errorLine1="    &lt;color name=&quot;green_50&quot;>#E6F4EA&lt;/color>"
         errorLine2="           ~~~~~~~~~~~~~~~">
@@ -1114,6 +1465,86 @@
 
     <issue
         id="UnusedResources"
+        message="The resource `R.xml.quick_action_search_widget_dino_info` appears to be unused"
+        errorLine1="&lt;appwidget-provider"
+        errorLine2="^">
+        <location
+            file="../../chrome/browser/ui/android/quickactionsearchwidget/java/res/xml/quick_action_search_widget_dino_info.xml"
+            line="8"
+            column="1"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.drawable.quick_action_search_widget_dino_preview` appears to be unused">
+        <location
+            file="../../chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable-nodpi/quick_action_search_widget_dino_preview.png"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.layout.quick_action_search_widget_dino_preview_layout` appears to be unused"
+        errorLine1="&lt;FrameLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
+        errorLine2="^">
+        <location
+            file="../../chrome/browser/ui/android/quickactionsearchwidget/java/res/layout/quick_action_search_widget_dino_preview_layout.xml"
+            line="8"
+            column="1"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.xml.quick_action_search_widget_small_info` appears to be unused"
+        errorLine1="&lt;appwidget-provider xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
+        errorLine2="^">
+        <location
+            file="../../chrome/browser/ui/android/quickactionsearchwidget/java/res/xml/quick_action_search_widget_small_info.xml"
+            line="8"
+            column="1"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.drawable.quick_action_search_widget_small_preview` appears to be unused">
+        <location
+            file="../../chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable-nodpi/quick_action_search_widget_small_preview.png"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.layout.quick_action_search_widget_small_preview_layout` appears to be unused"
+        errorLine1="&lt;FrameLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
+        errorLine2="^">
+        <location
+            file="../../chrome/browser/ui/android/quickactionsearchwidget/java/res/layout/quick_action_search_widget_small_preview_layout.xml"
+            line="7"
+            column="1"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.xml.search_widget_info` appears to be unused"
+        errorLine1="&lt;appwidget-provider"
+        errorLine2="^">
+        <location
+            file="../../chrome/android/java/res/xml/search_widget_info.xml"
+            line="9"
+            column="1"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.xml.searchable` appears to be unused"
+        errorLine1="&lt;searchable xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
+        errorLine2="^">
+        <location
+            file="gen/chrome/android/chrome_public_apk__lint/RESZIPS/obj/chrome/android/chrome_public_apk_template_resources.resources.zip/xml/searchable.xml"
+            line="8"
+            column="1"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
         message="The resource `R.color.default_text_color_on_accent2_container_baseline` appears to be unused"
         errorLine1="    &lt;color name=&quot;default_text_color_on_accent2_container_baseline&quot;>@color/baseline_secondary_10&lt;/color>"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -1356,6 +1787,13 @@
 
     <issue
         id="UnusedResources"
+        message="The resource `R.drawable.shortcut_newtab` appears to be unused">
+        <location
+            file="../../chrome/android/java/res/drawable-hdpi/shortcut_newtab.png"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
         message="The resource `R.style.DropdownPopupWindow` appears to be unused"
         errorLine1="    &lt;style name=&quot;DropdownPopupWindow&quot; parent=&quot;@android:style/Widget.ListPopupWindow&quot;>"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -1367,6 +1805,204 @@
 
     <issue
         id="UnusedResources"
+        message="The resource `R.style.LauncherTheme` appears to be unused"
+        errorLine1="    &lt;style name=&quot;LauncherTheme&quot; parent=&quot;Theme.BrowserUI.NoDisplay&quot; />"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../chrome/android/java/res/values/styles.xml"
+            line="11"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.style.Theme_Chromium` appears to be unused"
+        errorLine1="    &lt;style name=&quot;Theme.Chromium&quot; parent=&quot;Base.Theme.Chromium&quot; />"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../chrome/android/java/res/values/styles.xml"
+            line="31"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.style.PreferenceTheme` appears to be unused"
+        errorLine1="    &lt;style name=&quot;PreferenceTheme&quot;>"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../components/browser_ui/settings/android/java/res/values/styles.xml"
+            line="35"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.style.Theme_Chromium_Activity` appears to be unused"
+        errorLine1="    &lt;style name=&quot;Theme.Chromium.Activity&quot; parent=&quot;Theme.Chromium.WithWindowAnimation&quot; />"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../chrome/android/java/res/values/styles.xml"
+            line="39"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.style.Base_Theme_Chromium_Activity_Fullscreen` appears to be unused"
+        errorLine1="    &lt;style name=&quot;Base.Theme.Chromium.Activity.Fullscreen&quot; parent=&quot;Theme.BrowserUI.DayNight&quot;>"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../chrome/android/java/res/values/styles.xml"
+            line="42"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.style.SettingsFragment` appears to be unused"
+        errorLine1="    &lt;style name=&quot;SettingsFragment&quot;>"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../components/browser_ui/settings/android/java/res/values/styles.xml"
+            line="45"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.style.SettingsFragmentList` appears to be unused"
+        errorLine1="    &lt;style name=&quot;SettingsFragmentList&quot;>"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../components/browser_ui/settings/android/java/res/values/styles.xml"
+            line="49"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.style.Theme_Chromium_Activity_Fullscreen` appears to be unused"
+        errorLine1="    &lt;style name=&quot;Theme.Chromium.Activity.Fullscreen&quot; parent=&quot;Base.Theme.Chromium.Activity.Fullscreen&quot; />"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../chrome/android/java/res/values/styles.xml"
+            line="49"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.style.Theme_Chromium_Activity_Fullscreen_Transparent` appears to be unused"
+        errorLine1="    &lt;style name=&quot;Theme.Chromium.Activity.Fullscreen.Transparent&quot;>"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../chrome/android/java/res/values/styles.xml"
+            line="51"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.style.PreferenceItem` appears to be unused"
+        errorLine1="    &lt;style name=&quot;PreferenceItem&quot; parent=&quot;Preference.Material&quot;>"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../components/browser_ui/settings/android/java/res/values/styles.xml"
+            line="54"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.style.DialogPreference` appears to be unused"
+        errorLine1="    &lt;style name=&quot;DialogPreference&quot; parent=&quot;PreferenceItem&quot;>"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../components/browser_ui/settings/android/java/res/values/styles.xml"
+            line="60"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.style.Theme_Chromium_Activity_FakeTranslucent` appears to be unused"
+        errorLine1="    &lt;style name=&quot;Theme.Chromium.Activity.FakeTranslucent&quot; parent=&quot;Theme.Chromium.Activity&quot;>"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../chrome/android/java/res/values/styles.xml"
+            line="60"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.style.CheckBoxPreference` appears to be unused"
+        errorLine1="    &lt;style name=&quot;CheckBoxPreference&quot; parent=&quot;Preference.CheckBoxPreference.Material&quot;>"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../components/browser_ui/settings/android/java/res/values/styles.xml"
+            line="64"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.style.Theme_Chromium_SearchActivity` appears to be unused"
+        errorLine1="    &lt;style name=&quot;Theme.Chromium.SearchActivity&quot; parent=&quot;Theme.Chromium.WithWindowAnimation&quot; />"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../chrome/android/java/res/values/styles.xml"
+            line="72"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.style.Theme_Chromium_Webapp` appears to be unused"
+        errorLine1="    &lt;style name=&quot;Theme.Chromium.Webapp&quot; parent=&quot;Theme.Chromium.WithWindowAnimation&quot;>"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../chrome/android/java/res/values/styles.xml"
+            line="75"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.style.Theme_Chromium_Webapp_Translucent` appears to be unused"
+        errorLine1="    &lt;style name=&quot;Theme.Chromium.Webapp.Translucent&quot; parent=&quot;Theme.Chromium.Webapp&quot;>"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../chrome/android/java/res/values/styles.xml"
+            line="80"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.style.Base_Theme_Chromium_Settings` appears to be unused"
+        errorLine1="    &lt;style name=&quot;Base.Theme.Chromium.Settings&quot; parent=&quot;Theme.Chromium&quot;>"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../chrome/android/java/res/values/styles.xml"
+            line="84"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.style.Theme_Chromium_Settings` appears to be unused"
+        errorLine1="    &lt;style name=&quot;Theme.Chromium.Settings&quot; parent=&quot;Base.Theme.Chromium.Settings&quot; />"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../chrome/android/java/res/values/styles.xml"
+            line="102"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
         message="The resource `R.style.TextAppearance_TextAccentLarge` appears to be unused"
         errorLine1="    &lt;style name=&quot;TextAppearance.TextAccentLarge&quot; parent=&quot;TextAppearance.TextLarge&quot;>"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -1378,6 +2014,61 @@
 
     <issue
         id="UnusedResources"
+        message="The resource `R.style.Theme_Chromium_Settings_ManageSpace` appears to be unused"
+        errorLine1="    &lt;style name=&quot;Theme.Chromium.Settings.ManageSpace&quot;>"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../chrome/android/java/res/values/styles.xml"
+            line="120"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.style.Base_Theme_Chromium_SigninAndHistorySyncActivity` appears to be unused"
+        errorLine1="    &lt;style name=&quot;Base.Theme.Chromium.SigninAndHistorySyncActivity&quot;"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../chrome/android/java/res/values/styles.xml"
+            line="139"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.style.Theme_Chromium_SigninAndHistorySyncActivity` appears to be unused"
+        errorLine1="    &lt;style name=&quot;Theme.Chromium.SigninAndHistorySyncActivity&quot;"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../chrome/android/java/res/values/styles.xml"
+            line="146"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.style.SigninAndHistorySyncActivityAnimation` appears to be unused"
+        errorLine1="    &lt;style name=&quot;SigninAndHistorySyncActivityAnimation&quot; parent=&quot;@android:style/Animation.Dialog&quot;>"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../chrome/android/java/res/values/styles.xml"
+            line="154"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.style.Theme_Chromium_ClearDataDialogActivity` appears to be unused"
+        errorLine1="    &lt;style name=&quot;Theme.Chromium.ClearDataDialogActivity&quot;"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../chrome/android/java/res/values/styles.xml"
+            line="160"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
         message="The resource `R.style.TextAppearance_TextSmallThick_Secondary_Baseline_Light` appears to be unused"
         errorLine1="    &lt;style name=&quot;TextAppearance.TextSmallThick.Secondary.Baseline.Light&quot;"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -1389,6 +2080,17 @@
 
     <issue
         id="UnusedResources"
+        message="The resource `R.style.SettingsToolbarStyle` appears to be unused"
+        errorLine1="    &lt;style name=&quot;SettingsToolbarStyle&quot; parent=&quot;Widget.Material3Expressive.Toolbar&quot;>"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../chrome/android/java/res/values/styles.xml"
+            line="232"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
         message="The resource `R.style.TextAppearance_TextMediumThick_Green` appears to be unused"
         errorLine1="    &lt;style name=&quot;TextAppearance.TextMediumThick.Green&quot;>"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -1411,6 +2113,39 @@
 
     <issue
         id="UnusedResources"
+        message="The resource `R.style.ManageSpaceActionBarModern` appears to be unused"
+        errorLine1="    &lt;style name=&quot;ManageSpaceActionBarModern&quot; parent=&quot;Widget.MaterialComponents.ActionBar.Primary&quot;>"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../chrome/android/java/res/values/styles.xml"
+            line="245"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.style.ManageSpaceActionBarTheme` appears to be unused"
+        errorLine1="    &lt;style name=&quot;ManageSpaceActionBarTheme&quot;>"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../chrome/android/java/res/values/styles.xml"
+            line="251"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.style.ManageSpaceToolbarStyle` appears to be unused"
+        errorLine1="    &lt;style name=&quot;ManageSpaceToolbarStyle&quot; parent=&quot;SettingsToolbarStyle&quot;>"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../chrome/android/java/res/values/styles.xml"
+            line="256"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
         message="The resource `R.style.TextAppearance_Headline2_Primary_Baseline` appears to be unused"
         errorLine1="    &lt;style name=&quot;TextAppearance.Headline2.Primary.Baseline&quot; parent=&quot;TextAppearance.Headline2&quot;>"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -1454,6 +2189,101 @@
     </issue>
 
     <issue
+        id="UnusedResources"
+        message="The resource `R.drawable.themed_app_icon` appears to be unused"
+        errorLine1="&lt;vector xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
+        errorLine2="^">
+        <location
+            file="../../chrome/android/java/res_chromium_base/drawable/themed_app_icon.xml"
+            line="8"
+            column="1"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.style.Theme_BrowserUI_DayNight_AlertDialog_NoActionBar` appears to be unused"
+        errorLine1="    &lt;style name=&quot;Theme.BrowserUI.DayNight.AlertDialog.NoActionBar&quot; parent=&quot;Theme.BrowserUI.Dark.AlertDialog.NoActionBar&quot;/>"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../components/browser_ui/theme/android/java/res/values-night/themes.xml"
+            line="11"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.style.Theme_BrowserUI_Light_AlertDialog_NoActionBar` appears to be unused"
+        errorLine1="    &lt;style name=&quot;Theme.BrowserUI.Light.AlertDialog.NoActionBar&quot; parent=&quot;Theme.Material3Expressive.Light.Dialog.Alert&quot;>"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="gen/chrome/android/chrome_public_apk__lint/RESZIPS/obj/components/browser_ui/theme/android/theme_template_resources.resources.zip/values/themes.xml"
+            line="363"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.style.Theme_BrowserUI_Dark_AlertDialog_NoActionBar` appears to be unused"
+        errorLine1="    &lt;style name=&quot;Theme.BrowserUI.Dark.AlertDialog.NoActionBar&quot; parent=&quot;Theme.Material3Expressive.Dark.Dialog.Alert&quot;>"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="gen/chrome/android/chrome_public_apk__lint/RESZIPS/obj/components/browser_ui/theme/android/theme_template_resources.resources.zip/values/themes.xml"
+            line="875"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.style.Theme_BrowserUI_NoDisplay` appears to be unused"
+        errorLine1="    &lt;style name=&quot;Theme.BrowserUI.NoDisplay&quot; parent=&quot;Theme.BrowserUI.DayNight&quot;>"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="gen/chrome/android/chrome_public_apk__lint/RESZIPS/obj/components/browser_ui/theme/android/theme_template_resources.resources.zip/values/themes.xml"
+            line="1054"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.style.Theme_BrowserUI_Translucent` appears to be unused"
+        errorLine1="    &lt;style name=&quot;Theme.BrowserUI.Translucent&quot; parent=&quot;Theme.BrowserUI.DayNight&quot;>"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="gen/chrome/android/chrome_public_apk__lint/RESZIPS/obj/components/browser_ui/theme/android/theme_template_resources.resources.zip/values/themes.xml"
+            line="1065"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.style.Theme_BrowserUI_Translucent_NoTitleBar` appears to be unused"
+        errorLine1="    &lt;style name=&quot;Theme.BrowserUI.Translucent.NoTitleBar&quot;>"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="gen/chrome/android/chrome_public_apk__lint/RESZIPS/obj/components/browser_ui/theme/android/theme_template_resources.resources.zip/values/themes.xml"
+            line="1071"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.manage_space_activity` appears to be unused"
+        errorLine1="    &lt;string translatable=&quot;false&quot; name=&quot;manage_space_activity&quot;>org.chromium.chrome.browser.site_settings.ManageSpaceActivity&lt;/string>"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../chrome/android/java/res_base/values/values.xml"
+            line="8"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.drawable.widget_preview` appears to be unused">
+        <location
+            file="../../chrome/android/java/res/drawable-nodpi/widget_preview.png"/>
+    </issue>
+
+    <issue
         id="UsableSpace"
         message="Consider also using `StorageManager#getAllocatableBytes` and `allocateBytes` which will consider clearable cached data"
         errorLine1="                    dir.getAbsolutePath(), dir.getUsableSpace(), dir.getTotalSpace(), type);"
diff --git a/chrome/android/features/tab_ui/BUILD.gn b/chrome/android/features/tab_ui/BUILD.gn
index d1c81efa..f3c97ff3 100644
--- a/chrome/android/features/tab_ui/BUILD.gn
+++ b/chrome/android/features/tab_ui/BUILD.gn
@@ -196,6 +196,7 @@
     "//third_party/androidx:androidx_appcompat_appcompat_resources_java",
     "//third_party/androidx:androidx_core_core_java",
     "//third_party/androidx:androidx_recyclerview_recyclerview_java",
+    "//third_party/androidx:androidx_test_monitor_java",
     "//third_party/androidx:androidx_test_rules_java",
     "//third_party/androidx:androidx_test_runner_java",
     "//third_party/google-truth:google_truth_java",
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator.java
index 9ff25bea..9dd88d0 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator.java
@@ -559,8 +559,6 @@
     }
 
     public boolean onBackPressed() {
-        // TODO(crbug.com/40099884): add a regression test to make sure that the back button closes
-        // the dialog when the dialog is showing.
         @Nullable DialogController controller = getTabGridDialogControllerIfExists();
         return controller != null ? controller.handleBackPressed() : false;
     }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorCoordinator.java
index 3ad90e4..228d969 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorCoordinator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorCoordinator.java
@@ -397,8 +397,6 @@
                             .findViewById(R.id.selectable_list);
             mModel = new PropertyModel.Builder(TabListEditorProperties.ALL_KEYS).build();
 
-            // TODO(crbug.com/40881091): Refactor SnackbarManager to support multiple overridden
-            // parentViews in a stack to avoid contention and using new snackbar managers.
             mTabListEditorMediator =
                     new TabListEditorMediator(
                             activity,
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogViewTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogViewTest.java
index 9317f8f..b39f3d4 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogViewTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogViewTest.java
@@ -26,6 +26,7 @@
 import android.widget.RelativeLayout;
 import android.widget.TextView;
 
+import androidx.test.InstrumentationRegistry;
 import androidx.test.annotation.UiThreadTest;
 import androidx.test.filters.MediumTest;
 import androidx.test.filters.SmallTest;
@@ -358,6 +359,7 @@
                     mSourceView = new View(sActivity);
                     mTestParent.addView(mSourceView, 0, new FrameLayout.LayoutParams(100, 100));
                 });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
         ThreadUtils.runOnUiThreadBlocking(
                 () -> {
                     mTabGridDialogView.setupDialogAnimation(mSourceView);
@@ -444,6 +446,7 @@
                     mSourceView = new View(sActivity);
                     mTestParent.addView(mSourceView, 0, new FrameLayout.LayoutParams(100, 100));
                 });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
         ThreadUtils.runOnUiThreadBlocking(
                 () -> {
                     mTabGridDialogView.setupDialogAnimation(mSourceView);
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupColorPickerTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupColorPickerTest.java
index cc29d5f..e5857e0 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupColorPickerTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupColorPickerTest.java
@@ -14,6 +14,7 @@
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 
+import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.MediumTest;
 
 import com.google.android.material.button.MaterialButton;
@@ -128,6 +129,8 @@
                     mRootView.addView(mContainerView);
                 });
 
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
         // Change the width of the parent view to restrict for a double row
         ThreadUtils.runOnUiThreadBlocking(
                 () -> {
@@ -182,6 +185,8 @@
                     mRootView.addView(mContainerView);
                 });
 
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
         // Change the width of the parent view to allow for a single row
         ThreadUtils.runOnUiThreadBlocking(
                 () -> {
@@ -241,6 +246,8 @@
                     mRootView.addView(mContainerView);
                 });
 
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
         ThreadUtils.runOnUiThreadBlocking(
                 () -> {
                     int selectedIndex = 1;
@@ -276,6 +283,8 @@
                     mRootView.addView(mContainerView);
                 });
 
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
         ThreadUtils.runOnUiThreadBlocking(
                 () -> {
                     int selectedIndex = 0;
@@ -313,6 +322,8 @@
                     mRootView.addView(mContainerView);
                 });
 
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
         ThreadUtils.runOnUiThreadBlocking(
                 () -> {
                     LinearLayout firstRow =
@@ -340,6 +351,8 @@
                     mRootView.addView(mContainerView);
                 });
 
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
         // Change the width of the parent view to enact a row split on the colors
         ThreadUtils.runOnUiThreadBlocking(
                 () -> {
@@ -429,6 +442,8 @@
                     mRootView.addView(mContainerView);
                 });
 
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
         mRenderTestRule.render(mRootView, "tab_group_color_picker_single_row");
     }
 
@@ -441,6 +456,8 @@
                     mRootView.addView(mContainerView);
                 });
 
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
         // Change the width of the parent view to enact a row split on the colors
         ThreadUtils.runOnUiThreadBlocking(
                 () -> {
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorMenuTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorMenuTest.java
index 48a375c..a7eac597 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorMenuTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorMenuTest.java
@@ -27,6 +27,7 @@
 
 import androidx.appcompat.content.res.AppCompatResources;
 import androidx.core.view.ViewCompat;
+import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.MediumTest;
 import androidx.test.filters.SmallTest;
 
@@ -233,6 +234,8 @@
                                     new TabListEditorMenuAdapter());
                     mPropertyListModel.addObserver(mChangeProcessor);
                 });
+
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
     }
 
     @After
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabOverflowMenuRenderTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabOverflowMenuRenderTest.java
index 93b8c8e..11d4b86a 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabOverflowMenuRenderTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabOverflowMenuRenderTest.java
@@ -9,6 +9,7 @@
 import android.app.Activity;
 import android.view.View;
 
+import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.MediumTest;
 
 import org.junit.After;
@@ -98,6 +99,7 @@
         when(mTabModelSupplier.get()).thenReturn(mTabModel);
         when(mCollaborationService.getServiceStatus()).thenReturn(mServiceStatus);
         CollaborationServiceFactory.setForTesting(mCollaborationService);
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
     }
 
     @After
@@ -166,6 +168,7 @@
                     mCoordinator.createAndShowMenu(new View(mActivity), 1, mActivity);
                     mView = mCoordinator.getContentViewForTesting();
                 });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
 
         CriteriaHelper.pollUiThread(
                 () -> mView.getWidth() > 0 && mView.getHeight() > 0, "View not rendered");
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabThumbnailViewRenderTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabThumbnailViewRenderTest.java
index 06dc64f..8a4f984 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabThumbnailViewRenderTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabThumbnailViewRenderTest.java
@@ -16,6 +16,7 @@
 
 import androidx.annotation.ColorInt;
 import androidx.core.view.ViewCompat;
+import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.MediumTest;
 
 import org.junit.After;
@@ -113,6 +114,7 @@
                                     ViewGroup.LayoutParams.WRAP_CONTENT);
                     mActivityTestRule.getActivity().setContentView(mContentView, params);
                 });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
         ThreadUtils.runOnUiThreadBlocking(
                 () -> {
                     final int cardWidthPx = mContentView.getMeasuredWidth() / 2;
@@ -127,6 +129,7 @@
                     mTabCard.getLayoutParams().height = cardHeightPx;
                     mTabCard.setLayoutParams(mTabCard.getLayoutParams());
                 });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
         ThreadUtils.runOnUiThreadBlocking(
                 () -> {
                     mBitmap = createBitmapFourColor();
diff --git a/chrome/android/java/res/layout/radio_button_group_homepage_preference.xml b/chrome/android/java/res/layout/radio_button_group_homepage_preference.xml
index 763a1c6..f17a233 100644
--- a/chrome/android/java/res/layout/radio_button_group_homepage_preference.xml
+++ b/chrome/android/java/res/layout/radio_button_group_homepage_preference.xml
@@ -30,7 +30,6 @@
       android:layout_height="wrap_content"
       android:focusableInTouchMode="true">
 
-    <!-- TODO(crbug.com/40117411): Remove android:background for radio buttons here and below after enhancement. -->
     <org.chromium.components.browser_ui.widget.RadioButtonWithDescription
         android:id="@+id/radio_button_chrome_ntp"
         android:layout_width="match_parent"
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuChipControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuChipControllerTest.java
index f2854f88..51e1ed89 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuChipControllerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuChipControllerTest.java
@@ -16,6 +16,7 @@
 import android.app.Activity;
 import android.view.View;
 
+import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.SmallTest;
 
 import org.junit.Before;
@@ -94,6 +95,8 @@
                     sActivity.setContentView(R.layout.context_menu_fullscreen_container);
                     mAnchorView = sActivity.findViewById(R.id.context_menu_chip_anchor_point);
                 });
+
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
     }
 
     @Test
@@ -155,6 +158,8 @@
                     chipController.clickChipForTesting();
                 });
 
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
         verify(mMockDismissRunnable, times(1)).run();
         verify(mMockChipClickRunnable, times(1)).run();
         assertNotNull("Anchor view was not initialized.", mAnchorView);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderViewTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderViewTest.java
index 2f76ed8..1dae3fd 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderViewTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderViewTest.java
@@ -24,6 +24,7 @@
 import android.widget.ImageView;
 import android.widget.TextView;
 
+import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.SmallTest;
 
 import org.junit.After;
@@ -359,6 +360,7 @@
     public void testAccessibility() {
         setupForCollapsedState(/* longTitle= */ true, /* longUrl= */ false);
         ThreadUtils.runOnUiThreadBlocking(mHeaderTextView::callOnClick);
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
         CriteriaHelper.pollUiThread(
                 () -> mTitle.getLayout().getEllipsisCount(mTitle.getLineCount() - 1) == 0);
         verifyExpandedState();
@@ -372,6 +374,7 @@
                 info.getActionList(),
                 hasItem(ACTION_COLLAPSE));
         ThreadUtils.runOnUiThreadBlocking(mHeaderTextView::callOnClick);
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
         CriteriaHelper.pollUiThread(
                 () -> mTitle.getLayout().getEllipsisCount(mTitle.getLineCount() - 1) > 0);
         verifyCollapsedState();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuRenderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuRenderTest.java
index 2f44bd18..5f89fc75 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuRenderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuRenderTest.java
@@ -17,6 +17,7 @@
 import android.view.View;
 import android.view.ViewStub;
 
+import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.LargeTest;
 
 import org.junit.After;
@@ -110,6 +111,7 @@
                     ContextMenuListView listView = mView.findViewById(R.id.context_menu_list_view);
                     listView.setAdapter(mAdapter);
                 });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
     }
 
     @After
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/SingleWebsiteSettingsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/SingleWebsiteSettingsTest.java
index fd5de4e..e4a67d7 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/SingleWebsiteSettingsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/SingleWebsiteSettingsTest.java
@@ -28,6 +28,7 @@
 import static org.mockito.Mockito.when;
 
 import androidx.preference.Preference;
+import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.SmallTest;
 
 import org.junit.Assume;
@@ -164,6 +165,8 @@
                                             ContentSettingsType.NOTIFICATIONS)));
                 });
 
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
         settingsActivity.finish();
     }
 
@@ -568,6 +571,7 @@
                                     SingleWebsiteSettings.getPreferenceKey(
                                             ContentSettingsType.REQUEST_DESKTOP_SITE)));
                 });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
         settingsActivity.finish();
     }
 
@@ -694,6 +698,7 @@
                                     primaryUrl,
                                     secondaryUrl);
                 });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
         return result[0];
     }
 
@@ -749,6 +754,8 @@
                         doTest(websitePreferences);
                     });
 
+            InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
             mSettingsActivity.finish();
         }
 
@@ -795,6 +802,7 @@
                 () ->
                         info.setGeolocationSetting(
                                 ProfileManager.getLastUsedRegularProfile(), setting));
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
         website.setPermissionInfo(info);
         return website;
     }
@@ -812,6 +820,7 @@
                         sessionModel);
         ThreadUtils.runOnUiThreadBlocking(
                 () -> info.setContentSetting(ProfileManager.getLastUsedRegularProfile(), setting));
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
         website.setPermissionInfo(info);
         return website;
     }
@@ -834,6 +843,7 @@
                 () -> {
                     info.setContentSetting(ProfileManager.getLastUsedRegularProfile(), setting);
                 });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
         website.addEmbeddedPermission(info);
         return website;
     }
diff --git a/chrome/android/profiles/arm.newest.txt b/chrome/android/profiles/arm.newest.txt
index 09c10ff..2c444b2 100644
--- a/chrome/android/profiles/arm.newest.txt
+++ b/chrome/android/profiles/arm.newest.txt
@@ -1 +1 @@
-chromeos-chrome-arm-144.0.7532.0_pre1546354_rc-r1-merged.afdo.bz2
+chromeos-chrome-arm-144.0.7535.0_pre1547597_rc-r1-merged.afdo.bz2
diff --git a/chrome/app/chrome_main_delegate.cc b/chrome/app/chrome_main_delegate.cc
index d22c978..3cbbd15 100644
--- a/chrome/app/chrome_main_delegate.cc
+++ b/chrome/app/chrome_main_delegate.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/app/chrome_main_delegate.h"
 
 #include <stddef.h>
@@ -17,6 +12,7 @@
 #include "base/base_paths.h"
 #include "base/check.h"
 #include "base/command_line.h"
+#include "base/compiler_specific.h"
 #include "base/cpu.h"
 #include "base/dcheck_is_on.h"
 #include "base/features.h"
@@ -366,15 +362,16 @@
 bool HandleVersionSwitches(const base::CommandLine& command_line) {
 #if !BUILDFLAG(IS_MAC)
   if (command_line.HasSwitch(switches::kProductVersion)) {
-    printf("%s\n", version_info::GetVersionNumber().data());
+    UNSAFE_TODO(printf("%s\n", version_info::GetVersionNumber().data()));
     return true;
   }
 #endif
 
   if (command_line.HasSwitch(switches::kVersion)) {
-    printf("%s %s %s\n", version_info::GetProductName().data(),
-           version_info::GetVersionNumber().data(),
-           chrome::GetChannelName(chrome::WithExtendedStable(true)).c_str());
+    UNSAFE_TODO(printf(
+        "%s %s %s\n", version_info::GetProductName().data(),
+        version_info::GetVersionNumber().data(),
+        chrome::GetChannelName(chrome::WithExtendedStable(true)).c_str()));
     return true;
   }
 
@@ -397,7 +394,7 @@
 void SIGTERMProfilingShutdown(int signal) {
   content::Profiling::Stop();
   struct sigaction sigact;
-  memset(&sigact, 0, sizeof(sigact));
+  UNSAFE_TODO(memset(&sigact, 0, sizeof(sigact)));
   sigact.sa_handler = SIG_DFL;
   CHECK_EQ(sigaction(SIGTERM, &sigact, nullptr), 0);
   raise(signal);
@@ -1518,8 +1515,10 @@
   };
 
   for (size_t i = 0; i < std::size(kMainFunctions); ++i) {
-    if (process_type == kMainFunctions[i].name)
-      return kMainFunctions[i].function(std::move(main_function_params));
+    if (process_type == UNSAFE_TODO(kMainFunctions[i]).name) {
+      return UNSAFE_TODO(kMainFunctions[i])
+          .function(std::move(main_function_params));
+    }
   }
 #endif  // BUILDFLAG(IS_MAC)
 
diff --git a/chrome/app/password_manager_ui_strings.grdp b/chrome/app/password_manager_ui_strings.grdp
index 9e2b60fc9..b451360 100644
--- a/chrome/app/password_manager_ui_strings.grdp
+++ b/chrome/app/password_manager_ui_strings.grdp
@@ -1084,4 +1084,7 @@
   <message name="IDS_PASSWORD_MANAGER_UI_PASSWORD_UNCHANGED" desc="Text inside a toast when password wasn't updated.">
     Password wasn't changed
   </message>
+  <message name="IDS_PASSWORD_MANAGER_UI_PASSWORD_CHANGE_TOAST_RETRY_BUTTON" desc="Button text inside a toast which is shown when user hasn't finished logging in. Clicking this button simply retires the check.">
+    Retry
+  </message>
 </grit-part>
diff --git a/chrome/app/password_manager_ui_strings_grdp/IDS_PASSWORD_MANAGER_UI_PASSWORD_CHANGE_TOAST_RETRY_BUTTON.png.sha1 b/chrome/app/password_manager_ui_strings_grdp/IDS_PASSWORD_MANAGER_UI_PASSWORD_CHANGE_TOAST_RETRY_BUTTON.png.sha1
new file mode 100644
index 0000000..9b7eb4a21
--- /dev/null
+++ b/chrome/app/password_manager_ui_strings_grdp/IDS_PASSWORD_MANAGER_UI_PASSWORD_CHANGE_TOAST_RETRY_BUTTON.png.sha1
@@ -0,0 +1 @@
+d992bb2110fa299cd647874bba5234f4c3a91f96
\ No newline at end of file
diff --git a/chrome/app/profiles_strings.grdp b/chrome/app/profiles_strings.grdp
index c1b57c5..aa524b4 100644
--- a/chrome/app/profiles_strings.grdp
+++ b/chrome/app/profiles_strings.grdp
@@ -41,6 +41,9 @@
   <message name="IDS_AVATAR_BUTTON_SYNC_PAUSED" desc="Short label for the avatar button when sync is paused for the current profile." meaning="Sync is paused">
     Paused
   </message>
+  <message name="IDS_AVATAR_BUTTON_SYNC_ERROR_BOOKMARKS_LIMIT_EXCEEDED" desc="Short label for the avatar button when the user has too many bookmarks.">
+    Unsaved data
+  </message>
   <message name="IDS_AVATAR_BUTTON_SIGNIN_PAUSED" desc="Short label for the avatar button when the profile is in a Signin Paused state." meaning="The account is signed in on Chrome but signed out on the Web.">
     Verify it's you
   </message>
diff --git a/chrome/app/profiles_strings_grdp/IDS_AVATAR_BUTTON_SYNC_ERROR_BOOKMARKS_LIMIT_EXCEEDED.png.sha1 b/chrome/app/profiles_strings_grdp/IDS_AVATAR_BUTTON_SYNC_ERROR_BOOKMARKS_LIMIT_EXCEEDED.png.sha1
new file mode 100644
index 0000000..8ace896
--- /dev/null
+++ b/chrome/app/profiles_strings_grdp/IDS_AVATAR_BUTTON_SYNC_ERROR_BOOKMARKS_LIMIT_EXCEEDED.png.sha1
@@ -0,0 +1 @@
+42abd8ae8827db72aefae4347a26b7309aff5575
\ No newline at end of file
diff --git a/chrome/app/resources/chromium_strings_af.xtb b/chrome/app/resources/chromium_strings_af.xtb
index 47104f7..607764c 100644
--- a/chrome/app/resources/chromium_strings_af.xtb
+++ b/chrome/app/resources/chromium_strings_af.xtb
@@ -155,7 +155,6 @@
 <translation id="2718390899429598676">Chromium sal jou data enkripteer vir bykomende sekuriteit.</translation>
 <translation id="2721354645805494590">Meld af om jou Google-rekening uit Chromium te verwyder</translation>
 <translation id="2722636413143664436">Meld aan by Chromium om jou wagwoorde, boekmerke en meer op al jou toestelle te kry</translation>
-<translation id="2723860029395667894">Wys altyd Google KI-moduskortpad</translation>
 <translation id="2738871930057338499">Kon nie aan die internet koppel nie. HTTP 403 verbode. Gaan asseblief jou proxy-opstelling na.</translation>
 <translation id="2753623023919742414">Klik om te soek</translation>
 <translation id="2768103863314748511">Stel Chromium as jou verstek-PDF-bekyker</translation>
@@ -650,7 +649,6 @@
 <translation id="8619360774459241877">Begin tans Chromium …</translation>
 <translation id="8624541899164515475">Instellings; maak in nuwe oortjie oop.</translation>
 <translation id="8648201657708811153">Google Chrome-toetsweergawe kan nie jou verstekblaaier gemaak word nie.</translation>
-<translation id="8677922833187616101">Wys altyd Google KI-moduskortpad</translation>
 <translation id="8697124171261953979">Dit beheer ook watter bladsy gewys word wanneer jy Chromium begin of vanuit die omnikassie soek.</translation>
 <translation id="8704119203788522458">Dit is jou Chromium</translation>
 <translation id="8712637175834984815">Het dit</translation>
diff --git a/chrome/app/resources/chromium_strings_am.xtb b/chrome/app/resources/chromium_strings_am.xtb
index 73d55e4..c5dded37 100644
--- a/chrome/app/resources/chromium_strings_am.xtb
+++ b/chrome/app/resources/chromium_strings_am.xtb
@@ -155,7 +155,6 @@
 <translation id="2718390899429598676">ለተጨማሪ ደህንነት ሲባል Chromium ውሂብዎን ያመሰጥረዋል።</translation>
 <translation id="2721354645805494590">የGoogle መለያዎን ከChromium ለማስወገድ ዘግተው ይውጡ</translation>
 <translation id="2722636413143664436">የእርስዎን የይለፍ ቃላት፣ ዕልባቶች እና ሌሎችንም በሁሉም መሣሪያዎችዎ ላይ ለማግኘት ወደ Chromium ይግቡ</translation>
-<translation id="2723860029395667894">ሁልጊዜ የGoogle ሰው ሠራሽ አስተውሎት ሁነታ አቋራጭን አሳይ</translation>
 <translation id="2738871930057338499">ከበይነመረብ ጋር መገናኘት አልተቻለም። ኤችቲቲፒኤስ 403 ተከልክሏል። እባክዎ ተኪ ውቅረትዎን ይፈትሹ።</translation>
 <translation id="2753623023919742414">ለመፈለግ ጠቅ ያድርጉ</translation>
 <translation id="2768103863314748511">Chromiumን እንደ ነባሪ ፒዲኤፍ መመልከቻዎ ያቀናብሩ</translation>
@@ -650,7 +649,6 @@
 <translation id="8619360774459241877">Chromiumን በማስጀመር ላይ...</translation>
 <translation id="8624541899164515475">ቅንብሮች፣ በአዲስ ትር ውስጥ ይከፈታል።</translation>
 <translation id="8648201657708811153">Google Chrome ለሙከራ የእርስዎ ነባሪ አሳሽ እንዲሆን ማድረግ አይቻልም።</translation>
-<translation id="8677922833187616101">ሁልጊዜ የGoogle ሰው ሠራሽ አስተውሎት ሁነታ አቋራጭን አሳይ</translation>
 <translation id="8697124171261953979">እንዲሁም Chromiumን ሲጀምሩት ወይም ከኦምኒቦክሱ ሆነው ሲፈልጉ የሚታየውን ገፅ ይቆጣጠራል።</translation>
 <translation id="8704119203788522458">ይሄ የእርስዎ Chromium ነው</translation>
 <translation id="8712637175834984815">ገባኝ</translation>
diff --git a/chrome/app/resources/chromium_strings_ar.xtb b/chrome/app/resources/chromium_strings_ar.xtb
index 00a8fcd..7481580b 100644
--- a/chrome/app/resources/chromium_strings_ar.xtb
+++ b/chrome/app/resources/chromium_strings_ar.xtb
@@ -153,7 +153,6 @@
 <translation id="2718390899429598676">‏لمزيد من الأمان، سيشفر Chromium بياناتك</translation>
 <translation id="2721354645805494590">‏لإزالة حسابك على Google من Chromium، يجب تسجيل الخروج</translation>
 <translation id="2722636413143664436">‏للوصول إلى كلمات المرور والإشارات المرجعية وغيرهما على جميع أجهزتك، يجب تسجيل الدخول إلى Chromium</translation>
-<translation id="2723860029395667894">‏عرض اختصار "وضع Google AI" دائمًا</translation>
 <translation id="2738871930057338499">‏تعذر الاتصال بالإنترنت. بروتوكول HTTP 403 محظور. يُرجى التحقق من إعدادات الخادم الوكيل.</translation>
 <translation id="2753623023919742414">انقر للبحث</translation>
 <translation id="2768103863314748511">‏ضبط Chromium كعارض PDF التلقائي</translation>
@@ -178,6 +177,7 @@
 <translation id="2977506796191543575">‏إذا حاول موقع إلكتروني سرقة كلمة المرور أو إذا نزّلت ملفًا ضارًا، قد يرسِل متصفِّح Chromium أيضًا عناوين URL تتضمّن أجزاءً من محتوى الصفحة إلى خدمة "التصفُّح الآمن".</translation>
 <translation id="2981563588585023386">‏للحفاظ على أمانك على الإنترنت من خلال خيارات أحد والدَيك، سجِّل الدخول إلى Chromium</translation>
 <translation id="3003694935412297923">كل المهام</translation>
+<translation id="3012615494352020668">{count,plural, =1{‏يحتاج Chromium إلى إثبات هويتك قبل حفظ بعض البيانات في حسابك على Google واستخدامها على جميع أجهزتك. إذا سجَّلت الخروج الآن، فسيتم حذف عنصر واحد من هذه البيانات.}zero{‏يحتاج Chromium إلى إثبات هويتك قبل حفظ بعض البيانات في حسابك على Google واستخدامها على جميع أجهزتك. إذا سجَّلت الخروج الآن، فسيتم حذف {count} عنصر من هذه البيانات.}two{‏يحتاج Chromium إلى إثبات هويتك قبل حفظ بعض البيانات في حسابك على Google واستخدامها على جميع أجهزتك. إذا سجَّلت الخروج الآن، فسيتم حذف عنصرَين ({count}) من هذه البيانات.}few{‏يحتاج Chromium إلى إثبات هويتك قبل حفظ بعض البيانات في حسابك على Google واستخدامها على جميع أجهزتك. إذا سجَّلت الخروج الآن، فسيتم حذف {count} عناصر من هذه البيانات.}many{‏يحتاج Chromium إلى إثبات هويتك قبل حفظ بعض البيانات في حسابك على Google واستخدامها على جميع أجهزتك. إذا سجَّلت الخروج الآن، فسيتم حذف {count} عنصرًا من هذه البيانات.}other{‏يحتاج Chromium إلى إثبات هويتك قبل حفظ بعض البيانات في حسابك على Google واستخدامها على جميع أجهزتك. إذا سجَّلت الخروج الآن، فسيتم حذف {count} عنصر من هذه البيانات.}}</translation>
 <translation id="3013473503895162900">‏افتح <ph name="URL" /> في علامة تبويب جديدة في Chromium.</translation>
 <translation id="3032706164202344641">‏يتعذّر على Chromium التحقّق من كلمات المرور. يُرجى إعادة المحاولة.</translation>
 <translation id="3032787606318309379">‏جارٍ الإضافة إلى Chromium...</translation>
@@ -350,7 +350,7 @@
 <translation id="5187123684706427865">‏يتطلب حساب Chromium إعادة المصادقة</translation>
 <translation id="5224391634244552924">‏ما مِن كلمات مرور محفوظة. لا يستطيع Chromium التحقُّق من كلمات المرور إلا عند حفظها.</translation>
 <translation id="5231355151045086930">‏الخروج من Chromium</translation>
-<translation id="5234764350956374838">تجاهل</translation>
+<translation id="5234764350956374838">إغلاق</translation>
 <translation id="5254739261293693943">طرح أسئلة حول هذا الفيديو</translation>
 <translation id="5277894862589591112">‏لتطبيق التغييرات، يُرجى إعادة تشغيل Chromium</translation>
 <translation id="5286907366254680517">تمّ رصد اللغة</translation>
@@ -494,6 +494,7 @@
 <translation id="6729124504294600478">‏للحصول على خيارات مخصَّصة والاستفادة من ميزات أخرى، يمكنك تضمين متصفّح Chromium في "النشاط على الويب وفي التطبيقات" وخدمات Google المرتبطة</translation>
 <translation id="6734291798041940871">‏يتم تثبيت Chromium بالفعل لجميع المستخدمين على جهاز الكمبيوتر.</translation>
 <translation id="6751374565094704799">‏يعمل هذا الإعداد على زيادة سرعة المواقع الإلكترونية باستخدام محرّك V8 في Chromium، مع تقليل قدرة Chromium على مقاومة الهجمات قليلاً. هذا الإعداد مفعَّل.</translation>
+<translation id="6754665438209053659">{count,plural, =1{‏لم يتم حفظ بعض بيانات Chromium في حسابك على Google إلى الآن. يُرجى الانتظار بضع دقائق قبل تسجيل الخروج. إذا سجَّلت الخروج الآن، فسيتم حذف عنصر واحد من هذه البيانات.}zero{‏لم يتم حفظ بعض بيانات Chromium في حسابك على Google إلى الآن. يُرجى الانتظار بضع دقائق قبل تسجيل الخروج. إذا سجَّلت الخروج الآن، فسيتم حذف {count} عنصر من هذه البيانات.}two{‏لم يتم حفظ بعض بيانات Chromium في حسابك على Google إلى الآن. يُرجى الانتظار بضع دقائق قبل تسجيل الخروج. إذا سجَّلت الخروج الآن، فسيتم حذف عنصرَين ({count}) من هذه البيانات.}few{‏لم يتم حفظ بعض بيانات Chromium في حسابك على Google إلى الآن. يُرجى الانتظار بضع دقائق قبل تسجيل الخروج. إذا سجَّلت الخروج الآن، فسيتم حذف {count} عناصر من هذه البيانات.}many{‏لم يتم حفظ بعض بيانات Chromium في حسابك على Google إلى الآن. يُرجى الانتظار بضع دقائق قبل تسجيل الخروج. إذا سجَّلت الخروج الآن، فسيتم حذف {count} عنصرًا من هذه البيانات.}other{‏لم يتم حفظ بعض بيانات Chromium في حسابك على Google إلى الآن. يُرجى الانتظار بضع دقائق قبل تسجيل الخروج. إذا سجَّلت الخروج الآن، فسيتم حذف {count} عنصر من هذه البيانات.}}</translation>
 <translation id="67706546131546258">‏ينصح متصفِّح Chromium بفحص هذا الملف لأنّه قد يكون خطيرًا.</translation>
 <translation id="6779406956731413166">‏أصبح نظام التشغيل Chromium متاحًا من خلال <ph name="BEGIN_LINK_CROS_OSS" />برنامج إضافي مفتوح المصدر<ph name="END_LINK_CROS_OSS" />.</translation>
 <translation id="6831043979455480757">ترجمة</translation>
@@ -648,7 +649,6 @@
 <translation id="8619360774459241877">‏جارٍ إطلاق Chromium...</translation>
 <translation id="8624541899164515475">الإعدادات (يفتح الرابط في علامة تبويب جديدة)</translation>
 <translation id="8648201657708811153">‏لا يمكن اختيار الإصدار Google Chrome for Test ليكون متصفِّحك التلقائي.</translation>
-<translation id="8677922833187616101">‏عرض اختصار "وضع Google AI" دائمًا</translation>
 <translation id="8697124171261953979">‏كما أنها تتحكم في الصفحة التي تظهر عند تشغيل Chromium أو إجراء بحث من المربع متعدد الاستخدامات.</translation>
 <translation id="8704119203788522458">‏هذا هو Chromium الخاص بك</translation>
 <translation id="8712637175834984815">حسنًا</translation>
diff --git a/chrome/app/resources/chromium_strings_as.xtb b/chrome/app/resources/chromium_strings_as.xtb
index 7cf0ff6..f25c3b3 100644
--- a/chrome/app/resources/chromium_strings_as.xtb
+++ b/chrome/app/resources/chromium_strings_as.xtb
@@ -155,7 +155,6 @@
 <translation id="2718390899429598676">অতিৰিক্ত সুৰক্ষাৰ বাবে Chromiumএ আপোনাৰ ডেটা এনক্ৰিপ্ট কৰিব।</translation>
 <translation id="2721354645805494590">Chromiumৰ পৰা আপোনাৰ Google একাউণ্টটো আঁতৰাবলৈ ছাইন আউট কৰক</translation>
 <translation id="2722636413143664436">আপোনাৰ আটাইবোৰ ডিভাইচত নিজৰ পাছৱৰ্ড, বুকমাৰ্ক আৰু আন বহুতো বস্তু পাবলৈ, Chromiumত ছাইন ইন কৰক</translation>
-<translation id="2723860029395667894">সদায়েই Google AI ম’ডৰ শ্বৰ্টকাট দেখুৱাওক</translation>
 <translation id="2738871930057338499">ইণ্টাৰনেটৰ লগত সংযোগ কৰিব পৰা নাই। HTTP 403 নিষিদ্ধ। অনুগ্ৰহ কৰি আপোনাৰ প্ৰ’ক্সি কনফিগাৰেশ্বন পৰীক্ষা কৰক।</translation>
 <translation id="2753623023919742414">সন্ধান কৰিবলৈ ক্লিক কৰক</translation>
 <translation id="2768103863314748511">Chromiumক আপোনাৰ ডিফ’ল্ট PDF ভিউৱাৰ হিচাপে ছেট কৰক</translation>
@@ -650,7 +649,6 @@
 <translation id="8619360774459241877">Chromium লঞ্চ কৰি থকা হৈছে...</translation>
 <translation id="8624541899164515475">ছেটিং, নতুন টেবত খোলে।</translation>
 <translation id="8648201657708811153">Google Chrome for Testing আপোনাৰ ডিফ’ল্ট ব্ৰাউজাৰ কৰিব নোৱাৰি।</translation>
-<translation id="8677922833187616101">সদায়েই Google AI ম’ডৰ শ্বৰ্টকাট দেখুৱাওক</translation>
 <translation id="8697124171261953979">এইটোৱে আপুনি Chromiumৰ ব্যৱহাৰ আৰম্ভ কৰিলে বা Omniboxৰ পৰা সন্ধান কৰিলে কি পৃষ্ঠা খোল খাব সেয়া নিয়ন্ত্ৰণ কৰে।</translation>
 <translation id="8704119203788522458">এইটো আপোনাৰ Chromium</translation>
 <translation id="8712637175834984815">বুজি পালোঁ</translation>
diff --git a/chrome/app/resources/chromium_strings_az.xtb b/chrome/app/resources/chromium_strings_az.xtb
index eb09e31..ba178a06 100644
--- a/chrome/app/resources/chromium_strings_az.xtb
+++ b/chrome/app/resources/chromium_strings_az.xtb
@@ -155,7 +155,6 @@
 <translation id="2718390899429598676">Əlavə təhlükəsizlik üçün, Chromium datanızı şifrələyəcək.</translation>
 <translation id="2721354645805494590">Google Hesabını Chromium-dan silmək üçün çıxın</translation>
 <translation id="2722636413143664436">Parolları, əlfəcinləri və s. datanı bütün cihazlarınızda əldə etmək üçün Chromium-a daxil olun</translation>
-<translation id="2723860029395667894">Google Sİ rejimi qısayolu həmişə göstərilsin</translation>
 <translation id="2738871930057338499">İnternetə qoşulmaq olmur. HTTP 403 qadağan edilib. Proksi konfiqurasiyasını yoxlayın.</translation>
 <translation id="2753623023919742414">Klikləyərək axtarın</translation>
 <translation id="2768103863314748511">Chromium-u defolt PDF görüntüləyicisi kimi təyin edin</translation>
@@ -646,7 +645,6 @@
 <translation id="8619360774459241877">Chromium başlayır...</translation>
 <translation id="8624541899164515475">Ayarlar, yeni tabda açılır.</translation>
 <translation id="8648201657708811153">Sınaq üçün Google Chrome defolt brauzer ola bilməz.</translation>
-<translation id="8677922833187616101">Google Sİ rejimi qısayolu həmişə göstərilsin</translation>
 <translation id="8697124171261953979">O, həmçinin Chromium'u başlatdığınız zaman və ya Omnibox'dan axtarış etdiyiniz zaman göstərilən səhifəyə nəzarət edir.</translation>
 <translation id="8704119203788522458">Bu, Sizin Chromium'dur</translation>
 <translation id="8712637175834984815">Anladım</translation>
diff --git a/chrome/app/resources/chromium_strings_be.xtb b/chrome/app/resources/chromium_strings_be.xtb
index 935e54e..5c80cf5 100644
--- a/chrome/app/resources/chromium_strings_be.xtb
+++ b/chrome/app/resources/chromium_strings_be.xtb
@@ -154,7 +154,6 @@
 <translation id="2718390899429598676">Для большай бяспекі Chromium будзе шыфраваць даныя.</translation>
 <translation id="2721354645805494590">Каб выдаліць Уліковы запіс Google з Chromium, выйдзіце з яго</translation>
 <translation id="2722636413143664436">Каб выкарыстоўваць свае паролі, закладкі і іншыя даныя на ўсіх сваіх прыладах, увайдзіце ў Chromium</translation>
-<translation id="2723860029395667894">Заўсёды паказваць ярлык "Рэжым AI ад Google"</translation>
 <translation id="2738871930057338499">Не ўдалося падключыцца да інтэрнэту. Памылка HTTP 403: доступ забаронены. Праверце налады проксі-сервера.</translation>
 <translation id="2753623023919742414">Націсніце для пошуку</translation>
 <translation id="2768103863314748511">Зрабіце Chromium стандартным сродкам для прагляду файлаў PDF</translation>
@@ -649,7 +648,6 @@
 <translation id="8619360774459241877">Ідзе запуск Chromium...</translation>
 <translation id="8624541899164515475">Налады (адкрыюцца ў новай укладцы).</translation>
 <translation id="8648201657708811153">Google Chrome for Testing нельга зрабіць стандартным браўзерам.</translation>
-<translation id="8677922833187616101">Заўсёды паказваць ярлык "Рэжым AI ад Google"</translation>
 <translation id="8697124171261953979">Таксама вызначае, якая старонка паказваецца пры запуску Chromium або пошуку з амнібокса.</translation>
 <translation id="8704119203788522458">Гэта ваш Chromium</translation>
 <translation id="8712637175834984815">Зразумела</translation>
diff --git a/chrome/app/resources/chromium_strings_bg.xtb b/chrome/app/resources/chromium_strings_bg.xtb
index 3c9fec5a..ed1c6cf 100644
--- a/chrome/app/resources/chromium_strings_bg.xtb
+++ b/chrome/app/resources/chromium_strings_bg.xtb
@@ -153,7 +153,6 @@
 <translation id="2718390899429598676">За повишаване на сигурността Chromium ще шифрова данните ви.</translation>
 <translation id="2721354645805494590">За да премахнете профила си в Google от Chromium, излезте от браузъра</translation>
 <translation id="2722636413143664436">Влезте в Chromium, за да получите своите пароли, отметки и др. на всичките си устройства</translation>
-<translation id="2723860029395667894">Прекият път към режима с AI на Google да се показва винаги</translation>
 <translation id="2738871930057338499">Не може да се установи връзка с интернет. HTTP код 403 – Забранено. Проверете конфигурацията на прокси сървъра си.</translation>
 <translation id="2753623023919742414">Кликнете, за да търсите</translation>
 <translation id="2768103863314748511">Задаване на Chromium като стандартния визуализатор на PDF файлове</translation>
@@ -178,6 +177,7 @@
 <translation id="2977506796191543575">Ако сайт се опита да открадне паролата ви или изтеглите опасен файл, Chromium може също да изпрати до Безопасно сърфиране URL адресите и част от съдържанието на страницата</translation>
 <translation id="2981563588585023386">За да сърфирате по-безопасно онлайн с избраните от родителя ви настройки, влезте в Chromium</translation>
 <translation id="3003694935412297923">Всички задачи</translation>
+<translation id="3012615494352020668">{count,plural, =1{Chromium трябва да потвърди, че това сте вие, преди някои данни да могат да бъдат запазени в профила ви в Google и да се използват на всичките ви устройства. Ако излезете от профила си сега, тези данни (1 елемент) ще бъдат изтрити.}other{Chromium трябва да потвърди, че това сте вие, преди някои данни да могат да бъдат запазени в профила ви в Google и да се използват на всичките ви устройства. Ако излезете от профила си сега, тези данни ({count} елемента) ще бъдат изтрити.}}</translation>
 <translation id="3013473503895162900">Отваряне на <ph name="URL" /> в нов раздел в Chromium.</translation>
 <translation id="3032706164202344641">Chromium не може да провери паролите ви. Опитайте пак по-късно.</translation>
 <translation id="3032787606318309379">Добавя се към Chromium...</translation>
@@ -490,6 +490,7 @@
 <translation id="6729124504294600478">За да се възползвате от персонализиране и други функции, включете Chromium в „Активност в мрежата и приложенията“ и свързаните услуги на Google</translation>
 <translation id="6734291798041940871">Chromium вече е инсталиран за всички потребители на компютъра ви.</translation>
 <translation id="6751374565094704799">Ускорява сайтовете с машината V8 на Chromium, но същевременно устойчивостта на браузъра срещу атаки леко намалява. Тази настройка е включена.</translation>
+<translation id="6754665438209053659">{count,plural, =1{Някои от данните ви в Chromium още не са запазени в профила ви в Google. Изчакайте няколко минути, преди да излезете от браузъра. Ако излезете от профила си сега, тези данни (1 елемент) ще бъдат изтрити.}other{Някои от данните ви в Chromium още не са запазени в профила ви в Google. Изчакайте няколко минути, преди да излезете от браузъра. Ако излезете от профила си сега, тези данни ({count} елемента) ще бъдат изтрити.}}</translation>
 <translation id="67706546131546258">Chromium препоръчва този файл да бъде сканиран, защото може да е опасен.</translation>
 <translation id="6779406956731413166">Chromium OS е възможна благодарение на допълнителен <ph name="BEGIN_LINK_CROS_OSS" />софтуер с отворен код<ph name="END_LINK_CROS_OSS" />.</translation>
 <translation id="6831043979455480757">Превод</translation>
@@ -642,7 +643,6 @@
 <translation id="8619360774459241877">Chromium стартира…</translation>
 <translation id="8624541899164515475">Настройки (отваря се в нов раздел).</translation>
 <translation id="8648201657708811153">Google Chrome for Testing не може да бъде зададен като браузъра ви по подразбиране.</translation>
-<translation id="8677922833187616101">Прекият път към режима с AI на Google да се показва винаги</translation>
 <translation id="8697124171261953979">То също контролира коя страница се показва при стартиране на Chromium или при търсене от полето за всичко.</translation>
 <translation id="8704119203788522458">Това е вашият Chromium</translation>
 <translation id="8712637175834984815">Разбрах</translation>
diff --git a/chrome/app/resources/chromium_strings_bn.xtb b/chrome/app/resources/chromium_strings_bn.xtb
index fe7c8061..ad09786f 100644
--- a/chrome/app/resources/chromium_strings_bn.xtb
+++ b/chrome/app/resources/chromium_strings_bn.xtb
@@ -153,7 +153,6 @@
 <translation id="2718390899429598676">অতিরিক্ত নিরাপত্তার জন্য Chromium আপনার ডেটা এনক্রিপ্ট করবে।</translation>
 <translation id="2721354645805494590">Chromium থেকে আপনার Google অ্যাকাউন্ট সরিয়ে দিতে, সাইন-আউট করুন</translation>
 <translation id="2722636413143664436">নিজের সব ডিভাইসে পাসওয়ার্ড, বুকমার্ক ও আরও অনেক কিছু পেতে, Chromium-এ সাইন-ইন করুন</translation>
-<translation id="2723860029395667894">সবসময় Google AI মোড শর্টকাট দেখুন</translation>
 <translation id="2738871930057338499">ইন্টারনেটের সাথে কানেক্ট করা যায়নি। HTTP 403 নিষিদ্ধ। আপনার প্রক্সি কনফিগারেশন চেক করুন।</translation>
 <translation id="2753623023919742414">সার্চ করার জন্য ক্লিক করুন</translation>
 <translation id="2768103863314748511">আপনার ডিফল্ট PDF ভিউয়ার হিসেবে Chromium সেট করুন</translation>
@@ -178,6 +177,7 @@
 <translation id="2977506796191543575">যদি কোনও সাইট আপনার পাসওয়ার্ড চুরি করার চেষ্টা করে বা আপনি কোনও ক্ষতিকারক ফাইল ডাউনলোড করলে, Chromium, পৃষ্ঠার কিছু কন্টেন্ট সহ URL ও হয়ত Safe Browsing-এ পাঠাতে পারে</translation>
 <translation id="2981563588585023386">তোমার অভিভাবকের পছন্দ মেনে অনলাইনে আরও নিরাপদ থাকতে, Chromium-এ সাইন-ইন করো</translation>
 <translation id="3003694935412297923">সব টাস্ক</translation>
+<translation id="3012615494352020668">{count,plural, =1{Chromium আপনার পরিচয় যাচাই করে নেওয়ার পর আপনি Google অ্যাকাউন্টে কিছু ডেটা সেভ করতে ও সবকটি ডিভাইসে তা ব্যবহার করতে পারবেন। আপনি এখনই সাইন-আউট করলে, এই ডেটা (১টি আইটেম) মুছে যাবে।}one{Chromium আপনার পরিচয় যাচাই করে নেওয়ার পর আপনি Google অ্যাকাউন্টে কিছু ডেটা সেভ করতে ও সবকটি ডিভাইসে তা ব্যবহার করতে পারবেন। আপনি এখনই সাইন-আউট করলে, এই ডেটা ({count}টি আইটেম) মুছে যাবে।}other{Chromium আপনার পরিচয় যাচাই করে নেওয়ার পর আপনি Google অ্যাকাউন্টে কিছু ডেটা সেভ করতে ও সবকটি ডিভাইসে তা ব্যবহার করতে পারবেন। আপনি এখনই সাইন-আউট করলে, এই ডেটা ({count}টি আইটেম) মুছে যাবে।}}</translation>
 <translation id="3013473503895162900">Chromium-এর নতুন একটি ট্যাবে <ph name="URL" /> খুলুন।</translation>
 <translation id="3032706164202344641">Chromium আপনার পাসওয়ার্ড চেক করতে পারছে না। পরে আবার চেষ্টা করুন।</translation>
 <translation id="3032787606318309379">Chromium-এ জুড়ছে...</translation>
@@ -492,6 +492,7 @@
 <translation id="6729124504294600478">পছন্দমতো সুবিধা ও অন্যান্য ফিচার ব্যবহার করতে ওয়েব ও অ্যাপ অ্যাক্টিভিটি ও লিঙ্ক করা Google পরিষেবায় Chromium যোগ করে নিন</translation>
 <translation id="6734291798041940871">Chromium ইতোমধ্যে আপনার কম্পিউটারের সকল ব্যবহারকারীর জন্য ইনস্টল করা হয়েছে।</translation>
 <translation id="6751374565094704799">Chromium-এর ভি৮ ইঞ্জিন সাইটের স্পিড বাড়িয়ে দেয় কিন্তু Chromium-এর অ্যাটাক আটকানোর ক্ষমতা সামান্য কমে যায়। এই সেটিংসটি চালু করা আছে।</translation>
+<translation id="6754665438209053659">{count,plural, =1{আপনার Chromium ডেটার কিছুটা অংশ এখনও Google অ্যাকাউন্টে সেভ হয়নি। সাইন-আউট করার আগে কয়েক মিনিট অপেক্ষা করে দেখুন। আপনি এখনই সাইন-আউট করলে, এই ডেটা (১টি আইটেম) মুছে যাবে।}one{আপনার Chromium ডেটার কিছুটা অংশ এখনও Google অ্যাকাউন্টে সেভ হয়নি। সাইন-আউট করার আগে কয়েক মিনিট অপেক্ষা করে দেখুন। আপনি এখনই সাইন-আউট করলে, এই ডেটা ({count}টি আইটেম) মুছে যাবে।}other{আপনার Chromium ডেটার কিছুটা অংশ এখনও Google অ্যাকাউন্টে সেভ হয়নি। সাইন-আউট করার আগে কয়েক মিনিট অপেক্ষা করে দেখুন। আপনি এখনই সাইন-আউট করলে, এই ডেটা ({count}টি আইটেম) মুছে যাবে।}}</translation>
 <translation id="67706546131546258">ফাইলটি বিপজ্জনক হতে পারে বলে Chromium এটি স্ক্যান করার সাজেশন দেয়।</translation>
 <translation id="6779406956731413166">ChromeOS সম্ভবত অতিরিক্ত <ph name="BEGIN_LINK_CROS_OSS" />ওপেন সোর্স সফ্টওয়্যার<ph name="END_LINK_CROS_OSS" /> দিয়ে তৈরি।</translation>
 <translation id="6831043979455480757">অনুবাদ</translation>
@@ -646,7 +647,6 @@
 <translation id="8619360774459241877">Chromium লঞ্চ করা হচ্ছে...</translation>
 <translation id="8624541899164515475">সেটিংস, নতুন ট্যাবে খোলে।</translation>
 <translation id="8648201657708811153">Google Chrome for Testing-কে আপনার ডিফল্ট ব্রাউজার করে পারবেন না।</translation>
-<translation id="8677922833187616101">সবসময় Google AI মোড শর্টকাট দেখুন</translation>
 <translation id="8697124171261953979">আপনি Chromium শুরু করলে বা Omnibox থেকে সার্চ করলে কোন পৃষ্ঠাটি দেখানো হবে তাও এটি নিয়ন্ত্রণ করে।</translation>
 <translation id="8704119203788522458">এটি হল আপনার Chromium</translation>
 <translation id="8712637175834984815">বুঝেছি</translation>
diff --git a/chrome/app/resources/chromium_strings_bs.xtb b/chrome/app/resources/chromium_strings_bs.xtb
index 0ab8801..0dee07a 100644
--- a/chrome/app/resources/chromium_strings_bs.xtb
+++ b/chrome/app/resources/chromium_strings_bs.xtb
@@ -155,7 +155,6 @@
 <translation id="2718390899429598676">Chromium će šifrirati vaše podatke radi dodatne sigurnosti.</translation>
 <translation id="2721354645805494590">Odjavite se da uklonite Google račun iz Chromiuma</translation>
 <translation id="2722636413143664436">Da dobijate lozinke, oznake i druge stavke na svim svojim uređajima, prijavite se u Chromium</translation>
-<translation id="2723860029395667894">Uvijek prikazuj prečicu Google AI načina rada</translation>
 <translation id="2738871930057338499">Nije moguće povezati se s internetom. HTTP 403 je zabranjen. Provjerite konfiguraciju proksi servera.</translation>
 <translation id="2753623023919742414">Kliknite da pretražite</translation>
 <translation id="2768103863314748511">Postavite Chromium kao zadani preglednik PDF-a</translation>
@@ -650,7 +649,6 @@
 <translation id="8619360774459241877">Pokretanje Chromiuma...</translation>
 <translation id="8624541899164515475">Postavke; otvara se na novoj kartici.</translation>
 <translation id="8648201657708811153">Google Chrome for Testing nije moguće postaviti kao zadani preglednik.</translation>
-<translation id="8677922833187616101">Uvijek prikazuj prečicu Google AI načina rada</translation>
 <translation id="8697124171261953979">Također kontrolira koja stranica će se prikazati kada pokrenete Chromium ili budete pretraživali iz višenamjenskog okvira.</translation>
 <translation id="8704119203788522458">Ovo je vaš Chromium</translation>
 <translation id="8712637175834984815">Razumijem</translation>
diff --git a/chrome/app/resources/chromium_strings_ca.xtb b/chrome/app/resources/chromium_strings_ca.xtb
index 782e47a..989ebdc 100644
--- a/chrome/app/resources/chromium_strings_ca.xtb
+++ b/chrome/app/resources/chromium_strings_ca.xtb
@@ -153,7 +153,6 @@
 <translation id="2718390899429598676">Per a més seguretat, Chromium encriptarà les teves dades.</translation>
 <translation id="2721354645805494590">Per suprimir de Chromium el teu Compte de Google, tanca la sessió</translation>
 <translation id="2722636413143664436">Per obtenir les teves contrasenyes, adreces d'interès i altres dades en tots els teus dispositius, inicia la sessió a Chromium</translation>
-<translation id="2723860029395667894">Mostra sempre la drecera del mode IA de Google</translation>
 <translation id="2738871930057338499">No es pot connectar a Internet. Error d'HTTP "403 Forbidden". Comprova la configuració del servidor intermediari.</translation>
 <translation id="2753623023919742414">Fes clic per cercar</translation>
 <translation id="2768103863314748511">Defineix Chromium com el visor de PDF predeterminat</translation>
@@ -648,7 +647,6 @@
 <translation id="8619360774459241877">S'està iniciant Chromium...</translation>
 <translation id="8624541899164515475">Configuració; s'obre en una pestanya nova.</translation>
 <translation id="8648201657708811153">Google Chrome for Testing no pot definir-se com a navegador predeterminat.</translation>
-<translation id="8677922833187616101">Mostra sempre la drecera del mode IA de Google</translation>
 <translation id="8697124171261953979">També controla la pàgina que es mostra quan inicieu Chromium o quan feu una cerca des de l'omnibox.</translation>
 <translation id="8704119203788522458">Aquest és el vostre Chromium</translation>
 <translation id="8712637175834984815">Entesos</translation>
diff --git a/chrome/app/resources/chromium_strings_cs.xtb b/chrome/app/resources/chromium_strings_cs.xtb
index 028e0aca..d092966 100644
--- a/chrome/app/resources/chromium_strings_cs.xtb
+++ b/chrome/app/resources/chromium_strings_cs.xtb
@@ -154,7 +154,6 @@
 <translation id="2718390899429598676">V zájmu lepšího zabezpečení bude Chromium šifrovat vaše data.</translation>
 <translation id="2721354645805494590">Pokud z prohlížeče Chromium chcete odebrat svůj účet Google, odhlaste se</translation>
 <translation id="2722636413143664436">Pokud svá hesla, záložky a další položky chcete mít na všech svých zařízeních, přihlaste se do prohlížeče Chromium</translation>
-<translation id="2723860029395667894">Vždy zobrazovat zkratku režimu AI od Googlu</translation>
 <translation id="2738871930057338499">Nelze se připojit k internetu. HTTP 403 (Zakázáno). Zkontrolujte konfiguraci proxy.</translation>
 <translation id="2753623023919742414">Kliknutím spustíte hledání</translation>
 <translation id="2768103863314748511">Nastavte Chromium jako výchozí prohlížeč PDF</translation>
@@ -649,7 +648,6 @@
 <translation id="8619360774459241877">Spouštění prohlížeče Chromium...</translation>
 <translation id="8624541899164515475">Nastavení, otevře se na nové kartě.</translation>
 <translation id="8648201657708811153">Google Chrome for Testing nelze nastavit jako výchozí prohlížeč.</translation>
-<translation id="8677922833187616101">Vždy zobrazovat zkratku režimu AI od Googlu</translation>
 <translation id="8697124171261953979">Také řídí, která stránka se zobrazí po spuštění prohlížeče Chromium nebo při vyhledávání v omniboxu.</translation>
 <translation id="8704119203788522458">Toto je váš prohlížeč Chromium</translation>
 <translation id="8712637175834984815">Hotovo</translation>
diff --git a/chrome/app/resources/chromium_strings_cy.xtb b/chrome/app/resources/chromium_strings_cy.xtb
index 8daf9c35..697b959 100644
--- a/chrome/app/resources/chromium_strings_cy.xtb
+++ b/chrome/app/resources/chromium_strings_cy.xtb
@@ -155,7 +155,6 @@
 <translation id="2718390899429598676">Ar gyfer diogelwch ychwanegol, bydd Chromium yn amgryptio'ch data.</translation>
 <translation id="2721354645805494590">I dynnu'ch Cyfrif Google o Chromium, allgofnodwch</translation>
 <translation id="2722636413143664436">I gael eich cyfrineiriau, nodau tudalen a rhagor ar eich holl ddyfeisiau, mewngofnodwch i Chromium</translation>
-<translation id="2723860029395667894">Dangos llwybr byr Dull AI Google bob amser</translation>
 <translation id="2738871930057338499">Methu â chysylltu â'r Rhyngrwyd. HTTP 403 Gwaharddedig. Gwiriwch ffurfweddiad eich dirprwy weinydd.</translation>
 <translation id="2753623023919742414">Cliciwch i chwilio</translation>
 <translation id="2768103863314748511">Gosod Chromium fel eich dangosydd PDF diofyn</translation>
@@ -650,7 +649,6 @@
 <translation id="8619360774459241877">Wrthi'n lansio Chromium...</translation>
 <translation id="8624541899164515475">Gosodiadau, yn agor mewn tab newydd.</translation>
 <translation id="8648201657708811153">Ni ellir gwneud Google Chrome for Testing yn borwr diofyn i chi.</translation>
-<translation id="8677922833187616101">Dangos Llwybr Byr Dull AI Google Bob Amser</translation>
 <translation id="8697124171261953979">Mae hefyd yn rheoli pa dudalen sy'n cael ei dangos pan fyddwch yn cychwyn Chromium neu'n chwilio o'r Omniflwch.</translation>
 <translation id="8704119203788522458">Dyma eich Chromium</translation>
 <translation id="8712637175834984815">Iawn</translation>
diff --git a/chrome/app/resources/chromium_strings_da.xtb b/chrome/app/resources/chromium_strings_da.xtb
index c28bfb6e..0bc3537 100644
--- a/chrome/app/resources/chromium_strings_da.xtb
+++ b/chrome/app/resources/chromium_strings_da.xtb
@@ -153,7 +153,6 @@
 <translation id="2718390899429598676">Som et ekstra sikkerhedsniveau krypterer Chromium dine data.</translation>
 <translation id="2721354645805494590">Log ud for at fjerne din Google-konto fra Chromium</translation>
 <translation id="2722636413143664436">For at kunne se dine adgangskoder m.m. på alle dine enheder skal du logge ind i Chromium</translation>
-<translation id="2723860029395667894">Vis altid genvejen til Google AI-tilstand</translation>
 <translation id="2738871930057338499">Der kan ikke oprettes forbindelse til internettet. HTTP 403 (forbudt). Tjek din proxykonfiguration.</translation>
 <translation id="2753623023919742414">Klik for at søge</translation>
 <translation id="2768103863314748511">Angiv Chromium som din standard PDF-fremviser</translation>
@@ -648,7 +647,6 @@
 <translation id="8619360774459241877">Starter Chromium...</translation>
 <translation id="8624541899164515475">Indstillinger (åbnes på en ny fane).</translation>
 <translation id="8648201657708811153">Google Chrome for Testing kan ikke angives som din standardbrowser.</translation>
-<translation id="8677922833187616101">Vis altid genvejen til Google AI-tilstand</translation>
 <translation id="8697124171261953979">Den styrer også, hvilken side der vises, når du åbner Chromium eller søger via omnifeltet.</translation>
 <translation id="8704119203788522458">Dette er din Chromium-browser</translation>
 <translation id="8712637175834984815">Forstået</translation>
diff --git a/chrome/app/resources/chromium_strings_de.xtb b/chrome/app/resources/chromium_strings_de.xtb
index 320718a..bbc91da 100644
--- a/chrome/app/resources/chromium_strings_de.xtb
+++ b/chrome/app/resources/chromium_strings_de.xtb
@@ -152,7 +152,6 @@
 <translation id="2718390899429598676">Chromium verschlüsselt deine Daten zur Erhöhung der Sicherheit.</translation>
 <translation id="2721354645805494590">Wenn du dein Google-Konto von Chromium entfernen möchtest, melde dich ab</translation>
 <translation id="2722636413143664436">Wenn du auf allen deinen Geräten auf deine Passwörter, Lesezeichen und andere Daten zugreifen möchtest, melde dich in Chromium an</translation>
-<translation id="2723860029395667894">Verknüpfung zum KI-Modus von Google immer anzeigen</translation>
 <translation id="2738871930057338499">Internetverbindung kann nicht hergestellt werden. HTTP 403 Forbidden. Bitte prüfe deine Proxykonfiguration.</translation>
 <translation id="2753623023919742414">Zum Suchen klicken</translation>
 <translation id="2768103863314748511">Chromium als standardmäßigen PDF-Viewer festlegen</translation>
@@ -647,7 +646,6 @@
 <translation id="8619360774459241877">Chromium wird gestartet…</translation>
 <translation id="8624541899164515475">Einstellungen, werden in neuem Tab geöffnet.</translation>
 <translation id="8648201657708811153">Google Chrome for Testing kann nicht als Standardbrowser festgelegt werden.</translation>
-<translation id="8677922833187616101">Verknüpfung zum KI-Modus von Google immer anzeigen</translation>
 <translation id="8697124171261953979">Die Erweiterung legt auch fest, welche Seite beim Start von Chromium oder bei der Suche über die Omnibox angezeigt wird.</translation>
 <translation id="8704119203788522458">Dies ist dein persönlicher Chromium-Browser</translation>
 <translation id="8712637175834984815">Ok</translation>
diff --git a/chrome/app/resources/chromium_strings_el.xtb b/chrome/app/resources/chromium_strings_el.xtb
index 8d0aed5b..0dc6e53 100644
--- a/chrome/app/resources/chromium_strings_el.xtb
+++ b/chrome/app/resources/chromium_strings_el.xtb
@@ -153,7 +153,6 @@
 <translation id="2718390899429598676">Για επιπλέον ασφάλεια, το Chromium θα κρυπτογραφήσει τα δεδομένα σας.</translation>
 <translation id="2721354645805494590">Για να καταργήσετε τον Λογαριασμό σας Google από το Chromium, αποσυνδεθείτε</translation>
 <translation id="2722636413143664436">Για να έχετε πρόσβαση στους κωδικούς πρόσβασης, στους σελιδοδείκτες και σε άλλα στοιχεία σε όλες τις συσκευές σας, συνδεθείτε στο Chromium</translation>
-<translation id="2723860029395667894">Να εμφανίζεται πάντα η συντόμευση Λειτουργία AI της Google</translation>
 <translation id="2738871930057338499">Δεν είναι δυνατή η σύνδεση στο διαδίκτυο. HTTP 403 Forbidden. Ελέγξτε τη διαμόρφωση των παραμέτρων του διακομιστή μεσολάβησης.</translation>
 <translation id="2753623023919742414">Κάντε κλικ για αναζήτηση</translation>
 <translation id="2768103863314748511">Ορισμός του Chromium ως προεπιλεγμένου προγράμματος προβολής PDF</translation>
@@ -648,7 +647,6 @@
 <translation id="8619360774459241877">Εκκίνηση του Chromium…</translation>
 <translation id="8624541899164515475">Ρυθμίσεις, ανοίγει σε νέα καρτέλα.</translation>
 <translation id="8648201657708811153">Το Google Chrome for Testing δεν μπορεί να οριστεί ως το προεπιλεγμένο πρόγραμμα περιήγησης.</translation>
-<translation id="8677922833187616101">Να εμφανίζεται πάντα η συντόμευση Λειτουργία AI της Google</translation>
 <translation id="8697124171261953979">Επίσης, ελέγχει τη σελίδα που εμφανίζεται κατά την εκκίνηση του Chromium ή όταν κάνετε αναζήτηση από το κύριο πλαίσιο.</translation>
 <translation id="8704119203788522458">Ορίστε το δικό σας Chromium</translation>
 <translation id="8712637175834984815">Κατάλαβα!</translation>
diff --git a/chrome/app/resources/chromium_strings_en-GB.xtb b/chrome/app/resources/chromium_strings_en-GB.xtb
index 4c15f6d..657c325 100644
--- a/chrome/app/resources/chromium_strings_en-GB.xtb
+++ b/chrome/app/resources/chromium_strings_en-GB.xtb
@@ -155,7 +155,6 @@
 <translation id="2718390899429598676">For added security, Chromium will encrypt your data.</translation>
 <translation id="2721354645805494590">To remove your Google Account from Chromium, sign out</translation>
 <translation id="2722636413143664436">To get your passwords, bookmarks and more on all your devices, sign in to Chromium</translation>
-<translation id="2723860029395667894">Always show Google AI Mode shortcut</translation>
 <translation id="2738871930057338499">Unable to connect to the Internet. HTTP 403 Forbidden. Please check your proxy configuration.</translation>
 <translation id="2753623023919742414">Click to search</translation>
 <translation id="2768103863314748511">Set Chromium as your default PDF viewer</translation>
@@ -180,6 +179,7 @@
 <translation id="2977506796191543575">If a site tries to steal your password, or when you download a harmful file, Chromium may also send URLs, including bits of page content, to Safe Browsing</translation>
 <translation id="2981563588585023386">To stay safer online with your parent's choices, sign in to Chromium</translation>
 <translation id="3003694935412297923">All tasks</translation>
+<translation id="3012615494352020668">{count,plural, =1{Chromium needs to verify that it's you before some data can be saved in your Google Account and used on all your devices. If you sign out now, this data (1 item) will be deleted.}other{Chromium needs to verify that it's you before some data can be saved in your Google Account and used on all your devices. If you sign out now, this data ({count} items) will be deleted.}}</translation>
 <translation id="3013473503895162900">Open <ph name="URL" /> in a new tab in Chromium.</translation>
 <translation id="3032706164202344641">Chromium can't check your passwords. Try again later.</translation>
 <translation id="3032787606318309379">Adding to Chromium ...</translation>
@@ -496,6 +496,7 @@
 <translation id="6729124504294600478">To get personalisation and other features, include Chromium in Web &amp; App Activity and linked Google services</translation>
 <translation id="6734291798041940871">Chromium is already installed for all users on your computer.</translation>
 <translation id="6751374565094704799">Speeds up sites with Chromium's V8 engine but makes Chromium slightly less resistant to attacks. This setting is on.</translation>
+<translation id="6754665438209053659">{count,plural, =1{Some of your Chromium data hasn't been saved in your Google Account yet. Try waiting a few minutes before signing out. If you sign out now, this data (1 item) will be deleted.}other{Some of your Chromium data hasn't been saved in your Google Account yet. Try waiting a few minutes before signing out. If you sign out now, this data ({count} items) will be deleted.}}</translation>
 <translation id="67706546131546258">Chromium recommends scanning this file because it may be dangerous.</translation>
 <translation id="6779406956731413166">Chromium OS is made possible by additional <ph name="BEGIN_LINK_CROS_OSS" />open-source software<ph name="END_LINK_CROS_OSS" />.</translation>
 <translation id="6831043979455480757">Translate</translation>
@@ -650,7 +651,6 @@
 <translation id="8619360774459241877">Launching Chromium...</translation>
 <translation id="8624541899164515475">Settings, opens in new tab.</translation>
 <translation id="8648201657708811153">Google Chrome for testing cannot be made your default browser.</translation>
-<translation id="8677922833187616101">Always show Google AI mode shortcut</translation>
 <translation id="8697124171261953979">It also controls what page is shown when you start Chromium or search from the Omnibox.</translation>
 <translation id="8704119203788522458">This is your Chromium</translation>
 <translation id="8712637175834984815">Got it</translation>
diff --git a/chrome/app/resources/chromium_strings_es-419.xtb b/chrome/app/resources/chromium_strings_es-419.xtb
index 12f1935..71c5d31e 100644
--- a/chrome/app/resources/chromium_strings_es-419.xtb
+++ b/chrome/app/resources/chromium_strings_es-419.xtb
@@ -153,7 +153,6 @@
 <translation id="2718390899429598676">Para mayor seguridad, Chromium encriptará los datos.</translation>
 <translation id="2721354645805494590">Sal de Chromium para quitar tu Cuenta de Google</translation>
 <translation id="2722636413143664436">Para acceder a tus contraseñas, favoritos y más en todos tus dispositivos, accede a Chromium</translation>
-<translation id="2723860029395667894">Mostrar siempre el acceso directo al Modo IA de Google</translation>
 <translation id="2738871930057338499">No se puede conectar a Internet. HTTP 403 no permitido. Comprueba la configuración del proxy.</translation>
 <translation id="2753623023919742414">Hacer clic para buscar</translation>
 <translation id="2768103863314748511">Establece Chromium como tu lector de PDF predeterminado</translation>
@@ -642,7 +641,6 @@
 <translation id="8619360774459241877">Iniciando Chromium…</translation>
 <translation id="8624541899164515475">Configuración, se abre en una pestaña nueva.</translation>
 <translation id="8648201657708811153">Google Chrome for Testing no se puede establecer como tu navegador predeterminado.</translation>
-<translation id="8677922833187616101">Mostrar siempre el acceso directo al Modo IA de Google</translation>
 <translation id="8697124171261953979">También controla qué página se muestra al iniciar Chromium o al realizar búsquedas desde el cuadro multifunción.</translation>
 <translation id="8704119203788522458">Este es tu Chromium</translation>
 <translation id="8712637175834984815">Entendido</translation>
diff --git a/chrome/app/resources/chromium_strings_es.xtb b/chrome/app/resources/chromium_strings_es.xtb
index 18869e5..8fbbbf8 100644
--- a/chrome/app/resources/chromium_strings_es.xtb
+++ b/chrome/app/resources/chromium_strings_es.xtb
@@ -155,7 +155,6 @@
 <translation id="2718390899429598676">Para mayor seguridad, Chromium cifrará tus datos.</translation>
 <translation id="2721354645805494590">Para eliminar de Chromium tu cuenta de Google, cierra sesión</translation>
 <translation id="2722636413143664436">Inicia sesión en Chromium para acceder a tus contraseñas, marcadores y otros en todos tus dispositivos</translation>
-<translation id="2723860029395667894">Mostrar siempre el acceso directo al Modo IA de Google</translation>
 <translation id="2738871930057338499">No se puede conectar a Internet. HTTP 403 no permitido. Comprueba la configuración del proxy.</translation>
 <translation id="2753623023919742414">Haz clic para buscar</translation>
 <translation id="2768103863314748511">Establece Chromium como visor de PDFs predeterminado</translation>
@@ -180,6 +179,7 @@
 <translation id="2977506796191543575">Si un sitio intenta robarte tu contraseña o si descargas un archivo dañino, es posible que Chromium también envíe URLs, incluidos fragmentos de contenido de la página, a Navegación segura.</translation>
 <translation id="2981563588585023386">Para tener más protección online con las opciones de tus padres, inicia sesión en Chromium</translation>
 <translation id="3003694935412297923">Todas las tareas</translation>
+<translation id="3012615494352020668">{count,plural, =1{Chromium debe verificar que eres tú para poder guardar algunos datos en tu cuenta de Google y usarlos en todos tus dispositivos. Si cierras sesión ahora, estos datos (1 elemento) se eliminarán.}other{Chromium debe verificar que eres tú para poder guardar algunos datos en tu cuenta de Google y usarlos en todos tus dispositivos. Si cierras sesión ahora, estos datos ({count} elementos) se eliminarán.}}</translation>
 <translation id="3013473503895162900">Abre <ph name="URL" /> en una pestaña nueva de Chromium.</translation>
 <translation id="3032706164202344641">Chromium no puede comprobar tus contraseñas. Vuelve a intentarlo más tarde.</translation>
 <translation id="3032787606318309379">Añadiendo a Chromium...</translation>
@@ -496,6 +496,7 @@
 <translation id="6729124504294600478">Para disfrutar de personalización y otras funciones, incluye Chromium en Actividad en la Web y en Aplicaciones y en los servicios de Google vinculados</translation>
 <translation id="6734291798041940871">Chromium ya está instalado para todos los usuarios en tu ordenador.</translation>
 <translation id="6751374565094704799">Acelera los sitios con el motor V8 de Chromium, pero hace que Chromium sea un poco menos resistente a los ataques. Esta opción está activada.</translation>
+<translation id="6754665438209053659">{count,plural, =1{Algunos de tus datos de Chromium aún no se han guardado en tu cuenta de Google. Prueba a esperar unos minutos antes de cerrar sesión. Si cierras sesión ahora, estos datos (1 elemento) se eliminarán.}other{Algunos de tus datos de Chromium aún no se han guardado en tu cuenta de Google. Prueba a esperar unos minutos antes de cerrar sesión. Si cierras sesión ahora, estos datos ({count} elementos) se eliminarán.}}</translation>
 <translation id="67706546131546258">Chromium recomienda analizar este archivo porque puede que sea peligroso.</translation>
 <translation id="6779406956731413166">ChromiumOS se ha creado gracias a <ph name="BEGIN_LINK_CROS_OSS" />software libre<ph name="END_LINK_CROS_OSS" /> adicional.</translation>
 <translation id="6831043979455480757">Traducir</translation>
@@ -650,7 +651,6 @@
 <translation id="8619360774459241877">Iniciando Chromium...</translation>
 <translation id="8624541899164515475">Configuración, se abre en una pestaña nueva.</translation>
 <translation id="8648201657708811153">Google Chrome for Testing no se puede establecer como navegador predeterminado.</translation>
-<translation id="8677922833187616101">Mostrar siempre el acceso directo al Modo IA de Google</translation>
 <translation id="8697124171261953979">También controla qué página se muestra al iniciar Chromium o al hacer búsquedas desde el omnibox.</translation>
 <translation id="8704119203788522458">Aquí tienes tu navegador Chromium</translation>
 <translation id="8712637175834984815">Entendido</translation>
diff --git a/chrome/app/resources/chromium_strings_et.xtb b/chrome/app/resources/chromium_strings_et.xtb
index 8de7126..010ceffd 100644
--- a/chrome/app/resources/chromium_strings_et.xtb
+++ b/chrome/app/resources/chromium_strings_et.xtb
@@ -153,7 +153,6 @@
 <translation id="2718390899429598676">Turvalisuse suurendamiseks krüptib Chromium teie andmed.</translation>
 <translation id="2721354645805494590">Google'i konto Chromiumist eemaldamiseks logige välja</translation>
 <translation id="2722636413143664436">Kõigis seadmetes paroolide, järjehoidjate ja muude võimaluste kasutamiseks logige sisse Chromiumi</translation>
-<translation id="2723860029395667894">Kuva alati Google'i AI-režiimi otsetee</translation>
 <translation id="2738871930057338499">Internetiga ei õnnestu ühendust luua. HTTP 403 on keelatud. Kontrollige puhverserveri seadistust.</translation>
 <translation id="2753623023919742414">Klõpsake otsimiseks</translation>
 <translation id="2768103863314748511">Määrake Chromium oma PDF-vaikevaaturiks</translation>
@@ -648,7 +647,6 @@
 <translation id="8619360774459241877">Chromiumi käivitamine …</translation>
 <translation id="8624541899164515475">Seaded, avaneb uuel vahelehel.</translation>
 <translation id="8648201657708811153">Brauserit Google Chrome for Testing ei saa teie vaikebrauseriks määrata.</translation>
-<translation id="8677922833187616101">Kuva alati Google'i AI-režiimi otsetee</translation>
 <translation id="8697124171261953979">Lisaks juhib see seda, mis leht kuvatakse Chromiumi käivitamisel või omnikastikeses otsingu tegemisel.</translation>
 <translation id="8704119203788522458">See on teie Chromium</translation>
 <translation id="8712637175834984815">Selge</translation>
diff --git a/chrome/app/resources/chromium_strings_eu.xtb b/chrome/app/resources/chromium_strings_eu.xtb
index 830c4d2..8c3e1e74 100644
--- a/chrome/app/resources/chromium_strings_eu.xtb
+++ b/chrome/app/resources/chromium_strings_eu.xtb
@@ -154,7 +154,6 @@
 <translation id="2718390899429598676">Segurtasun gehiago izateko, Chromium-ek datuak enkriptatuko ditu.</translation>
 <translation id="2721354645805494590">Zure Google-ko kontua Chromium-etik kentzeko, amaitu saioa</translation>
 <translation id="2722636413143664436">Pasahitzak, laster-markak eta bestelako datuak zure gailu guztietan gordeta edukitzeko, hasi saioa Chromium-en</translation>
-<translation id="2723860029395667894">Erakutsi beti Google-ren AA moduaren lasterbidea</translation>
 <translation id="2738871930057338499">Ezin da konektatu Internetera. HTTP 403 (debekatuta). Egiaztatu proxyaren konfigurazioa.</translation>
 <translation id="2753623023919742414">Sakatu bilatzeko</translation>
 <translation id="2768103863314748511">Ezarri Chromium PDFen ikustaile lehenetsi gisa</translation>
@@ -522,6 +521,7 @@
 <translation id="705851970750939768">Eguneratu Chromium</translation>
 <translation id="7067091210845072982">Irudiren batek ez badu azalpen lagungarririk, halako bat lortzen ahaleginduko da Chromium. Azalpen horiek sortzeko, irudiak Google-ri bidaltzen zaizkio.</translation>
 <translation id="7141270731789036260">Pertsonalizatu Chrome for Testing</translation>
+<translation id="7147227333672430807">Chromium erabili ahalko duzu mezu, dokumentu eta aplikazioetako estekak sakatzen dituzunean</translation>
 <translation id="7163519456498498587">Kendu <ph name="EXTENSION_NAME" /> Chromium-etik</translation>
 <translation id="7173822816570314652">Erakundeak Chromium-eko datuak ezabatzen ditu <ph name="TIMEOUT_DURATION" />z erabiltzen ez denean. Arakatze-datuen barnean daude historia, automatikoki betetako datuak eta deskargak.</translation>
 <translation id="718435575166326686">Chromium-ek kamera erabiltzeko baimena behar du webgune honetan</translation>
@@ -636,6 +636,7 @@
 <translation id="8471947159125090285">Chromium-eko datuak Google-ko kontuan gordetzeko eta erabiltzeko, egiaztatu zeu zarela</translation>
 <translation id="8482493977473846331">Chrome-n saioa hasteko eskaera-mezuak erakusten ditu</translation>
 <translation id="8493179195440786826">Chromium zaharkituta dago</translation>
+<translation id="850264194101621529">Eskerrik asko Chromium arakatzaile lehenetsi gisa aukeratzeagatik!</translation>
 <translation id="8522801943730206384">Gordetzen dituzun pasahitzak egiaztatzeko gai da Chromium</translation>
 <translation id="8555465886620020932">Zerbitzuaren errorea: <ph name="SERVICE_ERROR" /></translation>
 <translation id="8556420416730706394">Irudi-bilaketa erraz erabiltzeko, aingura ezazu. Horretarako, sakatu ainguratzeko botoia alboko panelaren goialdean.</translation>
@@ -647,7 +648,6 @@
 <translation id="8619360774459241877">Chromium abiarazten…</translation>
 <translation id="8624541899164515475">Ezarpenak, beste fitxa batean irekitzen da.</translation>
 <translation id="8648201657708811153">Google Chrome for Testing ezin da ezarri arakatzaile lehenetsi gisa.</translation>
-<translation id="8677922833187616101">Erakutsi beti Google-ren AA moduaren lasterbidea</translation>
 <translation id="8697124171261953979">Chromium hasten duzunean edo Omnibox-etik bilaketak egiten dituzunean erakusten den orria ere kontrolatzen du.</translation>
 <translation id="8704119203788522458">Hau da zure Chromium arakatzailea</translation>
 <translation id="8712637175834984815">Ados</translation>
diff --git a/chrome/app/resources/chromium_strings_fa.xtb b/chrome/app/resources/chromium_strings_fa.xtb
index 25d9abe..4b657385 100644
--- a/chrome/app/resources/chromium_strings_fa.xtb
+++ b/chrome/app/resources/chromium_strings_fa.xtb
@@ -153,7 +153,6 @@
 <translation id="2718390899429598676">‏برای امنیت بیشتر، Chromium داده‌های شما را رمزگذاری می‌کند.</translation>
 <translation id="2721354645805494590">‏برای برداشتن «حساب Google» خود از Chromium، از سیستم خارج شوید</translation>
 <translation id="2722636413143664436">‏برای دریافت گذرواژه‌ها، نشانک‌ها، و موارد دیگر در همه دستگاه‌هایتان، به سیستم Chromium وارد شوید</translation>
-<translation id="2723860029395667894">‏همیشه میان‌بر «حالت هوش مصنوعی Google» نشان داده شود</translation>
 <translation id="2738871930057338499">‏اتصال به اینترنت برقرار نشد. HTTP ۴۰۳ ممنوع است. لطفاً پیکربندی پروکسی‌تان را بررسی کنید.</translation>
 <translation id="2753623023919742414">برای جستجو، کلیک کنید</translation>
 <translation id="2768103863314748511">‏تنظیم Chromium به‌عنوان نمایشگر PDF پیش‌فرض</translation>
@@ -646,7 +645,6 @@
 <translation id="8619360774459241877">‏درحال راه‌اندازی Chromium…</translation>
 <translation id="8624541899164515475">«تنظیمات»، در زبانه جدیدی باز می‌شود.</translation>
 <translation id="8648201657708811153">‏نمی‌توان Google Chrome for Testing را به‌عنوان مرورگر پیش‌فرض تنظیم کرد.</translation>
-<translation id="8677922833187616101">‏همیشه میان‌بر «حالت هوش مصنوعی Google» نشان داده شود</translation>
 <translation id="8697124171261953979">‏این برنامه همچنین صفحه‌ای را که هنگام راه‌اندازی Chromium یا جستجو از Omnibox نشان داده می‌شود، کنترل می‌کند.</translation>
 <translation id="8704119203788522458">‏این Chromium شماست</translation>
 <translation id="8712637175834984815">متوجه شدم</translation>
diff --git a/chrome/app/resources/chromium_strings_fi.xtb b/chrome/app/resources/chromium_strings_fi.xtb
index 9175138..e39cdd6 100644
--- a/chrome/app/resources/chromium_strings_fi.xtb
+++ b/chrome/app/resources/chromium_strings_fi.xtb
@@ -153,7 +153,6 @@
 <translation id="2718390899429598676">Chromium lisää suojausta salaamalla tietosi.</translation>
 <translation id="2721354645805494590">Jos haluat poistaa Google-tilisi Chromiumista, kirjaudu ulos</translation>
 <translation id="2722636413143664436">Kirjaudu sisään Chromiumiin, niin voit käyttää salasanoja, kirjanmerkkejä ja muita tietoja kaikilla laitteillasi</translation>
-<translation id="2723860029395667894">Näytä aina Googlen tekoälytilan pikakuvake</translation>
 <translation id="2738871930057338499">Internetyhteyden muodostaminen ei onnistu. HTTP 403 (kielletty). Tarkista välityspalvelimen asetukset.</translation>
 <translation id="2753623023919742414">Hae klikkaamalla</translation>
 <translation id="2768103863314748511">Valitse Chromium PDF:ien oletuskatseluohjelmaksi</translation>
@@ -648,7 +647,6 @@
 <translation id="8619360774459241877">Käynnistetään Chromiumia…</translation>
 <translation id="8624541899164515475">Asetukset, avautuu uudelle välilehdelle.</translation>
 <translation id="8648201657708811153">Google Chrome for Testingistä ei voi tehdä oletusselainta.</translation>
-<translation id="8677922833187616101">Näytä aina Googlen tekoälytilan pikakuvake</translation>
 <translation id="8697124171261953979">Määrittää myös Chromiumin ja omnibox-hakujen aloitussivun.</translation>
 <translation id="8704119203788522458">Tämä on oma Chromiumisi</translation>
 <translation id="8712637175834984815">Ymmärretty</translation>
diff --git a/chrome/app/resources/chromium_strings_fil.xtb b/chrome/app/resources/chromium_strings_fil.xtb
index 5f28af8..ee07c0e 100644
--- a/chrome/app/resources/chromium_strings_fil.xtb
+++ b/chrome/app/resources/chromium_strings_fil.xtb
@@ -155,7 +155,6 @@
 <translation id="2718390899429598676">Para sa karagdagang seguridad, ie-encrypt ng Chromium ang iyong data.</translation>
 <translation id="2721354645805494590">Para alisin ang iyong Google Account sa Chromium, mag-sign out</translation>
 <translation id="2722636413143664436">Para makuha ang iyong mga password, bookmark, at higit pa sa lahat ng device mo, mag-sign in sa Chromium</translation>
-<translation id="2723860029395667894">Palaging ipakita ang shortcut ng Google AI Mode</translation>
 <translation id="2738871930057338499">Hindi makakonekta sa Internet. HTTP 403 Forbidden. Tingnan ang configuration ng iyong proxy.</translation>
 <translation id="2753623023919742414">I-click para maghanap</translation>
 <translation id="2768103863314748511">Itakda ang Chromium bilang iyong default na viewer ng PDF</translation>
@@ -180,6 +179,7 @@
 <translation id="2977506796191543575">Kung susubukan ng site na nakawin ang iyong password, o kapag nag-download ka ng mapaminsalang file, posible ring magpadala ang Chromium sa Ligtas na Pag-browse ng mga URL, kabilang ang ilang content ng page</translation>
 <translation id="2981563588585023386">Para manatiling mas ligtas online sa pamamagitan ng mga pinili ng iyong magulang, mag-sign in sa Chromium</translation>
 <translation id="3003694935412297923">Lahat ng gawain</translation>
+<translation id="3012615494352020668">{count,plural, =1{Kailangang i-verify ng Chromium na ikaw ito bago ma-save ang ilang data sa iyong Google Account at magamit ito sa lahat ng device mo. Kung magsa-sign out ka ngayon, made-delete ang data na ito (1 item).}one{Kailangang i-verify ng Chromium na ikaw ito bago ma-save ang ilang data sa iyong Google Account at magamit ito sa lahat ng device mo. Kung magsa-sign out ka ngayon, made-delete ang data na ito ({count} item).}other{Kailangang i-verify ng Chromium na ikaw ito bago ma-save ang ilang data sa iyong Google Account at magamit ito sa lahat ng device mo. Kung magsa-sign out ka ngayon, made-delete ang data na ito ({count} na item).}}</translation>
 <translation id="3013473503895162900">Buksan ang <ph name="URL" /> sa bagong tab sa Chromium.</translation>
 <translation id="3032706164202344641">Hindi masuri ng Chromium ang iyong mga password. Subukan ulit sa ibang pagkakataon.</translation>
 <translation id="3032787606318309379">Idinaragdag sa Chromium...</translation>
@@ -496,6 +496,7 @@
 <translation id="6729124504294600478">Para makuha ang pag-personalize at iba pang feature, isama ang Chromium sa Aktibidad sa Web at App at mga naka-link na serbisyo ng Google</translation>
 <translation id="6734291798041940871">Naka-install na ang Chromium para sa lahat ng user sa iyong computer.</translation>
 <translation id="6751374565094704799">Pinapabilis ang mga site gamit ang V8 na engine ng Chromium pero ginagawang bahagyang hindi gaanong resistant sa mga attack ang Chromium. Naka-on ang setting na ito.</translation>
+<translation id="6754665438209053659">{count,plural, =1{Hindi pa nase-save sa Google Account mo ang ilan sa iyong data sa Chromium. Subukang maghintay nang ilang minuto bago mag-sign out. Kung magsa-sign out ka ngayon, made-delete ang data na ito (1 item).}one{Hindi pa nase-save sa Google Account mo ang ilan sa iyong data sa Chromium. Subukang maghintay nang ilang minuto bago mag-sign out. Kung magsa-sign out ka ngayon, made-delete ang data na ito ({count} item).}other{Hindi pa nase-save sa Google Account mo ang ilan sa iyong data sa Chromium. Subukang maghintay nang ilang minuto bago mag-sign out. Kung magsa-sign out ka ngayon, made-delete ang data na ito ({count} na item).}}</translation>
 <translation id="67706546131546258">Inirerekomenda ng Chromium na i-scan ang file na ito dahil posibleng mapanganib ito.</translation>
 <translation id="6779406956731413166">Pinapagana ng karagdagang <ph name="BEGIN_LINK_CROS_OSS" />open source na software<ph name="END_LINK_CROS_OSS" /> ang ChromiumOS.</translation>
 <translation id="6831043979455480757">Isalin</translation>
@@ -650,7 +651,6 @@
 <translation id="8619360774459241877">Inilulunsad ang Chromium...</translation>
 <translation id="8624541899164515475">Mga setting, magbubukas sa bagong tab.</translation>
 <translation id="8648201657708811153">Hindi puwedeng gawing default na browser mo ang Google Chrome na Pang-test.</translation>
-<translation id="8677922833187616101">Palaging Ipakita ang Shortcut ng Google AI Mode</translation>
 <translation id="8697124171261953979">Kinokontrol din nito kung anong pahina ang ipinapakita kapag sinimulan mo ang Chromium o naghanap mula sa Omnibox.</translation>
 <translation id="8704119203788522458">Ito ang iyong Chromium</translation>
 <translation id="8712637175834984815">Nakuha ko</translation>
diff --git a/chrome/app/resources/chromium_strings_fr-CA.xtb b/chrome/app/resources/chromium_strings_fr-CA.xtb
index e7a50e6..beda9e4 100644
--- a/chrome/app/resources/chromium_strings_fr-CA.xtb
+++ b/chrome/app/resources/chromium_strings_fr-CA.xtb
@@ -154,7 +154,6 @@
 <translation id="2718390899429598676">Pour une sécurité accrue, Chromium va chiffrer vos données.</translation>
 <translation id="2721354645805494590">Pour retirer votre compte Google de Chromium, déconnectez-vous</translation>
 <translation id="2722636413143664436">Pour obtenir vos mots de passe, vos favoris et plus encore sur tous vos appareils, connectez-vous à Chromium</translation>
-<translation id="2723860029395667894">Toujours afficher le raccourci du mode IA de Google</translation>
 <translation id="2738871930057338499">Impossible de se connecter à Internet. HTTP 403 Forbidden. Veuillez vérifier la configuration de votre mandataire.</translation>
 <translation id="2753623023919742414">Cliquer pour rechercher</translation>
 <translation id="2768103863314748511">Définissez Chromium comme visionneuse PDF par défaut</translation>
@@ -179,6 +178,7 @@
 <translation id="2977506796191543575">Si un site tente de voler votre mot de passe ou si vous téléchargez un fichier dangereux, Chromium peut également envoyer les URL concernées, y compris des extraits du contenu de pages, à la navigation sécurisée</translation>
 <translation id="2981563588585023386">Pour rester en sécurité en ligne avec les choix de tes parents, connecte-toi à Chromium</translation>
 <translation id="3003694935412297923">Toutes les tâches</translation>
+<translation id="3012615494352020668">{count,plural, =1{Chromium doit vérifier votre identité avant que certaines données puissent être enregistrées dans votre compte Google et utilisées sur tous vos appareils. Si vous vous déconnectez maintenant, ces données (1 élément) seront supprimées.}one{Chromium doit vérifier votre identité avant que certaines données puissent être enregistrées dans votre compte Google et utilisées sur tous vos appareils. Si vous vous déconnectez maintenant, ces données ({count} élément) seront supprimées.}other{Chromium doit vérifier votre identité avant que certaines données puissent être enregistrées dans votre compte Google et utilisées sur tous vos appareils. Si vous vous déconnectez maintenant, ces données ({count} éléments) seront supprimées.}}</translation>
 <translation id="3013473503895162900">Ouvrez l'URL <ph name="URL" /> dans un nouvel onglet dans Chromium.</translation>
 <translation id="3032706164202344641">Chromium ne peut pas vérifier vos mots de passe. Réessayez plus tard.</translation>
 <translation id="3032787606318309379">Ajout à Chromium en cours...</translation>
@@ -495,6 +495,7 @@
 <translation id="6729124504294600478">Pour bénéficier de la personnalisation et d'autres fonctionnalités, incluez Chromium dans l'activité sur le Web et dans les applications et les services Google associés</translation>
 <translation id="6734291798041940871">Chromium est déjà installé pour tous les utilisateurs sur votre ordinateur.</translation>
 <translation id="6751374565094704799">Accélère les sites avec le moteur V8 de Chromium, mais rend Chromium légèrement moins résistant aux attaques. Ce paramètre est activé.</translation>
+<translation id="6754665438209053659">{count,plural, =1{Certaines de vos données Chromium n'ont pas encore été enregistrées dans votre compte Google. Essayez d'attendre quelques minutes avant de vous déconnecter. Si vous vous déconnectez maintenant, ces données (1 élément) seront supprimées.}one{Certaines de vos données Chromium n'ont pas encore été enregistrées dans votre compte Google. Essayez d'attendre quelques minutes avant de vous déconnecter. Si vous vous déconnectez maintenant, ces données ({count} élément) seront supprimées.}other{Certaines de vos données Chromium n'ont pas encore été enregistrées dans votre compte Google. Essayez d'attendre quelques minutes avant de vous déconnecter. Si vous vous déconnectez maintenant, ces données ({count} éléments) seront supprimées.}}</translation>
 <translation id="67706546131546258">Chromium recommande d'analyser ce fichier, car il pourrait être dangereux.</translation>
 <translation id="6779406956731413166">Chromium OS fonctionne grâce à d'autres <ph name="BEGIN_LINK_CROS_OSS" />logiciels libres<ph name="END_LINK_CROS_OSS" />.</translation>
 <translation id="6831043979455480757">Traduire</translation>
@@ -649,7 +650,6 @@
 <translation id="8619360774459241877">Lancement de Chromium en cours…</translation>
 <translation id="8624541899164515475">Paramètres, s'ouvre dans un nouvel onglet.</translation>
 <translation id="8648201657708811153">Google Chrome for Testing ne peut pas être défini comme votre navigateur par défaut.</translation>
-<translation id="8677922833187616101">Toujours afficher le raccourci du mode IA de Google</translation>
 <translation id="8697124171261953979">Elle définit également quelle page s'affiche lorsque vous démarrez Chromium ou que vous effectuez une recherche dans l'omnibox.</translation>
 <translation id="8704119203788522458">Voici votre Chromium</translation>
 <translation id="8712637175834984815">OK</translation>
diff --git a/chrome/app/resources/chromium_strings_fr.xtb b/chrome/app/resources/chromium_strings_fr.xtb
index 6ebb17d4..4575c644 100644
--- a/chrome/app/resources/chromium_strings_fr.xtb
+++ b/chrome/app/resources/chromium_strings_fr.xtb
@@ -153,7 +153,6 @@
 <translation id="2718390899429598676">Pour plus de sécurité, vos données seront chiffrées dans Chromium.</translation>
 <translation id="2721354645805494590">Pour supprimer votre compte Google de Chromium, déconnectez-vous</translation>
 <translation id="2722636413143664436">Pour accéder à vos mots de passe, vos favoris et plus sur tous vos appareils, connectez-vous à Chromium</translation>
-<translation id="2723860029395667894">Toujours afficher le raccourci vers le Mode IA de Google</translation>
 <translation id="2738871930057338499">Impossible de se connecter à Internet : erreur HTTP 403 (accès interdit). Veuillez vérifier la configuration de votre proxy.</translation>
 <translation id="2753623023919742414">Cliquer pour rechercher</translation>
 <translation id="2768103863314748511">Définir Chromium comme visionneuse de PDF par défaut</translation>
@@ -648,7 +647,6 @@
 <translation id="8619360774459241877">Lancement de Chromium…</translation>
 <translation id="8624541899164515475">Paramètres, s'ouvre dans un nouvel onglet.</translation>
 <translation id="8648201657708811153">Impossible de définir Google Chrome for Testing comme navigateur par défaut.</translation>
-<translation id="8677922833187616101">Toujours afficher le raccourci vers le Mode IA de Google</translation>
 <translation id="8697124171261953979">Elle contrôle également la page qui s'affiche au démarrage de Chromium ou lorsque vous effectuez une recherche dans l'omnibox.</translation>
 <translation id="8704119203788522458">Voici votre Chromium</translation>
 <translation id="8712637175834984815">OK</translation>
diff --git a/chrome/app/resources/chromium_strings_gl.xtb b/chrome/app/resources/chromium_strings_gl.xtb
index e77a585..d0b2f67 100644
--- a/chrome/app/resources/chromium_strings_gl.xtb
+++ b/chrome/app/resources/chromium_strings_gl.xtb
@@ -155,7 +155,6 @@
 <translation id="2718390899429598676">Para obter unha maior seguranza, Chromium encriptará os teus datos.</translation>
 <translation id="2721354645805494590">Para quitar a túa Conta de Google de Chromium, pecha a sesión</translation>
 <translation id="2722636413143664436">Para poder acceder aos teus contrasinais, marcadores e a outros datos en todos os teus dispositivos, inicia sesión en Chromium</translation>
-<translation id="2723860029395667894">Mostrar sempre o atallo do modo IA de Google</translation>
 <translation id="2738871930057338499">Non se puido establecer conexión con Internet. Erro: HTTP 403 Forbidden (acceso non permitido). Revisa a configuración do proxy.</translation>
 <translation id="2753623023919742414">Fai clic nun obxecto para buscalo</translation>
 <translation id="2768103863314748511">Define Chromium como o teu visor de PDF predeterminado</translation>
@@ -650,7 +649,6 @@
 <translation id="8619360774459241877">Iniciando Chromium…</translation>
 <translation id="8624541899164515475">Configuración (ábrese nunha pestana nova).</translation>
 <translation id="8648201657708811153">Google Chrome for Testing non se pode converter no teu navegador predeterminado.</translation>
-<translation id="8677922833187616101">Mostrar sempre o atallo do modo IA de Google</translation>
 <translation id="8697124171261953979">Tamén controla a páxina que se mostra ao iniciar Chromium ou ao realizar unha busca desde Omnibox.</translation>
 <translation id="8704119203788522458">Este é o teu Chromium</translation>
 <translation id="8712637175834984815">De acordo</translation>
diff --git a/chrome/app/resources/chromium_strings_gu.xtb b/chrome/app/resources/chromium_strings_gu.xtb
index 702992f..ee769995 100644
--- a/chrome/app/resources/chromium_strings_gu.xtb
+++ b/chrome/app/resources/chromium_strings_gu.xtb
@@ -155,7 +155,6 @@
 <translation id="2718390899429598676">ઉમેરેલી સુરક્ષા માટે, Chromium તમારા ડેટાને એન્ક્રિપ્ટ કરશે.</translation>
 <translation id="2721354645805494590">Chromiumમાંથી તમારા Google એકાઉન્ટને કાઢી નાખવા માટે, સાઇન આઉટ કરો</translation>
 <translation id="2722636413143664436">તમારા બધા ડિવાઇસ પર તમારા પાસવર્ડ, બુકમાર્ક અને બીજું ઘણું મેળવવા માટે, Chromiumમાં સાઇન ઇન કરો</translation>
-<translation id="2723860029395667894">હંમેશાં Google AI મોડનો શૉર્ટકટ બતાવો</translation>
 <translation id="2738871930057338499">ઇન્ટરનેટ સાથે કનેક્ટ કરી શકતા નથી. HTTP 403 પ્રતિબંધિત. કૃપા કરીને તમારું પ્રૉક્સી કન્ફિગ્યુરેશન ચેક કરો.</translation>
 <translation id="2753623023919742414">શોધવા માટે ક્લિક કરો</translation>
 <translation id="2768103863314748511">Chromium ને તમારા ડિફૉલ્ટ PDF વ્યૂઅર તરીકે સેટ કરો</translation>
@@ -180,6 +179,7 @@
 <translation id="2977506796191543575">જો કોઈ સાઇટ તમારો પાસવર્ડ ચોરી કરવાનો પ્રયાસ કરે અથવા તમે કોઈ નુકસાનકારક ફાઇલ ડાઉનલોડ કરો, ત્યારે Chromium પેજ કન્ટેન્ટના બિટ સહિત URLs પણ Safe Browsingને મોકલી શકે છે</translation>
 <translation id="2981563588585023386">તમારા માતાપિતાની પસંદગીઓ સાથે ઑનલાઇન વધુ સલામત રહેવા માટે, Chromiumમાં સાઇન ઇન કરો</translation>
 <translation id="3003694935412297923">બધા કામ</translation>
+<translation id="3012615494352020668">{count,plural, =1{તમારા Google એકાઉન્ટમાં કેટલોક ડેટા સાચવી શકાય અને તમારા બધા ડિવાઇસ પર તેનો ઉપયોગ કરી શકાય તે પહેલાં, Chromium માટે એ તમે જ છો તેની ચકાસણી કરવી જરૂરી છે. જો તમે હમણાં જ સાઇન આઉટ કરશો, તો આ ડેટા (1 આઇટમ) ડિલીટ કરવામાં આવશે.}one{તમારા Google એકાઉન્ટમાં કેટલોક ડેટા સાચવી શકાય અને તમારા બધા ડિવાઇસ પર તેનો ઉપયોગ કરી શકાય તે પહેલાં, Chromium માટે એ તમે જ છો તેની ચકાસણી કરવી જરૂરી છે. જો તમે હમણાં જ સાઇન આઉટ કરશો, તો આ ડેટા ({count} આઇટમ) ડિલીટ કરવામાં આવશે.}other{તમારા Google એકાઉન્ટમાં કેટલોક ડેટા સાચવી શકાય અને તમારા બધા ડિવાઇસ પર તેનો ઉપયોગ કરી શકાય તે પહેલાં, Chromium માટે એ તમે જ છો તેની ચકાસણી કરવી જરૂરી છે. જો તમે હમણાં જ સાઇન આઉટ કરશો, તો આ ડેટા ({count} આઇટમ) ડિલીટ કરવામાં આવશે.}}</translation>
 <translation id="3013473503895162900">Chromiumમાં નવા ટૅબમાં <ph name="URL" /> ખોલો.</translation>
 <translation id="3032706164202344641">Chromium તમારા પાસવર્ડ ચેક કરી શકતું નથી. થોડા સમય પછી ફરી પ્રયાસ કરો.</translation>
 <translation id="3032787606318309379">Chromium માં ઉમેરી રહ્યું છે...</translation>
@@ -496,6 +496,7 @@
 <translation id="6729124504294600478">મનગમતું બનાવવાની અને અન્ય સુવિધાઓ મેળવવા માટે, Chromiumનો વેબ અને ઍપ ઍક્ટિવિટી અને લિંક કરેલી Google સેવાઓમાં સમાવેશ કરો</translation>
 <translation id="6734291798041940871">Chromium, તમારા કમ્પ્યુટર પર તમામ વપરાશકર્તાઓ માટે પહેલાંથી ઇન્સ્ટૉલ કરેલ છે.</translation>
 <translation id="6751374565094704799">Chromiumના V8 એન્જિન વડે સાઇટની ગતિ વધારે છે પરંતુ Chromiumને અટૅક સામે થોડું ઓછું પ્રતિરોધક બનાવે છે. આ સેટિંગ ચાલુ છે.</translation>
+<translation id="6754665438209053659">{count,plural, =1{Chromiumનો તમારો કેટલોક ડેટા હજી સુધી તમારા Google એકાઉન્ટમાં સાચવવામાં આવ્યો નથી. સાઇન આઉટ કરતા પહેલાં થોડી મિનિટ રાહ જોવાનો પ્રયાસ કરી જુઓ. જો તમે હમણાં જ સાઇન આઉટ કરશો, તો આ ડેટા (1 આઇટમ) ડિલીટ કરવામાં આવશે.}one{Chromiumનો તમારો કેટલોક ડેટા હજી સુધી તમારા Google એકાઉન્ટમાં સાચવવામાં આવ્યો નથી. સાઇન આઉટ કરતા પહેલાં થોડી મિનિટ રાહ જોવાનો પ્રયાસ કરી જુઓ. જો તમે હમણાં જ સાઇન આઉટ કરશો, તો આ ડેટા ({count} આઇટમ) ડિલીટ કરવામાં આવશે.}other{Chromiumનો તમારો કેટલોક ડેટા હજી સુધી તમારા Google એકાઉન્ટમાં સાચવવામાં આવ્યો નથી. સાઇન આઉટ કરતા પહેલાં થોડી મિનિટ રાહ જોવાનો પ્રયાસ કરી જુઓ. જો તમે હમણાં જ સાઇન આઉટ કરશો, તો આ ડેટા ({count} આઇટમ) ડિલીટ કરવામાં આવશે.}}</translation>
 <translation id="67706546131546258">Chromium આ ફાઇલને સ્કૅન કરવાનો સુઝાવ આપે છે, કારણ કે તે જોખમકારક હોઈ શકે છે.</translation>
 <translation id="6779406956731413166">ChromiumOSને વધારાના <ph name="BEGIN_LINK_CROS_OSS" />ઓપન સૉર્સ સૉફ્ટવેર<ph name="END_LINK_CROS_OSS" /> દ્વારા શક્ય બનાવવામાં આવ્યું છે.</translation>
 <translation id="6831043979455480757">અનુવાદ કરો</translation>
@@ -650,7 +651,6 @@
 <translation id="8619360774459241877">Chromium લૉન્ચ કરી રહ્યાં છીએ…</translation>
 <translation id="8624541899164515475">સેટિંગ, નવા ટૅબમાં ખૂલે છે.</translation>
 <translation id="8648201657708811153">Chrome for Testingને તમારું ડિફૉલ્ટ બ્રાઉઝર બનાવી શકાતું નથી.</translation>
-<translation id="8677922833187616101">હંમેશાં Google AI મોડનો શૉર્ટકટ બતાવો</translation>
 <translation id="8697124171261953979">જ્યારે તમે Chromium શરૂ કરો અથવા ઑમ્નિબૉક્સ પરથી શોધ કરો ત્યારે કયું પેજ બતાવવામાં આવે તે તેનું પણ નિયંત્રણ કરે છે.</translation>
 <translation id="8704119203788522458">આ તમારું Chromium છે</translation>
 <translation id="8712637175834984815">સમજાઈ ગયું</translation>
diff --git a/chrome/app/resources/chromium_strings_hi.xtb b/chrome/app/resources/chromium_strings_hi.xtb
index a6b03a0..2d45980 100644
--- a/chrome/app/resources/chromium_strings_hi.xtb
+++ b/chrome/app/resources/chromium_strings_hi.xtb
@@ -152,7 +152,6 @@
 <translation id="2718390899429598676">ज़्यादा सुरक्षा के लिए, क्रोमियम आपके डेटा को सुरक्षित करेगा.</translation>
 <translation id="2721354645805494590">Chromium से अपना Google खाता हटाने के लिए, साइन आउट करें</translation>
 <translation id="2722636413143664436">अपने सभी डिवाइसों से पासवर्ड, बुकमार्क वगैरह ऐक्सेस करने के लिए, Chromium में साइन इन करें</translation>
-<translation id="2723860029395667894">Google के एआई मोड का शॉर्टकट हमेशा दिखाएं</translation>
 <translation id="2738871930057338499">इंटरनेट से कनेक्ट नहीं किया जा सका. एचटीटीपी 403 फॉरबिडन रिस्पॉन्स दिख रहा है. कृपया अपने प्रॉक्सी कॉन्फ़िगरेशन की जांच करें.</translation>
 <translation id="2753623023919742414">खोजने के लिए क्लिक करें</translation>
 <translation id="2768103863314748511">Chromium को अपने डिफ़ॉल्ट PDF व्यूअर के तौर पर सेट करें</translation>
@@ -177,6 +176,7 @@
 <translation id="2977506796191543575">अगर कोई साइट आपका पासवर्ड चुराने की कोशिश करती है या नुकसान पहुंचाने वाली कोई फ़ाइल डाउनलोड होने पर Chromium, सुरक्षित ब्राउज़िंग की सेवा को उनके यूआरएल भेज सकता है. यूआरएल के साथ-साथ पेज का कुछ कॉन्टेंट भी भेजा जाता है</translation>
 <translation id="2981563588585023386">अपने माता-पिता के चुने गए विकल्पों के साथ, ऑनलाइन सुरक्षित रहने के लिए, Chromium में साइन इन करें</translation>
 <translation id="3003694935412297923">सभी टास्क</translation>
+<translation id="3012615494352020668">{count,plural, =1{आपके Google खाते में डेटा सेव करने और सभी डिवाइसों पर उसका इस्तेमाल करने से पहले, Chromium को आपकी पहचान की पुष्टि करनी होगी. अभी साइन आउट करने पर यह डेटा (1 आइटम) मिट जाएगा.}one{आपके Google खाते में डेटा सेव करने और सभी डिवाइसों पर उसका इस्तेमाल करने से पहले, Chromium को आपकी पहचान की पुष्टि करनी होगी. अभी साइन आउट करने पर यह डेटा ({count} आइटम) मिट जाएगा.}other{आपके Google खाते में डेटा सेव करने और सभी डिवाइसों पर उसका इस्तेमाल करने से पहले, Chromium को आपकी पहचान की पुष्टि करनी होगी. अभी साइन आउट करने पर यह डेटा ({count} आइटम) मिट जाएगा.}}</translation>
 <translation id="3013473503895162900"><ph name="URL" /> को Chromium के नए टैब में खोलें.</translation>
 <translation id="3032706164202344641">क्रोमियम आपके पासवर्ड की जांच नहीं कर सकता. बाद में कोशिश करें.</translation>
 <translation id="3032787606318309379">क्रोमियम में जोड़ रहा है...</translation>
@@ -493,6 +493,7 @@
 <translation id="6729124504294600478">मनमुताबिक अनुभव और अन्य सुविधाएं पाने के लिए, Chromium को 'वेब और ऐप्लिकेशन गतिविधि' सेटिंग और लिंक की गई Google की सेवाओं में शामिल करें</translation>
 <translation id="6734291798041940871">आपके कंप्यूटर पर मौजूद सभी उपयोगकर्ताओं के लिए क्रोमियम पहले से इंस्टॉल है.</translation>
 <translation id="6751374565094704799">Chromium के V8 इंजन की मदद से, साइटों के काम करने की स्पीड तेज़ करें. हालांकि, इससे सुरक्षा से जुड़े खतरों की संभावना बढ़ जाती है. यह सेटिंग चालू है.</translation>
+<translation id="6754665438209053659">{count,plural, =1{आपके Chromium का कुछ डेटा, अब तक आपके Google खाते में सेव नहीं किया गया. साइन आउट करने से पहले, कुछ मिनट इंतज़ार करें. अभी साइन आउट करने पर यह डेटा (1 आइटम) मिट जाएगा.}one{आपके Chromium का कुछ डेटा, अब तक आपके Google खाते में सेव नहीं किया गया. साइन आउट करने से पहले, कुछ मिनट इंतज़ार करें. अभी साइन आउट करने पर यह डेटा ({count} आइटम) मिट जाएगा.}other{आपके Chromium का कुछ डेटा, अब तक आपके Google खाते में सेव नहीं किया गया. साइन आउट करने से पहले, कुछ मिनट इंतज़ार करें. अभी साइन आउट करने पर यह डेटा ({count} आइटम) मिट जाएगा.}}</translation>
 <translation id="67706546131546258">Chromium इस फ़ाइल को स्कैन करने का सुझाव देता है, क्योंकि यह खतरनाक हो सकती है.</translation>
 <translation id="6779406956731413166">ChromiumOS को अतिरिक्त <ph name="BEGIN_LINK_CROS_OSS" />ओपन सोर्स सॉफ़्टवेयर<ph name="END_LINK_CROS_OSS" /> की मदद से बनाया गया है.</translation>
 <translation id="6831043979455480757">अनुवाद करें</translation>
@@ -647,7 +648,6 @@
 <translation id="8619360774459241877">क्रोमियम लॉन्च हो रहा है...</translation>
 <translation id="8624541899164515475">सेटिंग पेज नए टैब में खुलता है.</translation>
 <translation id="8648201657708811153">Google Chrome for Testing को आपका डिफ़ॉल्ट ब्राउज़र नहीं बनाया जा सकता.</translation>
-<translation id="8677922833187616101">Google के एआई मोड का शॉर्टकट हमेशा दिखाएं</translation>
 <translation id="8697124171261953979">इससे यह भी नियंत्रित होता है कि जब आप क्रोमियम शुरू करते हैं या ऑम्निबॉक्स से खोजते हैं तब कौन सा पेज दिखाया जाए.</translation>
 <translation id="8704119203788522458">यह आपका क्रोमियम है</translation>
 <translation id="8712637175834984815">समझ लिया</translation>
diff --git a/chrome/app/resources/chromium_strings_hr.xtb b/chrome/app/resources/chromium_strings_hr.xtb
index e974748..bec4c16 100644
--- a/chrome/app/resources/chromium_strings_hr.xtb
+++ b/chrome/app/resources/chromium_strings_hr.xtb
@@ -153,7 +153,6 @@
 <translation id="2718390899429598676">Radi dodatne sigurnosti Chromium će šifrirati vaše podatke.</translation>
 <translation id="2721354645805494590">Odjavite se da biste uklonili Google račun iz Chromiuma</translation>
 <translation id="2722636413143664436">Da biste mogli pristupati svojim zaporkama, oznakama i drugim podacima na svim svojim uređajima, prijavite se na Chromium</translation>
-<translation id="2723860029395667894">Uvijek prikaži prečac za Googleov AI način</translation>
 <translation id="2738871930057338499">Povezivanje s internetom nije moguće. HTTP 403 Zabranjeno je. Provjerite konfiguraciju proxyja.</translation>
 <translation id="2753623023919742414">Kliknite za pretraživanje</translation>
 <translation id="2768103863314748511">Postavite Chromium kao zadani preglednik za PDF</translation>
@@ -648,7 +647,6 @@
 <translation id="8619360774459241877">Pokretanje Chromiuma...</translation>
 <translation id="8624541899164515475">Postavke, otvara se na novoj kartici.</translation>
 <translation id="8648201657708811153">Google Chrome for Testing ne može biti vaš zadani preglednik.</translation>
-<translation id="8677922833187616101">Uvijek prikaži prečac za Googleov AI način</translation>
 <translation id="8697124171261953979">Upravlja i time koja se stranica prikazuje prilikom pokretanja Chromiuma ili pretraživanja putem višenamjenskog okvira.</translation>
 <translation id="8704119203788522458">To je vaš Chromium</translation>
 <translation id="8712637175834984815">Shvaćam</translation>
diff --git a/chrome/app/resources/chromium_strings_hu.xtb b/chrome/app/resources/chromium_strings_hu.xtb
index e2372f2..eec2c4d6 100644
--- a/chrome/app/resources/chromium_strings_hu.xtb
+++ b/chrome/app/resources/chromium_strings_hu.xtb
@@ -153,7 +153,6 @@
 <translation id="2718390899429598676">A nagyobb biztonság érdekében a Chromium titkosítja az Ön adatait.</translation>
 <translation id="2721354645805494590">Ha szeretné eltávolítani Google-fiókját a Chromiumból, jelentkezzen ki</translation>
 <translation id="2722636413143664436">Ha az összes eszközén szeretne hozzáférni jelszavaihoz, könyvjelzőihez és egyebekhez, jelentkezzen be a Chromiumba</translation>
-<translation id="2723860029395667894">A Google AI-mód gyorsparancsa mindig jelenjen meg</translation>
 <translation id="2738871930057338499">Nem lehet csatlakozni az internethez. HTTP 403 tiltás. Ellenőrizze a proxybeállításokat.</translation>
 <translation id="2753623023919742414">Kattintson a kereséshez</translation>
 <translation id="2768103863314748511">A Chromium beállítása alapértelmezett PDF-megtekintőként</translation>
@@ -646,7 +645,6 @@
 <translation id="8619360774459241877">Chromium indítása…</translation>
 <translation id="8624541899164515475">Beállítások, új lapon nyílik meg.</translation>
 <translation id="8648201657708811153">A Google Chrome for Testing nem alkalmazható alapértelmezett böngészőként.</translation>
-<translation id="8677922833187616101">A Google AI-mód gyorsparancsa mindig jelenjen meg</translation>
 <translation id="8697124171261953979">Továbbá azt is szabályozza, hogy melyik oldal jelenik meg a Chromium indításakor vagy a cím- és keresősávban indított kereséskor.</translation>
 <translation id="8704119203788522458">Ez az Ön Chromiumja</translation>
 <translation id="8712637175834984815">Értem</translation>
diff --git a/chrome/app/resources/chromium_strings_hy.xtb b/chrome/app/resources/chromium_strings_hy.xtb
index c42f0cdc..e4a5ccf 100644
--- a/chrome/app/resources/chromium_strings_hy.xtb
+++ b/chrome/app/resources/chromium_strings_hy.xtb
@@ -155,7 +155,6 @@
 <translation id="2718390899429598676">Լրացուցիչ անվտանգության համար Chromium-ը կգաղտնագրի ձեր տվյալները:</translation>
 <translation id="2721354645805494590">Ձեր Google հաշիվը Chromium-ից հեռացնելու համար դուրս եկեք հաշվից</translation>
 <translation id="2722636413143664436">Գաղտնաբառերը, էջանիշները և մյուս տվյալները ձեր բոլոր սարքերում օգտագործելու համար մուտք գործեք Chromium</translation>
-<translation id="2723860029395667894">Միշտ ցույց տալ Google-ի ԱԲ ռեժիմի դյուրանցումը</translation>
 <translation id="2738871930057338499">Հնարավոր չէ միանալ ինտերնետին։ HTTP 403 Forbidden։ Ստուգեք ձեր պրոքսի սերվերի կազմաձևը։</translation>
 <translation id="2753623023919742414">Սեղմեք որոնելու համար</translation>
 <translation id="2768103863314748511">Սահմանեք Chromium-ը որպես ձեր կանխադրված PDF դիտակ</translation>
@@ -650,7 +649,6 @@
 <translation id="8619360774459241877">Chromium-ի գործարկում...</translation>
 <translation id="8624541899164515475">Կարգավորումներ, բացվում է նոր ներդիրում։</translation>
 <translation id="8648201657708811153">Google Chrome for Testing-ը չի կարող դառնալ ձեր կանխադրված դիտարկիչը։</translation>
-<translation id="8677922833187616101">Միշտ ցույց տալ Google-ի ԱԲ ռեժիմի դյուրանցումը</translation>
 <translation id="8697124171261953979">Այն նաև վերահսկում է Chromium-ի մեկնարկի կամ Omnibox-ից որոնում կատարելու ժամանակ ցուցադրվող էջը:</translation>
 <translation id="8704119203788522458">Սա ձեր Chromium-ն է</translation>
 <translation id="8712637175834984815">Պատրաստ է</translation>
diff --git a/chrome/app/resources/chromium_strings_id.xtb b/chrome/app/resources/chromium_strings_id.xtb
index 3a474552..de4d854f 100644
--- a/chrome/app/resources/chromium_strings_id.xtb
+++ b/chrome/app/resources/chromium_strings_id.xtb
@@ -153,7 +153,6 @@
 <translation id="2718390899429598676">Untuk keamanan tambahan, Chromium akan mengenkripsi data Anda.</translation>
 <translation id="2721354645805494590">Logout untuk menghapus Akun Google Anda dari Chromium</translation>
 <translation id="2722636413143664436">Untuk mendapatkan sandi, bookmark, dan info Anda yang lain di semua perangkat Anda, login ke Chromium</translation>
-<translation id="2723860029395667894">Selalu tampilkan pintasan Mode AI Google</translation>
 <translation id="2738871930057338499">Tidak dapat terhubung ke internet. HTTP 403 Terlarang. Periksa konfigurasi proxy Anda.</translation>
 <translation id="2753623023919742414">Klik untuk menelusuri</translation>
 <translation id="2768103863314748511">Setel Chromium sebagai penampil PDF default Anda</translation>
@@ -648,7 +647,6 @@
 <translation id="8619360774459241877">Meluncurkan Chromium...</translation>
 <translation id="8624541899164515475">Setelan, terbuka di tab baru.</translation>
 <translation id="8648201657708811153">Google Chrome for Testing tidak dapat dijadikan sebagai browser default.</translation>
-<translation id="8677922833187616101">Selalu Tampilkan Pintasan Mode AI Google</translation>
 <translation id="8697124171261953979">Juga mengontrol halaman apa yang ditampilkan saat Anda memulai Chromium atau menelusuri dari Omnibox.</translation>
 <translation id="8704119203788522458">Ini Chromium Anda</translation>
 <translation id="8712637175834984815">Mengerti</translation>
diff --git a/chrome/app/resources/chromium_strings_is.xtb b/chrome/app/resources/chromium_strings_is.xtb
index 153a0f5..1c43010c 100644
--- a/chrome/app/resources/chromium_strings_is.xtb
+++ b/chrome/app/resources/chromium_strings_is.xtb
@@ -155,7 +155,6 @@
 <translation id="2718390899429598676">Chromium dulkóðar gögnin þín til að auka öryggið.</translation>
 <translation id="2721354645805494590">Skráðu þig út til að fjarlægja Google-reikninginn þinn af Chromium</translation>
 <translation id="2722636413143664436">Skráðu þig inn á Chromium til að fá aðgang að aðgangsorðum, bókamerkjum og fleiru í öllum tækjunum þínum</translation>
-<translation id="2723860029395667894">Alltaf sýna flýtileið gervigreindarstillingar Google</translation>
 <translation id="2738871930057338499">Ekki er hægt að tengjast internetinu. HTTP 403 bannað. Kannaðu uppsetningu staðgengilsþjóna.</translation>
 <translation id="2753623023919742414">Smelltu til að leita</translation>
 <translation id="2768103863314748511">Stilltu Chromium sem sjálfgefinn PDF-lesara</translation>
@@ -166,7 +165,7 @@
 <translation id="2841525013647267359">Þýða úr</translation>
 <translation id="2846251086934905009">Uppsetningarvilla: Uppsetningarforrit lauk ekki verki sínu. Hætt var við uppsetningu.</translation>
 <translation id="2847479871509788944">Fjarlægja úr Chromium...</translation>
-<translation id="2850691299438350830">Tryggir öryggi þitt í Chromium og kann að vera notað til að auka öryggi þitt í öðrum Google forritum þegar þú hefur skráð þig inn.</translation>
+<translation id="2850691299438350830">Tryggir öryggi þitt í Chromium og kann að vera notað til að auka öryggi þitt í öðrum Google-forritum þegar þú hefur skráð þig inn.</translation>
 <translation id="2885378588091291677">Verkstjórn</translation>
 <translation id="2910007522516064972">Um &amp;Chromium</translation>
 <translation id="2915996080311180594">Endurræsa seinna</translation>
@@ -650,7 +649,6 @@
 <translation id="8619360774459241877">Ræsir Chromium...</translation>
 <translation id="8624541899164515475">Stillingar, opnast í nýjum flipa.</translation>
 <translation id="8648201657708811153">Ekki er hægt að gera Google Chrome for Testing að sjálfgefna vafranum þínum.</translation>
-<translation id="8677922833187616101">Alltaf sýna flýtileið gervigreindarstillingar Google</translation>
 <translation id="8697124171261953979">Það stýrir því einnig hvaða síða opnast þegar þú ræsir Chromium eða leitar í veffangastikunni.</translation>
 <translation id="8704119203788522458">Chromium er þitt</translation>
 <translation id="8712637175834984815">Ég skil</translation>
diff --git a/chrome/app/resources/chromium_strings_it.xtb b/chrome/app/resources/chromium_strings_it.xtb
index 8ea78a3..4dd00e6 100644
--- a/chrome/app/resources/chromium_strings_it.xtb
+++ b/chrome/app/resources/chromium_strings_it.xtb
@@ -152,7 +152,6 @@
 <translation id="2718390899429598676">Per maggiore sicurezza, Chromium cripterà i tuoi dati.</translation>
 <translation id="2721354645805494590">Esci per rimuovere il tuo Account Google da Chromium</translation>
 <translation id="2722636413143664436">Accedi a Chromium per trovare le password, i preferiti e altri dati su tutti i dispositivi</translation>
-<translation id="2723860029395667894">Mostra sempre la scorciatoia di Google AI Mode</translation>
 <translation id="2738871930057338499">Impossibile connettersi a internet. HTTP 403 Accesso negato. Controlla la configurazione del proxy.</translation>
 <translation id="2753623023919742414">Fai clic per cercare</translation>
 <translation id="2768103863314748511">Imposta Chromium come visualizzatore PDF predefinito</translation>
@@ -647,7 +646,6 @@
 <translation id="8619360774459241877">Avvio di Chromium...</translation>
 <translation id="8624541899164515475">Impostazioni, si apre in una nuova scheda.</translation>
 <translation id="8648201657708811153">Google Chrome for Testing non può essere impostato come browser predefinito.</translation>
-<translation id="8677922833187616101">Mostra sempre la scorciatoia di Google AI Mode</translation>
 <translation id="8697124171261953979">Controlla anche la pagina visualizzata all'avvio di Chromium o quando esegui ricerche dalla Omnibox.</translation>
 <translation id="8704119203788522458">Questo è il tuo account Chromium</translation>
 <translation id="8712637175834984815">Ok</translation>
diff --git a/chrome/app/resources/chromium_strings_iw.xtb b/chrome/app/resources/chromium_strings_iw.xtb
index 27af4f5..da10941 100644
--- a/chrome/app/resources/chromium_strings_iw.xtb
+++ b/chrome/app/resources/chromium_strings_iw.xtb
@@ -153,7 +153,6 @@
 <translation id="2718390899429598676">‏לשיפור האבטחה, Chromium יצפין את הנתונים.</translation>
 <translation id="2721354645805494590">‏כדי להסיר את החשבון שלך ב-Google מ-Chromium, צריך לצאת מהחשבון</translation>
 <translation id="2722636413143664436">‏כדי לקבל גישה לסיסמאות, לסימניות ולנתונים נוספים בכל המכשירים שלך, כדאי להיכנס ל-Chromium</translation>
-<translation id="2723860029395667894">‏להציג תמיד את קיצור הדרך למצב AI של Google</translation>
 <translation id="2738871930057338499">‏לא ניתן להתחבר לאינטרנט. HTTP 403: קוד איסור. צריך לבדוק את ההגדרה של שרת ה-proxy.</translation>
 <translation id="2753623023919742414">צריך ללחוץ כדי לחפש</translation>
 <translation id="2768103863314748511">‏הגדרת Chromium ככלי ברירת המחדל לצפייה בקובצי PDF</translation>
@@ -178,6 +177,7 @@
 <translation id="2977506796191543575">‏אם באתר כלשהו מתבצע ניסיון לגנוב את הסיסמה שלך, או אם המערכת מזהה הורדה של קובץ מזיק, Chromium עשוי גם לשלוח כתובות URL לבדיקה באמצעות 'גלישה בטוחה'. הנתונים שנשלחים לבדיקה כוללים ביטים מתוכן של דפים</translation>
 <translation id="2981563588585023386">‏כדי לשמור על הבטיחות אונליין בהתאם לאפשרויות שנבחרו על ידי ההורה שלך, עליך להיכנס ל-Chromium</translation>
 <translation id="3003694935412297923">כל המשימות</translation>
+<translation id="3012615494352020668">{count,plural, =1{‏‫Chromium צריך לאמת את הזהות שלך לפני שאפשר יהיה לשמור חלק מהנתונים בחשבון Google ולהשתמש בהם בכל המכשירים שלך. אם תתבצע יציאה מהחשבון, הנתונים האלה יימחקו (פריט אחד).}one{‏‫Chromium צריך לאמת את הזהות שלך לפני שאפשר יהיה לשמור חלק מהנתונים בחשבון Google ולהשתמש בהם בכל המכשירים שלך. אם תתבצע יציאה מהחשבון, הנתונים האלה יימחקו ({count} פריטים).}two{‏‫Chromium צריך לאמת את הזהות שלך לפני שאפשר יהיה לשמור חלק מהנתונים בחשבון Google ולהשתמש בהם בכל המכשירים שלך. אם תתבצע יציאה מהחשבון, הנתונים האלה יימחקו ({count} פריטים).}other{‏‫Chromium צריך לאמת את הזהות שלך לפני שאפשר יהיה לשמור חלק מהנתונים בחשבון Google ולהשתמש בהם בכל המכשירים שלך. אם תתבצע יציאה מהחשבון, הנתונים האלה יימחקו ({count} פריטים).}}</translation>
 <translation id="3013473503895162900">‏פתיחה של <ph name="URL" /> בכרטיסייה חדשה ב-Chromium.</translation>
 <translation id="3032706164202344641">‏Chromium לא יכול לבדוק את הסיסמאות שלך. כדאי לנסות שוב מאוחר יותר.</translation>
 <translation id="3032787606318309379">‏מתבצעת הוספה ל-Chromium...</translation>
@@ -492,6 +492,7 @@
 <translation id="6729124504294600478">‏כדי להשתמש בהתאמה אישית ובתכונות אחרות, צריך לכלול את Chromium ב'פעילות באינטרנט ובאפליקציות' ובשירותי Google המקושרים</translation>
 <translation id="6734291798041940871">‏Chromium כבר מותקן במחשב ונגיש לכל המשתמשים.</translation>
 <translation id="6751374565094704799">‏אפשר להאיץ ביצועים של אתרים באמצעות מנוע V8 של Chromium, אבל Chromium יהיה קצת פחות עמיד בפני מתקפות. ההגדרה הזו פועלת.</translation>
+<translation id="6754665438209053659">{count,plural, =1{‏חלק מהנתונים ב-Chromium עדיין לא נשמרו בחשבון Google. כדאי לחכות כמה דקות לפני היציאה מהחשבון. אם תתבצע יציאה מהחשבון, הנתונים האלה יימחקו (פריט אחד).}one{‏חלק מהנתונים ב-Chromium עדיין לא נשמרו בחשבון Google. כדאי לחכות כמה דקות לפני היציאה מהחשבון. אם תתבצע יציאה מהחשבון, הנתונים האלה יימחקו ({count} פריטים).}two{‏חלק מהנתונים ב-Chromium עדיין לא נשמרו בחשבון Google. כדאי לחכות כמה דקות לפני היציאה מהחשבון. אם תתבצע יציאה מהחשבון, הנתונים האלה יימחקו ({count} פריטים).}other{‏חלק מהנתונים ב-Chromium עדיין לא נשמרו בחשבון Google. כדאי לחכות כמה דקות לפני היציאה מהחשבון. אם תתבצע יציאה מהחשבון, הנתונים האלה יימחקו ({count} פריטים).}}</translation>
 <translation id="67706546131546258">‏ההמלצה של Chromium היא לסרוק את הקובץ הזה כי הוא עלול להיות מסוכן.</translation>
 <translation id="6779406956731413166">‏<ph name="BEGIN_LINK_CROS_OSS" />תוכנת קוד פתוח<ph name="END_LINK_CROS_OSS" /> נוספת מאפשרת את השימוש ב-ChromiumOS.</translation>
 <translation id="6831043979455480757">תרגום</translation>
@@ -532,7 +533,7 @@
 <translation id="7274695763216404502">התכונה הוצמדה. מעכשיו אפשר להשתמש בתכונה 'חיפוש תמונות' דרך סרגל הכלים</translation>
 <translation id="7288567540154601580">כרטיסיות ותוספים</translation>
 <translation id="7295544978856094497">{NUM_EXTENSIONS,plural, =1{‏ההמלצה של Chromium היא להסיר אותו}one{‏ההמלצה של Chromium היא להסיר אותם}two{‏ההמלצה של Chromium היא להסיר אותם}other{‏ההמלצה של Chromium היא להסיר אותם}}</translation>
-<translation id="7296334833518879294">‏כדי לשתף את אודיו המערכת, צריך לפתוח את הגדרות המערכת ולבחור באפשרות "הקלטת אודיו המערכת בלבד" ב-Chromium. לאחר מכן צריך להפעיל מחדש את Chromium.</translation>
+<translation id="7296334833518879294">‏כדי לשתף אודיו מהמערכת, צריך לפתוח את הגדרות המערכת ולבחור באפשרות "הקלטת אודיו של המערכת בלבד" ל-Chromium. לאחר מכן צריך להפעיל מחדש את Chromium.</translation>
 <translation id="7309928523159922338">‏מדידת המודעות מאפשרת לאתרים שביקרת בהם לבקש מ-Chromium מידע שיעזור לבעלי האתרים למדוד את הביצועים של המודעות שלהם. מדידת המודעות מגבילה את המעקב באתרים שונים על ידי העברת כמות קטנה ככל האפשר של מידע בין אתרים.</translation>
 <translation id="731795002583552498">‏העדכון של Chromium‏ מתבצע</translation>
 <translation id="7318036098707714271">‏קובץ ההעדפות שלך פגום או לא חוקי. 
@@ -646,7 +647,6 @@
 <translation id="8619360774459241877">‏הפעלת Chromium מתבצעת...</translation>
 <translation id="8624541899164515475">הגדרות, ייפתחו בכרטיסייה חדשה.</translation>
 <translation id="8648201657708811153">‏לא ניתן להגדיר את Google Chrome for Testing כדפדפן ברירת המחדל.</translation>
-<translation id="8677922833187616101">‏להציג תמיד את קיצור הדרך למצב AI של Google</translation>
 <translation id="8697124171261953979">‏הגדרה זו גם קובעת איזה דף מוצג כשמפעילים את Chromium או מבצעים חיפוש מסרגל הכתובות.</translation>
 <translation id="8704119203788522458">‏זהו ה-Chromium שלך</translation>
 <translation id="8712637175834984815">הבנתי</translation>
diff --git a/chrome/app/resources/chromium_strings_ja.xtb b/chrome/app/resources/chromium_strings_ja.xtb
index 795e095..abfc0ed 100644
--- a/chrome/app/resources/chromium_strings_ja.xtb
+++ b/chrome/app/resources/chromium_strings_ja.xtb
@@ -152,7 +152,6 @@
 <translation id="2718390899429598676">セキュリティ強化のため、Chromium ではデータが暗号化されます。</translation>
 <translation id="2721354645805494590">Chromium から Google アカウントを削除するには、ログアウトしてください</translation>
 <translation id="2722636413143664436">すべてのデバイスで同じパスワード、ブックマーク、その他の設定を使用するには、Chromium にログインしてください</translation>
-<translation id="2723860029395667894">Google AI モードのショートカットを常に表示する</translation>
 <translation id="2738871930057338499">インターネットに接続できません。HTTP 403 アクセス不可エラーが発生しました。プロキシ設定をご確認ください。</translation>
 <translation id="2753623023919742414">クリックして検索</translation>
 <translation id="2768103863314748511">Chromium をデフォルトの PDF ビューアに設定する</translation>
@@ -177,6 +176,7 @@
 <translation id="2977506796191543575">サイトがパスワードを不正に取得しようとしている場合や、ユーザーが安全でないファイルをダウンロードしようとした場合は、URL とページ コンテンツの一部をセーフ ブラウジングに送信することがあります</translation>
 <translation id="2981563588585023386">保護者の方が指定した設定でインターネットをより安全に利用するには、Chromium にログインしてください</translation>
 <translation id="3003694935412297923">すべてのタスク</translation>
+<translation id="3012615494352020668">{count,plural, =1{Google アカウントに一部のデータを保存して、すべてのデバイスで使用できるようにするには、Chromium で本人確認を行う必要があります。今すぐログアウトすると、このデータ(1 個のアイテム)は削除されます。}other{Google アカウントに一部のデータを保存して、すべてのデバイスで使用できるようにするには、Chromium で本人確認を行う必要があります。今すぐログアウトすると、このデータ({count} 個のアイテム)は削除されます。}}</translation>
 <translation id="3013473503895162900">Chromium の新しいタブで <ph name="URL" /> を開きます。</translation>
 <translation id="3032706164202344641">Chromium でパスワードを確認できません。しばらくしてからもう一度お試しください。</translation>
 <translation id="3032787606318309379">Chromium に追加...</translation>
@@ -487,6 +487,7 @@
 <translation id="6729124504294600478">パーソナライズなどの機能を利用するには、Chromium をウェブとアプリのアクティビティと、リンクされた Google サービスに追加します</translation>
 <translation id="6734291798041940871">Chromium は既にパソコンのすべてのユーザーに対してインストールされています。</translation>
 <translation id="6751374565094704799">Chromium の V8 エンジンでサイトを高速化する(攻撃に対する Chromium の耐性は若干低下します)。この設定はオンになっています。</translation>
+<translation id="6754665438209053659">{count,plural, =1{Chromium データの一部が Google アカウントにまだ保存されていません。数分待ってからログアウトしてください。今すぐログアウトすると、このデータ(1 個のアイテム)は削除されます。}other{Chromium データの一部が Google アカウントにまだ保存されていません。数分待ってからログアウトしてください。今すぐログアウトすると、このデータ({count} 個のアイテム)は削除されます。}}</translation>
 <translation id="67706546131546258">このファイルは危害を及ぼす可能性があるため、スキャンすることをおすすめします。</translation>
 <translation id="6779406956731413166">Chromium OS は、追加の<ph name="BEGIN_LINK_CROS_OSS" />オープンソース ソフトウェア<ph name="END_LINK_CROS_OSS" />によって実現しました。</translation>
 <translation id="6831043979455480757">翻訳</translation>
@@ -641,7 +642,6 @@
 <translation id="8619360774459241877">Chromium を起動しています...</translation>
 <translation id="8624541899164515475">設定、新しいタブで開きます。</translation>
 <translation id="8648201657708811153">Google Chrome for Testing は、既定のブラウザには設定できません。</translation>
-<translation id="8677922833187616101">Google AI モードのショートカットを常に表示する</translation>
 <translation id="8697124171261953979">この拡張機能では、Chromium の起動時、またはアドレスバーからの検索時に表示されるページも制御されます。</translation>
 <translation id="8704119203788522458">自分好みに設定</translation>
 <translation id="8712637175834984815">理解しました</translation>
diff --git a/chrome/app/resources/chromium_strings_ka.xtb b/chrome/app/resources/chromium_strings_ka.xtb
index 74f2d12..71cb8a5 100644
--- a/chrome/app/resources/chromium_strings_ka.xtb
+++ b/chrome/app/resources/chromium_strings_ka.xtb
@@ -155,7 +155,6 @@
 <translation id="2718390899429598676">დამატებითი უსაფრთხოებისთვის, Chromium თქვენს მონაცემებს დაშიფრავს.</translation>
 <translation id="2721354645805494590">Chromium-იდან Google ანგარიში რომ ამოშალოთ, საჭიროა სისტემიდან გასვლა</translation>
 <translation id="2722636413143664436">თქვენს ყველა მოწყობილობაზე პაროლების, სანიშნეებისა და სხვა კონტენტის მისაღებად შედით Chromium-ში</translation>
-<translation id="2723860029395667894">Google-ის ხელოვნური ინტელექტის რეჟიმის მალსახმობის ყოველთვის ჩვენება</translation>
 <translation id="2738871930057338499">ინტერნეტთან დაკავშირება ვერ ხერხდება. HTTP 403 — აკრძალულია. შეამოწმეთ პროქსი-სერვერის კონფიგურაცია.</translation>
 <translation id="2753623023919742414">დააწკაპუნეთ ძიებისთვის</translation>
 <translation id="2768103863314748511">დააყეენთ Chromium PDF ფაილების ნაგულისხმევ მნახველად</translation>
@@ -652,7 +651,6 @@
 <translation id="8619360774459241877">მიმდინარეობს Chromium-ის გაშვება…</translation>
 <translation id="8624541899164515475">პარამეტრები, გაიხსნება ახალ ჩანართში.</translation>
 <translation id="8648201657708811153">Google Chrome for Testing ვერ გახდება თქვენი ნაგულისხმევი ბრაუზერი.</translation>
-<translation id="8677922833187616101">Google-ის ხელოვნური ინტელექტის რეჟიმის მალსახმობის ყოველთვის ჩვენება</translation>
 <translation id="8697124171261953979">იგი ასევე აკონტროლებს, თუ რომელი გვერდი გამოჩნდება Chromium-ის გაშვებისას ან Omnibox-ში ძიების დროს.</translation>
 <translation id="8704119203788522458">ეს არის თქვენი Chromium</translation>
 <translation id="8712637175834984815">კარგი</translation>
diff --git a/chrome/app/resources/chromium_strings_kk.xtb b/chrome/app/resources/chromium_strings_kk.xtb
index 3f8ae646..e496c24 100644
--- a/chrome/app/resources/chromium_strings_kk.xtb
+++ b/chrome/app/resources/chromium_strings_kk.xtb
@@ -154,7 +154,6 @@
 <translation id="2718390899429598676">Қосымша қауіпсіздік үшін Chromium деректеріңізді шифрлайды.</translation>
 <translation id="2721354645805494590">Chromium-нен Google аккаунтын өшіру үшін аккаунттан шығыңыз.</translation>
 <translation id="2722636413143664436">Құпия сөздерді, бетбелгілер мен басқа ақпаратты барлық құрылғыдан алу үшін Chromium аккаунтына кіріңіз.</translation>
-<translation id="2723860029395667894">Google AI режимінің жылдам пәрменін үнемі көрсету</translation>
 <translation id="2738871930057338499">Интернетке қосылу мүмкін емес. HTTP 403 бойынша тыйым салынған. Прокси конфигурациясын тексеріңіз.</translation>
 <translation id="2753623023919742414">Іздеу үшін басыңыз.</translation>
 <translation id="2768103863314748511">Chromium-ді әдепкі PDF көру құралы ретінде орнату</translation>
@@ -649,7 +648,6 @@
 <translation id="8619360774459241877">Chromium іске қосылуда…</translation>
 <translation id="8624541899164515475">Параметрлер, жаңа қойындыда ашылады.</translation>
 <translation id="8648201657708811153">Google Chrome for Testing браузерін әдепкі браузер қылу мүмкін емес.</translation>
-<translation id="8677922833187616101">Google AI режимінің жылдам пәрменін үнемі көрсету</translation>
 <translation id="8697124171261953979">Сонымен қатар ол Chromium іске қосқаныңызда немесе Omnibox ішінен іздегеніңізде қайсы бет көрсетілетінін бақылайды.</translation>
 <translation id="8704119203788522458">Сізге арналған Chromium.</translation>
 <translation id="8712637175834984815">Түсінікті</translation>
diff --git a/chrome/app/resources/chromium_strings_km.xtb b/chrome/app/resources/chromium_strings_km.xtb
index c8e89c0..89be228 100644
--- a/chrome/app/resources/chromium_strings_km.xtb
+++ b/chrome/app/resources/chromium_strings_km.xtb
@@ -154,7 +154,6 @@
 <translation id="2718390899429598676">ដើម្បីទទួលបានសុវត្ថិភាពបន្ថែម Chromium នឹងអ៊ិនគ្រីបទិន្នន័យរបស់អ្នក។</translation>
 <translation id="2721354645805494590">ដើម្បីដកគណនី Google របស់អ្នកចេញពី Chromium សូមចេញពីគណនី</translation>
 <translation id="2722636413143664436">ដើម្បី​ទទួលបាន​ពាក្យ​សម្ងាត់ ចំណាំ​របស់អ្នក និង​អ្វីៗជាច្រើនទៀត​នៅលើ​ឧបករណ៍​ទាំងអស់​របស់អ្នក សូម​ចូលគណនី Chromium</translation>
-<translation id="2723860029395667894">បង្ហាញ​ផ្លូវកាត់​មុខងារ Google AI ជានិច្ច</translation>
 <translation id="2738871930057338499">មិនអាចភ្ជាប់ទៅអ៊ីនធឺណិតបានទេ។ បាន​ហាមឃាត់ HTTP 403។ សូម​ពិនិត្យមើល​ការកំណត់​រចនាសម្ព័ន្ធ​ប្រូកស៊ី​របស់អ្នក។</translation>
 <translation id="2753623023919742414">ចុច​ដើម្បី​ស្វែង​រក</translation>
 <translation id="2768103863314748511">កំណត់ Chromium ជា​កម្មវិធី​មើល PDF លំនាំដើម​របស់អ្នក</translation>
@@ -652,7 +651,6 @@
 <translation id="8619360774459241877">កំពុង​ចាប់ផ្ដើម Chromium...</translation>
 <translation id="8624541899164515475">ការ​កំណត់, បើក​នៅក្នុង​ផ្ទាំងថ្មី។</translation>
 <translation id="8648201657708811153">មិនអាចកំណត់ Google Chrome for Testing ជាកម្មវិធីរុករកតាមអ៊ីនធឺណិតលំនាំដើមរបស់អ្នកបានទេ។</translation>
-<translation id="8677922833187616101">បង្ហាញ​ផ្លូវកាត់​មុខងារ Google AI ជានិច្ច</translation>
 <translation id="8697124171261953979">វាក៏គ្រប់គ្រងអ្វីដែលទំព័របានបង្ហាញផងដែរ នៅពេលអ្នកចាប់ផ្តើម Chromium ស្វែងរកពីប្រអប់អូមនី។</translation>
 <translation id="8704119203788522458">នេះគឺជា Chromium របស់អ្នក</translation>
 <translation id="8712637175834984815">យល់ហើយ</translation>
diff --git a/chrome/app/resources/chromium_strings_kn.xtb b/chrome/app/resources/chromium_strings_kn.xtb
index f3ab053..f9e37e3 100644
--- a/chrome/app/resources/chromium_strings_kn.xtb
+++ b/chrome/app/resources/chromium_strings_kn.xtb
@@ -153,7 +153,6 @@
 <translation id="2718390899429598676">ಹೆಚ್ಚುವರಿ ಭದ್ರತೆಗಾಗಿ, Chromium ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಎನ್‌ಕ್ರಿಪ್ಟ್ ಮಾಡುತ್ತದೆ.</translation>
 <translation id="2721354645805494590">Chromium ನಿಂದ ನಿಮ್ಮ Google ಖಾತೆಯನ್ನು ತೆಗೆದುಹಾಕಲು, ಸೈನ್ ಔಟ್ ಮಾಡಿ</translation>
 <translation id="2722636413143664436">ನಿಮ್ಮ ಎಲ್ಲಾ ಸಾಧನಗಳಲ್ಲಿ ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್‌ಗಳು, ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳು ಮತ್ತು ಇತ್ಯಾದಿಗಳನ್ನು ಪಡೆಯಲು, Chromium ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ</translation>
-<translation id="2723860029395667894">ಯಾವಾಗಲೂ Google AI ಮೋಡ್ ಶಾರ್ಟ್‌ಕಟ್ ಅನ್ನು ತೋರಿಸಿ</translation>
 <translation id="2738871930057338499">ಇಂಟರ್ನೆಟ್‌ಗೆ ಕನೆಕ್ಟ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. HTTP 403 ನಿಷೇಧಿಸಲಾಗಿದೆ. ನಿಮ್ಮ ಪ್ರಾಕ್ಸಿ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿ.</translation>
 <translation id="2753623023919742414">ಹುಡುಕಲು ಕ್ಲಿಕ್ ಮಾಡಿ</translation>
 <translation id="2768103863314748511">Chromium ಅನ್ನು ನಿಮ್ಮ ಡೀಫಾಲ್ಟ್ PDF ವೀಕ್ಷಕವನ್ನಾಗಿ ಸೆಟ್ ಮಾಡಿ</translation>
@@ -178,6 +177,7 @@
 <translation id="2977506796191543575">ಯಾವುದಾದರೂ ಸೈಟ್ ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಕದಿಯಲು ಪ್ರಯತ್ನಿಸಿದರೆ ಅಥವಾ ನೀವು ಹಾನಿಕಾರಕ ಫೈಲ್ ಅನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಿದಾಗ, ಪುಟದ ವಿಷಯದ ತುಣುಕುಗಳನ್ನು ಒಳಗೊಂಡ URL ಗಳನ್ನು ಸಹ Chromium, ಸುರಕ್ಷಿತ ಬ್ರೌಸಿಂಗ್‌ಗೆ ಕಳುಹಿಸುತ್ತದೆ</translation>
 <translation id="2981563588585023386">ನಿಮ್ಮ ಪೋಷಕರ ಆಯ್ಕೆಗಳೊಂದಿಗೆ ಆನ್‌ಲೈನ್‌ನಲ್ಲಿ ಸುರಕ್ಷಿತವಾಗಿರಲು, Chromium ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ</translation>
 <translation id="3003694935412297923">ಎಲ್ಲಾ ಕಾರ್ಯಗಳು</translation>
+<translation id="3012615494352020668">{count,plural, =1{ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಕೆಲವು ಡೇಟಾವನ್ನು ಸೇವ್‌ ಮಾಡುವ ಮತ್ತು ನಿಮ್ಮ ಎಲ್ಲಾ ಸಾಧನಗಳಲ್ಲಿ ಬಳಸುವ ಮೊದಲು Chromium ಇದು ನೀವೇ ಎಂದು ದೃಢೀಕರಿಸುವ ಅಗತ್ಯವಿದೆ. ನೀವು ಈಗ ಸೈನ್ ಔಟ್ ಮಾಡಿದರೆ, ಈ ಡೇಟಾವನ್ನು (1 ಐಟಂ) ಅಳಿಸಲಾಗುತ್ತದೆ.}one{ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಕೆಲವು ಡೇಟಾವನ್ನು ಸೇವ್‌ ಮಾಡುವ ಮತ್ತು ನಿಮ್ಮ ಎಲ್ಲಾ ಸಾಧನಗಳಲ್ಲಿ ಬಳಸುವ ಮೊದಲು Chromium ಇದು ನೀವೇ ಎಂದು ದೃಢೀಕರಿಸುವ ಅಗತ್ಯವಿದೆ. ನೀವು ಈಗ ಸೈನ್ ಔಟ್ ಮಾಡಿದರೆ, ಈ ಡೇಟಾ ({count} ಐಟಂಗಳನ್ನು) ಅಳಿಸಲಾಗುತ್ತದೆ.}other{ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಕೆಲವು ಡೇಟಾವನ್ನು ಸೇವ್‌ ಮಾಡುವ ಮತ್ತು ನಿಮ್ಮ ಎಲ್ಲಾ ಸಾಧನಗಳಲ್ಲಿ ಬಳಸುವ ಮೊದಲು Chromium ಇದು ನೀವೇ ಎಂದು ದೃಢೀಕರಿಸುವ ಅಗತ್ಯವಿದೆ. ನೀವು ಈಗ ಸೈನ್ ಔಟ್ ಮಾಡಿದರೆ, ಈ ಡೇಟಾ ({count} ಐಟಂಗಳನ್ನು) ಅಳಿಸಲಾಗುತ್ತದೆ.}}</translation>
 <translation id="3013473503895162900">Chromium ನಲ್ಲಿ <ph name="URL" /> ಅನ್ನು ಹೊಸ ಟ್ಯಾಬ್‌ನಲ್ಲಿ ತೆರೆಯಿರಿ.</translation>
 <translation id="3032706164202344641">Chromium ಗೆ ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ. ನಂತರ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="3032787606318309379">Chromium ಗೆ ಸೇರಿಸಲಾಗುತ್ತಿದೆ...</translation>
@@ -490,6 +490,7 @@
 <translation id="6729124504294600478">ವೈಯಕ್ತೀಕರಣ ಮತ್ತು ಇತರ ಫೀಚರ್‌ಗಳನ್ನು ಪಡೆಯಲು, ವೆಬ್ ಮತ್ತು ಆ್ಯಪ್ ಚಟುವಟಿಕೆ ಹಾಗೂ ಲಿಂಕ್ ಮಾಡಲಾದ Google ಸೇವೆಗಳಲ್ಲಿ Chromium ಅನ್ನು ಸೇರಿಸಿ</translation>
 <translation id="6734291798041940871">ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ನಲ್ಲಿನ ಎಲ್ಲ ಬಳಕೆದಾರರಿಗೆ ಈಗಾಗಲೇ Chromium ಸ್ಥಾಪಿತವಾಗಿದೆ.</translation>
 <translation id="6751374565094704799">Chromium ನ V8 ಇಂಜಿನ್‌ ಮೂಲಕ ಸೈಟ್‌ಗಳನ್ನು ವೇಗಗೊಳಿಸುತ್ತದೆ, ಆದರೆ Chromium ದಾಳಿಗಳ ವಿರುದ್ದ ಸ್ವಲ್ಪ ಕಡಿಮೆ ಪ್ರತಿರಕ್ಷಣೆ ಮಾಡುತ್ತದೆ. ಈ ಸೆಟ್ಟಿಂಗ್ ಆನ್ ಆಗಿದೆ.</translation>
+<translation id="6754665438209053659">{count,plural, =1{ನಿಮ್ಮ ಕೆಲವು Chromium ಡೇಟಾವನ್ನು ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಇನ್ನೂ ಸೇವ್ ಮಾಡಲಾಗಿಲ್ಲ. ಸೈನ್ ಔಟ್ ಮಾಡುವ ಮೊದಲು ಕೆಲವು ನಿಮಿಷ ಕಾಯಲು ಪ್ರಯತ್ನಿಸಿ. ನೀವು ಈಗ ಸೈನ್ ಔಟ್ ಮಾಡಿದರೆ, ಈ ಡೇಟಾವನ್ನು (1 ಐಟಂ) ಅಳಿಸಲಾಗುತ್ತದೆ.}one{ನಿಮ್ಮ ಕೆಲವು Chromium ಡೇಟಾವನ್ನು ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಇನ್ನೂ ಸೇವ್ ಮಾಡಲಾಗಿಲ್ಲ. ಸೈನ್ ಔಟ್ ಮಾಡುವ ಮೊದಲು ಕೆಲವು ನಿಮಿಷ ಕಾಯಲು ಪ್ರಯತ್ನಿಸಿ. ನೀವು ಈಗ ಸೈನ್ ಔಟ್ ಮಾಡಿದರೆ, ಈ ಡೇಟಾ ({count} ಐಟಂಗಳನ್ನು) ಅಳಿಸಲಾಗುತ್ತದೆ.}other{ನಿಮ್ಮ ಕೆಲವು Chromium ಡೇಟಾವನ್ನು ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಇನ್ನೂ ಸೇವ್ ಮಾಡಲಾಗಿಲ್ಲ. ಸೈನ್ ಔಟ್ ಮಾಡುವ ಮೊದಲು ಕೆಲವು ನಿಮಿಷ ಕಾಯಲು ಪ್ರಯತ್ನಿಸಿ. ನೀವು ಈಗ ಸೈನ್ ಔಟ್ ಮಾಡಿದರೆ, ಈ ಡೇಟಾ ({count} ಐಟಂಗಳನ್ನು) ಅಳಿಸಲಾಗುತ್ತದೆ.}}</translation>
 <translation id="67706546131546258">ಈ ಫೈಲ್ ಅಪಾಯಕಾರಿಯಾಗಿರಬಹುದು, ಆದ್ದರಿಂದ ಇದನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಬೇಕೆಂದು Chromium ಶಿಫಾರಸು ಮಾಡುತ್ತದೆ.</translation>
 <translation id="6779406956731413166">ಹೆಚ್ಚುವರಿ <ph name="BEGIN_LINK_CROS_OSS" />ಓಪನ್ ಸೋರ್ಸ್ ಸಾಫ್ಟ್‌ವೇರ್<ph name="END_LINK_CROS_OSS" /> ನಿಂದ ChromiumOS ಮಾಡಲು ಸಾಧ್ಯ.</translation>
 <translation id="6831043979455480757">Translate</translation>
@@ -642,7 +643,6 @@
 <translation id="8619360774459241877">Chromium ಅನ್ನು ಪ್ರಾರಂಭಿಸಲಾಗುತ್ತಿದೆ...</translation>
 <translation id="8624541899164515475">ಸೆಟ್ಟಿಂಗ್‌ಗಳು, ಹೊಸ ಟ್ಯಾಬ್‌ನಲ್ಲಿ ತೆರೆಯುತ್ತದೆ.</translation>
 <translation id="8648201657708811153">Google Chrome for Testing ಅನ್ನು ನಿಮ್ಮ ಡೀಫಾಲ್ಟ್ ಬ್ರೌಸರ್ ಆಗಿ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ.</translation>
-<translation id="8677922833187616101">ಯಾವಾಗಲೂ Google AI ಮೋಡ್ ಶಾರ್ಟ್‌ಕಟ್ ಅನ್ನು ತೋರಿಸಿ</translation>
 <translation id="8697124171261953979">ನೀವು Chromium ಪ್ರಾರಂಭಿಸಿದಾಗ ಅಥವಾ ಓಮ್ನಿಬಾಕ್ಸ್‌ನಿಂದ ಹುಡುಕಿದಾಗ ತೋರಿಸಬೇಕಾದ ಪುಟವನ್ನು ಕೂಡಾ ಇದು ನಿಯಂತ್ರಿಸುತ್ತದೆ.</translation>
 <translation id="8704119203788522458">ಇದು ನಿಮ್ಮ Chromium</translation>
 <translation id="8712637175834984815">ಅರ್ಥವಾಯಿತು</translation>
diff --git a/chrome/app/resources/chromium_strings_ko.xtb b/chrome/app/resources/chromium_strings_ko.xtb
index 92ad8aa..ecb9929 100644
--- a/chrome/app/resources/chromium_strings_ko.xtb
+++ b/chrome/app/resources/chromium_strings_ko.xtb
@@ -154,7 +154,6 @@
 <translation id="2718390899429598676">보안 강화를 위해 Chromium에서 사용자 데이터를 암호화합니다.</translation>
 <translation id="2721354645805494590">Chromium에서 Google 계정을 삭제하려면 로그아웃하세요.</translation>
 <translation id="2722636413143664436">모든 기기에서 비밀번호, 북마크 등을 사용하려면 Chromium에 로그인하세요</translation>
-<translation id="2723860029395667894">Google AI 모드 바로가기 항상 표시</translation>
 <translation id="2738871930057338499">인터넷에 연결할 수 없습니다(HTTP 403 Forbidden). 프록시 설정을 확인하시기 바랍니다.</translation>
 <translation id="2753623023919742414">클릭하여 검색</translation>
 <translation id="2768103863314748511">Chromium을 기본 PDF 뷰어로 설정</translation>
@@ -649,7 +648,6 @@
 <translation id="8619360774459241877">Chromium 실행 중...</translation>
 <translation id="8624541899164515475">설정, 새 탭에서 열립니다.</translation>
 <translation id="8648201657708811153">Google Chrome for Testing을 기본 브라우저로 설정할 수 없습니다.</translation>
-<translation id="8677922833187616101">Google AI 모드 바로가기 항상 표시</translation>
 <translation id="8697124171261953979">또한 Chromium을 시작하거나 검색주소창에서 검색할 때 표시되는 페이지를 설정합니다.</translation>
 <translation id="8704119203788522458">나만의 Chromium</translation>
 <translation id="8712637175834984815">확인</translation>
diff --git a/chrome/app/resources/chromium_strings_ky.xtb b/chrome/app/resources/chromium_strings_ky.xtb
index 81e3831d..f2034fc 100644
--- a/chrome/app/resources/chromium_strings_ky.xtb
+++ b/chrome/app/resources/chromium_strings_ky.xtb
@@ -155,7 +155,6 @@
 <translation id="2718390899429598676">Кошумча коопсуздук үчүн, Chromium дайын-даректериңизди шифрлейт.</translation>
 <translation id="2721354645805494590">Google аккаунтуңузду Chromium'дан өчүрүү үчүн чыгыңыз</translation>
 <translation id="2722636413143664436">Бардык түзмөктөрүңүздө сырсөздөрдү, кыстармаларды жана башка нерселерди алуу үчүн Chromium'га кириңиз</translation>
-<translation id="2723860029395667894">Google ЖИ режиминин ыкчам баскычы ар дайым көрсөтүлсүн</translation>
 <translation id="2738871930057338499">Интернетке туташуу мүмкүн болбой жатат. HTTP 403 Тыюу салынган. Прокси конфигурациясын текшериңиз.</translation>
 <translation id="2753623023919742414">Издөө үчүн чыкылдатыңыз</translation>
 <translation id="2768103863314748511">Chromium'ду демейки PDF көрүүчү каражаты катары тууралаңыз</translation>
@@ -650,7 +649,6 @@
 <translation id="8619360774459241877">Chromium иштетилүүдө…</translation>
 <translation id="8624541899164515475">Параметрлер, жаңы өтмөктө ачылат.</translation>
 <translation id="8648201657708811153">Google Chrome for Testing версиясын демейки серепчиңиз катары тандай албайсыз.</translation>
-<translation id="8677922833187616101">Google ЖИ режиминин ыкчам баскычы ар дайым көрсөтүлсүн</translation>
 <translation id="8697124171261953979">Chromium иштеп баштаганда же Omnibox'тон изделгенде, кайсы бет көрсөтүлө тургандыгын көзөмөлдөйт.</translation>
 <translation id="8704119203788522458">Бул сиздин Chromium</translation>
 <translation id="8712637175834984815">Түшүндүм</translation>
diff --git a/chrome/app/resources/chromium_strings_lo.xtb b/chrome/app/resources/chromium_strings_lo.xtb
index 3cef116..8484472 100644
--- a/chrome/app/resources/chromium_strings_lo.xtb
+++ b/chrome/app/resources/chromium_strings_lo.xtb
@@ -155,7 +155,6 @@
 <translation id="2718390899429598676">ເພື່ອຄວາມປອດໄພເພີ່ມເຕີມ, Chromium ຈະເຂົ້າລະຫັດຂໍ້ມູນຂອງທ່ານ.</translation>
 <translation id="2721354645805494590">ເພື່ອລຶບບັນຊີ Google ຂອງທ່ານອອກຈາກ Chromium, ໃຫ້ອອກຈາກລະບົບ</translation>
 <translation id="2722636413143664436">ເພື່ອເຂົ້າເຖິງລະຫັດຜ່ານ, ບຸກມາກ ແລະ ຂໍ້ມູນອື່ນໆຂອງທ່ານໃນອຸປະກອນທຸກເຄື່ອງຂອງທ່ານ, ໃຫ້ເຂົ້າສູ່ລະບົບ Chromium</translation>
-<translation id="2723860029395667894">ສະແດງທາງລັດຂອງໂໝດ Google AI ສະເໝີ</translation>
 <translation id="2738871930057338499">ບໍ່ສາມາດເຊື່ອມຕໍ່ກັບອິນເຕີເນັດໄດ້. HTTP 403 ຖືກຫ້າມ. ກະລຸນາກວດສອບການຕັ້ງຄ່າພຣັອກຊີຂອງທ່ານ.</translation>
 <translation id="2753623023919742414">ຄລິກເພື່ອຊອກຫາ</translation>
 <translation id="2768103863314748511">ຕັ້ງຄ່າ Chromium ເປັນໂປຣແກຣມອ່ານ PDF ເລີ່ມຕົ້ນຂອງທ່ານ</translation>
@@ -650,7 +649,6 @@
 <translation id="8619360774459241877">ກຳລັງເປີດໃຊ້ Chromium...</translation>
 <translation id="8624541899164515475">ການຕັ້ງຄ່າ, ເປີດໃນແຖບໃໝ່.</translation>
 <translation id="8648201657708811153">ບໍ່ສາມາດຕັ້ງ Google Chrome ສຳລັບການທົດສອບເປັນໂປຣແກຣມທ່ອງເວັບເລີ່ມຕົ້ນຂອງທ່ານໄດ້.</translation>
-<translation id="8677922833187616101">ສະແດງທາງລັດຂອງໂໝດ Google AI ສະເໝີ</translation>
 <translation id="8697124171261953979">ມັນຍັງຄວບຄຸມວ່າຈະໃຫ້ສະແດງໜ້າໃດຂຶ້ນ ເມື່ອທ່ານເລີ່ມຕົ້ນເປີດ Chromium ຫຼືຄົ້ນຫາຈາກ Omnibox.</translation>
 <translation id="8704119203788522458">ນີ້​ແມ່ນ Chromium ຂອງ​ທ່ານ</translation>
 <translation id="8712637175834984815">ເຂົ້າໃຈແລ້ວ</translation>
diff --git a/chrome/app/resources/chromium_strings_lt.xtb b/chrome/app/resources/chromium_strings_lt.xtb
index ee41816..7edd77a2 100644
--- a/chrome/app/resources/chromium_strings_lt.xtb
+++ b/chrome/app/resources/chromium_strings_lt.xtb
@@ -155,7 +155,6 @@
 <translation id="2718390899429598676">Kad būtų papildomai užtikrintas saugumas, „Chromium“ užšifruos jūsų duomenis.</translation>
 <translation id="2721354645805494590">Jei norite pašalinti „Google“ paskyrą iš „Chromium“, atsijunkite</translation>
 <translation id="2722636413143664436">Jei norite pasiekti slaptažodžius, žymes ir kitas funkcijas visuose įrenginiuose, prisijunkite prie „Chromium“</translation>
-<translation id="2723860029395667894">Visada rodyti „Google“ DI režimo spartųjį klavišą</translation>
 <translation id="2738871930057338499">Nepavyko prisijungti prie interneto. HTTP 403 uždrausta. Patikrinkite tarpinio serverio konfigūraciją.</translation>
 <translation id="2753623023919742414">Spustelėkite, jei norite ieškoti</translation>
 <translation id="2768103863314748511">Nustatyti „Chromium“ kaip numatytąją PDF failų žiūryklę</translation>
@@ -652,7 +651,6 @@
 <translation id="8619360774459241877">Pristatoma „Chromium“...</translation>
 <translation id="8624541899164515475">Nustatymai, atidaroma naujame skirtuke.</translation>
 <translation id="8648201657708811153">„Google Chrome for Testing“ negali būti nustatyta kaip numatytoji naršyklė.</translation>
-<translation id="8677922833187616101">Visada rodyti „Google“ DI režimo spartųjį klavišą</translation>
 <translation id="8697124171261953979">Ji taip pat kontroliuoja, koks puslapis rodomas, kai paleidžiate „Chromium“ arba ieškote „Omnibox“.</translation>
 <translation id="8704119203788522458">Tai jūsų „Chromium“</translation>
 <translation id="8712637175834984815">Supratau</translation>
diff --git a/chrome/app/resources/chromium_strings_lv.xtb b/chrome/app/resources/chromium_strings_lv.xtb
index 0c9b8cc..d73018f 100644
--- a/chrome/app/resources/chromium_strings_lv.xtb
+++ b/chrome/app/resources/chromium_strings_lv.xtb
@@ -152,7 +152,6 @@
 <translation id="2718390899429598676">Papildu drošības nolūkos Chromium šifrēs jūsu datus.</translation>
 <translation id="2721354645805494590">Lai noņemtu savu Google kontu no pārlūka Chromium, izrakstieties.</translation>
 <translation id="2722636413143664436">Pierakstieties pārlūkā Chromium, lai varētu piekļūt parolēm, grāmatzīmēm un citiem datiem visās savās ierīcēs.</translation>
-<translation id="2723860029395667894">Vienmēr rādīt Google MI režīma saīsni</translation>
 <translation id="2738871930057338499">Nevar izveidot savienojumu ar internetu. HTTP 403 — aizliegts. Lūdzu, pārbaudiet starpniekservera konfigurāciju.</translation>
 <translation id="2753623023919742414">Noklikšķiniet, lai meklētu</translation>
 <translation id="2768103863314748511">Iestatiet Chromium kā noklusējuma PDF failu skatītāju.</translation>
@@ -645,7 +644,6 @@
 <translation id="8619360774459241877">Notiek Chromium palaišana...</translation>
 <translation id="8624541899164515475">Iestatījumi; tiks atvērta jauna cilne.</translation>
 <translation id="8648201657708811153">Google Chrome for Testing nevar iestatīt kā noklusējuma pārlūku.</translation>
-<translation id="8677922833187616101">Vienmēr rādīt Google MI režīma saīsni</translation>
 <translation id="8697124171261953979">Tas nosaka arī to, kāda lapa tiks rādīta, kad atvērsiet pārlūku Chromium vai meklēsiet, izmantojot universālo lodziņu.</translation>
 <translation id="8704119203788522458">Šis ir jūsu Chromium</translation>
 <translation id="8712637175834984815">Sapratu!</translation>
diff --git a/chrome/app/resources/chromium_strings_mk.xtb b/chrome/app/resources/chromium_strings_mk.xtb
index 1f4ceea..dee2d8d 100644
--- a/chrome/app/resources/chromium_strings_mk.xtb
+++ b/chrome/app/resources/chromium_strings_mk.xtb
@@ -155,7 +155,6 @@
 <translation id="2718390899429598676">За дополнителна безбедност, Chromium ќе ги шифрира вашите податоци.</translation>
 <translation id="2721354645805494590">Одјавете се за да се отстрани вашата сметка на Google од Chromium</translation>
 <translation id="2722636413143664436">За да ги добиете лозинките, обележувачите и друго на сите ваши уреди, најавете се на Chromium</translation>
-<translation id="2723860029395667894">Секогаш прикажувај ја кратенката за „AI-режим“ на Google</translation>
 <translation id="2738871930057338499">Не може да се поврзе на интернет. HTTP-грешка 403: забранет пристап. Проверете ја вашата конфигурација на прокси.</translation>
 <translation id="2753623023919742414">Кликнете за да пребарате</translation>
 <translation id="2768103863314748511">Поставете го Chromium како стандарден PDF-прикажувач</translation>
@@ -180,6 +179,7 @@
 <translation id="2977506796191543575">Ако некој сајт се обиде да ви ја украде лозинката или кога ќе преземете штетна датотека, Chromium може да испрати и URL-адреси, вклучувајќи и делови од содржините на страницата, во „Безбедно прелистување“</translation>
 <translation id="2981563588585023386">За поголема безбедност онлајн со изборите на твојот родител, најави се на Chromium</translation>
 <translation id="3003694935412297923">Сите задачи</translation>
+<translation id="3012615494352020668">{count,plural, =1{Chromium треба да потврди дека сте вие пред да може да се зачуваат некои податоци во вашата сметка на Google и да се користат на сите ваши уреди. Ако се одјавите сега, податоциве (1 ставка) ќе се избришат.}one{Chromium треба да потврди дека сте вие пред да може да се зачуваат некои податоци во вашата сметка на Google и да се користат на сите ваши уреди. Ако се одјавите сега, податоциве ({count} ставка) ќе се избришат.}other{Chromium треба да потврди дека сте вие пред да може да се зачуваат некои податоци во вашата сметка на Google и да се користат на сите ваши уреди. Ако се одјавите сега, податоциве ({count} ставки) ќе се избришат.}}</translation>
 <translation id="3013473503895162900"><ph name="URL" /> ќе се отвори во нова картичка во Chromium.</translation>
 <translation id="3032706164202344641">Chromium не може да ги провери вашите лозинки. Обидете се пак подоцна.</translation>
 <translation id="3032787606318309379">Се додава на Chromium...</translation>
@@ -496,6 +496,7 @@
 <translation id="6729124504294600478">За да добиете персонализација и други функции, опфатете го Chromium во „Активноста на интернет и апликации“ и поврзаните услуги на Google</translation>
 <translation id="6734291798041940871">Chromium веќе е инсталиран за сите корисници на вашиот компјутер.</translation>
 <translation id="6751374565094704799">Ги забрзува сајтовите со пребарувачот V8 на Chromium, но го прави Chromium малку понеотпорен на напади. Поставкава е вклучена.</translation>
+<translation id="6754665438209053659">{count,plural, =1{Некои од вашите податоци од Chromium сѐ уште не се зачувани во вашата сметка на Google. Почекајте неколку минути пред да се одјавите. Ако се одјавите сега, податоциве (1 ставка) ќе се избришат.}one{Некои од вашите податоци од Chromium сѐ уште не се зачувани во вашата сметка на Google. Почекајте неколку минути пред да се одјавите. Ако се одјавите сега, податоциве ({count} ставка) ќе се избришат.}other{Некои од вашите податоци од Chromium сѐ уште не се зачувани во вашата сметка на Google. Почекајте неколку минути пред да се одјавите. Ако се одјавите сега, податоциве ({count} ставки) ќе се избришат.}}</translation>
 <translation id="67706546131546258">Chromium препорачува скенирање на датотекава бидејќи можеби е опасна.</translation>
 <translation id="6779406956731413166">Chromium OS е овозможен со дополнителен <ph name="BEGIN_LINK_CROS_OSS" />софтвер со отворен код<ph name="END_LINK_CROS_OSS" />.</translation>
 <translation id="6831043979455480757">Преведи</translation>
@@ -650,7 +651,6 @@
 <translation id="8619360774459241877">Се стартува Chromium…</translation>
 <translation id="8624541899164515475">Поставки, се отвора во нова картичка.</translation>
 <translation id="8648201657708811153">Google Chrome for Testing не може да се направи да биде ваш стандарден прелистувач.</translation>
-<translation id="8677922833187616101">Секогаш прикажувај ја кратенката за „AI-режим“ на Google</translation>
 <translation id="8697124171261953979">Контролира и која страница се прикажува кога го стартувате Chromium или ако пребарувате од лентата за адреси.</translation>
 <translation id="8704119203788522458">Ова е вашиот Chromium</translation>
 <translation id="8712637175834984815">Сфатив</translation>
diff --git a/chrome/app/resources/chromium_strings_ml.xtb b/chrome/app/resources/chromium_strings_ml.xtb
index 09437d09..4bfbbdb 100644
--- a/chrome/app/resources/chromium_strings_ml.xtb
+++ b/chrome/app/resources/chromium_strings_ml.xtb
@@ -155,7 +155,6 @@
 <translation id="2718390899429598676">അധിക സുരക്ഷക്കായി, Chromium നിങ്ങളുടെ ഡാറ്റ എന്‍‌ക്രിപ്റ്റ് ചെയ്യും.</translation>
 <translation id="2721354645805494590">Chromium-ൽ നിന്ന് നിങ്ങളുടെ Google Account നീക്കം ചെയ്യാൻ, സൈൻ ഔട്ട് ചെയ്യുക</translation>
 <translation id="2722636413143664436">പാസ്‌വേഡുകളും ബുക്ക്‌മാർക്കുകളും മറ്റും നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും ലഭിക്കാൻ Chromium-ലേക്ക് സൈൻ ഇൻ ചെയ്യുക</translation>
-<translation id="2723860029395667894">എല്ലായ്‌പ്പോഴും Google AI മോഡ് കുറുക്കുവഴി കാണിക്കുക</translation>
 <translation id="2738871930057338499">ഇന്റർനെറ്റിലേക്ക് കണക്റ്റ് ചെയ്യാനാകുന്നില്ല. HTTP 403 നിരോധിച്ചിരിക്കുന്നു. നിങ്ങളുടെ പ്രോക്‌സി കോൺഫിഗറേഷൻ പരിശോധിക്കുക.</translation>
 <translation id="2753623023919742414">തിരയാൻ ക്ലിക്ക് ചെയ്യുക</translation>
 <translation id="2768103863314748511">Chromium നിങ്ങളുടെ ഡിഫോൾട്ട് PDF വ്യൂവറായി സജ്ജീകരിക്കുക</translation>
@@ -180,6 +179,7 @@
 <translation id="2977506796191543575">ഒരു സൈറ്റ് നിങ്ങളുടെ പാസ്‌വേഡ് മോഷ്‌ടിക്കാൻ ശ്രമിക്കുകയോ നിങ്ങൾ ദോഷകരമായ ഒരു ഫയൽ ഡൗൺലോഡ് ചെയ്യുകയോ ആണെങ്കിൽ, പേജ് ഉള്ളടക്കത്തിന്റെ ബിറ്റുകൾ ഉൾപ്പെടെ URL-കളും സുരക്ഷിത ബ്രൗസിംഗിലേക്ക് Chromium അയച്ചേക്കാം</translation>
 <translation id="2981563588585023386">നിങ്ങളുടെ രക്ഷിതാവിന്റെ ചോയ്‌സുകൾ ഉപയോഗിച്ച് ഓൺലൈനിൽ സുരക്ഷിതരായിരിക്കാൻ, Chromium-ലേക്ക് സൈൻ ഇൻ ചെയ്യുക</translation>
 <translation id="3003694935412297923">എല്ലാ ടാസ്‌ക്കുകളും</translation>
+<translation id="3012615494352020668">{count,plural, =1{നിങ്ങളുടെ Google Account-ൽ ചില ഡാറ്റ സംരക്ഷിക്കുന്നതിനും അത് നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും ഉപയോഗിക്കുന്നതിനും മുമ്പ് ഇത് നിങ്ങൾ തന്നെയാണെന്ന് Chromium-ന് പരിശോധിച്ചുറപ്പിക്കേണ്ടതുണ്ട്. നിങ്ങൾ ഇപ്പോൾ സൈൻ ഔട്ട് ചെയ്താൽ, ഈ ഡാറ്റ (1 ഇനം) ഇല്ലാതാക്കും.}other{നിങ്ങളുടെ Google Account-ൽ ചില ഡാറ്റ സംരക്ഷിക്കുന്നതിനും അത് നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും ഉപയോഗിക്കുന്നതിനും മുമ്പ് ഇത് നിങ്ങൾ തന്നെയാണെന്ന് Chromium-ന് പരിശോധിച്ചുറപ്പിക്കേണ്ടതുണ്ട്. നിങ്ങൾ ഇപ്പോൾ സൈൻ ഔട്ട് ചെയ്താൽ ഈ ഡാറ്റ ({count} ഇനങ്ങൾ) ഇല്ലാതാക്കും.}}</translation>
 <translation id="3013473503895162900">Chromium-ലെ പുതിയ ടാബിൽ <ph name="URL" /> തുറക്കുക.</translation>
 <translation id="3032706164202344641">Chromium-ന് നിങ്ങളുടെ പാസ്‌വേഡുകൾ പരിശോധിക്കാനാവുന്നില്ല. പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</translation>
 <translation id="3032787606318309379">Chromium-ലേക്ക് ചേർക്കുന്നു...</translation>
@@ -496,6 +496,7 @@
 <translation id="6729124504294600478">വ്യക്തിപരമാക്കലും മറ്റ് ഫീച്ചറുകളും ലഭിക്കാൻ, വെബ്, ആപ്പ് ആക്റ്റിവിറ്റിയിലും ലിങ്ക് ചെയ്‌ത Google സേവനങ്ങളിലും Chromium ഉൾപ്പെടുത്തുക</translation>
 <translation id="6734291798041940871">നിങ്ങളുടെ കമ്പ്യൂട്ടറിലെ എല്ലാ ഉപയോക്താക്കൾക്കുമായി നിലവിൽ Chromium ഇൻസ്റ്റാൾ ചെയ്‌തിട്ടുണ്ട്.</translation>
 <translation id="6751374565094704799">Chromium-ന്റെ V8 എഞ്ചിൻ ഉപയോഗിച്ച് സൈറ്റുകളുടെ വേഗത കൂട്ടുന്നു, എന്നാൽ ആക്രമണങ്ങൾക്കെതിരായി Chromium-ന്റെ പ്രതിരോധം അൽപ്പം കുറയ്ക്കുന്നു. ഈ ക്രമീകരണം ഓണാണ്.</translation>
+<translation id="6754665438209053659">{count,plural, =1{നിങ്ങളുടെ Chromium ഡാറ്റയിൽ ചിലത് ഇതുവരെ നിങ്ങളുടെ Google Account-ൽ സംരക്ഷിച്ചിട്ടില്ല. സൈൻ ഔട്ട് ചെയ്യുന്നതിന് മുമ്പ് അൽപ്പസമയം കാത്തിരിക്കുക. നിങ്ങൾ ഇപ്പോൾ സൈൻ ഔട്ട് ചെയ്താൽ, ഈ ഡാറ്റ (1 ഇനം) ഇല്ലാതാക്കും.}other{നിങ്ങളുടെ Chromium ഡാറ്റയിൽ ചിലത് ഇതുവരെ നിങ്ങളുടെ Google Account-ൽ സംരക്ഷിച്ചിട്ടില്ല. സൈൻ ഔട്ട് ചെയ്യുന്നതിന് മുമ്പ് അൽപ്പസമയം കാത്തിരിക്കുക. നിങ്ങൾ ഇപ്പോൾ സൈൻ ഔട്ട് ചെയ്താൽ ഈ ഡാറ്റ ({count} ഇനങ്ങൾ) ഇല്ലാതാക്കും.}}</translation>
 <translation id="67706546131546258">ഈ ഫയൽ അപകടകരമാകാൻ സാധ്യതയുള്ളതിനാൽ ഇത് സ്‌കാൻ ചെയ്യാൻ Chromium നിർദ്ദേശിക്കുന്നു.</translation>
 <translation id="6779406956731413166">ChromiumOS സാധ്യമാക്കിയത് അധിക <ph name="BEGIN_LINK_CROS_OSS" />ഓപ്പൺ സോഴ്‌സ് സോഫ്റ്റ്‌വെയർ<ph name="END_LINK_CROS_OSS" /> ഉപയോഗിച്ചാണ്.</translation>
 <translation id="6831043979455480757">വിവർത്തനം ചെയ്യുക</translation>
@@ -650,7 +651,6 @@
 <translation id="8619360774459241877">Chromium സമാരംഭിക്കുന്നു...</translation>
 <translation id="8624541899164515475">ക്രമീകരണം, പുതിയ ടാബിൽ തുറക്കുന്നു.</translation>
 <translation id="8648201657708811153">Google Chrome for Testing നിങ്ങളുടെ ഡിഫോൾട്ട് ബ്രൗസറാക്കാനാകില്ല.</translation>
-<translation id="8677922833187616101">എല്ലായ്‌പ്പോഴും Google AI മോഡ് കുറുക്കുവഴി കാണിക്കുക</translation>
 <translation id="8697124171261953979">നിങ്ങൾ Chromium ആരംഭിക്കുമ്പോൾ അല്ലെങ്കിൽ ഓമ്‌നിബോക്‌സിൽ നിന്ന് തിരയുമ്പോൾ ദൃശ്യമാകുന്ന പേജും അത് നിയന്ത്രിയ്ക്കുന്നു.</translation>
 <translation id="8704119203788522458">ഇത് നിങ്ങളുടെ Chromium ആണ്</translation>
 <translation id="8712637175834984815">മനസ്സിലായി</translation>
diff --git a/chrome/app/resources/chromium_strings_mn.xtb b/chrome/app/resources/chromium_strings_mn.xtb
index 6e6bede8..3b9a2dff 100644
--- a/chrome/app/resources/chromium_strings_mn.xtb
+++ b/chrome/app/resources/chromium_strings_mn.xtb
@@ -155,7 +155,6 @@
 <translation id="2718390899429598676">Таны аюулгүй байдлыг сайжруулахын тулд Chromium таны өгөгдлийг шифрлэх болно.</translation>
 <translation id="2721354645805494590">Google Бүртгэлээ Chromium-с хасахын тулд гарна уу</translation>
 <translation id="2722636413143664436">Нууц үг, хавчуурга болон бусад зүйлээ бүх төхөөрөмж дээрээ авахын тулд Chromium-д нэвтэрнэ үү</translation>
-<translation id="2723860029395667894">Google-н ХОУ-ы горимын товчлолыг үргэлж харуулах</translation>
 <translation id="2738871930057338499">Интернэтэд холбогдох боломжгүй байна. HTTP 403 хориотой. Прокси тохируулгаа шалгана уу.</translation>
 <translation id="2753623023919742414">Хайхын тулд товшино уу</translation>
 <translation id="2768103863314748511">Chromium-г өгөгдмөл PDF үзэгчээрээ тохируулах</translation>
@@ -180,6 +179,7 @@
 <translation id="2977506796191543575">Хэрэв сайт таны нууц үгийг хулгайлахаар оролдох эсвэл таныг аюултай файл татах үед Chromium URL-г хуудасны бага зэрэг контентын хамт Аюулгүй үзэх рүү мөн илгээж болзошгүй</translation>
 <translation id="2981563588585023386">Эцэг эхийнхээ сонголтуудаар онлайн орчинд илүү аюулгүй байхын тулд Chromium-д нэвтэрнэ үү</translation>
 <translation id="3003694935412297923">Бүх ажил</translation>
+<translation id="3012615494352020668">{count,plural, =1{Зарим өгөгдлийг таны Google Бүртгэлд хадгалж, бүх төхөөрөмж дээр тань ашиглах боломжтой болохын өмнө Chromium таныг мөн болохыг баталгаажуулах шаардлагатай байна. Хэрэв та одоо гарвал энэ өгөгдлийг (1 зүйл) устгана.}other{Зарим өгөгдлийг таны Google Бүртгэлд хадгалж, бүх төхөөрөмж дээр тань ашиглах боломжтой болохын өмнө Chromium таныг мөн болохыг баталгаажуулах шаардлагатай байна. Хэрэв та одоо гарвал энэ өгөгдлийг ({count} зүйл) устгана.}}</translation>
 <translation id="3013473503895162900"><ph name="URL" />-г Chromium-д шинэ табд нээнэ үү.</translation>
 <translation id="3032706164202344641">Chromium таны нууц үгсийг шалгах боломжгүй байна. Дараа дахин оролдоно уу.</translation>
 <translation id="3032787606318309379">Chromium-д өгөгдөл нэмэх нь ...</translation>
@@ -494,6 +494,7 @@
 <translation id="6729124504294600478">Хувийн болгох болон бусад онцлогийг авахын тулд Chromium-г Веб, аппын үйл ажиллагаа болон Google-н холбосон үйлчилгээнүүдэд оруулна уу</translation>
 <translation id="6734291798041940871">Chromium-г таны компьютерийн бүх хэрэглэгчид суулгасан байна.</translation>
 <translation id="6751374565094704799">Chromium-н V8 системээр сайтыг хурдасгах ч Chromium-г халдлагад арай тэсвэр багатай болгоно. Энэ тохиргоо асаалттай байна.</translation>
+<translation id="6754665438209053659">{count,plural, =1{Таны Chromium-н зарим өгөгдлийг Google Бүртгэлд тань хараахан хадгалаагүй байна. Гарахаасаа өмнө хэдэн минут хүлээж үзнэ үү. Хэрэв та одоо гарвал энэ өгөгдлийг (1 зүйл) устгана.}other{Таны Chromium-н зарим өгөгдлийг Google Бүртгэлд тань хараахан хадгалаагүй байна. Гарахаасаа өмнө хэдэн минут хүлээж үзнэ үү. Хэрэв та одоо гарвал энэ өгөгдлийг ({count} зүйл) устгана.}}</translation>
 <translation id="67706546131546258">Энэ файл аюултай байж магадгүй тул Chromium үүнийг скан хийхийг зөвлөж байна.</translation>
 <translation id="6779406956731413166">ChromiumOS-г нэмэлт <ph name="BEGIN_LINK_CROS_OSS" />нээлттэй эх кодын программ хангамжаар<ph name="END_LINK_CROS_OSS" /> боломжтой болгосон.</translation>
 <translation id="6831043979455480757">Хөрвүүлэх</translation>
@@ -646,7 +647,6 @@
 <translation id="8619360774459241877">Chromium-г эхлүүлж байна...</translation>
 <translation id="8624541899164515475">Тохиргоо, шинэ табд нээгдэнэ.</translation>
 <translation id="8648201657708811153">Google Chrome for Testing-г өгөгдмөл хөтчөө болгох боломжгүй.</translation>
-<translation id="8677922833187616101">Google-н ХОУ-ы горимын товчлолыг үргэлж харуулах</translation>
 <translation id="8697124171261953979">Энэ нь мөн таныг Chromium-ыг эхлүүлж байх үед эсвэл Omnibox-аас хайлт хийж буй үед гарч ирдэг хуудсыг хянаж байдаг.</translation>
 <translation id="8704119203788522458">Энэ бол таны Chromium.</translation>
 <translation id="8712637175834984815">Ойлголоо</translation>
diff --git a/chrome/app/resources/chromium_strings_mr.xtb b/chrome/app/resources/chromium_strings_mr.xtb
index 88f2519..01057342 100644
--- a/chrome/app/resources/chromium_strings_mr.xtb
+++ b/chrome/app/resources/chromium_strings_mr.xtb
@@ -154,7 +154,6 @@
 <translation id="2718390899429598676">अतिरिक्त सुरक्षिततेसाठी, Chromium तुमचा डेटा एंक्रिप्ट करेल.</translation>
 <translation id="2721354645805494590">Chromium मधून तुमचे Google खाते काढून टाकण्यासाठी, साइन आउट करा</translation>
 <translation id="2722636413143664436">तुमच्या सर्व डिव्हाइसवर तुमचे पासवर्ड, बुकमार्क आणि आणखी बरेच काही मिळवण्यासाठी, Chromium मध्ये साइन इन करा</translation>
-<translation id="2723860029395667894">Google AI मोड शॉर्टकट नेहमी दाखवा</translation>
 <translation id="2738871930057338499">इंटरनेटशी कनेक्ट करता आले नाही. HTTP 403 प्रतिबंधित. कृपया तुमचे प्रॉक्सी कॉन्फिगरेशन तपासा.</translation>
 <translation id="2753623023919742414">शोधण्यासाठी क्लिक करा</translation>
 <translation id="2768103863314748511">Chromium ला तुमचा डीफॉल्ट PDF व्ह्यूअर म्हणून सेट करा</translation>
@@ -649,7 +648,6 @@
 <translation id="8619360774459241877">Chromium लाँच करत आहे...</translation>
 <translation id="8624541899164515475">सेटिंग्ज, नवीन टॅबमध्ये उघडते.</translation>
 <translation id="8648201657708811153">Google Chrome for Testing ला तुमचा डीफॉल्ट ब्राउझर बनवू शकत नाही.</translation>
-<translation id="8677922833187616101">Google AI मोड शॉर्टकट नेहमी दाखवा</translation>
 <translation id="8697124171261953979">तुम्ही Chromium सुरू करता किंवा तुम्ही ओम्निबॉक्समधून शोध घेता तेव्हा कोणते पेज दाखवावे हेदेखील ते नियंत्रित करते.</translation>
 <translation id="8704119203788522458">हे तुमचे Chromium आहे</translation>
 <translation id="8712637175834984815">समजले</translation>
diff --git a/chrome/app/resources/chromium_strings_ms.xtb b/chrome/app/resources/chromium_strings_ms.xtb
index 4650572..612cbc91 100644
--- a/chrome/app/resources/chromium_strings_ms.xtb
+++ b/chrome/app/resources/chromium_strings_ms.xtb
@@ -153,7 +153,6 @@
 <translation id="2718390899429598676">Untuk keselamatan tambahan, Chromium akan menyulitkan data anda.</translation>
 <translation id="2721354645805494590">Untuk mengalih keluar Google Account anda daripada Chromium, log keluar</translation>
 <translation id="2722636413143664436">Untuk mendapatkan kata laluan dan penanda halaman anda serta pelbagai lagi pada semua peranti anda, log masuk ke Chromium</translation>
-<translation id="2723860029395667894">Sentiasa paparkan pintasan AI Mode Google</translation>
 <translation id="2738871930057338499">Tidak dapat disambungkan kepada Internet. HTTP 403 Dilarang. Sila semak konfigurasi proksi anda.</translation>
 <translation id="2753623023919742414">Klik untuk mencari</translation>
 <translation id="2768103863314748511">Tetapkan Chromium sebagai alat lihat PDF lalai anda</translation>
@@ -650,7 +649,6 @@
 <translation id="8619360774459241877">Melancarkan Chromium...</translation>
 <translation id="8624541899164515475">Tetapan, dibuka dalam tab baharu.</translation>
 <translation id="8648201657708811153">Google Chrome for Testing tidak boleh dijadikan penyemak imbas lalai anda.</translation>
-<translation id="8677922833187616101">Sentiasa Paparkan Pintasan AI Mode Google</translation>
 <translation id="8697124171261953979">Sambungan turut mengawal halaman yang ditunjukkan apabila anda memulakan Chromium atau membuat carian dari Kotak Omni.</translation>
 <translation id="8704119203788522458">Ini Chromium anda</translation>
 <translation id="8712637175834984815">Faham</translation>
diff --git a/chrome/app/resources/chromium_strings_my.xtb b/chrome/app/resources/chromium_strings_my.xtb
index 69ab6ab..fcaf146 100644
--- a/chrome/app/resources/chromium_strings_my.xtb
+++ b/chrome/app/resources/chromium_strings_my.xtb
@@ -156,7 +156,6 @@
 <translation id="2718390899429598676">လုံခြုံမှု ပိုမိုရှိစေရန်၊ Chromium သည် သင့်ဒေတာအား လျှို့ဝှက်အသွင်ပြောင်းမည် ဖြစ်၏။</translation>
 <translation id="2721354645805494590">သင့် Google Account ကို Chromium မှ ဖယ်ရှားရန် ထွက်ပါ</translation>
 <translation id="2722636413143664436">သင့်စက်အားလုံးတွင် စကားဝှက်၊ ဝဘ်လိပ်စာ စသည်တို့ကို ရယူရန် Chromium သို့ လက်မှတ်ထိုးဝင်ပါ</translation>
-<translation id="2723860029395667894">‘Google AI မုဒ်’ ဖြတ်လမ်းလင့်ခ်ကို အမြဲပြပါ</translation>
 <translation id="2738871930057338499">အင်တာနက် ချိတ်ဆက်၍ မရပါ။ တားမြစ်ထားသည့်အမှား HTTP 403။ သင့်ပရောက်စီ စီစဉ်သတ်မှတ်ချက်ကို စစ်ဆေးပါ။</translation>
 <translation id="2753623023919742414">ရှာဖွေရန် နှိပ်ပါ</translation>
 <translation id="2768103863314748511">Chromium ကို သင်၏ မူရင်း PDF ကြည့်ရှုစနစ်အဖြစ် သတ်မှတ်နိုင်သည်</translation>
@@ -652,7 +651,6 @@
 <translation id="8619360774459241877">Chromium ကို ဖွင့်နေသည်...</translation>
 <translation id="8624541899164515475">ဆက်တင်များ၊ တဘ်အသစ်တွင် ဖွင့်သည်။</translation>
 <translation id="8648201657708811153">Google Chrome for Testing ကို သင့်မူရင်းဘရောင်ဇာအဖြစ် မပြုလုပ်နိုင်ပါ။</translation>
-<translation id="8677922833187616101">‘Google AI မုဒ်’ ဖြတ်လမ်းလင့်ခ်ကို အမြဲပြပါ</translation>
 <translation id="8697124171261953979">It also controls what page is shown when you start Chromium or search from the Omnibox.</translation>
 <translation id="8704119203788522458">ဒါဟာ သင်၏ Chromium ပါ</translation>
 <translation id="8712637175834984815">ရပါပြီ!</translation>
diff --git a/chrome/app/resources/chromium_strings_ne.xtb b/chrome/app/resources/chromium_strings_ne.xtb
index f5f5429..765e1fc 100644
--- a/chrome/app/resources/chromium_strings_ne.xtb
+++ b/chrome/app/resources/chromium_strings_ne.xtb
@@ -155,7 +155,6 @@
 <translation id="2718390899429598676">थप गरिएको सुरक्षाका लागि क्रोमियमले तपाईँको डेटा इन्क्रिप्ट गर्ने छ।</translation>
 <translation id="2721354645805494590">Chromium बाट आफ्नो Google खाता हटाउन साइन आउट गर्नुहोस्</translation>
 <translation id="2722636413143664436">आफ्ना सबै डिभाइसमा आफ्ना पासवर्ड र बुकमार्कलगायतका थप कुराहरू प्राप्त गर्न Chromium मा साइन इन गर्नुहोस्</translation>
-<translation id="2723860029395667894">Google AI मोडको सर्टकट सधैँ देखाउनुहोस्</translation>
 <translation id="2738871930057338499">इन्टरनेटमा कनेक्ट गर्न सकिएन। HTTP ४०३ निषेधित। कृपया आफ्नो प्रोक्सी कन्फिगुरेसन जाँच्नुहोस्।</translation>
 <translation id="2753623023919742414">खोज्न क्लिक गर्नुहोस्</translation>
 <translation id="2768103863314748511">Chromium लाई आफ्नो डिफल्ट PDF भ्युअर बनाउनुहोस्</translation>
@@ -648,7 +647,6 @@
 <translation id="8619360774459241877">Chromium सुरु गर्दै…</translation>
 <translation id="8624541899164515475">सेटिङ, नयाँ ट्याबमा खुल्छ।</translation>
 <translation id="8648201657708811153">Google Chrome for Testing लाई तपाईंको डिफल्ट ब्राउजर बनाउन मिल्दैन।</translation>
-<translation id="8677922833187616101">Google AI मोडको सर्टकट सधैँ देखाउनुहोस्</translation>
 <translation id="8697124171261953979">तपाइँले Chromium सुरु गर्दा वा ओम्निबाकसबाट खोज्दा कुन पृष्ठ देखाउँछ भनेर पनि यसले नियन्त्रण गर्छ।</translation>
 <translation id="8704119203788522458">यो तपाइँको Chromium हो</translation>
 <translation id="8712637175834984815">भयो</translation>
diff --git a/chrome/app/resources/chromium_strings_nl.xtb b/chrome/app/resources/chromium_strings_nl.xtb
index 3c88a74..6a1f6c6 100644
--- a/chrome/app/resources/chromium_strings_nl.xtb
+++ b/chrome/app/resources/chromium_strings_nl.xtb
@@ -154,7 +154,6 @@
 <translation id="2718390899429598676">Je gegevens worden voor extra beveiliging door Chromium gecodeerd.</translation>
 <translation id="2721354645805494590">Log uit om je Google-account uit Chromium te verwijderen</translation>
 <translation id="2722636413143664436">Log in bij Chromium om onder andere je wachtwoorden en bookmarks te gebruiken op al je apparaten</translation>
-<translation id="2723860029395667894">Snelkoppeling voor AI-modus van Google altijd tonen</translation>
 <translation id="2738871930057338499">Kan geen verbinding maken met internet. HTTP 403 Verboden. Check je proxyconfiguratie.</translation>
 <translation id="2753623023919742414">Klik om te zoeken</translation>
 <translation id="2768103863314748511">Chromium instellen als standaard pdf-viewer</translation>
@@ -649,7 +648,6 @@
 <translation id="8619360774459241877">Chromium starten…</translation>
 <translation id="8624541899164515475">Instellingen, wordt geopend in een nieuw tabblad.</translation>
 <translation id="8648201657708811153">Google Chrome for Testing kan niet worden ingesteld als je standaardbrowser.</translation>
-<translation id="8677922833187616101">Snelkoppeling voor AI-modus van Google altijd tonen</translation>
 <translation id="8697124171261953979">Hiermee wordt ook gecontroleerd welke pagina wordt getoond wanneer je Chromium start of vanuit de omnibox zoekt.</translation>
 <translation id="8704119203788522458">Personaliseer jouw Chromium</translation>
 <translation id="8712637175834984815">Begrepen</translation>
diff --git a/chrome/app/resources/chromium_strings_no.xtb b/chrome/app/resources/chromium_strings_no.xtb
index c2fb600..26a333d4 100644
--- a/chrome/app/resources/chromium_strings_no.xtb
+++ b/chrome/app/resources/chromium_strings_no.xtb
@@ -153,7 +153,6 @@
 <translation id="2718390899429598676">Chromium krypterer dataene dine for å øke sikkerheten.</translation>
 <translation id="2721354645805494590">For å fjerne Google-kontoen din fra Chromium, logg av</translation>
 <translation id="2722636413143664436">For å få passordene og bokmerkene dine med mer på alle enhetene dine, logg på Chromium</translation>
-<translation id="2723860029395667894">Vis alltid snarveien til AI-modus fra Google</translation>
 <translation id="2738871930057338499">Kan ikke koble til internett. HTTP 403 – forbudt. Kontroller proxy-tjenerkonfigurasjonen.</translation>
 <translation id="2753623023919742414">Klikk for å søke</translation>
 <translation id="2768103863314748511">Angi Chromium som standard PDF-leser</translation>
@@ -178,6 +177,7 @@
 <translation id="2977506796191543575">Hvis nettsteder prøver å stjele passordet ditt, eller når du laster ned skadelige filer, kan Chromium også sende nettadresser, inkludert deler av sideinnholdet, til Safe Browsing</translation>
 <translation id="2981563588585023386">For å holde deg tryggere på nettet med innstillingene som forelderen din har valgt, logg på Chromium</translation>
 <translation id="3003694935412297923">Alle gjøremål</translation>
+<translation id="3012615494352020668">{count,plural, =1{Chromium må bekrefte at det er deg, før enkelte data kan lagres i Google-kontoen din og brukes på alle enhetene dine. Hvis du logger av nå, slettes disse dataene (1 element).}other{Chromium må bekrefte at det er deg, før enkelte data kan lagres i Google-kontoen din og brukes på alle enhetene dine. Hvis du logger av nå, slettes disse dataene ({count} elementer).}}</translation>
 <translation id="3013473503895162900">Åpne <ph name="URL" /> i en ny fane i Chromium.</translation>
 <translation id="3032706164202344641">Chromium kan ikke sjekke passordene dine. Prøv på nytt senere.</translation>
 <translation id="3032787606318309379">Legger til i Chromium …</translation>
@@ -494,6 +494,7 @@
 <translation id="6729124504294600478">For å få personlig tilpasning og andre funksjoner må du inkludere Chromium i Nett- og appaktivitet og tilknyttede Google-tjenester</translation>
 <translation id="6734291798041940871">Chromium er allerede installert for alle brukerne på datamaskinen din.</translation>
 <translation id="6751374565094704799">Gjør nettsteder raskere med V8-motoren i Chromium, men gjør Chromium litt mindre motstandsdyktig mot angrep. Denne innstillingen er på.</translation>
+<translation id="6754665438209053659">{count,plural, =1{Noen av Chromium-dataene dine er ikke lagret i Google-kontoen din ennå. Prøv å vente i noen minutter før du logger av. Hvis du logger av nå, slettes disse dataene (1 element).}other{Noen av Chromium-dataene dine er ikke lagret i Google-kontoen din ennå. Prøv å vente i noen minutter før du logger av. Hvis du logger av nå, slettes disse dataene ({count} elementer).}}</translation>
 <translation id="67706546131546258">Chromium anbefaler å skanne denne filen ettersom den kan være farlig.</translation>
 <translation id="6779406956731413166">ChromiumOS er basert på <ph name="BEGIN_LINK_CROS_OSS" />tilleggsprogramvare med åpen kildekode<ph name="END_LINK_CROS_OSS" />.</translation>
 <translation id="6831043979455480757">Oversett</translation>
@@ -648,7 +649,6 @@
 <translation id="8619360774459241877">Starter Chromium ...</translation>
 <translation id="8624541899164515475">Innstillinger (åpnes i en ny fane).</translation>
 <translation id="8648201657708811153">Google Chrome for testing kan ikke brukes som standardnettleser.</translation>
-<translation id="8677922833187616101">Vis alltid snarveien til AI-modus fra Google</translation>
 <translation id="8697124171261953979">Den styrer også hvilken side som vises når du starter Chromium eller søker fra multifunksjonsfeltet.</translation>
 <translation id="8704119203788522458">Dette er din Chromium</translation>
 <translation id="8712637175834984815">Skjønner</translation>
diff --git a/chrome/app/resources/chromium_strings_or.xtb b/chrome/app/resources/chromium_strings_or.xtb
index 0e3aae1..5f3687b 100644
--- a/chrome/app/resources/chromium_strings_or.xtb
+++ b/chrome/app/resources/chromium_strings_or.xtb
@@ -154,7 +154,6 @@
 <translation id="2718390899429598676">ଅତିରିକ୍ତ ସୁରକ୍ଷା ପାଇଁ, Chromium ଆପଣଙ୍କର ଡାଟା ଏନ୍‍କ୍ରିପ୍ଟ କରିବ।</translation>
 <translation id="2721354645805494590">Chromiumରୁ ଆପଣଙ୍କ Google ଆକାଉଣ୍ଟକୁ କାଢ଼ି ଦେବା ପାଇଁ ସାଇନ ଆଉଟ କରନ୍ତୁ</translation>
 <translation id="2722636413143664436">ଆପଣଙ୍କର ସମସ୍ତ ଡିଭାଇସରେ ଆପଣଙ୍କ ପାସୱାର୍ଡ, ବୁକମାର୍କ ଏବଂ ଆହୁରି ଅନେକ କିଛି ପାଇବାକୁ Chromiumରେ ସାଇନ ଇନ କରନ୍ତୁ</translation>
-<translation id="2723860029395667894">ସର୍ବଦା Google AI ମୋଡ ସର୍ଟକଟ ଦେଖାନ୍ତୁ</translation>
 <translation id="2738871930057338499">ଇଣ୍ଟରନେଟ ସହ କନେକ୍ଟ କରିବାରେ ଅସମର୍ଥ। HTTP 403 ନିଷିଦ୍ଧ। ଦୟାକରି ଆପଣଙ୍କ ପ୍ରକ୍ସି କନଫିଗରେସନ ଯାଞ୍ଚ କରନ୍ତୁ।</translation>
 <translation id="2753623023919742414">ସର୍ଚ୍ଚ କରିବାକୁ କ୍ଲିକ କରନ୍ତୁ</translation>
 <translation id="2768103863314748511">Chromiumକୁ ଆପଣଙ୍କ ଡିଫଲ୍ଟ PDF ଭ୍ୟୁଅର ଭାବେ ସେଟ କରନ୍ତୁ</translation>
@@ -649,7 +648,6 @@
 <translation id="8619360774459241877">Chromium ଲଞ୍ଚ୍ ହେଉଛି...</translation>
 <translation id="8624541899164515475">ସେଟିଂସ, ନୂଆ ଟାବରେ ଖୋଲେ।</translation>
 <translation id="8648201657708811153">Google Chrome for Testingକୁ ଆପଣଙ୍କ ଡିଫଲ୍ଟ ବ୍ରାଉଜର କରାଯାଇପାରିବ ନାହିଁ।</translation>
-<translation id="8677922833187616101">ସର୍ବଦା Google AI ମୋଡ ସର୍ଟକଟ ଦେଖାନ୍ତୁ</translation>
 <translation id="8697124171261953979">ଯେତେବେଳେ ଆପଣ Chromium ଆରମ୍ଭ କରନ୍ତି କିମ୍ବା Omniboxରୁ ସର୍ଚ୍ଚ କରନ୍ତି, ସେତେବେଳେ କେଉଁ ପୃଷ୍ଠା ଦେଖାଯିବ ତାହା ମଧ୍ୟ ଏହା ନିୟନ୍ତ୍ରଣ କରେ।</translation>
 <translation id="8704119203788522458">ଏହା ହେଉଛି ଆପଣଙ୍କର Chromium</translation>
 <translation id="8712637175834984815">ବୁଝିଗଲି</translation>
diff --git a/chrome/app/resources/chromium_strings_pa.xtb b/chrome/app/resources/chromium_strings_pa.xtb
index 59ca1c5a..3196378 100644
--- a/chrome/app/resources/chromium_strings_pa.xtb
+++ b/chrome/app/resources/chromium_strings_pa.xtb
@@ -155,7 +155,6 @@
 <translation id="2718390899429598676">ਵਾਧੂ ਸੁਰੱਖਿਆ ਲਈ, Chromium ਤੁਹਾਡਾ ਡਾਟਾ ਐਨਕ੍ਰਿਪਟ ਕਰੇਗਾ।</translation>
 <translation id="2721354645805494590">Chromium ਤੋਂ ਆਪਣਾ Google ਖਾਤਾ ਹਟਾਉਣ ਲਈ, ਸਾਈਨ-ਆਊਟ ਕਰੋ</translation>
 <translation id="2722636413143664436">ਆਪਣੇ ਸਾਰੇ ਡੀਵਾਈਸਾਂ 'ਤੇ ਆਪਣੇ ਪਾਸਵਰਡ, ਬੁੱਕਮਾਰਕ ਅਤੇ ਹੋਰ ਬਹੁਤ ਕੁਝ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ, Chromium 'ਤੇ ਸਾਈਨ-ਇਨ ਕਰੋ</translation>
-<translation id="2723860029395667894">ਹਮੇਸ਼ਾਂ Google AI ਮੋਡ ਸ਼ਾਰਟਕੱਟ ਦਿਖਾਓ</translation>
 <translation id="2738871930057338499">ਇੰਟਰਨੈੱਟ ਨਾਲ ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। HTTP 403 ਪਾਬੰਦੀਸ਼ੁਦਾ। ਕਿਰਪਾ ਕਰਕੇ ਆਪਣੇ ਪ੍ਰੌਕਸੀ ਸੰਰੂਪਣ ਦੀ ਜਾਂਚ ਕਰੋ।</translation>
 <translation id="2753623023919742414">ਖੋਜਣ ਲਈ ਕਲਿੱਕ ਕਰੋ</translation>
 <translation id="2768103863314748511">Chromium ਨੂੰ ਆਪਣੇ ਪੂਰਵ ਨਿਰਧਾਰਿਤ PDF ਵਿਊਅਰ ਵਜੋਂ ਸੈੱਟ ਕਰੋ</translation>
@@ -180,6 +179,7 @@
 <translation id="2977506796191543575">ਜੇ ਕੋਈ ਸਾਈਟ ਤੁਹਾਡੇ ਪਾਸਵਰਡ ਨੂੰ ਚੋਰੀ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੀ ਹੈ ਜਾਂ ਜਦੋਂ ਤੁਸੀਂ ਕੋਈ ਨੁਕਸਾਨਦੇਹ ਫ਼ਾਈਲ ਡਾਊਨਲੋਡ ਕਰਦੇ ਹੋ, ਤਾਂ Chromium ਸੁਰੱਖਿਅਤ ਬ੍ਰਾਊਜ਼ਿੰਗ ਨੂੰ ਪੰਨੇ ਦੀ ਥੋੜ੍ਹੀ ਸਮੱਗਰੀ ਸਮੇਤ URL ਵੀ ਭੇਜ ਸਕਦਾ ਹੈ</translation>
 <translation id="2981563588585023386">ਆਪਣੇ ਮਾਂ-ਪਿਓ ਦੀ ਚੋਣ ਵਾਲੇ ਵਿਕਲਪਾਂ ਨਾਲ ਆਨਲਾਈਨ ਸੁਰੱਖਿਅਤ ਰਹਿਣ ਲਈ, Chromium ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰੋ</translation>
 <translation id="3003694935412297923">ਸਾਰੇ ਕਾਰਜ</translation>
+<translation id="3012615494352020668">{count,plural, =1{ਇਸ ਤੋਂ ਪਹਿਲਾਂ ਕਿ ਕੁਝ ਡਾਟੇ ਨੂੰ ਤੁਹਾਡੇ Google ਖਾਤੇ 'ਤੇ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾ ਸਕੇ ਅਤੇ ਤੁਹਾਡੇ ਸਾਰੇ ਡੀਵਾਈਸਾਂ 'ਤੇ ਵਰਤਿਆ ਜਾ ਸਕੇ, Chromium ਨੂੰ ਤੁਹਾਡੀ ਪਛਾਣ ਦੀ ਪੁਸ਼ਟੀ ਕਰਨ ਦੀ ਲੋੜ ਹੈ। ਜੇ ਤੁਸੀਂ ਹੁਣੇ ਸਾਈਨ-ਆਊਟ ਕਰਦੇ ਹੋ, ਤਾਂ ਇਸ ਡਾਟੇ (1 ਆਈਟਮ) ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।}one{ਇਸ ਤੋਂ ਪਹਿਲਾਂ ਕਿ ਕੁਝ ਡਾਟੇ ਨੂੰ ਤੁਹਾਡੇ Google ਖਾਤੇ 'ਤੇ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾ ਸਕੇ ਅਤੇ ਤੁਹਾਡੇ ਸਾਰੇ ਡੀਵਾਈਸਾਂ 'ਤੇ ਵਰਤਿਆ ਜਾ ਸਕੇ, Chromium ਨੂੰ ਤੁਹਾਡੀ ਪਛਾਣ ਦੀ ਪੁਸ਼ਟੀ ਕਰਨ ਦੀ ਲੋੜ ਹੈ। ਜੇ ਤੁਸੀਂ ਹੁਣੇ ਸਾਈਨ-ਆਊਟ ਕਰਦੇ ਹੋ, ਤਾਂ ਇਸ ਡਾਟੇ ({count} ਆਈਟਮ) ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।}other{ਇਸ ਤੋਂ ਪਹਿਲਾਂ ਕਿ ਕੁਝ ਡਾਟੇ ਨੂੰ ਤੁਹਾਡੇ Google ਖਾਤੇ 'ਤੇ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾ ਸਕੇ ਅਤੇ ਤੁਹਾਡੇ ਸਾਰੇ ਡੀਵਾਈਸਾਂ 'ਤੇ ਵਰਤਿਆ ਜਾ ਸਕੇ, Chromium ਨੂੰ ਤੁਹਾਡੀ ਪਛਾਣ ਦੀ ਪੁਸ਼ਟੀ ਕਰਨ ਦੀ ਲੋੜ ਹੈ। ਜੇ ਤੁਸੀਂ ਹੁਣੇ ਸਾਈਨ-ਆਊਟ ਕਰਦੇ ਹੋ, ਤਾਂ ਇਸ ਡਾਟੇ ({count} ਆਈਟਮਾਂ) ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।}}</translation>
 <translation id="3013473503895162900">Chromium ਵਿੱਚ <ph name="URL" /> ਨੂੰ ਨਵੀਂ ਟੈਬ ਵਿੱਚ ਖੋਲ੍ਹੋ।</translation>
 <translation id="3032706164202344641">Chromium ਤੁਹਾਡੇ ਪਾਸਵਰਡਾਂ ਦੀ ਜਾਂਚ ਨਹੀਂ ਕਰ ਸਕਦਾ। ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation>
 <translation id="3032787606318309379">Chromium ਵਿੱਚ ਜੋੜ ਰਿਹਾ ਹੈ...</translation>
@@ -496,6 +496,7 @@
 <translation id="6729124504294600478">ਵਿਅਕਤੀਗਤਕਰਨ ਅਤੇ ਹੋਰ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਲਈ, 'ਵੈੱਬ ਅਤੇ ਐਪ ਸਰਗਰਮੀ' ਅਤੇ ਲਿੰਕ ਕੀਤੀਆਂ Google ਸੇਵਾਵਾਂ ਵਿੱਚ Chromium ਸ਼ਾਮਲ ਕਰੋ</translation>
 <translation id="6734291798041940871">Chromium ਤੁਹਾਡੇ ਕੰਪਿਊਟਰ 'ਤੇ ਪਹਿਲਾਂ ਹੀ ਸਾਰੇ ਵਰਤੋਂਕਾਰਾਂ ਲਈ ਸਥਾਪਤ ਕੀਤਾ ਗਿਆ ਹੈ।</translation>
 <translation id="6751374565094704799">ਇਸ ਨਾਲ Chromium ਦੇ V8 ਇੰਜਣ ਨਾਲ ਸਾਈਟਾਂ ਦੀ ਗਤੀ ਵਧ ਜਾਂਦੀ ਹੈ, ਪਰ Chromium 'ਤੇ ਹਮਲਿਆਂ ਤੋਂ ਸੁਰੱਖਿਆ ਘਟ ਜਾਂਦੀ ਹੈ। ਇਹ ਸੈਟਿੰਗ ਚਾਲੂ ਹੈ।</translation>
+<translation id="6754665438209053659">{count,plural, =1{ਤੁਹਾਡੇ ਕੁਝ Chromium ਡਾਟੇ ਨੂੰ ਹਾਲੇ ਤੁਹਾਡੇ Google ਖਾਤੇ ਵਿੱਚ ਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤਾ ਗਿਆ ਹੈ। ਸਾਈਨ-ਆਊਟ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਕੁਝ ਮਿੰਟਾਂ ਦੀ ਉਡੀਕ ਕਰ ਕੇ ਦੇਖੋ। ਜੇ ਤੁਸੀਂ ਹੁਣੇ ਸਾਈਨ-ਆਊਟ ਕਰਦੇ ਹੋ, ਤਾਂ ਇਸ ਡਾਟੇ (1 ਆਈਟਮ) ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।}one{ਤੁਹਾਡੇ ਕੁਝ Chromium ਡਾਟੇ ਨੂੰ ਹਾਲੇ ਤੁਹਾਡੇ Google ਖਾਤੇ ਵਿੱਚ ਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤਾ ਗਿਆ ਹੈ। ਸਾਈਨ-ਆਊਟ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਕੁਝ ਮਿੰਟਾਂ ਦੀ ਉਡੀਕ ਕਰ ਕੇ ਦੇਖੋ। ਜੇ ਤੁਸੀਂ ਹੁਣੇ ਸਾਈਨ-ਆਊਟ ਕਰਦੇ ਹੋ, ਤਾਂ ਇਸ ਡਾਟੇ ({count} ਆਈਟਮ) ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।}other{ਤੁਹਾਡੇ ਕੁਝ Chromium ਡਾਟੇ ਨੂੰ ਹਾਲੇ ਤੁਹਾਡੇ Google ਖਾਤੇ ਵਿੱਚ ਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤਾ ਗਿਆ ਹੈ। ਸਾਈਨ-ਆਊਟ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਕੁਝ ਮਿੰਟਾਂ ਦੀ ਉਡੀਕ ਕਰ ਕੇ ਦੇਖੋ। ਜੇ ਤੁਸੀਂ ਹੁਣੇ ਸਾਈਨ-ਆਊਟ ਕਰਦੇ ਹੋ, ਤਾਂ ਇਸ ਡਾਟੇ ({count} ਆਈਟਮਾਂ) ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।}}</translation>
 <translation id="67706546131546258">Chromium ਵੱਲੋਂ ਇਸ ਫ਼ਾਈਲ ਨੂੰ ਸਕੈਨ ਕਰਨ ਦੀ ਸਿਫ਼ਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ ਕਿਉਂਕਿ ਇਹ ਹਾਨੀਕਾਰਕ ਹੋ ਸਕਦੀ ਹੈ।</translation>
 <translation id="6779406956731413166">ChromiumOS ਨੂੰ ਵਧੀਕ <ph name="BEGIN_LINK_CROS_OSS" />ਖੁੱਲ੍ਹੇ ਸਰੋਤ ਸਾਫ਼ਟਵੇਅਰ<ph name="END_LINK_CROS_OSS" /> ਕਰਕੇ ਸੰਭਵ ਬਣਾਇਆ ਗਿਆ ਹੈ।</translation>
 <translation id="6831043979455480757">ਅਨੁਵਾਦ ਕਰੋ</translation>
@@ -650,7 +651,6 @@
 <translation id="8619360774459241877">Chromium ਲਾਂਚ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ...</translation>
 <translation id="8624541899164515475">ਸੈਟਿੰਗਾਂ, ਨਵੀਂ ਟੈਬ ਵਿੱਚ ਖੁੱਲ੍ਹਦੀਆਂ ਹਨ।</translation>
 <translation id="8648201657708811153">Google Chrome for Testing ਨੂੰ ਤੁਹਾਡਾ ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਬ੍ਰਾਊਜ਼ਰ ਨਹੀਂ ਬਣਾਇਆ ਜਾ ਸਕਦਾ।</translation>
-<translation id="8677922833187616101">ਹਮੇਸ਼ਾਂ Google AI ਮੋਡ ਸ਼ਾਰਟਕੱਟ ਦਿਖਾਓ</translation>
 <translation id="8697124171261953979">ਇਹ ਇਸ ਨੂੰ ਵੀ ਕੰਟਰੋਲ ਕਰਦਾ ਹੈ ਕਿ ਜਦੋਂ ਤੁਸੀਂ Chromium ਨੂੰ ਸ਼ੁਰੂ ਕਰਦੇ ਜਾਂ ਓਮਨੀਬਾਕਸ ਤੋਂ ਖੋਜ ਕਰਦੇ ਹੋ।</translation>
 <translation id="8704119203788522458">ਇਹ ਤੁਹਾਡਾ Chromium ਹੈ</translation>
 <translation id="8712637175834984815">ਸਮਝ ਲਿਆ</translation>
diff --git a/chrome/app/resources/chromium_strings_pl.xtb b/chrome/app/resources/chromium_strings_pl.xtb
index 59fef7bd..357d2d55 100644
--- a/chrome/app/resources/chromium_strings_pl.xtb
+++ b/chrome/app/resources/chromium_strings_pl.xtb
@@ -152,7 +152,6 @@
 <translation id="2718390899429598676">Dla większego bezpieczeństwa Chromium szyfruje dane.</translation>
 <translation id="2721354645805494590">Aby usunąć konto Google z Chromium, wyloguj się</translation>
 <translation id="2722636413143664436">Aby mieć dostęp do haseł, zakładek oraz innych ustawień i danych na wszystkich swoich urządzeniach, zaloguj się w Chromium</translation>
-<translation id="2723860029395667894">Zawsze pokazuj skrót do trybu AI od Google</translation>
 <translation id="2738871930057338499">Nie można połączyć się z internetem. Kod HTTP 403 (Zabroniony). Sprawdź konfigurację proxy.</translation>
 <translation id="2753623023919742414">Kliknij, aby wyszukać</translation>
 <translation id="2768103863314748511">Ustaw Chromium jako domyślną przeglądarkę plików PDF</translation>
@@ -647,7 +646,6 @@
 <translation id="8619360774459241877">Uruchamiam Chromium…</translation>
 <translation id="8624541899164515475">Ustawienia, otwierają się w nowej karcie.</translation>
 <translation id="8648201657708811153">Google Chrome for Testing nie można ustawić jako przeglądarki domyślnej.</translation>
-<translation id="8677922833187616101">Zawsze pokazuj skrót do trybu AI od Google</translation>
 <translation id="8697124171261953979">Kontroluje także to, jaka strona wyświetla się po uruchomieniu Chromium lub wyszukiwaniu w omniboksie.</translation>
 <translation id="8704119203788522458">Oto Twoja przeglądarka Chromium</translation>
 <translation id="8712637175834984815">OK</translation>
diff --git a/chrome/app/resources/chromium_strings_pt-BR.xtb b/chrome/app/resources/chromium_strings_pt-BR.xtb
index ba0a785..2bcfa61 100644
--- a/chrome/app/resources/chromium_strings_pt-BR.xtb
+++ b/chrome/app/resources/chromium_strings_pt-BR.xtb
@@ -153,7 +153,6 @@
 <translation id="2718390899429598676">Para maior segurança, o Chromium criptografará seus dados.</translation>
 <translation id="2721354645805494590">Para remover sua Conta do Google do Chromium, saia dela</translation>
 <translation id="2722636413143664436">Para acessar suas senhas, favoritos e muito mais em todos os seus dispositivos, faça login no Chromium</translation>
-<translation id="2723860029395667894">Sempre mostrar o atalho do Modo IA do Google</translation>
 <translation id="2738871930057338499">Não foi possível conectar à Internet. HTTP 403 Proibido. Verifique sua configuração do proxy.</translation>
 <translation id="2753623023919742414">Clique para pesquisar</translation>
 <translation id="2768103863314748511">Defina o Chromium como seu leitor de PDF padrão</translation>
@@ -233,7 +232,7 @@
 <translation id="370962675267501463">{COUNT,plural, =0{Seu administrador pede que você reinicie o Chromium para que esta atualização seja feita.}=1{Seu administrador pede que você reinicie o Chromium para que esta atualização seja feita. Sua janela anônima não será aberta novamente.}one{Seu administrador pede que você reinicie o Chromium para que esta atualização seja feita. Sua janela anônima não será aberta novamente.}other{Seu administrador pede que você reinicie o Chromium para que esta atualização seja feita. Suas # janelas anônimas não serão abertas novamente.}}</translation>
 <translation id="3713809861844741608">Abrir link em nova &amp;guia do Chromium</translation>
 <translation id="3728124580182886854">Vincule o Chromium e outros Serviços do Google para personalização e outras finalidades</translation>
-<translation id="3729187154190517324">Aprofunde sua pesquisa adicionando várias guias, arquivos e ferramentas usando o botão "Adicione uma guia e muito mais".</translation>
+<translation id="3729187154190517324">Pressione o botão "Adicione uma guia e muito mais" e aprofunde sua pesquisa adicionando várias guias, arquivos e ferramentas.</translation>
 <translation id="3788675262216168505">Gerenciar perfis do Chromium</translation>
 <translation id="3790262771324122253">Saiba por que o Chromium bloqueia alguns downloads</translation>
 <translation id="379589255253486813">O Chromium vai informar se algo precisar ser revisado</translation>
@@ -642,7 +641,6 @@
 <translation id="8619360774459241877">Iniciando o Chromium…</translation>
 <translation id="8624541899164515475">Configurações, abre em uma nova guia.</translation>
 <translation id="8648201657708811153">O Google Chrome for Testing não pode ser definido como seu navegador padrão.</translation>
-<translation id="8677922833187616101">Sempre mostrar o atalho do Modo IA do Google</translation>
 <translation id="8697124171261953979">Controla também qual página deve ser exibida quando você inicia o Chromium ou faz uma pesquisa na Omnibox.</translation>
 <translation id="8704119203788522458">Este é seu Chromium</translation>
 <translation id="8712637175834984815">Entendi</translation>
diff --git a/chrome/app/resources/chromium_strings_pt-PT.xtb b/chrome/app/resources/chromium_strings_pt-PT.xtb
index 959a78c..9e530f1 100644
--- a/chrome/app/resources/chromium_strings_pt-PT.xtb
+++ b/chrome/app/resources/chromium_strings_pt-PT.xtb
@@ -153,7 +153,6 @@
 <translation id="2718390899429598676">Para uma segurança adicional, o Chromium encripta os seus dados.</translation>
 <translation id="2721354645805494590">Para remover a sua Conta Google do Chromium, termine sessão</translation>
 <translation id="2722636413143664436">Para aceder às suas palavras-passe, marcadores e muito mais em todos os seus dispositivos, inicie sessão no Chromium</translation>
-<translation id="2723860029395667894">Mostrar sempre o atalho do Modo IA da Google</translation>
 <translation id="2738871930057338499">Não é possível ligar à Internet. HTTP 403 proibido. Verifique a sua configuração de proxy.</translation>
 <translation id="2753623023919742414">Clique para pesquisar</translation>
 <translation id="2768103863314748511">Defina o Chromium como o seu visualizador de PDFs predefinido</translation>
@@ -650,7 +649,6 @@
 <translation id="8619360774459241877">A iniciar o Chromium…</translation>
 <translation id="8624541899164515475">Definições, abre num novo separador.</translation>
 <translation id="8648201657708811153">Não é possível tornar o Google Chrome for Testing o seu navegador predefinido.</translation>
-<translation id="8677922833187616101">Mostrar sempre o atalho do Modo IA da Google</translation>
 <translation id="8697124171261953979">Também controla a página apresentada quando inicia o Chromium ou pesquisa a partir da Caixa geral.</translation>
 <translation id="8704119203788522458">Este é o seu Chromium</translation>
 <translation id="8712637175834984815">OK</translation>
diff --git a/chrome/app/resources/chromium_strings_ro.xtb b/chrome/app/resources/chromium_strings_ro.xtb
index 1d996289..27cd082 100644
--- a/chrome/app/resources/chromium_strings_ro.xtb
+++ b/chrome/app/resources/chromium_strings_ro.xtb
@@ -153,7 +153,6 @@
 <translation id="2718390899429598676">Pentru un plus de securitate, Chromium îți va cripta datele.</translation>
 <translation id="2721354645805494590">Pentru a elimina Contul Google din Chromium, deconectează-te</translation>
 <translation id="2722636413143664436">Pentru a accesa parolele, marcajele și alte date pe toate dispozitivele, conectează-te la Chromium</translation>
-<translation id="2723860029395667894">Afișează întotdeauna comanda rapidă pentru Modul Google AI</translation>
 <translation id="2738871930057338499">Nu se poate realiza conexiunea la internet. HTTP Eroare 403 – Acces interzis. Verifică-ți configurația de proxy.</translation>
 <translation id="2753623023919742414">Dă clic pentru a căuta</translation>
 <translation id="2768103863314748511">Setează Chromium ca vizualizator PDF prestabilit</translation>
@@ -648,7 +647,6 @@
 <translation id="8619360774459241877">Se lansează Chromium...</translation>
 <translation id="8624541899164515475">Setări, se deschide într-o filă nouă.</translation>
 <translation id="8648201657708811153">Google Chrome for Testing nu poate fi setat ca browser prestabilit.</translation>
-<translation id="8677922833187616101">Afișează întotdeauna comanda rapidă pentru Modul Google AI</translation>
 <translation id="8697124171261953979">Stabilește și ce pagină se afișează când porniți Chromium sau când căutați din caseta polivalentă.</translation>
 <translation id="8704119203788522458">Acesta este browserul dvs. Chromium</translation>
 <translation id="8712637175834984815">Am înțeles</translation>
diff --git a/chrome/app/resources/chromium_strings_ru.xtb b/chrome/app/resources/chromium_strings_ru.xtb
index 63e919f..eeeeb02 100644
--- a/chrome/app/resources/chromium_strings_ru.xtb
+++ b/chrome/app/resources/chromium_strings_ru.xtb
@@ -152,7 +152,6 @@
 <translation id="2718390899429598676">В целях повышения безопасности Chromium шифрует ваши данные.</translation>
 <translation id="2721354645805494590">Чтобы удалить аккаунт Google из браузера, выйдите из Chromium</translation>
 <translation id="2722636413143664436">Чтобы синхронизировать пароли, закладки и другие данные на всех своих устройствах, войдите в Chromium.</translation>
-<translation id="2723860029395667894">Всегда показывать ярлык режима ИИ от Google</translation>
 <translation id="2738871930057338499">Не удалось подключиться к интернету. Ошибка HTTP 403: доступ запрещен. Проверьте настройки прокси-сервера.</translation>
 <translation id="2753623023919742414">Нажмите на объект для поиска</translation>
 <translation id="2768103863314748511">Используйте Chromium по умолчанию для просмотра PDF-файлов.</translation>
@@ -645,7 +644,6 @@
 <translation id="8619360774459241877">Запуск Chromium...</translation>
 <translation id="8624541899164515475">Настройки (страница откроется в новой вкладке).</translation>
 <translation id="8648201657708811153">Google Chrome для тестирования нельзя сделать браузером по умолчанию.</translation>
-<translation id="8677922833187616101">Всегда показывать ярлык режима ИИ от Google</translation>
 <translation id="8697124171261953979">Кроме того, расширение изменило стартовую страницу Chromium и поисковую систему, используемую по умолчанию при вводе запроса в омнибокс.</translation>
 <translation id="8704119203788522458">Ваш персональный Chromium</translation>
 <translation id="8712637175834984815">OK</translation>
diff --git a/chrome/app/resources/chromium_strings_si.xtb b/chrome/app/resources/chromium_strings_si.xtb
index a8127fb..c716b14 100644
--- a/chrome/app/resources/chromium_strings_si.xtb
+++ b/chrome/app/resources/chromium_strings_si.xtb
@@ -154,7 +154,6 @@
 <translation id="2718390899429598676">අමතර ආරක්ෂාව සඳහා, Chromium ඔබේ දත්ත සංකේතනය කරනු ඇත.</translation>
 <translation id="2721354645805494590">Chromium වෙතින් ඔබේ Google ගිණුම ඉවත් කිරීමට, වරන්න</translation>
 <translation id="2722636413143664436">ඔබේ සියලු උපාංග මත ඔබේ මුරපද, පිටුසන්, සහ තවත් දේ ලබා ගැනීමට, Chromium වෙත පුරන්න</translation>
-<translation id="2723860029395667894">සැම විටම Google AI මාදිලි කෙටිමඟ පෙන්වන්න</translation>
 <translation id="2738871930057338499">අන්තර්ජාලය වෙත සම්බන්ධ වීමට නොහැකි වේ. HTTP 403 තහනම්. ඔබේ ප්‍රොක්සි වින්‍යාසය පරීක්ෂා කරන්න.</translation>
 <translation id="2753623023919742414">සෙවීමට ක්ලික් කරන්න</translation>
 <translation id="2768103863314748511">ඔබේ පෙරනිමි PDF දක්වනය ලෙස Chromium සකසන්න</translation>
@@ -649,7 +648,6 @@
 <translation id="8619360774459241877">Chromium දියත් කරමින්...</translation>
 <translation id="8624541899164515475">සැකසීම්, නව පටිත්තක විවෘත වේ.</translation>
 <translation id="8648201657708811153">පරීක්ෂණ සඳහා Google Chrome ඔබේ පෙරනිමි බ්‍රව්සරය බවට පත් කළ නොහැක.</translation>
-<translation id="8677922833187616101">සැම විටම Google AI මාදිලි කෙටිමඟ පෙන්වන්න</translation>
 <translation id="8697124171261953979">තවද එය ඔබ Chromium විවෘත කරන විට හෝ Omnibox වෙතින් සොයන විට පෙන්වන වෙබ් පිටුව නිර්ණය කරයි.</translation>
 <translation id="8704119203788522458">මෙය ඔබේ Chromium වේ</translation>
 <translation id="8712637175834984815">එය ලැබුණා</translation>
diff --git a/chrome/app/resources/chromium_strings_sk.xtb b/chrome/app/resources/chromium_strings_sk.xtb
index 9426e0a..366fd58 100644
--- a/chrome/app/resources/chromium_strings_sk.xtb
+++ b/chrome/app/resources/chromium_strings_sk.xtb
@@ -154,7 +154,6 @@
 <translation id="2718390899429598676">V záujme vyššej miery zabezpečenia budú dáta v prehliadači Chromium šifrované.</translation>
 <translation id="2721354645805494590">Ak chcete odstrániť svoj účet Google z prehliadača Chromium, odhláste sa</translation>
 <translation id="2722636413143664436">Ak chcete mať heslá, záložky a ďalší obsah k dispozícii vo všetkých svojich zariadeniach, prihláste sa do prehliadača Chromium</translation>
-<translation id="2723860029395667894">Vždy zobrazovať odkaz na režim AI od Googlu</translation>
 <translation id="2738871930057338499">Nepodarilo sa pripojiť k internetu. Chyba odmietnutia prístupu HTTP 403. Skontrolujte konfiguráciu servera proxy.</translation>
 <translation id="2753623023919742414">Vyhľadávanie spustíte kliknutím</translation>
 <translation id="2768103863314748511">Nastavte si Chromium ako predvolený zobrazovač súborov PDF</translation>
@@ -179,6 +178,7 @@
 <translation id="2977506796191543575">Ak sa vám určitý web pokúsi ukradnúť heslo alebo stiahnete škodlivý súbor, Chromium môže odoslať Bezpečnému prehliadaniu aj webové adresy vrátane častí obsahu stránok</translation>
 <translation id="2981563588585023386">Ak chceš zvýšiť svoju bezpečnosť na internete pomocou vybraných možností tvojho rodiča, prihlás sa do prehliadača Chromium</translation>
 <translation id="3003694935412297923">Všetky úlohy</translation>
+<translation id="3012615494352020668">{count,plural, =1{Než sa niektoré údaje uložia do vášho účtu Google a začnú používať vo všetkých zariadeniach, musí Chromium overiť vašu totožnosť. Ak sa odhlásite teraz, tieto údaje (1 položka) budú odstránené.}few{Než sa niektoré údaje uložia do vášho účtu Google a začnú používať vo všetkých zariadeniach, musí Chromium overiť vašu totožnosť. Ak sa odhlásite teraz, tieto údaje ({count} položky) budú odstránené.}many{Chromium needs to verify it’s you before some data can be saved in your Google Account and used on all your devices. If you sign out now, this data ({count} items) will be deleted.}other{Než sa niektoré údaje uložia do vášho účtu Google a začnú používať vo všetkých zariadeniach, musí Chromium overiť vašu totožnosť. Ak sa odhlásite teraz, tieto údaje ({count} položiek) budú odstránené.}}</translation>
 <translation id="3013473503895162900">Otvorte <ph name="URL" /> na novej karte v prehliadači Chromium.</translation>
 <translation id="3032706164202344641">Chromium nemôže skontrolovať heslá. Skúste to neskôr.</translation>
 <translation id="3032787606318309379">Pridáva sa do prehliadača Chromium...</translation>
@@ -495,6 +495,7 @@
 <translation id="6729124504294600478">Ak chcete mať k dispozícii prispôsobenie a ďalšie funkcie, zahrňte Chromium do aktivity na internete a v aplikáciách a prepojených služieb Googlu</translation>
 <translation id="6734291798041940871">Chromium už majú nainštalovaný všetci používatelia na vašom počítači.</translation>
 <translation id="6751374565094704799">Zrýchľuje weby pomocou nástroja V8 prehliadača Chromium, ale mierne zníži odolnosť prehliadača voči útokom. Toto nastavenie je zapnuté.</translation>
+<translation id="6754665438209053659">{count,plural, =1{Niektoré údaje prehliadača Chromium zatiaľ neboli uložené vo vašom účte Google. Pred odhlásením skúste počkať niekoľko minút. Ak sa odhlásite teraz, tieto údaje (1 položka) budú odstránené.}few{Niektoré údaje prehliadača Chromium zatiaľ neboli uložené vo vašom účte Google. Pred odhlásením skúste počkať niekoľko minút. Ak sa odhlásite teraz, tieto údaje ({count} položky) budú odstránené.}many{Some of your Chromium data hasn't been saved in your Google Account yet. Try waiting a few minutes before signing out. If you sign out now, this data ({count} items) will be deleted.}other{Niektoré údaje prehliadača Chromium zatiaľ neboli uložené vo vašom účte Google. Pred odhlásením skúste počkať niekoľko minút. Ak sa odhlásite teraz, tieto údaje ({count} položiek) budú odstránené.}}</translation>
 <translation id="67706546131546258">Chromium odporúča skontrolovať tento súbor, pretože môže byť nebezpečný.</translation>
 <translation id="6779406956731413166">Chromium OS mohol vzniknúť vďaka ďalšiemu <ph name="BEGIN_LINK_CROS_OSS" />softvéru typu open source<ph name="END_LINK_CROS_OSS" />.</translation>
 <translation id="6831043979455480757">Preložiť</translation>
@@ -649,7 +650,6 @@
 <translation id="8619360774459241877">Spúšťa sa Chromium…</translation>
 <translation id="8624541899164515475">Nastavenia (otvoria sa na novej karte)</translation>
 <translation id="8648201657708811153">Google Chrome for Testing nemôžete nastaviť ako svoj predvolený prehliadač.</translation>
-<translation id="8677922833187616101">Vždy zobrazovať odkaz na režim AI od Googlu</translation>
 <translation id="8697124171261953979">Tiež určuje, ktorá stránka sa zobrazí pri spustení prehliadača Chromium alebo pri vyhľadávaní pomocou všeobecného poľa.</translation>
 <translation id="8704119203788522458">Toto je váš prehliadač Chromium</translation>
 <translation id="8712637175834984815">Dobre</translation>
diff --git a/chrome/app/resources/chromium_strings_sl.xtb b/chrome/app/resources/chromium_strings_sl.xtb
index bca78c2..2e212e9 100644
--- a/chrome/app/resources/chromium_strings_sl.xtb
+++ b/chrome/app/resources/chromium_strings_sl.xtb
@@ -155,7 +155,6 @@
 <translation id="2718390899429598676">Zaradi večje varnosti bo Chromium šifriral vaše podatke.</translation>
 <translation id="2721354645805494590">Če želite račun Google odstraniti iz Chromiuma, se odjavite</translation>
 <translation id="2722636413143664436">Če želite dostopati do gesel, zaznamkov in drugega v vseh napravah, se prijavite v Chromium</translation>
-<translation id="2723860029395667894">Vedno pokaži bližnjico do Googlovega načina umetne inteligence</translation>
 <translation id="2738871930057338499">Internetne povezave ni mogoče vzpostaviti. Koda napake HTTP je »403 Forbidden«. Preverite konfiguracijo strežnika proxy configuration.</translation>
 <translation id="2753623023919742414">Kliknite, če želite iskati</translation>
 <translation id="2768103863314748511">Nastavite Chromium kot privzeti pregledovalnik PDF-jev</translation>
@@ -650,7 +649,6 @@
 <translation id="8619360774459241877">Zagon Chromiuma …</translation>
 <translation id="8624541899164515475">Nastavitve, odpre se na novem zavihku.</translation>
 <translation id="8648201657708811153">Brskalnika Google Chrome for Testing ni mogoče nastaviti kot privzetega brskalnika.</translation>
-<translation id="8677922833187616101">Vedno pokaži bližnjico do Googlovega načina umetne inteligence</translation>
 <translation id="8697124171261953979">Določa tudi, katera stran je prikazana, ko zaženete Chromium ali iščete v naslovni vrstici.</translation>
 <translation id="8704119203788522458">To je vaš Chromium</translation>
 <translation id="8712637175834984815">Razumem</translation>
diff --git a/chrome/app/resources/chromium_strings_sq.xtb b/chrome/app/resources/chromium_strings_sq.xtb
index 4bbba2d..f27875e9 100644
--- a/chrome/app/resources/chromium_strings_sq.xtb
+++ b/chrome/app/resources/chromium_strings_sq.xtb
@@ -154,7 +154,6 @@
 <translation id="2718390899429598676">Për më shumë siguri, Chromium do t'i enkriptojë të dhënat e tua.</translation>
 <translation id="2721354645805494590">Për ta hequr "Llogarinë tënde të Google" nga Chromium, dil nga llogaria</translation>
 <translation id="2722636413143664436">Për të marrë fjalëkalimet, faqeshënuesit etj. në të gjitha pajisjet e tua, identifikohu në Chromium</translation>
-<translation id="2723860029395667894">Shfaq gjithmonë shkurtoren e "Modalitetit të IA-së së Google"</translation>
 <translation id="2738871930057338499">Lidhja me internetin nuk mund të kryhej. HTTP 403 (E ndaluar). Kontrollo konfigurimin e proxy-t.</translation>
 <translation id="2753623023919742414">Kliko për të kërkuar</translation>
 <translation id="2768103863314748511">Cakto Chromium si shikuesin e parazgjedhur të skedarëve PDF</translation>
@@ -649,7 +648,6 @@
 <translation id="8619360774459241877">Po hapet Chromium...</translation>
 <translation id="8624541899164515475">Cilësimet, hapet në një skedë të re.</translation>
 <translation id="8648201657708811153">Google Chrome for Testing nuk mund të bëhet shfletuesi yt i parazgjedhur.</translation>
-<translation id="8677922833187616101">Shfaq gjithmonë shkurtoren e "Modalitetit të IA-së së Google"</translation>
 <translation id="8697124171261953979">Kontrollon po ashtu se cila faqe shfaqet kur nis Chromium ose kur kërkon nga Omnibox.</translation>
 <translation id="8704119203788522458">Ky është Chromium për ty</translation>
 <translation id="8712637175834984815">E kuptova</translation>
diff --git a/chrome/app/resources/chromium_strings_sr-Latn.xtb b/chrome/app/resources/chromium_strings_sr-Latn.xtb
index cdb0f9db..04052cad 100644
--- a/chrome/app/resources/chromium_strings_sr-Latn.xtb
+++ b/chrome/app/resources/chromium_strings_sr-Latn.xtb
@@ -155,7 +155,6 @@
 <translation id="2718390899429598676">Chromium će šifrovati podatke radi dodatne sigurnosti.</translation>
 <translation id="2721354645805494590">Da biste uklonili Google nalog iz Chromium-a, odjavite se</translation>
 <translation id="2722636413143664436">Da bi vam lozinke, obeleživači i drugi sadržaj bili dostupni na svim uređajima, prijavite se u Chromium</translation>
-<translation id="2723860029395667894">Uvek prikazuj prečicu za Google AI režim</translation>
 <translation id="2738871930057338499">Povezivanje sa internetom nije uspelo. Zabranjen je pristup (HTTP 403). Proverite konfiguraciju proksija.</translation>
 <translation id="2753623023919742414">Kliknite da biste pretražili</translation>
 <translation id="2768103863314748511">Podesite Chromium kao podrazumevani PDF pregledač</translation>
@@ -652,7 +651,6 @@
 <translation id="8619360774459241877">Pokreće se Chromium...</translation>
 <translation id="8624541899164515475">Podešavanja, otvaraju se na novoj kartici.</translation>
 <translation id="8648201657708811153">Google Chrome for Testing ne može da se postavi za podrazumevani pregledač.</translation>
-<translation id="8677922833187616101">Uvek prikazuj prečicu za Google AI režim</translation>
 <translation id="8697124171261953979">Kontroliše i stranicu koja se prikazuje kada pokrenete Chromium ili pretražujete iz omniboksa.</translation>
 <translation id="8704119203788522458">Ovo je vaš Chromium</translation>
 <translation id="8712637175834984815">Važi</translation>
diff --git a/chrome/app/resources/chromium_strings_sr.xtb b/chrome/app/resources/chromium_strings_sr.xtb
index ecb8c28..f6ef391 100644
--- a/chrome/app/resources/chromium_strings_sr.xtb
+++ b/chrome/app/resources/chromium_strings_sr.xtb
@@ -155,7 +155,6 @@
 <translation id="2718390899429598676">Chromium ће шифровати податке ради додатне сигурности.</translation>
 <translation id="2721354645805494590">Да бисте уклонили Google налог из Chromium-а, одјавите се</translation>
 <translation id="2722636413143664436">Да би вам лозинке, обележивачи и други садржај били доступни на свим уређајима, пријавите се у Chromium</translation>
-<translation id="2723860029395667894">Увек приказуј пречицу за Google AI режим</translation>
 <translation id="2738871930057338499">Повезивање са интернетом није успело. Забрањен је приступ (HTTP 403). Проверите конфигурацију проксија.</translation>
 <translation id="2753623023919742414">Кликните да бисте претражили</translation>
 <translation id="2768103863314748511">Подесите Chromium као подразумевани PDF прегледач</translation>
@@ -652,7 +651,6 @@
 <translation id="8619360774459241877">Покреће се Chromium...</translation>
 <translation id="8624541899164515475">Подешавања, отварају се на новој картици.</translation>
 <translation id="8648201657708811153">Google Chrome for Testing не може да се постави за подразумевани прегледач.</translation>
-<translation id="8677922833187616101">Увек приказуј пречицу за Google AI режим</translation>
 <translation id="8697124171261953979">Контролише и страницу која се приказује када покренете Chromium или претражујете из омнибокса.</translation>
 <translation id="8704119203788522458">Ово је ваш Chromium</translation>
 <translation id="8712637175834984815">Важи</translation>
diff --git a/chrome/app/resources/chromium_strings_sv.xtb b/chrome/app/resources/chromium_strings_sv.xtb
index 6acf02c6..ceceb5a 100644
--- a/chrome/app/resources/chromium_strings_sv.xtb
+++ b/chrome/app/resources/chromium_strings_sv.xtb
@@ -155,7 +155,6 @@
 <translation id="2718390899429598676">Din data krypteras i Chromium för att öka säkerheten.</translation>
 <translation id="2721354645805494590">Du kan ta bort Google-kontot från Chromium genom att logga ut</translation>
 <translation id="2722636413143664436">Logga in i Chromium om du vill få tillgång till dina lösenord, bokmärken med mera på alla dina enheter</translation>
-<translation id="2723860029395667894">Visa alltid genvägen till Google AI-läget</translation>
 <translation id="2738871930057338499">Det går inte att ansluta till internet. HTTP 403 Förbjuden. Kontrollera proxykonfigurationen.</translation>
 <translation id="2753623023919742414">Klicka för att söka</translation>
 <translation id="2768103863314748511">Ställ in Chromium som standard PDF-läsare</translation>
@@ -650,7 +649,6 @@
 <translation id="8619360774459241877">Chromium startas …</translation>
 <translation id="8624541899164515475">Inställningar, öppnas på en ny flik.</translation>
 <translation id="8648201657708811153">Google Chrome for Testing kan inte användas som standardwebbläsare.</translation>
-<translation id="8677922833187616101">Visa alltid genvägen till Google AI-läget</translation>
 <translation id="8697124171261953979">Det styr också vilken sida som visas när du startar Chromium eller söker i adressfältet.</translation>
 <translation id="8704119203788522458">Det här är Chromium</translation>
 <translation id="8712637175834984815">Uppfattat</translation>
diff --git a/chrome/app/resources/chromium_strings_sw.xtb b/chrome/app/resources/chromium_strings_sw.xtb
index 348c440..d18532cc 100644
--- a/chrome/app/resources/chromium_strings_sw.xtb
+++ b/chrome/app/resources/chromium_strings_sw.xtb
@@ -155,7 +155,6 @@
 <translation id="2718390899429598676">Kwa usalama ulioongezwa, Chromium itasimba data yako kwa njia fiche.</translation>
 <translation id="2721354645805494590">Ili uondoe Akaunti yako ya Google kwenye Chromium, ondoka kwenye akaunti</translation>
 <translation id="2722636413143664436">Ili upate manenosiri yako, alamisho na zaidi kwenye vifaa vyako vyote, ingia katika Chromium</translation>
-<translation id="2723860029395667894">Onyesha njia ya mkato ya Matumizi ya Google AI kila wakati</translation>
 <translation id="2738871930057338499">Imeshindwa kuunganisha kwenye Intaneti. HTTP 403 Hairuhusiwi. Tafadhali angalia mipangilio yako ya seva mbadala.</translation>
 <translation id="2753623023919742414">Bofya ili utafute</translation>
 <translation id="2768103863314748511">Weka Chromium iwe kitazamaji chako chaguomsingi cha PDF</translation>
@@ -652,7 +651,6 @@
 <translation id="8619360774459241877">Inaanzisha Chromium...</translation>
 <translation id="8624541899164515475">Mipangilio, hufunguka katika kichupo kipya.</translation>
 <translation id="8648201657708811153">Huwezi kufanya Google Chrome ya Majaribio iwe kivinjari chako chaguomsingi.</translation>
-<translation id="8677922833187616101">Onyesha Njia ya Mkato ya Matumizi ya Google AI Kila Wakati</translation>
 <translation id="8697124171261953979">Pia inadhibiti ukurasa unaoonyeshwa unapoanzisha Chromium au unapotafuta kutoka Sanduku Kuu.</translation>
 <translation id="8704119203788522458">Hii ni Chromium yako</translation>
 <translation id="8712637175834984815">Nimeelewa</translation>
diff --git a/chrome/app/resources/chromium_strings_ta.xtb b/chrome/app/resources/chromium_strings_ta.xtb
index 957bb8a..5524a18 100644
--- a/chrome/app/resources/chromium_strings_ta.xtb
+++ b/chrome/app/resources/chromium_strings_ta.xtb
@@ -153,7 +153,6 @@
 <translation id="2718390899429598676">கூடுதல் பாதுகாப்பிற்கு, Chromium உங்கள் தரவை என்க்ரிப்ட் செய்யும்.</translation>
 <translation id="2721354645805494590">உங்கள் Google கணக்கை Chromiumமில் இருந்து அகற்ற, வெளியேறவும்</translation>
 <translation id="2722636413143664436">கடவுச்சொற்கள், புக்மார்க்குகள் மற்றும் பலவற்றை உங்களின் எல்லாச் சாதனங்களிலும் பெற Chromiumமில் உள்நுழையுங்கள்</translation>
-<translation id="2723860029395667894">Google AI மோட் ஷார்ட்கட்டை எப்போதும் காட்டு</translation>
 <translation id="2738871930057338499">இணையத்துடன் இணைக்க முடியவில்லை. HTTP 403 தடுக்கப்பட்டது. உங்கள் ப்ராக்ஸி உள்ளமைவைச் சரிபார்க்கவும்.</translation>
 <translation id="2753623023919742414">தேட கிளிக் செய்யவும்</translation>
 <translation id="2768103863314748511">Chromiumமை இயல்பு PDF வியூவராக அமையுங்கள்</translation>
@@ -650,7 +649,6 @@
 <translation id="8619360774459241877">Chromiumமைத் தொடங்குகிறது...</translation>
 <translation id="8624541899164515475">அமைப்புகள், புதிய பக்கத்தில் திறக்கும்.</translation>
 <translation id="8648201657708811153">Google Chrome for Testingகை உங்கள் இயல்பு உலாவியாக அமைக்க முடியாது.</translation>
-<translation id="8677922833187616101">Google AI மோட் ஷார்ட்கட்டை எப்போதும் காட்டு</translation>
 <translation id="8697124171261953979">Chromiumமைத் தொடங்கும்போது அல்லது ஆம்னிபாக்ஸிலிருந்து தேடலை மேற்கொள்ளும்போது காண்பிக்கப்படும் பக்கத்தையும் இது கட்டுப்படுத்துகிறது.</translation>
 <translation id="8704119203788522458">இது உங்கள் Chromium ஆகும்</translation>
 <translation id="8712637175834984815">புரிந்தது</translation>
diff --git a/chrome/app/resources/chromium_strings_te.xtb b/chrome/app/resources/chromium_strings_te.xtb
index ce62fa6..c459e6b 100644
--- a/chrome/app/resources/chromium_strings_te.xtb
+++ b/chrome/app/resources/chromium_strings_te.xtb
@@ -153,7 +153,6 @@
 <translation id="2718390899429598676">అదనపు భద్రత కోసం, Chromium మీ డేటాను ఎన్‌క్రిప్ట్ చేస్తుంది.</translation>
 <translation id="2721354645805494590">Chromium నుండి మీ Google ఖాతాను తీసివేయడానికి, సైన్ అవుట్ చేయండి</translation>
 <translation id="2722636413143664436">మీ డివైజ్‌లన్నింటిలో మీ పాస్‌వర్డ్‌లను, బుక్‌మార్క్‌లను, ఇంకా మరిన్నింటిని పొందడానికి Chromiumకు సైన్ ఇన్ చేయండి</translation>
-<translation id="2723860029395667894">Google AI మోడ్ షార్ట్‌కట్‌ను ఎల్లప్పుడూ చూపండి</translation>
 <translation id="2738871930057338499">ఇంటర్నెట్‌కు కనెక్ట్ చేయడం సాధ్యపడలేదు. HTTP 403 అనుమతి లేదు. దయచేసి మీ ప్రాక్సీ కాన్ఫిగరేషన్‌ను చెక్ చేయండి.</translation>
 <translation id="2753623023919742414">సెర్చ్ చేయడానికి క్లిక్ చేయండి</translation>
 <translation id="2768103863314748511">మీ ఆటోమేటిక్ సెట్టింగ్ PDF వ్యూయర్‌గా Chromiumను సెట్ చేయండి</translation>
@@ -178,6 +177,7 @@
 <translation id="2977506796191543575">ఏదైనా సైట్ మీ పాస్‌వర్డ్‌ను దొంగిలించే ప్రయత్నం చేసినా, లేదంటే ఏదైనా హానికరమైన ఫైల్‌ను మీరు డౌన్‌లోడ్ చేసినా, సదరు URLలను, ఆయా పేజీల కంటెంట్‌లోని కొన్ని భాగాలను కూడా Chromium, 'సురక్షిత బ్రౌజింగ్'కు పంపవచ్చు</translation>
 <translation id="2981563588585023386">మీ తల్లి/తండ్రి ఛాయిస్‌లతో ఆన్‌లైన్‌లో సురక్షితంగా ఉండటానికి, Chromiumకు సైన్ ఇన్ చేయండి</translation>
 <translation id="3003694935412297923">అన్ని టాస్క్‌లు</translation>
+<translation id="3012615494352020668">{count,plural, =1{మీ Google ఖాతాలో కొంత డేటాను సేవ్ చేయడానికి, దాన్ని మీ డివైజ్‌లన్నింటిలో ఉపయోగించుకోవడానికి ముందు, అది మీరేనని Chromium ధృవీకరించాలి. మీరు ఇప్పుడు సైన్ అవుట్ చేస్తే, ఈ డేటా (1 ఐటెమ్) తొలగించబడుతుంది.}other{మీ Google ఖాతాలో కొంత డేటాను సేవ్ చేయడానికి, దాన్ని మీ డివైజ్‌లన్నింటిలో ఉపయోగించుకోవడానికి ముందు, అది మీరేనని Chromium ధృవీకరించాలి. మీరు ఇప్పుడు సైన్ అవుట్ చేస్తే, ఈ డేటా ({count} ఐటెమ్‌లు) తొలగించబడుతుంది.}}</translation>
 <translation id="3013473503895162900"><ph name="URL" /> ను Chromiumలో కొత్త ట్యాబ్‌లో తెరవండి.</translation>
 <translation id="3032706164202344641">Chromium మీ పాస్‌వర్డ్‌లను చెక్ చేయలేకపోయింది. తర్వాత మళ్లీ ట్రై చేయండి.</translation>
 <translation id="3032787606318309379">Chromiumకి జోడిస్తోంది...</translation>
@@ -492,6 +492,7 @@
 <translation id="6729124504294600478">వ్యక్తిగతీకరణను, ఇతర ఫీచర్‌లను పొందడానికి, Chromiumను 'వెబ్ &amp; యాప్ యాక్టివిటీ'లో, లింక్ అయిన Google సర్వీస్‌లలో చేర్చండి</translation>
 <translation id="6734291798041940871">మీ కంప్యూటర్‌లోని వినియోగదారులందరికీ Chromium ఇప్పటికే ఇన్‌స్టాల్ చేయబడింది.</translation>
 <translation id="6751374565094704799">Chromium V8 ఇంజిన్‌తో సైట్‌లను వేగవంతం చేస్తుంది కానీ Chromium అటాక్‌లకు కొద్దిగా తక్కువ నిరోధకతను కలిగిస్తుంది. ఈ సెట్టింగ్ ఆన్ చేయబడింది.</translation>
+<translation id="6754665438209053659">{count,plural, =1{మీ Chromium డేటాలో కొంత భాగం, ఇంకా మీ Google ఖాతాలో సేవ్ కాలేదు. సైన్ అవుట్ చేయడానికి ముందు, కొన్ని నిమిషాలు వేచి ఉండటానికి ట్రై చేయండి. మీరు ఇప్పుడు సైన్ అవుట్ చేస్తే, ఈ డేటా (1 ఐటెమ్) తొలగించబడుతుంది.}other{మీ Chromium డేటాలో కొంత భాగం, ఇంకా మీ Google ఖాతాలో సేవ్ కాలేదు. సైన్ అవుట్ చేయడానికి ముందు, కొన్ని నిమిషాలు వేచి ఉండటానికి ట్రై చేయండి. మీరు ఇప్పుడు సైన్ అవుట్ చేస్తే, ఈ డేటా ({count} ఐటెమ్‌లు) తొలగించబడుతుంది.}}</translation>
 <translation id="67706546131546258">ఈ ఫైల్ ప్రమాదకరమైనది కావచ్చు, కాబట్టి దీనిని స్కాన్ చేయమని Chromium సిఫార్సు చేస్తోంది.</translation>
 <translation id="6779406956731413166">ChromiumOS అనేది అదనపు <ph name="BEGIN_LINK_CROS_OSS" />ఓపెన్ సోర్స్ సాఫ్ట్‌వేర్<ph name="END_LINK_CROS_OSS" /> ద్వారా సాధ్యమైంది.</translation>
 <translation id="6831043979455480757">అనువదించు</translation>
@@ -644,7 +645,6 @@
 <translation id="8619360774459241877">Chromiumని ప్రారంభిస్తోంది...</translation>
 <translation id="8624541899164515475">సెట్టింగ్‌లు, కొత్త ట్యాబ్‌లో తెరుచుకుంటాయి.</translation>
 <translation id="8648201657708811153">Chrome for Testingను మీ ఆటోమేటిక్ బ్రౌజర్‌గా సెట్ చేయడం సాధ్యపడదు.</translation>
-<translation id="8677922833187616101">Google AI మోడ్ షార్ట్‌కట్‌ను ఎల్లప్పుడూ చూపండి</translation>
 <translation id="8697124171261953979">ఇది మీరు Chromiumను ప్రారంభించేటప్పుడు లేదా ఓమ్నిబాక్స్ నుండి వెతికేటప్పుడు చూపబడే పేజీని కూడా నియంత్రిస్తుంది.</translation>
 <translation id="8704119203788522458">ఇది మీ Chromium</translation>
 <translation id="8712637175834984815">అర్థమైంది</translation>
diff --git a/chrome/app/resources/chromium_strings_th.xtb b/chrome/app/resources/chromium_strings_th.xtb
index a2e4985e..b4fee8a 100644
--- a/chrome/app/resources/chromium_strings_th.xtb
+++ b/chrome/app/resources/chromium_strings_th.xtb
@@ -152,7 +152,6 @@
 <translation id="2718390899429598676">เพื่อเพิ่มความปลอดภัยให้มากยิ่งขึ้น Chromium จะเข้ารหัสข้อมูลของคุณ</translation>
 <translation id="2721354645805494590">หากต้องการนำบัญชี Google ออกจาก Chromium ให้ออกจากระบบ</translation>
 <translation id="2722636413143664436">ลงชื่อเข้าใช้ Chromium เพื่อเข้าถึงรหัสผ่าน บุ๊กมาร์ก และข้อมูลอื่นๆ ในอุปกรณ์ทุกเครื่อง</translation>
-<translation id="2723860029395667894">แสดงทางลัดโหมด AI ของ Google เสมอ</translation>
 <translation id="2738871930057338499">เชื่อมต่อกับอินเทอร์เน็ตไม่ได้ HTTP 403 Forbidden โปรดตรวจสอบการกำหนดค่าพร็อกซีของคุณ</translation>
 <translation id="2753623023919742414">คลิกเพื่อค้นหา</translation>
 <translation id="2768103863314748511">ตั้งค่า Chromium เป็นโปรแกรมอ่าน PDF เริ่มต้น</translation>
@@ -177,6 +176,7 @@
 <translation id="2977506796191543575">หากเว็บไซต์พยายามขโมยรหัสผ่าน หรือคุณดาวน์โหลดไฟล์ที่เป็นอันตราย Chromium อาจส่ง URL รวมถึงเนื้อหาบางส่วนในหน้าไปยัง Google Safe Browsing ด้วย</translation>
 <translation id="2981563588585023386">หากต้องการท่องโลกออนไลน์อย่างปลอดภัยยิ่งขึ้นด้วยตัวเลือกของผู้ปกครอง ให้ลงชื่อเข้าใช้ Chromium</translation>
 <translation id="3003694935412297923">งานทั้งหมด</translation>
+<translation id="3012615494352020668">{count,plural, =1{Chromium จำเป็นต้องยืนยันว่าเป็นคุณก่อนจึงจะบันทึกข้อมูลบางอย่างในบัญชี Google และใช้ในอุปกรณ์ทุกเครื่องได้ หากคุณออกจากระบบตอนนี้ ระบบจะลบข้อมูลนี้ (1 รายการ)}other{Chromium จำเป็นต้องยืนยันว่าเป็นคุณก่อนจึงจะบันทึกข้อมูลบางอย่างในบัญชี Google และใช้ในอุปกรณ์ทุกเครื่องได้ หากคุณออกจากระบบตอนนี้ ระบบจะลบข้อมูลนี้ ({count} รายการ)}}</translation>
 <translation id="3013473503895162900">เปิด <ph name="URL" /> ในแท็บใหม่ใน Chromium</translation>
 <translation id="3032706164202344641">Chromium ตรวจสอบรหัสผ่านของคุณไม่ได้ โปรดลองอีกครั้งภายหลัง</translation>
 <translation id="3032787606318309379">กำลังเพิ่มลงใน Chromium...</translation>
@@ -493,6 +493,7 @@
 <translation id="6729124504294600478">รวม Chromium ไว้ในกิจกรรมบนเว็บและแอป ตลอดจนบริการของ Google ที่ลิงก์ไว้เพื่อรับการปรับเปลี่ยนในแบบของคุณและฟีเจอร์อื่นๆ</translation>
 <translation id="6734291798041940871">มีการติดตั้ง Chromium สำหรับผู้ใช้ทุกคนบนคอมพิวเตอร์ของคุณแล้ว</translation>
 <translation id="6751374565094704799">เพิ่มความเร็วให้เว็บไซต์ด้วยเครื่องมือ V8 ของ Chromium แต่ทำให้ Chromium ต้านทานการโจมตีได้น้อยลงเล็กน้อย การตั้งค่านี้เปิดอยู่</translation>
+<translation id="6754665438209053659">{count,plural, =1{ยังไม่ได้บันทึกข้อมูล Chromium บางอย่างของคุณลงในบัญชี Google โปรดรอสักครู่ก่อนออกจากระบบ หากคุณออกจากระบบตอนนี้ ระบบจะลบข้อมูลนี้ (1 รายการ)}other{ยังไม่ได้บันทึกข้อมูล Chromium บางอย่างของคุณลงในบัญชี Google โปรดรอสักครู่ก่อนออกจากระบบ หากคุณออกจากระบบตอนนี้ ระบบจะลบข้อมูลนี้ ({count} รายการ)}}</translation>
 <translation id="67706546131546258">Chromium แนะนำให้สแกนไฟล์นี้เนื่องจากอาจเป็นอันตราย</translation>
 <translation id="6779406956731413166">Chromium OS เกิดขึ้นได้ด้วยการสนับสนุนจาก<ph name="BEGIN_LINK_CROS_OSS" />ซอฟต์แวร์โอเพนซอร์ส<ph name="END_LINK_CROS_OSS" />อื่นเพิ่มเติม</translation>
 <translation id="6831043979455480757">แปลภาษา</translation>
@@ -647,7 +648,6 @@
 <translation id="8619360774459241877">กำลังเปิด Chromium...</translation>
 <translation id="8624541899164515475">การตั้งค่า เปิดในแท็บใหม่</translation>
 <translation id="8648201657708811153">ไม่สามารถตั้ง Google Chrome สำหรับการทดสอบเป็นเบราว์เซอร์เริ่มต้นได้</translation>
-<translation id="8677922833187616101">แสดงทางลัดโหมด AI ของ Google เสมอ</translation>
 <translation id="8697124171261953979">อีกทั้งยังควบคุมหน้าที่จะแสดงเมื่อคุณเปิด Chromium หรือทำการค้นหาจากแถบอเนกประสงค์ด้วย</translation>
 <translation id="8704119203788522458">นี่คือ Chromium ของคุณ</translation>
 <translation id="8712637175834984815">รับทราบ</translation>
diff --git a/chrome/app/resources/chromium_strings_tr.xtb b/chrome/app/resources/chromium_strings_tr.xtb
index d55b223..be07d17 100644
--- a/chrome/app/resources/chromium_strings_tr.xtb
+++ b/chrome/app/resources/chromium_strings_tr.xtb
@@ -152,7 +152,6 @@
 <translation id="2718390899429598676">Chromium ek güvenlik için verilerinizi şifreler.</translation>
 <translation id="2721354645805494590">Google Hesabınızı Chromium'dan kaldırmak için oturumu kapatın</translation>
 <translation id="2722636413143664436">Şifrelerinizi, yer işaretlerinizi ve diğer öğelerinizi tüm cihazlarınızda kullanmak için Chromium'da oturum açın</translation>
-<translation id="2723860029395667894">Google AI Modu kısayolunu her zaman göster</translation>
 <translation id="2738871930057338499">İnternet'e bağlanılamadı. HTTP 403 Yasak. Lütfen proxy yapılandırmanızı kontrol edin.</translation>
 <translation id="2753623023919742414">Aramak için tıklayın</translation>
 <translation id="2768103863314748511">Chromium'u varsayılan PDF görüntüleyiciniz olarak ayarlayın</translation>
@@ -645,7 +644,6 @@
 <translation id="8619360774459241877">Chromium başlatılıyor...</translation>
 <translation id="8624541899164515475">Ayarlar, yeni sekmede açılır.</translation>
 <translation id="8648201657708811153">Google Chrome for Testing varsayılan tarayıcınız olarak ayarlanamaz.</translation>
-<translation id="8677922833187616101">Google AI Modu Kısayolunu Her Zaman Göster</translation>
 <translation id="8697124171261953979">Ayrıca Chromium'u başlattığınızda veya Çok Amaçlı Adres Çubuğu'ndan arama yaptığınızda gösterilecek sayfayı da denetler.</translation>
 <translation id="8704119203788522458">Bu sizin Chromium'unuz</translation>
 <translation id="8712637175834984815">Anladım</translation>
diff --git a/chrome/app/resources/chromium_strings_uk.xtb b/chrome/app/resources/chromium_strings_uk.xtb
index db23239..97b7409 100644
--- a/chrome/app/resources/chromium_strings_uk.xtb
+++ b/chrome/app/resources/chromium_strings_uk.xtb
@@ -153,7 +153,6 @@
 <translation id="2718390899429598676">Задля підвищення безпеки Chromium шифруватиме ваші дані.</translation>
 <translation id="2721354645805494590">Щоб вилучити обліковий запис Google, вийдіть із Chromium</translation>
 <translation id="2722636413143664436">Щоб отримати доступ до паролів, закладок і інших даних на всіх своїх пристроях, увійдіть у Chromium</translation>
-<translation id="2723860029395667894">Завжди показувати ярлик режиму ШІ від Google</translation>
 <translation id="2738871930057338499">Не вдалося підключитися до Інтернету. Помилка "HTTP 403 заборонено". Перевірте конфігурацію свого проксі-сервера.</translation>
 <translation id="2753623023919742414">Натисніть, щоб шукати</translation>
 <translation id="2768103863314748511">Зробіть Chromium засобом перегляду файлів PDF за умовчанням</translation>
@@ -648,7 +647,6 @@
 <translation id="8619360774459241877">Запускається Chromium…</translation>
 <translation id="8624541899164515475">Налаштування (відкриється в новій вкладці).</translation>
 <translation id="8648201657708811153">Google Chrome for Testing не можна зробити веб-переглядачем за умовчанням.</translation>
-<translation id="8677922833187616101">Завжди показувати ярлик режиму ШІ від Google</translation>
 <translation id="8697124171261953979">Розширення також змінило сторінку, яка відкривається під час запуску Chromium або пошуку в універсальному вікні пошуку.</translation>
 <translation id="8704119203788522458">Це ваш Chromium</translation>
 <translation id="8712637175834984815">OK</translation>
diff --git a/chrome/app/resources/chromium_strings_ur.xtb b/chrome/app/resources/chromium_strings_ur.xtb
index 98e35816..e02e989 100644
--- a/chrome/app/resources/chromium_strings_ur.xtb
+++ b/chrome/app/resources/chromium_strings_ur.xtb
@@ -154,7 +154,6 @@
 <translation id="2718390899429598676">‏اضافی سیکیورٹی کیلئے، Chromium آپ کا ڈیٹا مرموز کر دے گا۔</translation>
 <translation id="2721354645805494590">‏‫Chromium سے اپنا Google اکاؤنٹ ہٹانے کے لیے، سائن آؤٹ کریں</translation>
 <translation id="2722636413143664436">‏اپنے تمام آلات پر اپنے پاس ورڈز، بُک مارکس وغیرہ حاصل کرنے کے لیے، Chromium میں سائن ان کریں</translation>
-<translation id="2723860029395667894">‏ہمیشہ Google AI وضع کا شارٹ کٹ دکھائیں</translation>
 <translation id="2738871930057338499">‏انٹرنیٹ سے منسلک ہونے سے قاصر ہے۔ HTTP 403 ممنوع ہے۔ براہ کرم اپنی پراکسی کنفیگریشن چیک کریں۔</translation>
 <translation id="2753623023919742414">تلاش کرنے کیلئے کلک کریں</translation>
 <translation id="2768103863314748511">‏‫Chromium کو اپنے ڈیفالٹ PDF ناظر کے طور پر سیٹ کریں</translation>
@@ -649,7 +648,6 @@
 <translation id="8619360774459241877">‏Chromium شروع ہو رہا ہے…</translation>
 <translation id="8624541899164515475">ترتیبات، نئے ٹیب میں کھلتی ہیں۔</translation>
 <translation id="8648201657708811153">‏Google Chrome for Testing کو آپ کا ڈیفالٹ براؤزر نہیں بنایا جا سکتا۔</translation>
-<translation id="8677922833187616101">‏ہمیشہ Google AI وضع کا شارٹ کٹ دکھائیں</translation>
 <translation id="8697124171261953979">‏یہ آپ کی جانب سے Chromium شروع کیے جانے یا اومنی باکس سے تلاش کیے جانے پر دکھائی دینے والے صفحہ کو کنٹرول بھی کرتا ہے۔</translation>
 <translation id="8704119203788522458">‏یہ آپ کا Chromium ہے</translation>
 <translation id="8712637175834984815">سمجھ آ گئی</translation>
diff --git a/chrome/app/resources/chromium_strings_uz.xtb b/chrome/app/resources/chromium_strings_uz.xtb
index ec168c62..9e361e64 100644
--- a/chrome/app/resources/chromium_strings_uz.xtb
+++ b/chrome/app/resources/chromium_strings_uz.xtb
@@ -152,7 +152,6 @@
 <translation id="2718390899429598676">Xavfsizlik himoyasini oshirish maqsadida Chromium ma’lumotlaringizni shifrlaydi.</translation>
 <translation id="2721354645805494590">Chromiumdan Google hisobini olib tashlash uchun hisobdan chiqing</translation>
 <translation id="2722636413143664436">Barcha qurilmalarda parollar, bukmarklar va boshqalarni olish uchun Chromium hisobidan kiring</translation>
-<translation id="2723860029395667894">Google AI rejimi tezkor tugmasini doim chiqarish</translation>
 <translation id="2738871930057338499">Internetga ulanmadi. HTTP 403, taqiqlangan. Proksi konfiguratsiyasini tekshiring.</translation>
 <translation id="2753623023919742414">Qidirish uchun bosing</translation>
 <translation id="2768103863314748511">Chromium birlamchi PDF fayllarni koʻrish vositasi etib tayinlansin</translation>
@@ -647,7 +646,6 @@
 <translation id="8619360774459241877">Chromium ishga tushmoqda...</translation>
 <translation id="8624541899164515475">Sozlamalar yangi varaqda ochiladi.</translation>
 <translation id="8648201657708811153">Google Chrome for Testing asosiy brauzer boʻla olmaydi.</translation>
-<translation id="8677922833187616101">Google AI rejimi tezkor tugmasini doim chiqarish</translation>
 <translation id="8697124171261953979">Bundan tashqari kengaytma Chromium boshlash sahifasini va omniboksdagi so‘rovlar uchun foydalaniladigan birlamchi qidiruv tizimini o‘zgartirdi.</translation>
 <translation id="8704119203788522458">Bu sizning shaxsiy Chromium brauzeringiz</translation>
 <translation id="8712637175834984815">Tushunarli</translation>
diff --git a/chrome/app/resources/chromium_strings_vi.xtb b/chrome/app/resources/chromium_strings_vi.xtb
index 59bdf04..9f236961 100644
--- a/chrome/app/resources/chromium_strings_vi.xtb
+++ b/chrome/app/resources/chromium_strings_vi.xtb
@@ -153,7 +153,6 @@
 <translation id="2718390899429598676">Để bảo mật hơn, Chromium sẽ mã hóa dữ liệu của bạn.</translation>
 <translation id="2721354645805494590">Để xoá Tài khoản Google của bạn khỏi Chromium, hãy đăng xuất</translation>
 <translation id="2722636413143664436">Để sử dụng mật khẩu, dấu trang và các dữ liệu khác trên mọi thiết bị của bạn, hãy đăng nhập vào Chromium</translation>
-<translation id="2723860029395667894">Luôn hiện lối tắt đến Chế độ AI của Google</translation>
 <translation id="2738871930057338499">Không thể kết nối với Internet. HTTP 403 bị cấm. Vui lòng kiểm tra cấu hình proxy.</translation>
 <translation id="2753623023919742414">Nhấp để tìm</translation>
 <translation id="2768103863314748511">Đặt Chromium làm trình xem PDF mặc định</translation>
@@ -650,7 +649,6 @@
 <translation id="8619360774459241877">Đang khởi động Chromium...</translation>
 <translation id="8624541899164515475">Trang Cài đặt, mở trong thẻ mới.</translation>
 <translation id="8648201657708811153">Bạn không thể đặt Google Chrome for Testing làm trình duyệt mặc định.</translation>
-<translation id="8677922833187616101">Luôn hiện lối tắt đến Chế độ AI của Google</translation>
 <translation id="8697124171261953979">Tiện ích này cũng điều khiển trang nào được hiển thị khi bạn khởi động Chromium hoặc tìm kiếm từ Thanh địa chỉ.</translation>
 <translation id="8704119203788522458">Đây là Chromium của bạn</translation>
 <translation id="8712637175834984815">Tôi hiểu</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-CN.xtb b/chrome/app/resources/chromium_strings_zh-CN.xtb
index 027fab47..8ef6e26a 100644
--- a/chrome/app/resources/chromium_strings_zh-CN.xtb
+++ b/chrome/app/resources/chromium_strings_zh-CN.xtb
@@ -152,7 +152,6 @@
 <translation id="2718390899429598676">为了提高安全性,Chromium 将对您的数据进行加密。</translation>
 <translation id="2721354645805494590">若要从 Chromium 中移除您的 Google 账号,请退出账号</translation>
 <translation id="2722636413143664436">如需在您的所有设备上获取密码、书签等信息,请登录 Chromium</translation>
-<translation id="2723860029395667894">始终显示 Google AI 模式快捷方式</translation>
 <translation id="2738871930057338499">无法连接到互联网。发生 HTTP 403 Forbidden 错误,请检查您的代理配置。</translation>
 <translation id="2753623023919742414">点击即可搜索</translation>
 <translation id="2768103863314748511">将 Chromium 设为默认 PDF 查看器</translation>
@@ -647,7 +646,6 @@
 <translation id="8619360774459241877">正在启动 Chromium…</translation>
 <translation id="8624541899164515475">“设置”页面,在新标签页中打开。</translation>
 <translation id="8648201657708811153">您无法将 Google Chrome for Testing 设为默认浏览器。</translation>
-<translation id="8677922833187616101">始终显示 Google AI 模式快捷方式</translation>
 <translation id="8697124171261953979">它还能够控制您启动Chromium后或通过多功能框进行搜索时系统显示的页面。</translation>
 <translation id="8704119203788522458">这是您的专属Chromium</translation>
 <translation id="8712637175834984815">知道了</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-HK.xtb b/chrome/app/resources/chromium_strings_zh-HK.xtb
index d64d541c..288c04f 100644
--- a/chrome/app/resources/chromium_strings_zh-HK.xtb
+++ b/chrome/app/resources/chromium_strings_zh-HK.xtb
@@ -154,7 +154,6 @@
 <translation id="2718390899429598676">為提高安全性,Chromium 會將您的資料加密。</translation>
 <translation id="2721354645805494590">如要從 Chromium 中移除 Google 帳戶,請登出 Chromium</translation>
 <translation id="2722636413143664436">如要在你的所有裝置上取用密碼、書籤和其他資料,請登入 Chromium</translation>
-<translation id="2723860029395667894">一律顯示 Google AI 模式捷徑</translation>
 <translation id="2738871930057338499">無法連線至互聯網。發生 HTTP 403 禁止錯誤,請檢查 Proxy 設定。</translation>
 <translation id="2753623023919742414">按一下即可搜尋</translation>
 <translation id="2768103863314748511">將 Chromium 設定為預設 PDF 檢視器</translation>
@@ -179,6 +178,7 @@
 <translation id="2977506796191543575">如果有網站試圖盜取您的密碼,或當您下載有害檔案時,Chromium 亦可能將網址 (包括部分網頁內容) 傳送至「安全瀏覽」功能</translation>
 <translation id="2981563588585023386">如要按家長所選設定加強網上安全,請登入 Chromium</translation>
 <translation id="3003694935412297923">所有工作</translation>
+<translation id="3012615494352020668">{count,plural, =1{Chromium 需要先驗證身分,才能將部分資料儲存至 Google 帳戶,並在所有裝置上使用。如果你現在登出,系統將刪除有關資料 (1 個項目)。}other{Chromium 需要先驗證身分,才能將部分資料儲存至 Google 帳戶,並在所有裝置上使用。如果你現在登出,系統將刪除有關資料 ({count} 個項目)。}}</translation>
 <translation id="3013473503895162900">在 Chromium 中的新分頁開啟 <ph name="URL" />。</translation>
 <translation id="3032706164202344641">Chromium 無法檢查密碼,請稍後再試。</translation>
 <translation id="3032787606318309379">正在新增至 Chromium…</translation>
@@ -493,6 +493,7 @@
 <translation id="6729124504294600478">如要取得個人化和其他功能,請將 Chromium 加入「網絡和應用程式活動記錄」以及連結的 Google 服務</translation>
 <translation id="6734291798041940871">已為您電腦上的所有使用者安裝 Chromium。</translation>
 <translation id="6751374565094704799">使用 Chromium 的 V8 引擎加快網站速度,但 Chromium 防攻擊的能力會略為下降。此設定已開啟。</translation>
+<translation id="6754665438209053659">{count,plural, =1{部分 Chromium 資料尚未儲存至 Google 帳戶,請等待幾分鐘後再嘗試登出。如果你現在登出,系統將刪除有關資料 (1 個項目)。}other{部分 Chromium 資料尚未儲存至 Google 帳戶,請等待幾分鐘後再嘗試登出。如果你現在登出,系統將刪除有關資料 ({count} 個項目)。}}</translation>
 <translation id="67706546131546258">此檔案可能不安全,因此 Chromium 建議掃瞄檔案。</translation>
 <translation id="6779406956731413166">Chromium 作業系統得以面世,有賴其他<ph name="BEGIN_LINK_CROS_OSS" />開放原始碼軟件<ph name="END_LINK_CROS_OSS" />。</translation>
 <translation id="6831043979455480757">翻譯</translation>
@@ -647,7 +648,6 @@
 <translation id="8619360774459241877">正在啟動 Chromium…</translation>
 <translation id="8624541899164515475">設定,喺新分頁打開。</translation>
 <translation id="8648201657708811153">Google Chrome for Testing 無法設為預設瀏覽器。</translation>
-<translation id="8677922833187616101">一律顯示 Google AI 模式捷徑</translation>
 <translation id="8697124171261953979">這個擴充功能也會控管 Chromium 啟動時或您使用網址列搜尋時所顯示的網頁。</translation>
 <translation id="8704119203788522458">這是您專屬的 Chromium</translation>
 <translation id="8712637175834984815">我知道了</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-TW.xtb b/chrome/app/resources/chromium_strings_zh-TW.xtb
index c734439e..eb79b1d 100644
--- a/chrome/app/resources/chromium_strings_zh-TW.xtb
+++ b/chrome/app/resources/chromium_strings_zh-TW.xtb
@@ -152,7 +152,6 @@
 <translation id="2718390899429598676">為了提升安全性,Chromium 會將您的資料加密保護。</translation>
 <translation id="2721354645805494590">如要從 Chromium 中移除 Google 帳戶,請登出 Chromium</translation>
 <translation id="2722636413143664436">如要在所有裝置上使用你的密碼、書籤和其他資料,請登入 Chromium</translation>
-<translation id="2723860029395667894">一律顯示 Google AI 模式捷徑</translation>
 <translation id="2738871930057338499">無法連線至網際網路。發生 HTTP 403 禁止錯誤,請檢查 Proxy 設定。</translation>
 <translation id="2753623023919742414">按一下即可搜尋</translation>
 <translation id="2768103863314748511">將 Chromium 設為預設 PDF 檢視器</translation>
@@ -647,7 +646,6 @@
 <translation id="8619360774459241877">正在啟動 Chromium…</translation>
 <translation id="8624541899164515475">設定,在新分頁中開啟。</translation>
 <translation id="8648201657708811153">Google Chrome for Testing 無法設為預設瀏覽器。</translation>
-<translation id="8677922833187616101">一律顯示 Google AI 模式捷徑</translation>
 <translation id="8697124171261953979">這個擴充功能也會控管 Chromium 啟動時或你使用網址列搜尋時所顯示的網頁。</translation>
 <translation id="8704119203788522458">這是你專屬的 Chromium</translation>
 <translation id="8712637175834984815">我瞭解了</translation>
diff --git a/chrome/app/resources/chromium_strings_zu.xtb b/chrome/app/resources/chromium_strings_zu.xtb
index c2acdc4..bef7be5 100644
--- a/chrome/app/resources/chromium_strings_zu.xtb
+++ b/chrome/app/resources/chromium_strings_zu.xtb
@@ -154,7 +154,6 @@
 <translation id="2718390899429598676">Ngokuvikela okungeziwe, i-Chromium izobethela idatha yakho.</translation>
 <translation id="2721354645805494590">Ukuze ususe i-Google Account yakho ku-Chromium, phuma ngemvume</translation>
 <translation id="2722636413143664436">Ukuze uthole amaphasiwedi wakho, amabhukhimakhi, nokuningi kuwo wonke amadivayisi akho, ngena ngemvume kuChromium</translation>
-<translation id="2723860029395667894">Bonisa njalo isinqamuleli Semodi ye-AI yeGoogle</translation>
 <translation id="2738871930057338499">Ayikwazi ukuxhuma ku-inthanethi I-HTTP 403 Yenqatshelwe. Sicela uchekhe ukulungiselelwa kommeleli wakho.</translation>
 <translation id="2753623023919742414">Chofoza ukuze useshe</translation>
 <translation id="2768103863314748511">Setha iChromium njengesibuki sakho esizenzakalelayo se-PDF</translation>
@@ -649,7 +648,6 @@
 <translation id="8619360774459241877">Iqalisa i-Chromium...</translation>
 <translation id="8624541899164515475">Amasethingi, avuleka kuthebhu entsha.</translation>
 <translation id="8648201657708811153">I-Google Chrome Yokuhlola ayikwazi ukwenziwa ibhrawuza yakho yokuzenzakalelayo.</translation>
-<translation id="8677922833187616101">Bonisa Njalo Isinqamuleli Semodi ye-AI yeGoogle</translation>
 <translation id="8697124171261953979">Iphinda ilawule ukuthi yiliphi ikhasi eliboniswayo uma uqala i-Chromium noma usesho kusuka ku-Omnibox.</translation>
 <translation id="8704119203788522458">Lena yi-Chromium yakho</translation>
 <translation id="8712637175834984815">Ngiyitholile</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index 2026ab0..e27e05f 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -1063,6 +1063,7 @@
 <translation id="1706586824377653884">تمت الإضافة من قبل المشرف</translation>
 <translation id="170658918174941828">‏سيتم إرسال إصدار Chrome وإصدار نظام التشغيل وإعدادات Google Cast وإحصاءات أداء النسخ المطابق وسجلات تشخيص قناة الاتصال بالإضافة إلى أي معلومات تختار تضمينها أعلاه. ويتم استخدام ملاحظاتك هذه لتشخيص المشاكل والمساعدة في تحسين الميزة. وستتم حماية أي معلومات شخصية ترسلها، سواء بشكل صريح أو بدون قصد، بموجب سياسات الخصوصية التي نلتزم بها. ومن خلال إرسال هذه الملاحظات، فإنّك توافق على أنّه يجوز لشركة Google استخدام الملاحظات التي تقدّمها لتحسين أي منتج أو خدمة من Google.</translation>
 <translation id="17081583771848899">‏مشغّل التطبيقات + Alt + <ph name="TOP_ROW_KEY" /></translation>
+<translation id="170825127491242914">الحفظ في مساحة التخزين في السحابة الإلكترونية</translation>
 <translation id="1708291623166985230">نقطة الاتصال غير مفعَّلة.</translation>
 <translation id="1708338024780164500">(غير نشطة)</translation>
 <translation id="1708563369218024896">لم يتم اختيار أي أداة تجميع للبيانات. يُرجى اختيار أداة تجميع واحدة على الأقل.</translation>
@@ -6157,7 +6158,7 @@
 <translation id="5233638681132016545">علامة تبويب جديدة</translation>
 <translation id="5233736638227740678">ل&amp;صق</translation>
 <translation id="5234523649284990414">‏يُستخدم قارئ الشاشة ChromeVox على ChromeOS بشكل أساسي من قِبل الأشخاص المكفوفين أو الذين يعانون من ضعف في النظر من أجل قراءة النص المعروض على الشاشة باستخدام برنامج تحويل النص إلى كلام أو جهاز عرض بلغة برايل. اضغط على مفتاح المسافة لتفعيل ChromeVox. عند تفعيل ChromeVox، يمكنك إجراء جولة سريعة للتعرّف على ميزاته.</translation>
-<translation id="5234764350956374838">تجاهل</translation>
+<translation id="5234764350956374838">إغلاق</translation>
 <translation id="5235050375939235066">هل تريد إلغاء تثبيت التطبيق؟</translation>
 <translation id="523505283826916779">إعدادات إمكانية الدخول</translation>
 <translation id="5235750401727657667">استبدال الصفحة التي تشاهدها عند فتح علامة تبويب جديدة</translation>
@@ -6666,6 +6667,7 @@
 <translation id="5585912436068747822">تعذّر إتمام عملية التنسيق</translation>
 <translation id="5587765208077583036">للمشاركة، انقر بزر الماوس الأيمن على مجلَّد في تطبيق "الملفات"، ثم اختَر "المشاركة مع "<ph name="SPECIFIC_NAME" />".</translation>
 <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation>
+<translation id="5588712142463367677">فلترة المواقع الإلكترونية على الصفحة</translation>
 <translation id="558918721941304263">جارٍ تحميل التطبيقات...</translation>
 <translation id="5590418976913374224">تشغيل صوت عند بدء تشغيل الجهاز</translation>
 <translation id="5591465468509111843">أحرف متباعدة جدًا</translation>
@@ -8056,6 +8058,7 @@
 <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> - تمت مشاركة محتوى سطح المكتب</translation>
 <translation id="6580060371127789208">اكتملت العملية بنسبة %<ph name="PERCENTAGE_COMPLETE" />.</translation>
 <translation id="6580203076670148210">سرعة الفحص</translation>
+<translation id="6580676117087365538">للحصول على هذه الإضافة على جميع أجهزة الكمبيوتر الخاصة بك، يُرجى إثبات هويتك</translation>
 <translation id="6581356304040102696">يتعذّر استيراد كلمات المرور. يجب أن يكون حجم الملف أقل من 1 ميغابايت.</translation>
 <translation id="6582080224869403177">إعادة ضبط <ph name="DEVICE_TYPE" /> لترقية الأمان</translation>
 <translation id="6582274660680936615">أنت الآن تتصفّح في وضع الضيف</translation>
@@ -9585,6 +9588,7 @@
 <translation id="7647403192093989392">ليست هناك أنشطة حديثة</translation>
 <translation id="7648023614017258011">‏‫Chrome يتحقّق حاليًا من حزمة التثبيت</translation>
 <translation id="7648048654005891115">أسلوب الخريطة الرئيسية</translation>
+<translation id="7648180062672842917">يشتمل هذا الملف على بيانات حسّاسة أو خطيرة. وستسمح لك مؤسستك بحفظه في مساحة التخزين في السحابة الإلكترونية أو تجاهله</translation>
 <translation id="7649070708921625228">مساعدة</translation>
 <translation id="7649954700951153978">‏تذكيري على أجهزة iOS</translation>
 <translation id="7650141368285545431">استخدام مفتاح مرور من جهاز آخر</translation>
@@ -10914,6 +10918,7 @@
 <translation id="8535005006684281994">‏عنوان URL لتجديد شهادة Netscape</translation>
 <translation id="8536810348276651776">‏يؤدي هذا الخيار إلى تسجيل خروجك من معظم المواقع الإلكترونية. ستظل مُسجلاً الدخول إلى حسابك على Google لكي تسري إعدادات Family Link لمتصفِّح Chrome.</translation>
 <translation id="8536956381488731905">إصدار صوت عند الضغط على مفتاح</translation>
+<translation id="8537854269962256103">‏يتم عرض محادثتك مع Gemini في نافذة خارجية. يمكنك النقر في أي مكان على هذه اللوحة الجانبية لنقلها إلى هنا.</translation>
 <translation id="8539727552378197395">‏لا (HttpOnly)</translation>
 <translation id="8539766201049804895">ترقية</translation>
 <translation id="8540136935098276800">‏يُرجى إدخال عنوان URL بتنسيق صحيح.</translation>
@@ -11161,6 +11166,7 @@
 <translation id="8703766890819308134">عرض اختصارات طلبات البحث</translation>
 <translation id="8704662571571150811">النطاقات</translation>
 <translation id="8705331520020532516">الرقم التسلسلي</translation>
+<translation id="870536819717176711">‏عند مشاركة علامة التبويب الحالية مع Gemini، يتم إرسال محتواها بالكامل والوسائط وعنوان URL الخاص بها إلى Google.</translation>
 <translation id="8705580154597116082">‏اتصال Wi-Fi متاح عبر الهاتف</translation>
 <translation id="8705629851992224300">تعذّر الاطّلاع على مفتاح الأمان</translation>
 <translation id="8706111173576263877">تم مسح رمز الاستجابة السريعة ضوئيًا.</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb
index f2da8f1..882911e 100644
--- a/chrome/app/resources/generated_resources_as.xtb
+++ b/chrome/app/resources/generated_resources_as.xtb
@@ -6673,6 +6673,7 @@
 <translation id="5585912436068747822">ফৰ্মেট কৰিব পৰা নগ’ল</translation>
 <translation id="5587765208077583036">শ্বেয়াৰ কৰিবলৈ Files এপত থকা কোনো এটা ফ’ল্ডাৰত সোঁফালে ক্লিক কৰক আৰু "Share with <ph name="SPECIFIC_NAME" />" বাছনি কৰক।</translation>
 <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation>
+<translation id="5588712142463367677">পৃষ্ঠাত ছাইটসমূহ ফিল্টাৰ কৰক</translation>
 <translation id="558918721941304263">এপ্‌ ল’ড কৰি থকা হৈছে...</translation>
 <translation id="5590418976913374224">ডিভাইচ ষ্টাৰ্টআপ হওঁতে ধ্বনি প্লে’ কৰক</translation>
 <translation id="5591465468509111843">বৰ্ণৰ মাজত খালী স্থান যথেষ্ট বেছি আছে</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb
index 71a800ff..2ecfecfb 100644
--- a/chrome/app/resources/generated_resources_bg.xtb
+++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -1065,6 +1065,7 @@
 приемате, че може да го използваме за подобряването
 на всички продукти или услуги на Google.</translation>
 <translation id="17081583771848899">клавиш за стартовия панел + Alt + <ph name="TOP_ROW_KEY" /></translation>
+<translation id="170825127491242914">Запазване в хранилището в облака</translation>
 <translation id="1708291623166985230">Точката за достъп е деактивирана</translation>
 <translation id="1708338024780164500">(Неактивно)</translation>
 <translation id="1708563369218024896">Не е избран източник на данни. Изберете поне един.</translation>
@@ -6673,6 +6674,7 @@
 <translation id="5585912436068747822">Форматирането не бе успешно</translation>
 <translation id="5587765208077583036">За да споделите папка, кликнете с десния бутон върху нея в приложението „Файлове“ и изберете опцията за споделяне с(ъс) <ph name="SPECIFIC_NAME" />.</translation>
 <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation>
+<translation id="5588712142463367677">Филтриране на сайтовете на страницата</translation>
 <translation id="558918721941304263">Приложенията се зареждат...</translation>
 <translation id="5590418976913374224">Възпроизвеждане на звук при стартиране на устройството</translation>
 <translation id="5591465468509111843">Много голямо</translation>
@@ -8064,6 +8066,7 @@
 <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> – съдържанието на работния плот е споделено</translation>
 <translation id="6580060371127789208">Завършено: <ph name="PERCENTAGE_COMPLETE" />%</translation>
 <translation id="6580203076670148210">Скорост на сканиране</translation>
+<translation id="6580676117087365538">Потвърдете самоличността си, за да получите това разширение на всичките си компютри</translation>
 <translation id="6581356304040102696">Импортирането на паролите не е възможно. Размерът на файла трябва да е по-малък от 1 MB.</translation>
 <translation id="6582080224869403177">Нулирайте устройството си <ph name="DEVICE_TYPE" />, за да надстроите функциите за сигурност.</translation>
 <translation id="6582274660680936615">Сърфирате като гост</translation>
@@ -9585,6 +9588,7 @@
 <translation id="7647403192093989392">Няма скорошна активност</translation>
 <translation id="7648023614017258011">Chrome проверява инсталационния пакет</translation>
 <translation id="7648048654005891115">Стил на клавиатурната подредба</translation>
+<translation id="7648180062672842917">В този файл има поверително или опасно съдържание. Организацията ви ще ви даде възможност да го запазите в хранилището в облака или да го отхвърлите</translation>
 <translation id="7649070708921625228">Помощ</translation>
 <translation id="7649954700951153978">Напомняне под iOS</translation>
 <translation id="7650141368285545431">Използване на ключ за достъп от друго устройство</translation>
@@ -10913,6 +10917,7 @@
 <translation id="8535005006684281994">URL адрес за подновяване на сертификат на Netscape</translation>
 <translation id="8536810348276651776">Ще излезете от повечето сайтове, но не и от профила си в Google, така че настройките на Family Link за Chrome ще останат в сила.</translation>
 <translation id="8536956381488731905">Звук при натискане на клавишите</translation>
+<translation id="8537854269962256103">Разговорът ви с Gemini е в изскачащ прозорец за чат. Кликнете където и да е в този страничен панел, за да го преместите тук.</translation>
 <translation id="8539727552378197395">Не (HttpOnly)</translation>
 <translation id="8539766201049804895">Надстройване</translation>
 <translation id="8540136935098276800">Въведете правилно форматиран URL адрес</translation>
@@ -11160,6 +11165,7 @@
 <translation id="8703766890819308134">Показване на преките пътища за търсене</translation>
 <translation id="8704662571571150811">Домейни</translation>
 <translation id="8705331520020532516">Сериен номер</translation>
+<translation id="870536819717176711">Когато изберете да споделите текущия раздел с Gemini, цялото съдържание, мултимедията и URL адресът на раздела се изпращат до Google.</translation>
 <translation id="8705580154597116082">Налице е Wi-Fi през телефон</translation>
 <translation id="8705629851992224300">Ключът ви за сигурност не можа да бъде прочетен</translation>
 <translation id="8706111173576263877">QR кодът е сканиран.</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb
index 5e54905dc..5e64b75 100644
--- a/chrome/app/resources/generated_resources_bn.xtb
+++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -1070,6 +1070,7 @@
     এই মতামত জমা দেওয়ার অর্থ, Google-এর যেকোনও প্রোডাক্ট
     বা পরিষেবার উন্নতির জন্য সেটি ব্যবহার করার ব্যাপারে আপনি সম্মতি জানাচ্ছেন।</translation>
 <translation id="17081583771848899">লঞ্চার + alt + <ph name="TOP_ROW_KEY" /></translation>
+<translation id="170825127491242914">ক্লাউড স্টোরেজে সেভ করুন</translation>
 <translation id="1708291623166985230">হটস্পট বন্ধ আছে</translation>
 <translation id="1708338024780164500">(নিষ্ক্রিয়)</translation>
 <translation id="1708563369218024896">কোনও ডেটা সোর্স বেছে নেওয়া হয়নি। অন্তত একটি ডেটা সোর্স বেছে নিন।</translation>
@@ -8068,6 +8069,7 @@
 <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> - ডেস্কটপ কন্টেন্ট শেয়ার করেছে</translation>
 <translation id="6580060371127789208"><ph name="PERCENTAGE_COMPLETE" />% সম্পূর্ণ হয়েছে</translation>
 <translation id="6580203076670148210">স্ক্যানিং স্পিড</translation>
+<translation id="6580676117087365538">আপনার সব কম্পিউটারে এই এক্সটেনশন পেতে, নিজের পরিচয় যাচাই করিয়ে নিন</translation>
 <translation id="6581356304040102696">পাসওয়ার্ড ইমপোর্ট করা যাচ্ছে না। ফাইলের সাইজ ১ এমবির কম হতে হবে।</translation>
 <translation id="6582080224869403177">আপনার নিরাপত্তা আপগ্রেড করতে <ph name="DEVICE_TYPE" /> রিসেট করুন।</translation>
 <translation id="6582274660680936615">আপনি গেস্ট হিসেবে ব্রাউজ করছেন</translation>
@@ -9591,6 +9593,7 @@
 <translation id="7647403192093989392">সাম্প্রতিক কোনও অ্যাক্টিভিটি নেই</translation>
 <translation id="7648023614017258011">Chrome ইনস্টলেশন বান্ডেল যাচাই করছে</translation>
 <translation id="7648048654005891115">কীম্যাপ ধরন</translation>
+<translation id="7648180062672842917">এই ফাইলে সংবেদনশীল বা বিপজ্জনক ডেটা রয়েছে। ক্লাউড স্টোরেজে এটি সেভ করতে বা এটি বাতিল করতে আপনার সংস্থার কাছ থেকে অনুমতি নিতে হবে</translation>
 <translation id="7649070708921625228">সহায়তা</translation>
 <translation id="7649954700951153978">iOS-এ রিমাইন্ডার দিন</translation>
 <translation id="7650141368285545431">অন্য ডিভাইস থেকে পাসকী ব্যবহার করুন</translation>
@@ -10919,6 +10922,7 @@
 <translation id="8535005006684281994">Netscape সার্টিফিকেট পুনর্নবীকরণ ইউআরএল</translation>
 <translation id="8536810348276651776">বেশিরভাগ সাইট থেকে আপনাকে সাইন-আউট করিয়ে দেয়। নিজের Google অ্যাকাউন্টে সাইন-ইন করে থাকবেন তাই Chrome-এর জন্য আপনার Family Link সেটিংস প্রযোজ্য হবে।</translation>
 <translation id="8536956381488731905">কী প্রেস করার সময় যে শব্দ হয়</translation>
+<translation id="8537854269962256103">পপ-আউট চ্যাটে রয়েছে আপনার Gemini কথোপকথন। এখানে সরাতে এই সাইড প্যানেলটির যেকোনও জায়গায় ক্লিক করুন।</translation>
 <translation id="8539727552378197395">না (কেবলমাত্র Http)</translation>
 <translation id="8539766201049804895">আপগ্রেড করুন</translation>
 <translation id="8540136935098276800">সঠিকভাবে ফর্ম্যাট করা একটি ইউআরএল লিখুন</translation>
@@ -11166,6 +11170,7 @@
 <translation id="8703766890819308134">সার্চ শর্টকাট দেখুন</translation>
 <translation id="8704662571571150811">ডোমেন</translation>
 <translation id="8705331520020532516">ক্রমিক সংখ্যা</translation>
+<translation id="870536819717176711">আপনি Gemini-র সাথে বর্তমান ট্যাব শেয়ার করার বিকল্প বেছে নিলে Google-এর সাথে ট্যাবের সব কন্টেন্ট, মিডিয়া ও URL শেয়ার করা হয়।</translation>
 <translation id="8705580154597116082">ফোন থেকে ওয়াই ফাই পাওয়া যাচ্ছে</translation>
 <translation id="8705629851992224300">আপনার নিরাপত্তা কী পড়া যায়নি</translation>
 <translation id="8706111173576263877">QR কোড স্ক্যান করা হয়েছে।</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index 1028e6c..7b4efe2d 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -6678,6 +6678,7 @@
 <translation id="5585912436068747822">Formatering mislykkedes</translation>
 <translation id="5587765208077583036">Hvis du vil dele, skal du højreklikke på en mappe i appen Filer og derefter vælge "Del med <ph name="SPECIFIC_NAME" />".</translation>
 <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation>
+<translation id="5588712142463367677">Filtrér websites på siden</translation>
 <translation id="558918721941304263">Indlæser apps...</translation>
 <translation id="5590418976913374224">Afspil lyd ved opstart af enheden</translation>
 <translation id="5591465468509111843">Meget store mellemrum</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index b42b49a..d7fc7b2 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -8101,7 +8101,7 @@
 <translation id="6619990499523117484">PIN bestätigen</translation>
 <translation id="6620000730890558421">Tabs mithilfe von KI ordnen</translation>
 <translation id="6620254580880484313">Containername</translation>
-<translation id="6621282332208609777">Google fragen oder URL eingeben</translation>
+<translation id="6621282332208609777">Google fragen oder eine URL eingeben</translation>
 <translation id="6621391692573306628">Wenn du diesen Tab an ein anderes Gerät senden möchtest, melde dich auf beiden Geräten in Chrome an</translation>
 <translation id="6622980291894852883">Bilder weiterhin blockieren</translation>
 <translation id="6624036901798307345">Tippe im Tablet-Modus auf die Tab-Zähler-Schaltfläche in der Symbolleiste, um die neue Tableiste zu öffnen, die Miniaturansichten der einzelnen Tabs anzeigt.</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index 5edf4a4..c0102f0 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -1069,6 +1069,7 @@
     you agree that Google may use feedback that you provide to improve
     any Google product or service.</translation>
 <translation id="17081583771848899">launcher + alt + <ph name="TOP_ROW_KEY" /></translation>
+<translation id="170825127491242914">Save to cloud storage</translation>
 <translation id="1708291623166985230">Hotspot disabled</translation>
 <translation id="1708338024780164500">(Inactive)</translation>
 <translation id="1708563369218024896">No data collector selected. Please select at least one data collector.</translation>
@@ -8066,6 +8067,7 @@
 <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> – Desktop content shared</translation>
 <translation id="6580060371127789208"><ph name="PERCENTAGE_COMPLETE" />% completed</translation>
 <translation id="6580203076670148210">Scanning speed</translation>
+<translation id="6580676117087365538">To get this extension on all your computers, verify that it's you</translation>
 <translation id="6581356304040102696">Can't import passwords. The file size should be less than 1 MB.</translation>
 <translation id="6582080224869403177">Reset your <ph name="DEVICE_TYPE" /> to upgrade your security.</translation>
 <translation id="6582274660680936615">You're browsing as a Guest</translation>
@@ -9587,6 +9589,7 @@
 <translation id="7647403192093989392">No recent activities</translation>
 <translation id="7648023614017258011">Chrome is verifying the installation bundle</translation>
 <translation id="7648048654005891115">Keymap style</translation>
+<translation id="7648180062672842917">This file has sensitive or dangerous data. Your organisation will let you save it to cloud storage or discard it</translation>
 <translation id="7649070708921625228">Help</translation>
 <translation id="7649954700951153978">Remind me on iOS</translation>
 <translation id="7650141368285545431">Use passkey from another device</translation>
@@ -10915,6 +10918,7 @@
 <translation id="8535005006684281994">Netscape Certificate Renewal URL</translation>
 <translation id="8536810348276651776">Signs you out of most sites. You'll stay signed in to your Google Account so your Family Link settings for Chrome apply.</translation>
 <translation id="8536956381488731905">Sound on key-press</translation>
+<translation id="8537854269962256103">Your Gemini conversation is in a pop-out chat. Click anywhere on this side panel to move it here.</translation>
 <translation id="8539727552378197395">No (HttpOnly)</translation>
 <translation id="8539766201049804895">Upgrade</translation>
 <translation id="8540136935098276800">Enter a correctly formatted URL</translation>
@@ -11162,6 +11166,7 @@
 <translation id="8703766890819308134">Show search shortcuts</translation>
 <translation id="8704662571571150811">Domains</translation>
 <translation id="8705331520020532516">Serial Number</translation>
+<translation id="870536819717176711">When you choose to share the current tab with Gemini, the tab's full content, media and URL are sent to Google.</translation>
 <translation id="8705580154597116082">Wi-Fi available via phone</translation>
 <translation id="8705629851992224300">Your security key couldn't be read</translation>
 <translation id="8706111173576263877">QR code has been scanned.</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb
index 1a5995c..89ea8eaf6 100644
--- a/chrome/app/resources/generated_resources_es-419.xtb
+++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -5489,7 +5489,7 @@
 <translation id="4773122030389014189">Compartir el grupo de pestañas “<ph name="GROUP_NAME" />”</translation>
 <translation id="4773253008034797668">Puede conectarse a cualquier dispositivo de tu red local</translation>
 <translation id="477548766361111120">Permitir que la extensión lea y modifique este sitio</translation>
-<translation id="4775646243557794597">Se borró <ph name="TIME_PERIOD" /></translation>
+<translation id="4775646243557794597">Período borrado: <ph name="TIME_PERIOD" /></translation>
 <translation id="4776311127346151860">Se conectó <ph name="DEVICE_NAME" /></translation>
 <translation id="4776594120007763294">Si quieres agregar una página para leerla más tarde, haz clic en el botón</translation>
 <translation id="4777458362738635055">Otros usuarios de este dispositivo pueden usar esta red</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb
index 12ac01d1..751cf8f 100644
--- a/chrome/app/resources/generated_resources_es.xtb
+++ b/chrome/app/resources/generated_resources_es.xtb
@@ -1060,6 +1060,7 @@
 <translation id="1706586824377653884">Añadido por tu administrador</translation>
 <translation id="170658918174941828">Se enviará la versión de Chrome, la versión del sistema operativo, la configuración de envío, las estadísticas de rendimiento de proyección y los registros de diagnóstico de canales de comunicación, así como la información que selecciones más arriba. Tus comentarios se utilizarán para diagnosticar problemas y ayudarán a mejorar la función. La información personal que envíes, ya sea intencionadamente o por error, se protegerá de acuerdo con nuestras políticas de privacidad. Al enviar estos comentarios, aceptas que Google pueda utilizarlos para mejorar sus productos o servicios.</translation>
 <translation id="17081583771848899">tecla del menú de aplicaciones + Alt + <ph name="TOP_ROW_KEY" /></translation>
+<translation id="170825127491242914">Guardar en almacenamiento en la nube</translation>
 <translation id="1708291623166985230">Punto de acceso inhabilitado</translation>
 <translation id="1708338024780164500">(Inactiva)</translation>
 <translation id="1708563369218024896">No se han seleccionado fuentes de recogida de datos. Selecciona al menos una.</translation>
@@ -6661,6 +6662,7 @@
 <translation id="5585912436068747822">Error de formato</translation>
 <translation id="5587765208077583036">Para compartir una carpeta, haz clic en ella con el botón derecho en la aplicación Archivos y selecciona Compartir con <ph name="SPECIFIC_NAME" />.</translation>
 <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation>
+<translation id="5588712142463367677">Filtrar sitios en la página</translation>
 <translation id="558918721941304263">Cargando aplicaciones...</translation>
 <translation id="5590418976913374224">Reproducir sonido al iniciar el dispositivo</translation>
 <translation id="5591465468509111843">Muy ancho</translation>
@@ -8051,6 +8053,7 @@
 <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> - Contenido del ordenador compartido</translation>
 <translation id="6580060371127789208"><ph name="PERCENTAGE_COMPLETE" /> % completado</translation>
 <translation id="6580203076670148210">Velocidad de búsqueda</translation>
+<translation id="6580676117087365538">Para obtener esta extensión en todos tus ordenadores, verifica que eres tú</translation>
 <translation id="6581356304040102696">No se pueden importar las contraseñas. El tamaño del archivo debe ser inferior a 1 MB.</translation>
 <translation id="6582080224869403177">Restablece tu <ph name="DEVICE_TYPE" /> para actualizar la seguridad.</translation>
 <translation id="6582274660680936615">Estás navegando como invitado</translation>
@@ -9572,6 +9575,7 @@
 <translation id="7647403192093989392">Ninguna actividad reciente</translation>
 <translation id="7648023614017258011">Chrome está verificando el paquete de instalación</translation>
 <translation id="7648048654005891115">Estilo de mapa de teclado</translation>
+<translation id="7648180062672842917">Este archivo contiene datos sensibles o peligrosos. Tu organización te permitirá guardarlo en almacenamiento en la nube o descartarlo.</translation>
 <translation id="7649070708921625228">Ayuda</translation>
 <translation id="7649954700951153978">Recuérdamelo en iOS</translation>
 <translation id="7650141368285545431">Usar la llave de acceso de otro dispositivo</translation>
@@ -10900,6 +10904,7 @@
 <translation id="8535005006684281994">URL de renovación de certificado de Netscape</translation>
 <translation id="8536810348276651776">Cierra tu sesión en la mayoría de los sitios. La sesión de tu cuenta de Google seguirá abierta para que se apliquen los ajustes de Family Link en Chrome.</translation>
 <translation id="8536956381488731905">Sonido al pulsar tecla</translation>
+<translation id="8537854269962256103">Tu conversación con Gemini está en un chat emergente. Haz clic en cualquier parte de este panel lateral para moverlo aquí.</translation>
 <translation id="8539727552378197395">No (HttpOnly)</translation>
 <translation id="8539766201049804895">Actualizar</translation>
 <translation id="8540136935098276800">Introduce una URL con el formato correcto</translation>
@@ -11147,6 +11152,7 @@
 <translation id="8703766890819308134">Mostrar atajos de búsqueda</translation>
 <translation id="8704662571571150811">Dominios</translation>
 <translation id="8705331520020532516">Número de serie</translation>
+<translation id="870536819717176711">Cuando decides compartir la pestaña actual con Gemini, el contenido completo, el contenido multimedia y la URL de la pestaña se envían a Google.</translation>
 <translation id="8705580154597116082">Wi-Fi disponible a través del teléfono</translation>
 <translation id="8705629851992224300">No se ha podido leer tu llave de seguridad</translation>
 <translation id="8706111173576263877">Se ha escaneado el código QR.</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb
index 27803709..97f56412 100644
--- a/chrome/app/resources/generated_resources_eu.xtb
+++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -10868,6 +10868,7 @@
 <translation id="8517759303731677493">Editatu…</translation>
 <translation id="8518809011298357036">Itxi goiko ikuspegia</translation>
 <translation id="8518942514525208851">Ezkutatu biraoak</translation>
+<translation id="8520238089740349550">Huts egin du: blokeatu egin da gailuko deskarga</translation>
 <translation id="8523493869875972733">Mantendu aldaketak</translation>
 <translation id="8523849605371521713">Gidalerroei jarraikiz gehitu da</translation>
 <translation id="8524594273111932386">Bilaketa + behera egiteko gezi-tekla</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index 8cdf15ed..a3cd2bbf 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -2879,7 +2879,7 @@
 <translation id="2946640296642327832">فعال کردن بلوتوث</translation>
 <translation id="2947281105969315778">‏برای هم‌رسانی کردن گروه‌های زبانه یا پیوستن به آن‌ها، باید بتوانید به سیستم Chrome وارد شوید</translation>
 <translation id="2947605845283690091">مرور وب باید سریع باشد اکنون چندلحظه برای<ph name="BEGIN_LINK" />بررسی افزونه‌هایتان<ph name="END_LINK" /> وقت بگذارید.</translation>
-<translation id="2948287943780377675">{FILE_COUNT,plural, =1{فایل را اینجا رها کنید}one{فایل‌ها را اینجا رها کنید}other{فایل‌ها را اینجا رها کنید}}</translation>
+<translation id="2948287943780377675">{FILE_COUNT,plural, =1{فایل را اینجا رها کنید}one{فایل را اینجا رها کنید}other{فایل‌ها را اینجا رها کنید}}</translation>
 <translation id="2948300991547862301">رفتن به <ph name="PAGE_TITLE" /></translation>
 <translation id="29488703364906173">مرورگر وب سریع، ساده و ایمن که برای وب مدرن طراحی شده است.</translation>
 <translation id="2950666755714083615">ثبت‌نام شوم</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index cce585a..7285adf9 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -1070,6 +1070,7 @@
     sumasang-ayon kang puwedeng gamitin ng Google ang feedback na ibibigay mo para mapahusay
     ang anumang produkto o serbisyo ng Google.</translation>
 <translation id="17081583771848899">launcher + alt + <ph name="TOP_ROW_KEY" /></translation>
+<translation id="170825127491242914">I-save sa cloud storage</translation>
 <translation id="1708291623166985230">Naka-disable ang hotspot</translation>
 <translation id="1708338024780164500">(Hindi aktibo)</translation>
 <translation id="1708563369218024896">Walang piniling collector ng data Pumili ng kahit isang collector ng data.</translation>
@@ -8067,6 +8068,7 @@
 <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> - Ibinabahagi ang content ng desktop</translation>
 <translation id="6580060371127789208"><ph name="PERCENTAGE_COMPLETE" />% na ang natapos</translation>
 <translation id="6580203076670148210">Bilis ng pag-scan</translation>
+<translation id="6580676117087365538">Para makuha ang extension na ito sa lahat ng iyong computer, i-verify na ikaw ito</translation>
 <translation id="6581356304040102696">Hindi ma-import ang mga password. Dapat ay wala pang 1 MB ang laki ng file.</translation>
 <translation id="6582080224869403177">I-reset ang iyong <ph name="DEVICE_TYPE" /> para i-upgrade ang iyong seguridad.</translation>
 <translation id="6582274660680936615">Nagba-browse ka bilang isang Bisita</translation>
@@ -9590,6 +9592,7 @@
 <translation id="7647403192093989392">Walang kamakailang aktibidad</translation>
 <translation id="7648023614017258011">Vine-verify ng Chrome ang bundle ng pag-install</translation>
 <translation id="7648048654005891115">Estilo ng Keymap</translation>
+<translation id="7648180062672842917">May sensitibo o mapanganib na data ang file na ito. Hahayaan ka ng iyong organisasyon na i-save ito sa cloud storage o i-discard ito</translation>
 <translation id="7649070708921625228">Tulong</translation>
 <translation id="7649954700951153978">Paalalahanan ako sa iOS</translation>
 <translation id="7650141368285545431">Gumamit ng passkey mula sa ibang device</translation>
@@ -10919,6 +10922,7 @@
 <translation id="8535005006684281994">URL ng Pag-renew ng Netscape Certificate</translation>
 <translation id="8536810348276651776">Isa-sign out ka sa karamihan ng mga site. Mananatili kang naka-sign in sa iyong Google Account kaya malalapat ang mga setting mo ng Family Link para sa Chrome.</translation>
 <translation id="8536956381488731905">Tunog sa keypress</translation>
+<translation id="8537854269962256103">Nasa pop-out na chat ang iyong interaction sa Gemini. Mag-click sa kahit saan sa panel sa gilid na ito para ilipat ito rito.</translation>
 <translation id="8539727552378197395">Hindi (HttpOnly)</translation>
 <translation id="8539766201049804895">I-upgrade</translation>
 <translation id="8540136935098276800">Maglagay ng URL na tama ang pag-format</translation>
@@ -11166,6 +11170,7 @@
 <translation id="8703766890819308134">Magpakita ng mga shortcut ng paghahanap</translation>
 <translation id="8704662571571150811">Mga Domain</translation>
 <translation id="8705331520020532516">Serial Number</translation>
+<translation id="870536819717176711">Kapag pinili mong i-share ang kasalukuyang tab sa Gemini, ipapadala sa Google ang buong content, media, at URL ng tab.</translation>
 <translation id="8705580154597116082">Available ang Wi-Fi sa pamamagitan ng telepono</translation>
 <translation id="8705629851992224300">Hindi mabasa ang iyong security key</translation>
 <translation id="8706111173576263877">Na-scan na ang QR Code.</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb
index 42cd5f32..90bbb978 100644
--- a/chrome/app/resources/generated_resources_fr-CA.xtb
+++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -1061,6 +1061,7 @@
 <translation id="1706586824377653884">Ajouté par votre administrateur</translation>
 <translation id="170658918174941828">Nous recevrons la version de Chrome, la version de votre système d'exploitation, les paramètres de diffusion, les statistiques des performances de duplication d'écran et les journaux des diagnostics de votre canal de communication ainsi que toute autre information que vous choisirez d'inclure ci-dessus. Vos commentaires nous servent à diagnostiquer les problèmes et à améliorer la fonctionnalité. Les renseignements personnels que vous nous envoyez, de manière explicite ou accessoire, sont protégés conformément à nos politiques de confidentialité. En nous envoyant ces commentaires, vous acceptez que Google les utilise pour améliorer ses produits ou ses services.</translation>
 <translation id="17081583771848899">lanceur+alt+<ph name="TOP_ROW_KEY" /></translation>
+<translation id="170825127491242914">Enregistrer dans l'espace de stockage infonuagique</translation>
 <translation id="1708291623166985230">Point d'accès sans fil désactivé</translation>
 <translation id="1708338024780164500">(Inactive)</translation>
 <translation id="1708563369218024896">Aucun collecteur de données n'a été sélectionné. Veuillez sélectionner au moins un collecteur de données.</translation>
@@ -8055,6 +8056,7 @@
 <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> – Contenu du bureau partagé</translation>
 <translation id="6580060371127789208">Terminé à <ph name="PERCENTAGE_COMPLETE" /> %</translation>
 <translation id="6580203076670148210">Vitesse de recherche</translation>
+<translation id="6580676117087365538">Pour obtenir cette extension sur tous vos ordinateurs, confirmez votre identité</translation>
 <translation id="6581356304040102696">Impossible d'importer les mots de passe. La taille du fichier doit être inférieure à 1 Mo.</translation>
 <translation id="6582080224869403177">Réinitialisez votre <ph name="DEVICE_TYPE" /> pour effectuer une mise à niveau de la sécurité.</translation>
 <translation id="6582274660680936615">Vous naviguez en tant qu'invité</translation>
@@ -9577,6 +9579,7 @@
 <translation id="7647403192093989392">Aucune activité récente</translation>
 <translation id="7648023614017258011">Chrome vérifie l'ensemble d'installation</translation>
 <translation id="7648048654005891115">Style de mappage du clavier</translation>
+<translation id="7648180062672842917">Ce fichier contient des données sensibles ou dangereuses. Votre organisation vous permettra de l'enregistrer dans l'espace de stockage infonuagique ou de le supprimer</translation>
 <translation id="7649070708921625228">Aide</translation>
 <translation id="7649954700951153978">M'envoyer un rappel sur iOS</translation>
 <translation id="7650141368285545431">Utiliser la clé d'accès d'un autre appareil</translation>
@@ -10904,6 +10907,7 @@
 <translation id="8535005006684281994">URL de renouvellement du certificat Netscape</translation>
 <translation id="8536810348276651776">Cette option vous déconnectera de la plupart des sites. Vous resterez connecté à votre compte Google, donc vos paramètres Family Link pour Chrome s'appliqueront toujours.</translation>
 <translation id="8536956381488731905">Son à chaque touche</translation>
+<translation id="8537854269962256103">Votre conversation Gemini se trouve dans une fenêtre de clavardage. Cliquez n'importe où sur ce panneau latéral pour la déplacer ici.</translation>
 <translation id="8539727552378197395">Non (HttpOnly)</translation>
 <translation id="8539766201049804895">Mettre à niveau</translation>
 <translation id="8540136935098276800">Entrez une URL au format correct</translation>
@@ -11151,6 +11155,7 @@
 <translation id="8703766890819308134">Afficher les raccourcis de recherche</translation>
 <translation id="8704662571571150811">Domaines</translation>
 <translation id="8705331520020532516">Numéro de série</translation>
+<translation id="870536819717176711">Lorsque vous choisissez de partager l'onglet actuel avec Gemini, le contenu complet, les éléments multimédias et l'URL de l'onglet sont envoyés à Google.</translation>
 <translation id="8705580154597116082">Connexion Wi-Fi possible à l'aide d'un téléphone</translation>
 <translation id="8705629851992224300">Impossible de lire votre clé de sécurité</translation>
 <translation id="8706111173576263877">Le code QR a été numérisé.</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index 7766a5c..20fa492 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -11982,7 +11982,7 @@
 <translation id="958571289841636277">Passez à la page suivante ou précédente avec un geste de balayage</translation>
 <translation id="960987915827980018">Environ 1 heure restante</translation>
 <translation id="961010578115289982">Remplacer par la vue de gauche</translation>
-<translation id="961856697154696964">Supprimer les données de navigation</translation>
+<translation id="961856697154696964">Suppr. données navigation</translation>
 <translation id="962802172452141067">Arborescence de dossiers des favoris</translation>
 <translation id="963000966785016697">Rechercher l'image avec <ph name="VISUAL_SEARCH_PROVIDER" /></translation>
 <translation id="964286338916298286">Votre administrateur informatique a désactivé les bonus Chrome pour votre appareil.</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb
index 670b272c..b4de7b3 100644
--- a/chrome/app/resources/generated_resources_gu.xtb
+++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -1058,6 +1058,7 @@
 <translation id="1706586824377653884">તમારા વ્યવસ્થાપક દ્વારા ઉમેરાયેલ</translation>
 <translation id="170658918174941828">તમે ઉપર શામેલ કરવા માટે પસંદ કરો તેવી કોઇપણ માહિતી ઉપરાંત, તમારું Chrome વર્ઝન, ઑપરેટિંગ સિસ્ટમ વર્ઝન, કાસ્ટ સેટિંગ, મીરરીંગ કાર્યપ્રદર્શનની આંકડાકીય માહિતી અને સંચાર ચૅનલ નિદાનના લૉગ સબમિટ કરવામાં આવશે. આ પ્રતિસાદનો ઉપયોગ સમસ્યાઓના નિદાન કરવા અને સુવિધાને બહેતર બનાવવામાં સહાય માટે કરવામાં આવે છે. સ્પષ્ટપણે અથવા તો અકસ્માતે, તમે સબમિટ કરેલી કોઇપણ વ્યક્તિગત માહિતીને અમારી પ્રાઇવસી પૉલિસીઓ મુજબ સુરક્ષિત રાખવામાં આવશે. આ પ્રતિસાદ સબમિટ કરીને, તમે સંમત થાઓ છો કે Google તમે પ્રદાન કરેલા પ્રતિસાદનો ઉપયોગ કોઇપણ Google પ્રોડક્ટ અથવા સેવાને બહેતર બનાવવા માટે કરી શકે છે.</translation>
 <translation id="17081583771848899">લૉન્ચર + alt + <ph name="TOP_ROW_KEY" /></translation>
+<translation id="170825127491242914">ક્લાઉડ સ્ટોરેજમાં સાચવો</translation>
 <translation id="1708291623166985230">હૉટસ્પૉટ બંધ કર્યું</translation>
 <translation id="1708338024780164500">(નિષ્ક્રિય)</translation>
 <translation id="1708563369218024896">કોઈ ડેટા કલેકટરની પસંદગી કરવામાં આવી નથી. કૃપા કરીને ઓછામાં ઓછા એક ડેટા કલેકટરની પસંદગી કરો.</translation>
@@ -8054,6 +8055,7 @@
 <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> - ડેસ્કટૉપ કન્ટેન્ટ શેર કર્યું</translation>
 <translation id="6580060371127789208"><ph name="PERCENTAGE_COMPLETE" />% પૂર્ણ</translation>
 <translation id="6580203076670148210">સ્કૅન કરવાની ઝડપ</translation>
+<translation id="6580676117087365538">તમારા બધા કમ્પ્યૂટર પર આ એક્સ્ટેન્શન મેળવવા માટે, આ તમે જ છો તેની ચકાસણી કરો</translation>
 <translation id="6581356304040102696">પાસવર્ડ આયાત કરી શકાતા નથી. ફાઇલનું કદ 1 MB કરતાં ઓછું હોવું જોઈએ.</translation>
 <translation id="6582080224869403177">તમારી સુરક્ષા અપગ્રેડ કરવા માટે <ph name="DEVICE_TYPE" />ને રીસેટ કરો.</translation>
 <translation id="6582274660680936615">તમે અતિથિ તરીકે બ્રાઉઝ કરી રહ્યાં છો</translation>
@@ -9577,6 +9579,7 @@
 <translation id="7647403192093989392">તાજેતરની કોઈ પ્રવૃત્તિ નથી</translation>
 <translation id="7648023614017258011">Chrome ઇન્સ્ટૉલેશન બંડલની ચકાસણી કરી રહ્યું છે</translation>
 <translation id="7648048654005891115">કીમેપ શૈલી</translation>
+<translation id="7648180062672842917">આ ફાઇલમાં સંવેદનશીલ અથવા જોખમી ડેટા શામેલ છે. તમારી સંસ્થા તેને ક્લાઉડ સ્ટોરેજમાં સાચવવાનો અથવા કાઢી નાખવાનો વિકલ્પ તમને પસંદ કરવા આપશે</translation>
 <translation id="7649070708921625228">સહાય</translation>
 <translation id="7649954700951153978">iOS પર મને યાદ કરાવો</translation>
 <translation id="7650141368285545431">અન્ય ડિવાઇસમાંથી પાસકીનો ઉપયોગ કરો</translation>
@@ -10900,6 +10903,7 @@
 <translation id="8535005006684281994">નેટસ્કેપ પ્રમાણપત્ર નવીકરણ URL</translation>
 <translation id="8536810348276651776">તમને મોટાભાગની સાઇટમાંથી સાઇન આઉટ કરે છે. તમે તમારા Google એકાઉન્ટમાં સાઇન ઇન થયેલા રહેશો, જેથી Chrome માટેના તમારા Family Linkના સેટિંગ લાગુ કરી શકાય.</translation>
 <translation id="8536956381488731905">કી દબાવવા પર સાઉન્ડ</translation>
+<translation id="8537854269962256103">તમારી Gemini વાતચીત પૉપ-આઉટ ચૅટમાં છે. આ બાજુની પૅનલને અહીં ખસેડવા માટે, તેના પર ગમે ત્યાં ક્લિક કરો.</translation>
 <translation id="8539727552378197395">ના (ફક્ત Http)</translation>
 <translation id="8539766201049804895">અપગ્રેડ કરો</translation>
 <translation id="8540136935098276800">સાચી રીતે ફોર્મેટ કરેલું URL દાખલ કરો</translation>
@@ -11147,6 +11151,7 @@
 <translation id="8703766890819308134">શોધ માટે શૉર્ટકટ બતાવો</translation>
 <translation id="8704662571571150811">ડોમેન</translation>
 <translation id="8705331520020532516">અનુક્રમ નંબર</translation>
+<translation id="870536819717176711">જ્યારે તમે વર્તમાન ટૅબને Gemini સાથે શેર કરવાનું પસંદ કરો, ત્યારે Googleને ટૅબનું બધું કન્ટેન્ટ, મીડિયા અને URL મોકલવામાં આવે છે.</translation>
 <translation id="8705580154597116082">ફોન દ્વારા વાઇ-ફાઇ ઉપલબ્ધ</translation>
 <translation id="8705629851992224300">તમારી સુરક્ષા કી વાંચી શકાઈ નથી</translation>
 <translation id="8706111173576263877">QR કોડ સ્કૅન કરવામાં આવ્યો છે.</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index b8c4c7d..1e47857 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -1070,6 +1070,7 @@
     इस फ़ीडबैक (सुझाव, शिकायत या राय) को सबमिट करके, आप इस बात की सहमति देते हैं कि Google आपके दिए गए सुझाव, शिकायत या राय का
     इस्तेमाल किसी भी Google प्रॉडक्ट या सेवा को बेहतर बनाने के लिए कर सकता है.</translation>
 <translation id="17081583771848899">लॉन्चर + alt + <ph name="TOP_ROW_KEY" /></translation>
+<translation id="170825127491242914">क्लाउड स्टोरेज में सेव करें</translation>
 <translation id="1708291623166985230">हॉटस्पॉट बंद कर दिया गया है</translation>
 <translation id="1708338024780164500">(प्रयोग में नहीं)</translation>
 <translation id="1708563369218024896">कोई डेटा कलेक्टर नहीं चुना गया. कृपया कम से कम एक डेटा कलेक्टर चुनें.</translation>
@@ -8064,6 +8065,7 @@
 <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> - डेस्कटॉप की सामग्री शेयर की गई</translation>
 <translation id="6580060371127789208"><ph name="PERCENTAGE_COMPLETE" />% पूरा हो गया है</translation>
 <translation id="6580203076670148210">स्कैन करने की रफ़्तार</translation>
+<translation id="6580676117087365538">सभी कंप्यूटर पर इस एक्सटेंशन को इस्तेमाल करने के लिए, अपनी पहचान की पुष्टि करें</translation>
 <translation id="6581356304040102696">पासवर्ड इंपोर्ट नहीं किए जा सके. फ़ाइल का साइज़ एक एमबी से कम होना चाहिए.</translation>
 <translation id="6582080224869403177">अपनी सुरक्षा बेहतर बनाने के लिए अपना <ph name="DEVICE_TYPE" /> रीसेट करें.</translation>
 <translation id="6582274660680936615">मेहमान मोड में ब्राउज़ किया जा रहा है</translation>
@@ -9586,6 +9588,7 @@
 <translation id="7647403192093989392">कोई हाल की गतिविधि नहीं</translation>
 <translation id="7648023614017258011">Chrome, इंस्टॉलेशन बंडल की पुष्टि कर रहा है</translation>
 <translation id="7648048654005891115">कीमैप शैली</translation>
+<translation id="7648180062672842917">इस फ़ाइल में संवेदनशील या खतरनाक डेटा मौजूद है. आपका संगठन, आपको यह चुनने की अनुमति देगा कि आप इस फ़ाइल को क्लाउड स्टोरेज में सेव करें या इसे हटाएं</translation>
 <translation id="7649070708921625228">सहायता</translation>
 <translation id="7649954700951153978">मुझे iOS डिवाइस पर रिमाइंडर दें</translation>
 <translation id="7650141368285545431">किसी दूसरे डिवाइस की पासकी इस्तेमाल करें</translation>
@@ -10914,6 +10917,7 @@
 <translation id="8535005006684281994">Netscape प्रमाणपत्र नवीनीकरण यूआरएल</translation>
 <translation id="8536810348276651776">आपको ज़्यादातर साइटों से साइन आउट कर देता है. आप अपने Google खाते में साइन इन रहेंगे/रहेंगी, ताकि Chrome के लिए आपकी Family Link सेटिंग लागू हो सकें.</translation>
 <translation id="8536956381488731905">बटन दबाने पर आवाज़</translation>
+<translation id="8537854269962256103">Gemini के साथ की गई आपकी बातचीत, पॉप-आउट चैट में मौजूद है. साइड पैनल को यहां ले जाने के लिए, इस पर कहीं भी क्लिक करें.</translation>
 <translation id="8539727552378197395">नहीं (केवल Http)</translation>
 <translation id="8539766201049804895">बेहतर बनाएं</translation>
 <translation id="8540136935098276800">सही से फ़ॉर्मैट किया गया यूआरएल डालें</translation>
@@ -11161,6 +11165,7 @@
 <translation id="8703766890819308134">सर्च शॉर्टकट दिखाएं</translation>
 <translation id="8704662571571150811">डोमेन</translation>
 <translation id="8705331520020532516">क्रम संख्या</translation>
+<translation id="870536819717176711">मौजूदा टैब को Gemini के साथ शेयर करने का विकल्प चुनने पर, टैब का पूरा कॉन्टेंट, मीडिया, और यूआरएल Google को भेजा जाएगा.</translation>
 <translation id="8705580154597116082">फ़ोन के ज़रिए वाई-फ़ाई उपलब्ध है</translation>
 <translation id="8705629851992224300">आपकी सुरक्षा कुंजी में कुछ गड़बड़ है</translation>
 <translation id="8706111173576263877">क्यूआर कोड स्कैन किया गया.</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb
index 6359537..3577b80 100644
--- a/chrome/app/resources/generated_resources_hy.xtb
+++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -6660,6 +6660,7 @@
 <translation id="5585912436068747822">Ձևաչափումը չհաջողվեց</translation>
 <translation id="5587765208077583036">Կիսվելու համար «Ֆայլեր» հավելվածում պանակի վրա սեղմեք մկնիկի աջ կոճակը և ընտրեք «Կիսվել <ph name="SPECIFIC_NAME" />-ի միջոցով»։</translation>
 <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation>
+<translation id="5588712142463367677">Զտել կայքերը էջում</translation>
 <translation id="558918721941304263">Հավելվածների բեռնում…</translation>
 <translation id="5590418976913374224">Հնչեցնել ձայնային ազդանշան սարքը գործարկելիս</translation>
 <translation id="5591465468509111843">Շատ լայն</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb
index 929192b..91f9f31 100644
--- a/chrome/app/resources/generated_resources_is.xtb
+++ b/chrome/app/resources/generated_resources_is.xtb
@@ -417,7 +417,7 @@
 <translation id="1264337193001759725">Til að skoða annála notendaviðmóts netkerfis skaltu skoða: <ph name="DEVICE_LOG_LINK" /></translation>
 <translation id="1264956950255940376">Pírðu vinstra augað</translation>
 <translation id="1265094893042958831">Býr til tillögur fyrir þessa síðu…</translation>
-<translation id="1265279736024499987">Forritin þín og stillingarnar verða samstillt í öllum ChromeOS Flex tækjum sem þú skráðir þig inn á með Google reikningnum þínum. Samstillingarvalkosti vafra er að finna í <ph name="LINK_BEGIN" />stillingum Chrome<ph name="LINK_END" />.</translation>
+<translation id="1265279736024499987">Forritin þín og stillingarnar verða samstillt í öllum ChromeOS Flex-tækjum sem þú skráðir þig inn á með Google-reikningnum þínum. Samstillingarvalkosti vafra er að finna í <ph name="LINK_BEGIN" />stillingum Chrome<ph name="LINK_END" />.</translation>
 <translation id="1267081565119405990">Sýndu fleiri aðgerðir eins og bæta við dagatal, búa til Google-skjöl og fleira eftir að þú tekur skjámynd eða leitar á skjánum.</translation>
 <translation id="126710816202626562">Þýðingartungumál:</translation>
 <translation id="1267649802567297774">Tilbúin mynd <ph name="INDEX" /> af <ph name="SUBJECT" /> í <ph name="STYLE" />-stíl með <ph name="MOOD" />-stemningu.</translation>
@@ -4323,7 +4323,7 @@
 <translation id="3923958273791212723">Viðvaranir vegna vandamála varðandi afköst</translation>
 <translation id="3924145049010392604">Meta</translation>
 <translation id="3924259174674732591">Stærð skjás og texta <ph name="DISPLAY_ZOOM" />%</translation>
-<translation id="3924487862883651986">Sendir vefslóðir til athugunar í Öruggri vefskoðun. Sendir einnig lítið brot af síðum, niðurhali, virkni viðbóta og kerfisupplýsingar til að auðvelda leit að nýjum ógnum. Tengir þessi gögn tímabundið við Google reikninginn þinn þegar þú ert skráð(ur) inn til að auka öryggi þitt í Google forritum.</translation>
+<translation id="3924487862883651986">Sendir vefslóðir til athugunar í Öruggri vefskoðun. Sendir einnig lítið brot af síðum, niðurhali, virkni viðbóta og kerfisupplýsingar til að auðvelda leit að nýjum ógnum. Tengir þessi gögn tímabundið við Google-reikninginn þinn þegar þú ert skráð(ur) inn til að auka öryggi þitt í Google-forritum.</translation>
 <translation id="3925573269917483990">Myndavél:</translation>
 <translation id="3925926055063465902">Aðrir notendur þessa tækis geta einnig notað þetta net</translation>
 <translation id="3926002189479431949">Skipt um síma Smart Lock</translation>
@@ -6555,7 +6555,7 @@
 <translation id="549957179819296104">Nýtt tákn</translation>
 <translation id="5499634624419508916">Skipta fyrirliggjandi flipahópi út</translation>
 <translation id="5500163593833085874">Þegar vinstri músarhnappur er valinn skaltu nota „+“ til að tvísmella</translation>
-<translation id="5500168250243071806"><ph name="BEGIN_LINK_SEARCH" />Leitarferill<ph name="END_LINK_SEARCH" /> og <ph name="BEGIN_LINK_GOOGLE" />aðrar aðgerðir<ph name="END_LINK_GOOGLE" /> kunna að vera vistaðar á Google reikningnum þínum ef þú ert innskráð(ur). Þú getur eytt þessu hvenær sem er.</translation>
+<translation id="5500168250243071806"><ph name="BEGIN_LINK_SEARCH" />Leitarferill<ph name="END_LINK_SEARCH" /> og <ph name="BEGIN_LINK_GOOGLE" />aðrar aðgerðir<ph name="END_LINK_GOOGLE" /> kunna að vera vistaðar á Google-reikningnum þínum ef þú ert innskráð(ur). Þú getur eytt þessu hvenær sem er.</translation>
 <translation id="5501322521654567960">Hliðargluggi sem er jafnaður til vinstri</translation>
 <translation id="5501809658163361512">{COUNT,plural, =1{Ekki tókst að taka við <ph name="ATTACHMENTS" /> frá <ph name="DEVICE_NAME" />}one{Ekki tókst að taka við <ph name="ATTACHMENTS" /> frá <ph name="DEVICE_NAME" />}other{Ekki tókst að taka við <ph name="ATTACHMENTS" /> frá <ph name="DEVICE_NAME" />}}</translation>
 <translation id="5501979953419946416">Skrifaðu eitthvað nýtt</translation>
@@ -7523,7 +7523,7 @@
 <translation id="6195163219142236913">Fótspor þriðja aðila takmörkuð</translation>
 <translation id="6195693561221576702">Ekki er hægt að setja þetta tæki upp í ótengdri prufustillingu.</translation>
 <translation id="6196640612572343990">Loka á fótspor frá þriðja aðila</translation>
-<translation id="6196854373336333322">Viðbótin „<ph name="EXTENSION_NAME" />“ hefur tekið að sér stjórn yfir proxy-stillingunum þínum, sem þýðir að hún getur breytt, slitið eða hlerað allt sem þú gerir á netinu. Ef þú veist ekki hvernig þetta gerðist er þetta líklega eitthvað sem þú vilt ekki.</translation>
+<translation id="6196854373336333322">Viðbótin „<ph name="EXTENSION_NAME" />“ hefur tekið að sér stjórn yfir staðgengilsþjónsstillingunum þínum, sem þýðir að hún getur breytt, slitið eða hlerað allt sem þú gerir á netinu. Ef þú veist ekki hvernig þetta gerðist er þetta líklega eitthvað sem þú vilt ekki.</translation>
 <translation id="6197128521826316819">Búa til QR-kóða fyrir þessa síðu</translation>
 <translation id="6198223452299275399">Strjúktu á milli síðna</translation>
 <translation id="6198252989419008588">Breyta PIN-númeri</translation>
@@ -8430,7 +8430,7 @@
 <translation id="6824584962142919697">&amp;Kanna einingar</translation>
 <translation id="6825184156888454064">Raða eftir heiti</translation>
 <translation id="6827121912381363404">Leyfa öllum viðbótum að lesa og breyta <ph name="PERMITTED_SITE" /></translation>
-<translation id="6827517233063803343">Forritin þín og stillingarnar verða samstillt í öllum ChromeOS tækjum sem þú skráðir þig inn á með Google reikningnum þínum. Samstillingarvalkosti vafra er að finna í <ph name="LINK_BEGIN" />stillingum Chrome<ph name="LINK_END" />.</translation>
+<translation id="6827517233063803343">Forritin þín og stillingarnar verða samstillt í öllum ChromeOS-tækjum sem þú skráðir þig inn á með Google-reikningnum þínum. Samstillingarvalkosti vafra er að finna í <ph name="LINK_BEGIN" />stillingum Chrome<ph name="LINK_END" />.</translation>
 <translation id="6827767090350758381">Þegar desember 2022 er liðinn verður ekki hægt að opna gamlar útgáfur Chrome forrita í Windows-tækjum. Hafðu samband við stjórnandann til að uppfæra í nýja útgáfu eða fjarlægja þetta forrit.</translation>
 <translation id="6828182567531805778">Sláðu inn aðgangsorðið til að samstilla gögnin þín</translation>
 <translation id="682871081149631693">Flýtilagfæring</translation>
@@ -9604,7 +9604,7 @@
 <translation id="7654941827281939388">Þegar er verið að nota þennan reikning í þessari tölvu.</translation>
 <translation id="7655411746932645568">Vefsvæði geta beðið um að tengjast raðtengjum</translation>
 <translation id="7657090467145778067">Lítill sparnaður</translation>
-<translation id="7657218410916651670"><ph name="BEGIN_LINK_GOOGLE" />Aðrar aðgerðir<ph name="END_LINK_GOOGLE" /> kunna að vera vistaðar á Google reikningnum þínum ef þú ert innskráð(ur). Þú getur eytt þessu hvenær sem er.</translation>
+<translation id="7657218410916651670"><ph name="BEGIN_LINK_GOOGLE" />Aðrar aðgerðir<ph name="END_LINK_GOOGLE" /> kunna að vera vistaðar á Google-reikningnum þínum ef þú ert innskráð(ur). Þú getur eytt þessu hvenær sem er.</translation>
 <translation id="7658239707568436148">Hætta við</translation>
 <translation id="7658395071164441475">Sum aðgangsorð eru aðeins vistuð í þessu tæki. Til að nota þau í öðrum tækjum skaltu vista þau á Google-reikningnum þínum, <ph name="USER_EMAIL" /></translation>
 <translation id="7659154729610375585">Viltu samt loka huliðsstillingu?</translation>
@@ -9921,7 +9921,7 @@
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> – parað</translation>
 <translation id="7869655448736341731">Allt</translation>
 <translation id="7870005751202275328">Smelltu á veffangastikuna</translation>
-<translation id="787069710204604994">Ef þú heimsækir til dæmis vefsvæði sem selur hlaupaskó fyrir langhlaup, gæti vefsvæðið áætlað að þú hafir áhuga á að hlaupa maraþon. Ef þú heimsækir annað vefsvæði síðar gætu auglýsingar fyrir hlaupaskó birst á því vefsvæði í samræmi við tillögu frá fyrra vefsvæðinu.</translation>
+<translation id="787069710204604994">Ef þú heimsækir til dæmis vefsvæði sem selur hlaupaskó fyrir langhlaup gæti vefsvæðið áætlað að þú hafir áhuga á að hlaupa maraþon. Ef þú heimsækir annað vefsvæði síðar gætu auglýsingar fyrir hlaupaskó birst á því vefsvæði í samræmi við tillögu frá fyrra vefsvæðinu.</translation>
 <translation id="7870730066603611552">Fara yfir samstillingarkosti eftir uppsetningu</translation>
 <translation id="7870790288828963061">Engin sjálfsalaforrit í nýrri útgáfu fundust. Ekkert til að uppfæra. Fjarlægðu USB-lykilinn.</translation>
 <translation id="7871109039747854576">Nota lyklana <ph name="COMMA" /> og <ph name="PERIOD" /> til að fara á milli tillögusíðna</translation>
@@ -11110,7 +11110,7 @@
 <translation id="8673026256276578048">Leita á vefnum...</translation>
 <translation id="867329473311423817">Leyft að stjórna gluggum á öllum skjáum</translation>
 <translation id="8673383193459449849">Vandamál á netþjóni</translation>
-<translation id="8674903726754070732">Tölvan er því miður grunnstillt með gölluðu vélbúnaðarauðkenni. Þetta kemur í veg fyrir að ChromeOS geti uppfært í nýjustu öryggisúrræði og tölvan <ph name="BEGIN_BOLD" />kann að vera berskjölduð gagnvart árásum<ph name="END_BOLD" />.</translation>
+<translation id="8674903726754070732">Tölvan er því miður grunnstillt með gölluðu vélbúnaðarauðkenni. Það kemur í veg fyrir að ChromeOS geti uppfært í nýjustu öryggisúrræði og tölvan <ph name="BEGIN_BOLD" />kann að vera berskjölduð gagnvart árásum<ph name="END_BOLD" />.</translation>
 <translation id="8675657007450883866">Vefsvæði nota þennan eiginleika til að nota allan skjáinn sjálfkrafa. Venjulega krefst notkun alls skjásins notendavirkni.</translation>
 <translation id="8675704450909805533">Uppsetningarforritið fann ekki gildan endastað til að setja upp <ph name="DEVICE_OS" />.</translation>
 <translation id="8676152597179121671">{COUNT,plural, =1{Myndskeið}one{# myndskeið}other{# myndskeið}}</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index 1ce870ca..ea6a145 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -1068,6 +1068,7 @@
     מבטאת את הסכמתך לכך ש-Google תהיה רשאית להשתמש במשוב
     ממך כדי לשפר כל מוצר או שירות של Google.</translation>
 <translation id="17081583771848899">‏מרכז האפליקציות + Alt +‏ <ph name="TOP_ROW_KEY" /></translation>
+<translation id="170825127491242914">שמירה באחסון בענן</translation>
 <translation id="1708291623166985230">נקודת האינטרנט מושבתת</translation>
 <translation id="1708338024780164500">(לא פעיל)</translation>
 <translation id="1708563369218024896">לא נבחר אוסף נתונים. יש לבחור לפחות אוסף נתונים אחד.</translation>
@@ -2992,7 +2993,7 @@
 <translation id="3019023222666709803">כלי החץ</translation>
 <translation id="3019285239893817657">כפתור למעבר אל דף משנה</translation>
 <translation id="3019595674945299805">‏שירות VPN</translation>
-<translation id="3020101754533552167">פרטי הכניסה נבדקים…</translation>
+<translation id="3020101754533552167">פרטי הכניסה לחשבון נבדקים…</translation>
 <translation id="3020183492814296499">קיצורי דרך</translation>
 <translation id="3020990233660977256">מספר סידורי: <ph name="SERIAL_NUMBER" /></translation>
 <translation id="3021065318976393105">בזמן שימוש בסוללה</translation>
@@ -6676,6 +6677,7 @@
 <translation id="5585912436068747822">הפרמוט נכשל</translation>
 <translation id="5587765208077583036">כדי לשתף, לוחצים לחיצה ימנית על תיקייה באפליקציה 'קבצים' ובוחרים באפשרות 'שיתוף עם <ph name="SPECIFIC_NAME" />'.</translation>
 <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation>
+<translation id="5588712142463367677">סינון אתרים בדף</translation>
 <translation id="558918721941304263">המערכת טוענת אפליקציות...</translation>
 <translation id="5590418976913374224">השמעת צליל במהלך הפעלת המכשיר</translation>
 <translation id="5591465468509111843">גדול מאוד</translation>
@@ -8066,6 +8068,7 @@
 <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> - תוכן שולחן העבודה משותף</translation>
 <translation id="6580060371127789208">הושלמו: %<ph name="PERCENTAGE_COMPLETE" /></translation>
 <translation id="6580203076670148210">מהירות הסריקה</translation>
+<translation id="6580676117087365538">כדי לקבל את התוסף הזה בכל המחשבים, צריך לאמת את הזהות שלך</translation>
 <translation id="6581356304040102696">‏לא ניתן לייבא את הסיסמאות. גודל הקובץ צריך להיות פחות מ-1MB.</translation>
 <translation id="6582080224869403177">יש לאתחל את <ph name="DEVICE_TYPE" /> כדי לשדרג את האבטחה.</translation>
 <translation id="6582274660680936615">גלישה כאורח</translation>
@@ -9591,6 +9594,7 @@
 <translation id="7647403192093989392">אין פעילויות אחרונות</translation>
 <translation id="7648023614017258011">‏Chrome מאמת את חבילת ההתקנה</translation>
 <translation id="7648048654005891115">סגנון מפת מקשים</translation>
+<translation id="7648180062672842917">הקובץ הזה מכיל נתונים רגישים או מסוכנים. הארגון שלך יאפשר לך לשמור אותם באחסון בענן או למחוק אותם</translation>
 <translation id="7649070708921625228">עזרה</translation>
 <translation id="7649954700951153978">‏קבלת תזכורת ב-iOS</translation>
 <translation id="7650141368285545431">שימוש במפתח גישה ממכשיר אחר</translation>
@@ -10921,6 +10925,7 @@
 <translation id="8535005006684281994">‏כתובת אתר לחידוש אישור Netscape</translation>
 <translation id="8536810348276651776">‏תתבצע יציאה מהחשבון ברוב האתרים. כדי שההגדרות של Family Link ל-Chrome יחולו, לא תתבצע יציאה מחשבון Google.</translation>
 <translation id="8536956381488731905">צלילים בהקשה</translation>
+<translation id="8537854269962256103">‏השיחה עם Gemini מופיעה בחלון קופץ. כדי להעביר את החלונית הצדדית לכאן, צריך ללחוץ במקום כלשהו בחלונית הזו.</translation>
 <translation id="8539727552378197395">‏לא (Http בלבד)</translation>
 <translation id="8539766201049804895">שדרוג</translation>
 <translation id="8540136935098276800">‏יש להזין כתובת URL בפורמט חוקי</translation>
@@ -11168,6 +11173,7 @@
 <translation id="8703766890819308134">הצגת קיצורי הדרך לחיפוש</translation>
 <translation id="8704662571571150811">דומיינים</translation>
 <translation id="8705331520020532516">מספר סידורי</translation>
+<translation id="870536819717176711">‏אם משתפים את הכרטיסייה הנוכחית עם Gemini, התוכן המלא של הכרטיסייה, המדיה וכתובת ה-URL שלה נשלחים אל Google.</translation>
 <translation id="8705580154597116082">‏יש Wi-Fi זמין בטלפון</translation>
 <translation id="8705629851992224300">לא ניתן לקרוא את מפתח האבטחה שלך</translation>
 <translation id="8706111173576263877">‏קוד ה-QR נסרק.</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb
index c8570e4b..e049c1a 100644
--- a/chrome/app/resources/generated_resources_ja.xtb
+++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -1059,6 +1059,7 @@
 <translation id="1706586824377653884">管理者により追加</translation>
 <translation id="170658918174941828">上記で送信するよう選択した情報に加えて、お使いの Chrome のバージョン、オペレーティング システムのバージョン、キャストの設定、ミラーリングのパフォーマンス統計情報、通信チャンネルの診断ログが送信されます。お寄せいただいたフィードバックは、問題の診断と機能の改善に使用されます。送信していただいた個人情報は、直接の送信、他の情報に付随しての送信を問わず、Google のプライバシー ポリシーに従って保護されます。このフィードバックを送信すると、Google がその内容を Google のプロダクトまたはサービスの改善のため使用することについて同意したことになります。</translation>
 <translation id="17081583771848899">ランチャー+Alt+<ph name="TOP_ROW_KEY" /></translation>
+<translation id="170825127491242914">クラウド ストレージに保存</translation>
 <translation id="1708291623166985230">アクセス ポイントを無効にしました</translation>
 <translation id="1708338024780164500">(無効)</translation>
 <translation id="1708563369218024896">データ収集ツールが選択されていません。データ収集ツールを少なくとも 1 つ選択してください。</translation>
@@ -6648,6 +6649,7 @@
 <translation id="5585912436068747822">フォーマット エラー</translation>
 <translation id="5587765208077583036">共有するには、ファイルアプリ内でフォルダを右クリックし、[<ph name="SPECIFIC_NAME" /> と共有] を選択します。</translation>
 <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation>
+<translation id="5588712142463367677">ページ上のサイトをフィルタ</translation>
 <translation id="558918721941304263">アプリを読み込んでいます...</translation>
 <translation id="5590418976913374224">デバイスの起動時に音を鳴らす</translation>
 <translation id="5591465468509111843">かなり広くする</translation>
@@ -8037,6 +8039,7 @@
 <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> - パソコンのコンテンツが共有されています</translation>
 <translation id="6580060371127789208"><ph name="PERCENTAGE_COMPLETE" />% 完了しました</translation>
 <translation id="6580203076670148210">スキャンの速度</translation>
+<translation id="6580676117087365538">すべてのパソコンでこの拡張機能を使用するには、本人確認を行ってください</translation>
 <translation id="6581356304040102696">パスワードをインポートできません。ファイルサイズを 1 MB より小さくしてください。</translation>
 <translation id="6582080224869403177">セキュリティをアップグレードするには <ph name="DEVICE_TYPE" /> をリセットしてください。</translation>
 <translation id="6582274660680936615">ゲスト モードでブラウジング中</translation>
@@ -9557,6 +9560,7 @@
 <translation id="7647403192093989392">最近のアクティビティはありません</translation>
 <translation id="7648023614017258011">Chrome がインストールするバンドルを確認しています</translation>
 <translation id="7648048654005891115">キーマップのスタイル</translation>
+<translation id="7648180062672842917">このファイルにはデリケートなデータまたは危険なデータが含まれています。組織の設定では、このデータをクラウド ストレージに保存するか破棄することができます。</translation>
 <translation id="7649070708921625228">ヘルプ</translation>
 <translation id="7649954700951153978">iOS で通知</translation>
 <translation id="7650141368285545431">別のデバイスのパスキーを使用</translation>
@@ -10884,6 +10888,7 @@
 <translation id="8535005006684281994">Netscape 証明書更新 URL</translation>
 <translation id="8536810348276651776">ほとんどのサイトからログアウトします。ただし、Google アカウントへのログイン状態は維持されるため、Chrome のファミリー リンクの設定は適用されます。</translation>
 <translation id="8536956381488731905">キー操作音</translation>
+<translation id="8537854269962256103">Gemini との会話はポップアウト チャットに表示されます。このサイドパネルの任意の場所をクリックすると、チャットをここに移動します。</translation>
 <translation id="8539727552378197395">いいえ(HTTP のみ)</translation>
 <translation id="8539766201049804895">アップグレード</translation>
 <translation id="8540136935098276800">正しい形式の URL を入力してください</translation>
@@ -11131,6 +11136,7 @@
 <translation id="8703766890819308134">検索ショートカットを表示</translation>
 <translation id="8704662571571150811">ドメイン</translation>
 <translation id="8705331520020532516">シリアル番号</translation>
+<translation id="870536819717176711">現在のタブを Gemini と共有すると、タブのコンテンツ全体、メディア、URL が Google に送信されます。</translation>
 <translation id="8705580154597116082">スマートフォンから Wi-Fi に接続できます</translation>
 <translation id="8705629851992224300">セキュリティ キーを読み取れませんでした</translation>
 <translation id="8706111173576263877">QR コードをスキャンしました。</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb
index 8635b4df..a99e8ae 100644
--- a/chrome/app/resources/generated_resources_km.xtb
+++ b/chrome/app/resources/generated_resources_km.xtb
@@ -6673,6 +6673,7 @@
 <translation id="5585912436068747822">ការសម្អាតបានបរាជ័យ</translation>
 <translation id="5587765208077583036">ដើម្បី​ចែករំលែក សូម​ចុចកណ្ដុរខាងស្ដាំ​លើថត​នៅក្នុង​កម្មវិធី Files រួចជ្រើសរើស "ចែករំលែក​ជាមួយ <ph name="SPECIFIC_NAME" />"។</translation>
 <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation>
+<translation id="5588712142463367677">ត្រង​គេហទំព័រ​នៅលើ​ទំព័រ</translation>
 <translation id="558918721941304263">កំពុង​ផ្ទុក​កម្មវិធី...</translation>
 <translation id="5590418976913374224">ចាក់សំឡេង​នៅពេល​ចាប់ផ្ដើម​ឧបករណ៍</translation>
 <translation id="5591465468509111843">អក្សរឃ្លាតគ្នាខ្លាំង</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb
index d46cd08..bc89c0b 100644
--- a/chrome/app/resources/generated_resources_kn.xtb
+++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -1063,6 +1063,7 @@
 <translation id="1706586824377653884">ನಿಮ್ಮ ನಿರ್ವಾಹಕರ ಮೂಲಕ ಸೇರಿಸಲಾಗಿದೆ</translation>
 <translation id="170658918174941828">ನೀವು ಸೇರಿಸಲು ಆಯ್ಕೆ ಮಾಡಿದ ಮೇಲಿನ ಯಾವುದೇ ಮಾಹಿತಿಯ ಜೊತೆಗೆ, ನಿಮ್ಮ Chrome ಆವೃತ್ತಿ, ಆಪರೇಟಿಂಗ್ ಸಿಸ್ಟಂ ಆವೃತ್ತಿ, ಬಿತ್ತರಿಸುವಿಕೆ ಸೆಟ್ಟಿಂಗ್‌ಗಳು, ಪ್ರತಿಬಿಂಬಿಸುವಿಕೆ ಕಾರ್ಯಕ್ಷಮತೆಯ ಅಂಕಿಅಂಶಗಳು ಮತ್ತು ಸಂವಹನ ಚಾನಲ್ ಡಯಾಗ್ನಾಸ್ಟಿಕ್ ಲಾಗ್‌ಗಳನ್ನು ಸಹ ಸಲ್ಲಿಸಲಾಗುತ್ತದೆ. ಈ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಸಮಸ್ಯೆಗಳನ್ನು ಪತ್ತೆಹಚ್ಚಲು ಮತ್ತು ಫೀಚರ್ ಅನ್ನು ಸುಧಾರಿಸಲು ಸಹಾಯ ಮಾಡಲು ಬಳಸಲಾಗುತ್ತದೆ. ನೀವು ಸಲ್ಲಿಸುವ ಯಾವುದೇ ವೈಯಕ್ತಿಕ ಮಾಹಿತಿಯು, ಸ್ಪಷ್ಟವಾಗಿರಲಿ ಅಥವಾ ಆಕಸ್ಮಿಕವಾಗಿರಲಿ ನಮ್ಮ ಗೌಪ್ಯತೆ ನೀತಿಯ ಅನುಸಾರವಾಗಿ ಅದನ್ನು ರಕ್ಷಿಸಲಾಗುತ್ತದೆ. ಈ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಸಲ್ಲಿಸುವ ಮೂಲಕ, ಯಾವುದೇ Google ಉತ್ಪನ್ನ ಅಥವಾ ಸೇವೆಯನ್ನು ಸುಧಾರಿಸಲು ನೀವು ಒದಗಿಸಿದ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು Google ಬಳಸಬಹುದು ಎಂದು ನೀವು ಸಮ್ಮತಿಸುತ್ತೀರಿ.</translation>
 <translation id="17081583771848899">ಲಾಂಚರ್ + alt + <ph name="TOP_ROW_KEY" /></translation>
+<translation id="170825127491242914">ಕ್ಲೌಡ್ ಸಂಗ್ರಹಣೆಯಲ್ಲಿ ಸೇವ್ ಮಾಡಿ</translation>
 <translation id="1708291623166985230">ಹಾಟ್‌ಸ್ಪಾಟ್ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ</translation>
 <translation id="1708338024780164500">(ಸಕ್ರಿಯವಲ್ಲದ)</translation>
 <translation id="1708563369218024896">ಯಾವುದೇ ಡೇಟಾ ಸಂಗ್ರಾಹಕವನ್ನು ಆಯ್ಕೆಮಾಡಲಾಗಿಲ್ಲ. ಕನಿಷ್ಠ ಒಂದು ಡೇಟಾ ಸಂಗ್ರಾಹಕವನ್ನು ಆಯ್ಕೆಮಾಡಿ.</translation>
@@ -6667,6 +6668,7 @@
 <translation id="5585912436068747822">ಸ್ವರೂಪಣೆಯು ವಿಫಲವಾಗಿದೆ</translation>
 <translation id="5587765208077583036">ಹಂಚಿಕೊಳ್ಳಲು, Files ಆ್ಯಪ್‌ನಲ್ಲಿರುವ ಫೋಲ್ಡರ್ ಮೇಲೆ ಬಲ ಕ್ಲಿಕ್ ಮಾಡಿ, ತದನಂತರ "<ph name="SPECIFIC_NAME" /> ಜೊತೆಗೆ ಹಂಚಿಕೊಳ್ಳಿ" ಆಯ್ಕೆ ಮಾಡಿ.</translation>
 <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation>
+<translation id="5588712142463367677">ಪುಟದಲ್ಲಿ ಸೈಟ್‌ಗಳನ್ನು ಫಿಲ್ಟರ್ ಮಾಡಿ</translation>
 <translation id="558918721941304263">ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ...</translation>
 <translation id="5590418976913374224">ಸಾಧನದ ಪ್ರಾರಂಭದಲ್ಲಿ ಧ್ವನಿಯನ್ನು ಪ್ಲೇ ಮಾಡಿ</translation>
 <translation id="5591465468509111843">ಅಕ್ಷರಗಳ ನಡುವೆ ಹೆಚ್ಚಿನ ಅಂತರ</translation>
@@ -8058,6 +8060,7 @@
 <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> - ಡೆಸ್ಕ್‌ಟಾಪ್ ವಿಷಯವನ್ನು ಹಂಚಲಾಗಿದೆ</translation>
 <translation id="6580060371127789208"><ph name="PERCENTAGE_COMPLETE" />% ಪೂರ್ಣಗೊಂಡಿದೆ</translation>
 <translation id="6580203076670148210">ಸ್ಕ್ಯಾನಿಂಗ್‌ನ ವೇಗ</translation>
+<translation id="6580676117087365538">ನಿಮ್ಮ ಎಲ್ಲಾ ಕಂಪ್ಯೂಟರ್‌ಗಳಲ್ಲಿ ಈ ಎಕ್ಸ್‌ಟೆನ್ಶನ್ ಅನ್ನು ಪಡೆಯಲು, ಇದು ನೀವೇ ಎಂಬುದನ್ನು ದೃಢೀಕರಿಸಿ</translation>
 <translation id="6581356304040102696">ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ಇಂಪೋರ್ಟ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ಫೈಲ್ ಗಾತ್ರವು 1 MB ಗಿಂತ ಕಡಿಮೆಯಿರಬೇಕು.</translation>
 <translation id="6582080224869403177">ನಿಮ್ಮ ಸುರಕ್ಷತೆಯನ್ನು ಅಪ್‌ಗ್ರೇಡ್‌ ಮಾಡಲು, ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ಅನ್ನು ಮರುಹೊಂದಿಸಿ.</translation>
 <translation id="6582274660680936615">ನೀವು ಒಬ್ಬ ಅತಿಥಿಯಾಗಿ ಬ್ರೌಸಿಂಗ್ ಮಾಡುತ್ತಿರುವಿರಿ</translation>
@@ -9581,6 +9584,7 @@
 <translation id="7647403192093989392">ಯಾವುದೇ ಇತ್ತೀಚಿನ ಚಟುವಟಿಕೆಗಳಿಲ್ಲ</translation>
 <translation id="7648023614017258011">Chrome, ಇನ್‌ಸ್ಟಾಲೇಶನ್ ಬಂಡಲ್ ಅನ್ನು ಪರಿಶೀಲಿಸುತ್ತಿದೆ</translation>
 <translation id="7648048654005891115">ಕೀಮ್ಯಾಪ್ ಶೈಲಿ</translation>
+<translation id="7648180062672842917">ಈ ಫೈಲ್ ಸೂಕ್ಷ್ಮ ಅಥವಾ ಅಪಾಯಕಾರಿ ಡೇಟಾವನ್ನು ಒಳಗೊಂಡಿದೆ. ನಿಮ್ಮ ಸಂಸ್ಥೆಯು ಅದನ್ನು ಕ್ಲೌಡ್ ಸಂಗ್ರಹಣೆಯಲ್ಲಿ ಸೇವ್ ಮಾಡಲು ಅಥವಾ ತ್ಯಜಿಸಲು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ</translation>
 <translation id="7649070708921625228">ಸಹಾಯ</translation>
 <translation id="7649954700951153978">iOS ನಲ್ಲಿ ನನಗೆ ರಿಮೈಂಡ್ ಮಾಡಿ</translation>
 <translation id="7650141368285545431">ಇನ್ನೊಂದು ಸಾಧನದ ಪಾಸ್‌ಕೀ ಅನ್ನು ಬಳಸಿ</translation>
@@ -10906,6 +10910,7 @@
 <translation id="8535005006684281994">Netscape ಪ್ರಮಾಣಪತ್ರ ಅಪ್‌ಡೇಟ್‌‌ URL</translation>
 <translation id="8536810348276651776">ಹೆಚ್ಚಿನ ವೆಬ್‌ಸೈಟ್‌ಗಳಿಂದ ಸೈನ್‌ ಔಟ್‌ ಮಾಡುತ್ತದೆ. ಆದಾಗ್ಯೂ, ನಿಮ್ಮ Google ಖಾತೆ ಸೈನ್ ಇನ್ ಆಗಿಯೇ ಇರುತ್ತದೆ. ಹಾಗಾಗಿ Chrome ನಲ್ಲಿನ ನಿಮ್ಮ Family Link ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಕಾರ್ಯನಿರ್ವಹಿಸುವುದನ್ನು ಮುಂದುವರಿಸುತ್ತವೆ.</translation>
 <translation id="8536956381488731905">ಕೀಪ್ರೆಸ್ ಶಬ್ಧ</translation>
+<translation id="8537854269962256103">ನಿಮ್ಮ Gemini ಸಂಭಾಷಣೆಯು ಪಾಪ್-ಔಟ್ ಚಾಟ್‌ನಲ್ಲಿದೆ. ಈ ಸೈಡ್ ಪ್ಯಾನೆಲ್ ಅನ್ನು ಇಲ್ಲಿಗೆ ಸರಿಸಲು ಅದರ ಮೇಲೆ ಎಲ್ಲಿಯಾದರೂ ಕ್ಲಿಕ್ ಮಾಡಿ.</translation>
 <translation id="8539727552378197395">ಇಲ್ಲ (Httpಮಾತ್ರ)</translation>
 <translation id="8539766201049804895">ಅಪ್‌ಗ್ರೇಡ್ ಮಾಡಿ</translation>
 <translation id="8540136935098276800">ಸರಿಯಾಗಿ ಫಾರ್ಮ್ಯಾಟ್ ಮಾಡಲಾದ URL ಅನ್ನು ನಮೂದಿಸಿ</translation>
@@ -11153,6 +11158,7 @@
 <translation id="8703766890819308134">ಹುಡುಕಾಟದ ಶಾರ್ಟ್‌ಕಟ್‌ಗಳನ್ನು ತೋರಿಸಿ</translation>
 <translation id="8704662571571150811">ಡೊಮೇನ್‌ಗಳು</translation>
 <translation id="8705331520020532516">ಕ್ರಮ ಸಂಖ್ಯೆ</translation>
+<translation id="870536819717176711">ನೀವು ಪ್ರಸ್ತುತ ಟ್ಯಾಬ್ ಅನ್ನು Gemini ಜೊತೆಗೆ ಹಂಚಿಕೊಳ್ಳಲು ಆಯ್ಕೆಮಾಡಿದಾಗ, ಟ್ಯಾಬ್‌ನ ಪೂರ್ಣ ಕಂಟೆಂಟ್‌, ಮೀಡಿಯಾ ಮತ್ತು URL ಅನ್ನು Google ಗೆ ಕಳುಹಿಸಲಾಗುತ್ತದೆ.</translation>
 <translation id="8705580154597116082">ಫೋನ್ ಮೂಲಕ ವೈ-ಫೈ ಲಭ್ಯವಿದೆ</translation>
 <translation id="8705629851992224300">ನಿಮ್ಮ ಸುರಕ್ಷತಾ ಕೀಯನ್ನು ಓದಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ</translation>
 <translation id="8706111173576263877">QR ಕೋಡ್ ಅನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಲಾಗಿದೆ.</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb
index 2cf53569..cfe39c3 100644
--- a/chrome/app/resources/generated_resources_lo.xtb
+++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -1771,6 +1771,7 @@
 <translation id="2192505247865591433">ຈາກ:</translation>
 <translation id="219283042927675668">ແຖບໃນກຸ່ມ</translation>
 <translation id="2192881772486983655"><ph name="THIRD_PARTY_NTP_MANAGER" /> ກຳລັງຈັດການໜ້າແຖບໃໝ່ຂອງທ່ານ, ເປີດໃນແຖບໃໝ່</translation>
+<translation id="2192982266585216032">&amp;ການຈ່າຍເງິນ</translation>
 <translation id="2194856509914051091">ສິ່ງທີ່ຕ້ອງພິຈາລະນາ</translation>
 <translation id="2195331105963583686">ທ່ານຈະຍັງສາມາດໃຊ້ <ph name="DEVICE_TYPE" /> ນີ້ໄດ້ຄືເກົ່າຫຼັງຈາກເວລານັ້ນ, ແຕ່ມັນຈະບໍ່ໄດ້ຮັບການອັບເດດຊອບແວ ແລະ ຄວາມປອດໄພໂດຍອັດຕະໂນມັດ</translation>
 <translation id="2195729137168608510">ການປົກປ້ອງອີເມວ</translation>
@@ -3002,6 +3003,7 @@
 <translation id="3022072018423103125">ເຂດພູ</translation>
 <translation id="3022361196600037287"><ph name="DEVICE" /> ຈະຖືກລຶບອອກຈາກ Chromebook ນີ້ ແລະ ຈະບໍ່ຖືກບັນທຶກໄວ້ໃນ <ph name="PRIMARY_EMAIL" />.</translation>
 <translation id="3022978424994383087">ບໍ່ເຂົ້າໃຈສິ່ງນັ້ນ.</translation>
+<translation id="3023204744987201088">&amp;ຂໍ້ມູນຜູ້ຕິດຕໍ່</translation>
 <translation id="3023464535986383522">ເລືອກເພື່ອເວົ້າ</translation>
 <translation id="3024374909719388945">ໃຊ້​ໂມງ​ແບບ 24 ຊົ່ວ​ໂມງ</translation>
 <translation id="3027296729579831126">ເປີດໃຊ້ການແບ່ງປັນໃກ້ຄຽງ</translation>
@@ -6674,6 +6676,7 @@
 <translation id="5585912436068747822">ການຟໍແມັດບໍ່ສໍາເລັດ</translation>
 <translation id="5587765208077583036">ເພື່ອແບ່ງປັນ, ໃຫ້ຄລິກຂວາໃສ່ໂຟນເດີໃນແອັບ Files, ແລ້ວເລືອກ "ແບ່ງປັນກັບ <ph name="SPECIFIC_NAME" />".</translation>
 <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation>
+<translation id="5588712142463367677">ກັ່ນຕອງເວັບໄຊໃນໜ້າ</translation>
 <translation id="558918721941304263">ກຳລັງໂຫຼດແອັບ...</translation>
 <translation id="5590418976913374224">ເປີດສຽງຢູ່ອຸປະກອນສະຕາດອັບ</translation>
 <translation id="5591465468509111843">ກວ້າງຫຼາຍ</translation>
@@ -7941,6 +7944,7 @@
 <translation id="6495261233408033662">ປິດແຖບທີ່ເປີດຢູ່</translation>
 <translation id="6495266441917713704">ບໍ່ສາມາດໂອນຍ້າຍ Wi-Fi ໄດ້</translation>
 <translation id="6495453178162183932">ອັບເດດຮູບແບບສີສັນເປັນ Chrome ເຊິ່ງເປັນຄ່າເລີ່ມຕົ້ນແລ້ວ</translation>
+<translation id="6496641546298525838">ອຸປະກອນຂອງທ່ານ</translation>
 <translation id="6497784818439587832">ປ່ຽນຂະໜາດການສະແດງຜົນເພື່ອເຮັດໃຫ້ລາຍການຕ່າງໆໃນໜ້າຈໍຂອງທ່ານນ້ອຍລົງ ຫຼື ໃຫຍ່ຂຶ້ນ</translation>
 <translation id="6497789971060331894">ການເລື່ອນເມົ້າຖອຍຫຼັງ</translation>
 <translation id="6498249116389603658">&amp;ທຸກພາສາຂອງທ່ານ</translation>
@@ -9760,6 +9764,7 @@
 <translation id="7759809451544302770">ທາງ​ເລືອກ</translation>
 <translation id="7760176388948986635">ອະນຸຍາດໃຫ້ແອັບ, ເວັບໄຊ ແລະ ບໍລິການຂອງ ChromeOS ຮວມທັງ Android ທີ່ໄດ້ຮັບການອະນຸຍາດສະຖານທີ່ໃຊ້ສະຖານທີ່ຂອງອຸປະກອນນີ້. ຄວາມຖືກຕ້ອງຂອງສະຖານທີ່ລະບຸສະຖານທີ່ທີ່ຖືກຕ້ອງຍິ່ງຂຶ້ນສຳລັບແອັບ ແລະ ບໍລິການຕ່າງໆຂອງ Android. ເພື່ອດຳເນີນການນີ້, Google ຈະປະມວນຜົນຂໍ້ມູນກ່ຽວກັບເຊັນເຊີໃນອຸປະກອນ ແລະ ສັນຍານໄຮ້ສາຍຈາກອຸປະກອນນີ້ເປັນໄລຍະເພື່ອຊອກຫາສະຖານທີ່ຂອງສັນຍານໄຮ້ສາຍຈາກມວນຊົນ. ພວກເຮົາໃຊ້ສະຖານທີ່ເຫຼົ່ານີ້ໂດຍບໍ່ລະບຸຕົວຕົນຂອງບຸກຄົນໃດກໍຕາມເພື່ອປັບປຸງຄວາມຖືກຕ້ອງຂອງສະຖານທີ່ ແລະ ບໍລິການທີ່ອ້າງອີງສະຖານທີ່ ຮວມທັງເພື່ອປັບປຸງ, ຈັດຫາ ແລະ ເບິ່ງແຍງຮັກສາບໍລິການຂອງ Google ໂດຍອີງຕາມຜົນປະໂຫຍດທີ່ຖືກຕ້ອງຕາມກົດໝາຍຂອງ Google ແລະ ຂອງພາກສ່ວນທີສາມໃນການຕອບສະໜອງຄວາມຕ້ອງການຂອງຜູ້ໃຊ້.</translation>
 <translation id="7762024824096060040">ບໍ່ສາມາດໃຊ້ບັນຊີນີ້ໄດ້</translation>
+<translation id="776324966908034528">ການຕັ້ງຄ່າພຣັອກຊີຂອງໂປຣແກຣມທ່ອງເວັບຖືກຄວບຄຸມໂດຍແຫຼ່ງທີ່ມາຫຼາຍແຫ່ງ</translation>
 <translation id="7764225426217299476">ເພີ່ມ​ທີ່​ຢູ່</translation>
 <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> ຈາກ <ph name="DOWNLOAD_DOMAIN" /></translation>
 <translation id="7764527477537408401">ເປີດກຸ່ມໃນໜ້າຈໍໃໝ່</translation>
@@ -11012,6 +11017,7 @@
 <translation id="8616441548384109662">ເພີ່ມ <ph name="CONTACT_NAME" /> ໃສ່ລາຍຊື່ຜູ້ຕິດຕໍ່ຂອງທ່ານ</translation>
 <translation id="8617601976406256334">ລຶບຂໍ້ມູນເວັບໄຊ ແລະ ການອະນຸຍາດສຳລັບ <ph name="SITE_NAME" /> ອອກບໍ?</translation>
 <translation id="8617748779076050570">ໄອດີການເຊື່ອມຕໍ່ທີ່ປອດໄພ: <ph name="CONNECTION_ID" /></translation>
+<translation id="8618586951885164886">&amp;ຂໍ້ມູນຜູ້ຕິດຕໍ່</translation>
 <translation id="8619000641825875669">OneDrive</translation>
 <translation id="8619369551122276044">ບໍ່ອະນຸຍາດໃຫ້ຕິດຕັ້ງເວັບແອັບຢູ່ອຸປະກອນຂອງທ່ານ</translation>
 <translation id="8619803522055190423">ເງົາ</translation>
@@ -11612,6 +11618,7 @@
 <translation id="90033698482696970">ສະແກນຫາໂປຣໄຟລ໌ eSIM ທີ່ມີຢູ່ໂດຍອັດຕະໂນມັດບໍ?</translation>
 <translation id="9003647077635673607">ອະ​ນຸ​ຍາດ​ໃຫ້​ຢູ່​ໃນ​ທຸກເວັບ​ໄຊ​ທ​໌​</translation>
 <translation id="9005774573776346118">ເພື່ອເຂົ້າເຖິງລະຫັດຜ່ານ, ບຸກມາກ ແລະ ຂໍ້ມູນອື່ນໆຂອງທ່ານໃນທຸກອຸປະກອນຂອງທ່ານ, ໃຫ້ເຂົ້າສູ່ລະບົບດ້ວຍ <ph name="EMAIL" /></translation>
+<translation id="9006511997799670136">ອົງກອນຂອງທ່ານ</translation>
 <translation id="9008133509889712539"><ph name="ORIGIN" /> ຕ້ອງການເປີດລິ້ງນີ້ໃນແອັບ.</translation>
 <translation id="9008201768610948239">ບໍ່ສົນໃຈ</translation>
 <translation id="9008201858626224558">ປຸ່ມກັບຄືນໜ້າລາຍລະອຽດ <ph name="SUBPAGE_TITLE" /></translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb
index 69eb47ae..153a7a7 100644
--- a/chrome/app/resources/generated_resources_mk.xtb
+++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -1070,6 +1070,7 @@
     се согласувате дека Google може да ги користи за подобрување
     на кој било производ или услуга на Google.</translation>
 <translation id="17081583771848899">launcher + alt + <ph name="TOP_ROW_KEY" /></translation>
+<translation id="170825127491242914">Зачувајте во просторот во облакот</translation>
 <translation id="1708291623166985230">Точката на пристап е оневозможена</translation>
 <translation id="1708338024780164500">(Неактивна)</translation>
 <translation id="1708563369218024896">Не е избран прибирач на податоци. Изберете најмалку еден прибирач на податоци.</translation>
@@ -8067,6 +8068,7 @@
 <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> - содржините од работната површина се споделени</translation>
 <translation id="6580060371127789208">Завршено: <ph name="PERCENTAGE_COMPLETE" /> %</translation>
 <translation id="6580203076670148210">Брзина на скенирање</translation>
+<translation id="6580676117087365538">За да ја добиете екстензијава на сите ваши компјутери, потврдете дека сте вие</translation>
 <translation id="6581356304040102696">Не може да се увезат лозинките. Големината на датотеката треба да биде под 1 MB.</translation>
 <translation id="6582080224869403177">Ресетирајте го <ph name="DEVICE_TYPE" /> за да ја надградите безбедноста.</translation>
 <translation id="6582274660680936615">Прелистувате како гостин</translation>
@@ -9589,6 +9591,7 @@
 <translation id="7647403192093989392">Нема неодамнешни активности</translation>
 <translation id="7648023614017258011">Chrome го потврдува пакетот за инсталација</translation>
 <translation id="7648048654005891115">Стил Keymap</translation>
+<translation id="7648180062672842917">Датотекава содржи чувствителни или опасни податоци. Вашата организација ќе ви дозволи да го зачувате во просторот во облакот или да го отфрлите</translation>
 <translation id="7649070708921625228">Помош</translation>
 <translation id="7649954700951153978">Потсети ме на iOS</translation>
 <translation id="7650141368285545431">Користете криптографски клуч од друг уред</translation>
@@ -10919,6 +10922,7 @@
 <translation id="8535005006684281994">URL за обновување сертификат на Netscape</translation>
 <translation id="8536810348276651776">Ќе ве одјави од повеќето сајтови. Ќе останете најавени на вашата сметка на Google, па важат вашите поставки на Family Link за Chrome.</translation>
 <translation id="8536956381488731905">Звук на притискање копче</translation>
+<translation id="8537854269962256103">Вашиот разговор со Gemini е во одвоен разговор. Кликнете каде било во страничнава табла за да го преместите овде.</translation>
 <translation id="8539727552378197395">Не (HttpOnly)</translation>
 <translation id="8539766201049804895">Надгради</translation>
 <translation id="8540136935098276800">Внесете правилно форматирана URL-адреса</translation>
@@ -11166,6 +11170,7 @@
 <translation id="8703766890819308134">Прикажи ги кратенките за пребарување</translation>
 <translation id="8704662571571150811">Домени</translation>
 <translation id="8705331520020532516">Сериски број</translation>
+<translation id="870536819717176711">Кога ќе изберете да ја споделите тековната картичка со Gemini, сите содржини, аудиовизуелни содржини и URL-адресата на картичката се испраќаат до Google.</translation>
 <translation id="8705580154597116082">Wi-Fi е достапно преку телефон</translation>
 <translation id="8705629851992224300">Не може да се прочита безбедносниот клуч</translation>
 <translation id="8706111173576263877">QR-кодот е скениран.</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb
index 2f03fb36..cbab3b0 100644
--- a/chrome/app/resources/generated_resources_ml.xtb
+++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -1057,6 +1057,7 @@
 <translation id="1706586824377653884">നിങ്ങളുടെ അഡ്‌മിനിസ്‌ട്രേറ്റർ ചേർത്തത്</translation>
 <translation id="170658918174941828">മുകളിൽ ഉൾപ്പെടുത്താൻ നിങ്ങൾ തിരഞ്ഞെടുത്ത എല്ലാ വിവരങ്ങൾക്കും പുറമെ നിങ്ങളുടെ Chrome പതിപ്പ്, ഓപ്പറേറ്റിംഗ് സിസ്റ്റത്തിന്റെ പതിപ്പ്, Cast ക്രമീകരണം, മിററിംഗ് പ്രകടന സ്ഥിതിവിവരക്കണക്കുകൾ, കമ്മ്യൂണിക്കേഷൻ ചാനൽ ഡയഗണോസ്റ്റിക് ലോഗുകൾ എന്നിവയും സമർപ്പിക്കുന്നതാണ്. പ്രശ്‌നങ്ങൾ നിർണ്ണയിച്ച് ഫീച്ചർ മെച്ചപ്പെടുത്തുന്നതിന് ഈ ഫീഡ്‌ബാക്ക് ഉപയോഗിക്കുന്നതാണ്. വ്യക്തമായോ ആകസ്‌മികമായോ നിങ്ങൾ സമർപ്പിക്കുന്ന എല്ലാ വ്യക്തിഗത വിവരങ്ങളും ഞങ്ങളുടെ സ്വകാര്യതാ നയങ്ങൾ പ്രകാരം പരിരക്ഷിക്കും. ഈ ഫീഡ്‌ബാക്ക് സമർപ്പിക്കുന്നതിലൂടെ, Google-ന്റെ ഏതെങ്കിലും ഉൽപ്പന്നമോ സേവനമോ മെച്ചപ്പെടുത്താൻ നിങ്ങൾ നൽകിയ ഫീഡ്‌ബാക്ക് Google ഉപയോഗിക്കാനിടയുണ്ടെന്ന് നിങ്ങൾ അംഗീകരിക്കുന്നു.</translation>
 <translation id="17081583771848899">ലോഞ്ചർ + alt + <ph name="TOP_ROW_KEY" /></translation>
+<translation id="170825127491242914">ക്ലൗഡ് സ്‌റ്റോറേജിലേക്ക് സംരക്ഷിക്കുക</translation>
 <translation id="1708291623166985230">ഹോട്ട് സ്‌പോട്ട് പ്രവർത്തനരഹിതമാക്കി</translation>
 <translation id="1708338024780164500">(നിഷ്‌ക്രിയം)</translation>
 <translation id="1708563369218024896">ഡാറ്റാ കളക്ടർ ഒന്നും തിരഞ്ഞെടുത്തിട്ടില്ല. ഒരു ഡാറ്റാ കളക്ടർ എങ്കിലും തിരഞ്ഞെടുക്കുക.</translation>
@@ -6659,6 +6660,7 @@
 <translation id="5585912436068747822">ഫോർമാറ്റുചെയ്യൽ പരാജയപ്പെട്ടു</translation>
 <translation id="5587765208077583036">പങ്കിടാൻ, Files ആപ്പിലെ ഒരു ഫോൾഡറിൽ വലത് ക്ലിക്ക് ചെയ്‌തശേഷം, "<ph name="SPECIFIC_NAME" /> ഉപയോഗിച്ച് പങ്കിടുക" തിരഞ്ഞെടുക്കുക.</translation>
 <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation>
+<translation id="5588712142463367677">പേജിലെ സൈറ്റുകൾ ഫിൽട്ടർ ചെയ്യുക</translation>
 <translation id="558918721941304263">ആപ്പുകൾ ലോഡുചെയ്യുന്നു...</translation>
 <translation id="5590418976913374224">ഉപകരണം ആരംഭിക്കുമ്പോൾ ശബ്ദം പ്ലേ ചെയ്യുക</translation>
 <translation id="5591465468509111843">അകലം വളരെ കൂടുതലാണ്</translation>
@@ -8049,6 +8051,7 @@
 <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> - ഡെസ്‌ക്‌ടോപ്പ് ഉള്ളടക്കം പങ്കിട്ടു</translation>
 <translation id="6580060371127789208"><ph name="PERCENTAGE_COMPLETE" />% പൂർത്തിയായി</translation>
 <translation id="6580203076670148210">സ്‌കാനിംഗ് വേഗത</translation>
+<translation id="6580676117087365538">നിങ്ങളുടെ എല്ലാ കമ്പ്യൂട്ടറുകളിലും ഈ വിപുലീകരണം ലഭിക്കാൻ, ഇത് നിങ്ങൾ തന്നെയാണെന്ന് പരിശോധിച്ചുറപ്പിക്കുക</translation>
 <translation id="6581356304040102696">പാസ്‌വേഡുകൾ ഇമ്പോർട്ട് ചെയ്യാനാകുന്നില്ല. ഫയലിന്റെ വലുപ്പം 1 MB-യിലും കുറവായിരിക്കണം.</translation>
 <translation id="6582080224869403177">സുരക്ഷ അപ്‌ഗ്രേഡ് ചെയ്യാനായി നിങ്ങളുടെ <ph name="DEVICE_TYPE" /> പുനഃക്രമീകരിക്കുക.</translation>
 <translation id="6582274660680936615">നിങ്ങൾ ഒരു അതിഥിയായി ബ്രൗസ് ചെയ്യുന്നു</translation>
@@ -9569,6 +9572,7 @@
 <translation id="7647403192093989392">സമീപകാല പ്രവര്‍‌ത്തനങ്ങളൊന്നുമില്ല</translation>
 <translation id="7648023614017258011">Chrome, ഇൻസ്‌റ്റലേഷൻ ബണ്ടിൽ പരിശോധിച്ചുറപ്പിക്കുകയാണ്</translation>
 <translation id="7648048654005891115">കീമാപ്പ് ശൈലി</translation>
+<translation id="7648180062672842917">ഈ ഫയലിൽ സൂക്ഷ്‌മമായി കൈകാര്യം ചെയ്യേണ്ടതോ അപകടകരമായതോ ആയ ഡാറ്റ അടങ്ങിയിരിക്കുന്നു. ക്ലൗഡ് സ്റ്റോറേജിലേക്ക് അത് സംരക്ഷിക്കാനോ നിരസിക്കാനോ നിങ്ങളുടെ സ്ഥാപനം നിങ്ങളെ അനുവദിക്കും</translation>
 <translation id="7649070708921625228">സഹായം</translation>
 <translation id="7649954700951153978">iOS-ൽ എന്നെ ഓർമ്മിപ്പിക്കുക</translation>
 <translation id="7650141368285545431">മറ്റൊരു ഉപകരണത്തിൽ നിന്ന് പാസ്‌കീ ഉപയോഗിക്കുക</translation>
@@ -10897,6 +10901,7 @@
 <translation id="8535005006684281994">നെറ്റ്‌സ്‌കേപ്പ് സര്‍‌ട്ടിഫിക്കറ്റ് പുതുക്കല്‍‌URL</translation>
 <translation id="8536810348276651776">നിങ്ങൾ മിക്ക സൈറ്റുകളിൽ നിന്നും സൈൻ ഔട്ടാകും. Chrome-നായുള്ള Family Link ക്രമീകരണങ്ങൾ ബാധകമാകേണ്ടതിന് നിങ്ങൾ Google Account-ൽ സൈൻ ഇൻ ചെയ്‌ത നിലയിൽ തുടരും.</translation>
 <translation id="8536956381488731905">കീ അമർത്തുമ്പോഴുള്ള ശബ്‌ദം</translation>
+<translation id="8537854269962256103">നിങ്ങളുടെ Gemini സംഭാഷണം ഒരു പോപ്പ്-ഔട്ട് ചാറ്റിലാണ്. ഈ സൈഡ് പാനൽ ഇവിടേക്ക് നീക്കാൻ അതിൽ എവിടെയെങ്കിലും ക്ലിക്ക് ചെയ്യുക.</translation>
 <translation id="8539727552378197395">ഇല്ല (Httpമാത്രം)</translation>
 <translation id="8539766201049804895">അപ്‍ഗ്രേഡ് ചെയ്യുക</translation>
 <translation id="8540136935098276800">ശരിയായി ഫോർമാറ്റ് ചെയ്‌ത URL നൽകുക</translation>
@@ -11144,6 +11149,7 @@
 <translation id="8703766890819308134">തിരയൽ കുറുക്കുവഴികൾ കാണിക്കുക</translation>
 <translation id="8704662571571150811">ഡൊമെയ്‌നുകൾ</translation>
 <translation id="8705331520020532516">സീരിയല്‍‌ നമ്പര്‍‌</translation>
+<translation id="870536819717176711">നിങ്ങൾ നിലവിലെ ടാബ് Gemini-യുമായി പങ്കിടാൻ തിരഞ്ഞെടുക്കുമ്പോൾ, ടാബിന്റെ മുഴുവൻ ഉള്ളടക്കവും മീഡിയയും URL-ഉം Google-ലേക്ക് അയയ്ക്കും.</translation>
 <translation id="8705580154597116082">ഫോൺ വഴി ലഭ്യമായ വൈഫൈ</translation>
 <translation id="8705629851992224300">നിങ്ങളുടെ സുരക്ഷാ കീ വായിക്കാനായില്ല</translation>
 <translation id="8706111173576263877">QR കോഡ് സ്കാൻ ചെയ്തു.</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb
index 26f6de9d..fbdcfb8 100644
--- a/chrome/app/resources/generated_resources_mn.xtb
+++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -1066,6 +1066,7 @@
     Google таны өгсөн санал хүсэлтийг Google-н аливаа бүтээгдэхүүн
     эсвэл үйлчилгээг сайжруулахад ашиглаж болохыг зөвшөөрч байна.</translation>
 <translation id="17081583771848899">эхлүүлэгч + alt + <ph name="TOP_ROW_KEY" /></translation>
+<translation id="170825127491242914">Үүлэн хадгалах санд хадгалах</translation>
 <translation id="1708291623166985230">Сүлжээний цэгийг идэвхгүй болгосон</translation>
 <translation id="1708338024780164500">(Идэвхигүй)</translation>
 <translation id="1708563369218024896">Ямар ч өгөгдөл цуглуулагч сонгоогүй. Дор хаяж нэг өгөгдөл цуглуулагч сонгоно уу.</translation>
@@ -6672,6 +6673,7 @@
 <translation id="5585912436068747822">Форматлах явц амжилтгүй боллоо</translation>
 <translation id="5587765208077583036">Хуваалцахын тулд Файлс аппын фолдерын баруун талыг товшоод дараа нь "<ph name="SPECIFIC_NAME" />-тай хуваалцах"-ыг сонгоно уу.</translation>
 <translation id="5588033542900357244">( <ph name="RATING_COUNT" /> )</translation>
+<translation id="5588712142463367677">Хуудсан дээрх сайтуудыг шүүх</translation>
 <translation id="558918721941304263">Аппыг ачаалж байна...</translation>
 <translation id="5590418976913374224">Төхөөрөмжийн эхлэлд дуу тоглуулах</translation>
 <translation id="5591465468509111843">Маш өргөн</translation>
@@ -8062,6 +8064,7 @@
 <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> - Дэлгэцийн агуулгыг хуваалцаж байна</translation>
 <translation id="6580060371127789208"><ph name="PERCENTAGE_COMPLETE" />%-ийг гүйцээсэн</translation>
 <translation id="6580203076670148210">Скан хийх хурд</translation>
+<translation id="6580676117087365538">Энэ өргөтгөлийг бүх компьютер дээрээ авахын тулд өөрийгөө мөн болохыг баталгаажуулна уу</translation>
 <translation id="6581356304040102696">Нууц үгийг импортлох боломжгүй. Файлын хэмжээ 1 МБ-аас бага байх ёстой.</translation>
 <translation id="6582080224869403177">Аюулгүй байдлаа сайжруулахын тулд <ph name="DEVICE_TYPE" />-ээ шинэчилнэ үү.</translation>
 <translation id="6582274660680936615">Та Зочноор үзэж байна</translation>
@@ -9582,6 +9585,7 @@
 <translation id="7647403192093989392">Саяхны үйл ажиллагаа байхгүй</translation>
 <translation id="7648023614017258011">Chrome суулгах багцыг баталгаажуулж байна</translation>
 <translation id="7648048654005891115">Гарын товчлууруудын байрлалын загвар</translation>
+<translation id="7648180062672842917">Энэ файл эмзэг, аюултай өгөгдөлтэй байна. Танай байгууллага танд үүнийг үүлэн хадгалах санд хадгалах, устгахыг зөвшөөрнө</translation>
 <translation id="7649070708921625228">Тусламж</translation>
 <translation id="7649954700951153978">iOS дээр надад сануул</translation>
 <translation id="7650141368285545431">Өөр төхөөрөмжөөс нэвтрэх түлхүүр ашиглах</translation>
@@ -10908,6 +10912,7 @@
 <translation id="8535005006684281994">Нетскейп гэрчилгээг шинэчлэх холбоос</translation>
 <translation id="8536810348276651776">Таныг ихэнх сайтаас гаргана. Та Google Бүртгэлдээ нэвтэрсэн хэвээр байх бөгөөд ингэснээр таны Chrome-н Family Link-н тохиргоо хэрэгжинэ.</translation>
 <translation id="8536956381488731905">Товч дарахад дуу гарах</translation>
+<translation id="8537854269962256103">Таны Gemini-тай хийсэн харилцан яриа попап чатад байна. Энэ хажуугийн самбарыг ийш зөөхийн тулд самбарын дурын хэсэгт товшино уу.</translation>
 <translation id="8539727552378197395">Үгүй (HttpOnly)</translation>
 <translation id="8539766201049804895">Дэвшүүлэх</translation>
 <translation id="8540136935098276800">Зөв форматтай URL оруулна уу</translation>
@@ -11155,6 +11160,7 @@
 <translation id="8703766890819308134">Хайлтын товчлолыг харуулах</translation>
 <translation id="8704662571571150811">Домэйнүүд</translation>
 <translation id="8705331520020532516">Сери дугаар</translation>
+<translation id="870536819717176711">Таныг одоогийн табыг Gemini-тай хуваалцахаар сонгох үед тухайн табын бүрэн агуулга, медиа, URL-г Google-д илгээнэ.</translation>
 <translation id="8705580154597116082">Wi-Fi-д утсаар холбогдох боломжтой</translation>
 <translation id="8705629851992224300">Таны аюулгүй байдлын түлхүүрийг унших боломжгүй байна</translation>
 <translation id="8706111173576263877">QR кодыг скан хийсэн.</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb
index c231e1e..751a9ce 100644
--- a/chrome/app/resources/generated_resources_ms.xtb
+++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -6677,6 +6677,7 @@
 <translation id="5585912436068747822">Pemformatan gagal</translation>
 <translation id="5587765208077583036">Untuk berkongsi, klik kanan folder dalam apl Fail, kemudian pilih "Kongsi dengan <ph name="SPECIFIC_NAME" />".</translation>
 <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation>
+<translation id="5588712142463367677">Tapis laman pada halaman</translation>
 <translation id="558918721941304263">Memuatkan apl...</translation>
 <translation id="5590418976913374224">Mainkan bunyi pada permulaan peranti</translation>
 <translation id="5591465468509111843">Sangat lebar</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb
index ed18c243..5542bad1 100644
--- a/chrome/app/resources/generated_resources_no.xtb
+++ b/chrome/app/resources/generated_resources_no.xtb
@@ -1064,6 +1064,7 @@
     du at Google bruker informasjonen du sender inn, til å forbedre
     Google-produkter og -tjenester.</translation>
 <translation id="17081583771848899">Appoversikt-tasten + Alt + <ph name="TOP_ROW_KEY" /></translation>
+<translation id="170825127491242914">Lagre i nettskyen</translation>
 <translation id="1708291623166985230">Wifi-sone er slått av</translation>
 <translation id="1708338024780164500">(Inaktiv)</translation>
 <translation id="1708563369218024896">Ingen datasamler er valgt. Velg minst én datasamler.</translation>
@@ -6665,6 +6666,7 @@
 <translation id="5585912436068747822">Formateringen mislyktes</translation>
 <translation id="5587765208077583036">For å dele en mappe, høyreklikk på den i Filer-appen, og velg «Del med <ph name="SPECIFIC_NAME" />».</translation>
 <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation>
+<translation id="5588712142463367677">Filtrer nettsteder på siden</translation>
 <translation id="558918721941304263">Laster inn apper …</translation>
 <translation id="5590418976913374224">Spill av lyd ved oppstart av enheten</translation>
 <translation id="5591465468509111843">Svært bred</translation>
@@ -8055,6 +8057,7 @@
 <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> – skrivebordinnholdet er delt</translation>
 <translation id="6580060371127789208"><ph name="PERCENTAGE_COMPLETE" /> % fullført</translation>
 <translation id="6580203076670148210">Skannehastighet</translation>
+<translation id="6580676117087365538">Bekreft at det er deg for å få denne utvidelsen på alle datamaskinene dine.</translation>
 <translation id="6581356304040102696">Kan ikke importere passordene. Filstørrelsen må være mindre enn 1 MB.</translation>
 <translation id="6582080224869403177">Tilbakestill <ph name="DEVICE_TYPE" /> for å oppgradere sikkerheten din.</translation>
 <translation id="6582274660680936615">Du surfer som gjest</translation>
@@ -9576,6 +9579,7 @@
 <translation id="7647403192093989392">Ingen nylige aktiviteter</translation>
 <translation id="7648023614017258011">Chrome bekrefter installeringspakken</translation>
 <translation id="7648048654005891115">Keymap-stil</translation>
+<translation id="7648180062672842917">Denne filen har sensitive eller farlige data. Organisasjonen din lar deg lagre den i skylagring eller forkaste den</translation>
 <translation id="7649070708921625228">Hjelp</translation>
 <translation id="7649954700951153978">Minn meg på dette i iOS</translation>
 <translation id="7650141368285545431">Bruk passnøkkel fra en annen enhet</translation>
@@ -10904,6 +10908,7 @@
 <translation id="8535005006684281994">Fornying av Netscape-sertifikat for nettadresse</translation>
 <translation id="8536810348276651776">Logger deg av de fleste nettsteder. Du forblir pålogget Google-kontoen din, slik at Family Link-innstillingene for Chrome fortsetter å gjelde.</translation>
 <translation id="8536956381488731905">Lyd ved tastetrykk</translation>
+<translation id="8537854269962256103">Gemini-samtalen din er i en chat i et eget vindu. Klikk hvor som helst i dette sidepanelet for å flytte den hit.</translation>
 <translation id="8539727552378197395">Nei (kun http)</translation>
 <translation id="8539766201049804895">Oppgrader</translation>
 <translation id="8540136935098276800">Skriv inn en riktig formatert nettadresse</translation>
@@ -11151,6 +11156,7 @@
 <translation id="8703766890819308134">Vis søkesnarveier</translation>
 <translation id="8704662571571150811">Domener</translation>
 <translation id="8705331520020532516">Serienummer</translation>
+<translation id="870536819717176711">Når du velger å dele den aktive fanen med Gemini, sendes hele innholdet, media og nettadressen til Google.</translation>
 <translation id="8705580154597116082">Wifi er tilgjengelig via telefon</translation>
 <translation id="8705629851992224300">Kunne ikke lese sikkerhetsnøkkelen</translation>
 <translation id="8706111173576263877">QR-koden er skannet.</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb
index 969df89b..e8b3b53 100644
--- a/chrome/app/resources/generated_resources_pa.xtb
+++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -1070,6 +1070,7 @@
     ਦਿੰਦੇ ਹੋ ਕਿ Google ਤੁਹਾਡੇ ਵੱਲੋਂ ਮੁਹੱਈਆ ਕਰਵਾਏ ਵਿਚਾਰ ਦੀ ਵਰਤੋਂ
     ਕਿਸੇ ਵੀ Google ਉਤਪਾਦ ਜਾਂ ਸੇਵਾ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ ਕਰ ਸਕਦਾ ਹੈ।</translation>
 <translation id="17081583771848899">ਲਾਂਚਰ + alt + <ph name="TOP_ROW_KEY" /></translation>
+<translation id="170825127491242914">ਕਲਾਊਡ ਸਟੋਰੇਜ ਵਿੱਚ ਰੱਖਿਅਤ ਕਰੋ</translation>
 <translation id="1708291623166985230">ਹੌਟਸਪੌਟ ਬੰਦ ਹੈ</translation>
 <translation id="1708338024780164500">(ਨਿਸ਼ਕਿਰਿਆ)</translation>
 <translation id="1708563369218024896">ਕੋਈ ਵੀ ਡਾਟਾ ਉਗਰਾਹਕ ਨਹੀਂ ਚੁਣਿਆ ਗਿਆ। ਕਿਰਪਾ ਕਰਕੇ ਘੱਟੋ-ਘੱਟ ਇੱਕ ਡਾਟਾ ਉਗਰਾਹਕ ਚੁਣੋ।</translation>
@@ -8067,6 +8068,7 @@
 <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> - ਡੈਸਕਟਾਪ ਸਮੱਗਰੀ ਨੂੰ ਸਾਂਝਾ ਕੀਤਾ ਗਿਆ</translation>
 <translation id="6580060371127789208"><ph name="PERCENTAGE_COMPLETE" />% ਪੂਰੀ ਹੋ ਗਈ</translation>
 <translation id="6580203076670148210">ਸਕੈਨ ਕਰਨ ਦੀ ਗਤੀ</translation>
+<translation id="6580676117087365538">ਇਸ ਐਕਸਟੈਂਸ਼ਨ ਨੂੰ ਆਪਣੇ ਸਾਰੇ ਕੰਪਿਊਟਰਾਂ 'ਤੇ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ, ਆਪਣੀ ਪਛਾਣ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ</translation>
 <translation id="6581356304040102696">ਪਾਸਵਰਡਾਂ ਨੂੰ ਆਯਾਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। ਫ਼ਾਈਲ ਦਾ ਆਕਾਰ 1 MB ਤੋਂ ਘੱਟ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।</translation>
 <translation id="6582080224869403177">ਆਪਣੀ ਸੁਰੱਖਿਆ ਨੂੰ ਅੱਪਗ੍ਰੇਡ ਕਰਨ ਲਈ ਆਪਣੀ <ph name="DEVICE_TYPE" /> ਨੂੰ ਰੀਸੈੱਟ ਕਰੋ।</translation>
 <translation id="6582274660680936615">ਤੁਸੀਂ ਮਹਿਮਾਨ ਵਜੋਂ ਬ੍ਰਾਊਜ਼ ਕਰ ਰਹੇ ਹੋ</translation>
@@ -9589,6 +9591,7 @@
 <translation id="7647403192093989392">ਕੋਈ ਹਾਲੀਆ ਸਰਗਰਮੀ ਨਹੀਂ ਹੈ</translation>
 <translation id="7648023614017258011">Chrome ਸਥਾਪਨਾ ਬੰਡਲ ਦੀ ਪੁਸ਼ਟੀ ਕਰ ਰਿਹਾ ਹੈ</translation>
 <translation id="7648048654005891115">ਕੀਮੈਪ ਸਟਾਈਲ</translation>
+<translation id="7648180062672842917">ਇਸ ਫ਼ਾਈਲ ਵਿੱਚ ਸੰਵੇਦਨਸ਼ੀਲ ਜਾਂ ਖਤਰਨਾਕ ਡਾਟਾ ਹੈ। ਤੁਹਾਡੀ ਸੰਸਥਾ ਤੁਹਾਨੂੰ ਇਸਨੂੰ ਕਲਾਊਡ ਸਟੋਰੇਜ ਵਿੱਚ ਰੱਖਿਅਤ ਕਰਨ ਜਾਂ ਇਸਨੂੰ ਬਰਖਾਸਤ ਕਰਨ ਦੇਵੇਗੀ</translation>
 <translation id="7649070708921625228">ਸਹਾਇਤਾ</translation>
 <translation id="7649954700951153978">iOS 'ਤੇ ਮੈਨੂੰ ਯਾਦ ਕਰਵਾਓ</translation>
 <translation id="7650141368285545431">ਕਿਸੇ ਹੋਰ ਡੀਵਾਈਸ ਤੋਂ ਪਾਸਕੀ ਵਰਤੋ</translation>
@@ -10916,6 +10919,7 @@
 <translation id="8535005006684281994">Netscape ਪ੍ਰਮਾਣ-ਪੱਤਰ ਨਵੀਨੀਕਰਨ URL</translation>
 <translation id="8536810348276651776">ਤੁਹਾਨੂੰ ਜ਼ਿਆਦਾਤਰ ਸਾਈਟਾਂ ਤੋਂ ਸਾਈਨ-ਆਊਟ ਕਰ ਦਿੰਦਾ ਹੈ। ਤੁਸੀਂ ਆਪਣੇ Google ਖਾਤੇ ਵਿੱਚ ਸਾਈਨ-ਇਨ ਰਹੋਗੇ, ਤਾਂ ਜੋ Chrome ਲਈ ਤੁਹਾਡੀਆਂ Family Link ਸੈਟਿੰਗਾਂ ਲਾਗੂ ਹੋ ਸਕਣ।</translation>
 <translation id="8536956381488731905">ਕੁੰਜੀ ਦਬਾਉਣ 'ਤੇ ਧੁਨੀ</translation>
+<translation id="8537854269962256103">ਤੁਹਾਡੀ Gemini ਗੱਲਬਾਤ ਪੌਪ-ਆਊਟ ਚੈਟ ਵਿੱਚ ਹੈ। ਇਸ ਸਾਈਡ ਪੈਨਲ ਨੂੰ ਇੱਥੇ ਲਿਜਾਉਣ ਲਈ ਇਸ 'ਤੇ ਕਿਤੇ ਵੀ ਕਲਿੱਕ ਕਰੋ।</translation>
 <translation id="8539727552378197395">ਨਹੀਂ (HttpOnly)</translation>
 <translation id="8539766201049804895">ਅੱਪਗ੍ਰੇਡ ਕਰੋ</translation>
 <translation id="8540136935098276800">ਸਹੀ ਢੰਗ ਨਾਲ ਫਾਰਮੈਟ ਕੀਤਾ URL ਦਾਖਲ ਕਰੋ</translation>
@@ -11163,6 +11167,7 @@
 <translation id="8703766890819308134">ਖੋਜ ਸੰਬੰਧੀ ਸ਼ਾਰਟਕੱਟ ਦਿਖਾਓ</translation>
 <translation id="8704662571571150811">ਡੋਮੇਨ</translation>
 <translation id="8705331520020532516">ਸੀਰੀਅਲ ਨੰਬਰ</translation>
+<translation id="870536819717176711">ਜਦੋਂ ਤੁਸੀਂ ਮੌਜੂਦਾ ਟੈਬ ਨੂੰ Gemini ਨਾਲ ਸਾਂਝਾ ਕਰਨ ਦੀ ਚੋਣ ਕਰਦੇ ਹੋ, ਤਾਂ ਟੈਬ ਦੀ ਪੂਰੀ ਸਮੱਗਰੀ, ਮੀਡੀਆ ਅਤੇ URL Google ਨੂੰ ਭੇਜ ਦਿੱਤੇ ਜਾਂਦੇ ਹਨ।</translation>
 <translation id="8705580154597116082">ਫ਼ੋਨ ਰਾਹੀਂ ਵਾਈ-ਫਾਈ ਉਪਲਬਧ ਹੈ</translation>
 <translation id="8705629851992224300">ਤੁਹਾਡੀ ਸੁਰੱਖਿਆ ਕੁੰਜੀ ਨੂੰ ਪੜ੍ਹਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ</translation>
 <translation id="8706111173576263877">QR ਕੋਡ ਸਕੈਨ ਕੀਤਾ ਗਿਆ।</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb
index 4ca253e..e65e09b 100644
--- a/chrome/app/resources/generated_resources_pl.xtb
+++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -6641,6 +6641,7 @@
 <translation id="5585912436068747822">Formatowanie nie powiodło się</translation>
 <translation id="5587765208077583036">Aby udostępnić folder, kliknij go prawym przyciskiem myszy w aplikacji Pliki, a potem kliknij „Udostępnij dla: <ph name="SPECIFIC_NAME" />”.</translation>
 <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation>
+<translation id="5588712142463367677">Filtruj witryny na stronie</translation>
 <translation id="558918721941304263">Wczytuję aplikacje…</translation>
 <translation id="5590418976913374224">Odtwarzaj dźwięk podczas uruchamiania urządzenia</translation>
 <translation id="5591465468509111843">Bardzo szeroko</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb
index 8abaff5..dd56be7 100644
--- a/chrome/app/resources/generated_resources_pt-BR.xtb
+++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -11903,7 +11903,7 @@
 <translation id="9180380851667544951">O site pode compartilhar sua tela</translation>
 <translation id="9180847522826713506">Para conferir sua senha ou adicionar uma observação sobre ela, clique no ícone de chave</translation>
 <translation id="9182556968660520230">Não permitir que os sites reproduzam conteúdo protegido</translation>
-<translation id="9183302530794969518">Documentos Google</translation>
+<translation id="9183302530794969518">Google Docs</translation>
 <translation id="918352324374649435">{COUNT,plural, =1{App}one{# app}other{# apps}}</translation>
 <translation id="9186743636216815027">{NUM_APPS,plural,offset:2 =1{O administrador pode gravar sua tela com o app <ph name="APP0_NAME" />. Você não vai receber uma notificação quando a gravação começar.}=2{O administrador pode gravar sua tela com os apps <ph name="APP0_NAME" /> e <ph name="APP1_NAME" />. Você não vai receber uma notificação quando a gravação começar.}=3{O administrador pode gravar sua tela com os apps <ph name="APP0_NAME" />, <ph name="APP1_NAME" /> e mais 1. Você não vai receber uma notificação quando a gravação começar.}one{O administrador pode gravar sua tela com os apps <ph name="APP0_NAME" />, <ph name="APP1_NAME" /> e mais #. Você não vai receber uma notificação quando a gravação começar.}other{O administrador pode gravar sua tela com os apps <ph name="APP0_NAME" />, <ph name="APP1_NAME" /> e mais #. Você não vai receber uma notificação quando a gravação começar.}}</translation>
 <translation id="9186963452600581158">Fazer login com a Conta do Google de uma criança</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb
index b5df862..980832a2 100644
--- a/chrome/app/resources/generated_resources_pt-PT.xtb
+++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -4039,7 +4039,7 @@
 <translation id="3756578970075173856">Defina o PIN</translation>
 <translation id="3756806135608816820">Os sites podem pedir para procurar dispositivos Bluetooth</translation>
 <translation id="3757567010566591880">Desafixar da barra de ferramentas</translation>
-<translation id="3757645900890881944">Ferramentas de pesquisa</translation>
+<translation id="3757645900890881944">Ferramentas da Pesquisa</translation>
 <translation id="3757733214359997190">Não foram encontrados sites.</translation>
 <translation id="375841316537350618">A transferir o script de proxy...</translation>
 <translation id="3758887577462995665">Sugestão:</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index 1f08b06..66cbe7e 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -6665,6 +6665,7 @@
 <translation id="5585912436068747822">Ошибка форматирования</translation>
 <translation id="5587765208077583036">Чтобы открыть доступ к папке, нажмите на нее правой кнопкой мыши в приложении "Файлы" и выберите "Предоставить доступ <ph name="SPECIFIC_NAME" />".</translation>
 <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation>
+<translation id="5588712142463367677">Отфильтруйте сайты на странице</translation>
 <translation id="558918721941304263">Загрузка...</translation>
 <translation id="5590418976913374224">Воспроизводить звук при запуске устройства</translation>
 <translation id="5591465468509111843">Очень большое расстояние между символами</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb
index 5911714..b8b86edf 100644
--- a/chrome/app/resources/generated_resources_sk.xtb
+++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -1062,6 +1062,7 @@
 <translation id="1706586824377653884">Pridané správcom</translation>
 <translation id="170658918174941828">Okrem všetkých údajov, ktoré vyberiete vyššie, budú odoslané aj tieto údaje: verzia prehliadača Chrome, verzia operačného systému, nastavenia prenosu, štatistiky výkonnosti zrkadlenia a diagnostické denníky komunikačného kanála. Túto spätnú väzbu použijeme pri diagnostike problémov a zlepšovaní funkcií. Všetky úmyselne alebo náhodne odoslané osobné údaje budú chránené v súlade s našimi pravidlami ochrany súkromia. Odoslaním tejto spätnej väzby súhlasíte s tým, že Google môže pomocou poskytnutej spätnej väzby zlepšovať akékoľvek produkty alebo služby Googlu.</translation>
 <translation id="17081583771848899">Spúšťač + alt + <ph name="TOP_ROW_KEY" /></translation>
+<translation id="170825127491242914">Uložiť do cloudového priestoru</translation>
 <translation id="1708291623166985230">Hotspot je deaktivovaný</translation>
 <translation id="1708338024780164500">(Neaktívne)</translation>
 <translation id="1708563369218024896">Nebol vybraný žiadny nástroj na zhromažďovanie údajov. Vyberte aspoň jeden.</translation>
@@ -8053,6 +8054,7 @@
 <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> – bol zdieľaný obsah pracovnej plochy</translation>
 <translation id="6580060371127789208">Dokončené: <ph name="PERCENTAGE_COMPLETE" /> %</translation>
 <translation id="6580203076670148210">Rýchlosť prehľadávania</translation>
+<translation id="6580676117087365538">Ak chcete mať toto rozšírenie k dispozícii vo všetkých svojich počítačoch, overte svoju totožnosť</translation>
 <translation id="6581356304040102696">Heslá sa nedajú importovať. Súbor musí byť menší ako 1 MB.</translation>
 <translation id="6582080224869403177">Obnovte zariadenie <ph name="DEVICE_TYPE" /> a inovujte tak svoje zabezpečenie.</translation>
 <translation id="6582274660680936615">Prehliadate ako hosť</translation>
@@ -9577,6 +9579,7 @@
 <translation id="7647403192093989392">Žiadne nedávne aktivity</translation>
 <translation id="7648023614017258011">Chrome overuje inštalačný balík</translation>
 <translation id="7648048654005891115">Štýl mapy klávesov</translation>
+<translation id="7648180062672842917">V tomto súbore sú citlivé alebo nebezpečné údaje. Vaša organizácia vám umožní uložiť ho do cloudového priestoru alebo zahodiť.</translation>
 <translation id="7649070708921625228">Pomocník</translation>
 <translation id="7649954700951153978">Pripomenúť mi v systéme iOS</translation>
 <translation id="7650141368285545431">Použiť prístupový kľúč z iného zariadenia</translation>
@@ -10905,6 +10908,7 @@
 <translation id="8535005006684281994">Netscape – webová adresa pre obnovenie certifikátu</translation>
 <translation id="8536810348276651776">Touto akciou sa odhlásiš z väčšiny webov. Zachováš si prihlásenie do účtu Googlu, takže budú platiť nastavenia aplikácie Family Link pre Chrome.</translation>
 <translation id="8536956381488731905">Zvuk pri stlačení klávesa</translation>
+<translation id="8537854269962256103">Vaša konverzácia s Gemini je v rozbaľovacom čete. Ak chcete tento bočný panel presunúť sem, kdekoľvek naň kliknite.</translation>
 <translation id="8539727552378197395">Nie (HttpOnly)</translation>
 <translation id="8539766201049804895">Inovovať</translation>
 <translation id="8540136935098276800">Zadajte správne naformátovanú webovú adresu</translation>
@@ -11152,6 +11156,7 @@
 <translation id="8703766890819308134">Zobraziť vyhľadávacie odkazy</translation>
 <translation id="8704662571571150811">Domény</translation>
 <translation id="8705331520020532516">Sériové číslo</translation>
+<translation id="870536819717176711">Keď sa rozhodnete zdieľať aktuálnu kartu s Gemini, celý jej obsah, médiá a webová adresa sa odošlú Googlu.</translation>
 <translation id="8705580154597116082">Sieť Wi‑Fi je k dispozícii prostredníctvom telefónu</translation>
 <translation id="8705629851992224300">Váš bezpečnostný kľúč sa nepodarilo prečítať</translation>
 <translation id="8706111173576263877">QR kód bol naskenovaný.</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb
index 78aa8b3..df8459dd 100644
--- a/chrome/app/resources/generated_resources_sl.xtb
+++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -6680,6 +6680,7 @@
 <translation id="5585912436068747822">Formatiranje ni uspelo</translation>
 <translation id="5587765208077583036">Če želite deliti, z desnim gumbom miške kliknite mapo v aplikaciji Datoteke, nato izberite »Deljenje s sistemom <ph name="SPECIFIC_NAME" />«.</translation>
 <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation>
+<translation id="5588712142463367677">Filtriranje spletnih mest na strani</translation>
 <translation id="558918721941304263">Nalaganje aplikacij ...</translation>
 <translation id="5590418976913374224">Predvajaj zvok ob zagonu naprave</translation>
 <translation id="5591465468509111843">Zelo narazen</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb
index b089dde7..315dab1f 100644
--- a/chrome/app/resources/generated_resources_ta.xtb
+++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -6677,6 +6677,7 @@
 <translation id="5585912436068747822">வடிவமைத்தல் தோல்வியடைந்தது</translation>
 <translation id="5587765208077583036">பகிர, Files ஆப்ஸில் ஒரு ஃபோல்டரில் வலது கிளிக் செய்து "<ph name="SPECIFIC_NAME" /> உடன் பகிர்” என்பதைத் தேர்ந்தெடுக்கவும்.</translation>
 <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation>
+<translation id="5588712142463367677">பக்கத்தில் உள்ள தளங்களை ஃபில்டர் செய்</translation>
 <translation id="558918721941304263">ஆப்ஸை ஏற்றுகிறது...</translation>
 <translation id="5590418976913374224">சாதனம் தொடங்கும்போது ஒலி எழுப்பு</translation>
 <translation id="5591465468509111843">மிகவும் அகலம்</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb
index e8109ce..ca322160 100644
--- a/chrome/app/resources/generated_resources_te.xtb
+++ b/chrome/app/resources/generated_resources_te.xtb
@@ -1067,6 +1067,7 @@
     ఏదైనా Google ప్రోడక్ట్‌ను లేదా సర్వీస్‌ను మెరుగుపరచడానికి
     ఉపయోగించవచ్చు అని మీరు అంగీకరిస్తున్నారు.</translation>
 <translation id="17081583771848899">లాంచర్ + alt + <ph name="TOP_ROW_KEY" /></translation>
+<translation id="170825127491242914">క్లౌడ్ స్టోరేజ్‌కు సేవ్ చేయండి</translation>
 <translation id="1708291623166985230">హాట్‌స్పాట్ డిజేబుల్ చేయబడింది</translation>
 <translation id="1708338024780164500">(క్రియారహితం)</translation>
 <translation id="1708563369218024896">ఒక్క డేటా కలెక్టర్‌ను కూడా ఎంచుకోలేదు. కనీసం ఒక్క డేటా కలెక్టర్‌ను అయినా ఎంచుకోండి.</translation>
@@ -8063,6 +8064,7 @@
 <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> - డెస్క్‌టాప్‌ కంటెంట్‌ షేర్ చేయబడింది</translation>
 <translation id="6580060371127789208"><ph name="PERCENTAGE_COMPLETE" />% పూర్తయింది</translation>
 <translation id="6580203076670148210">స్కానింగ్ వేగం</translation>
+<translation id="6580676117087365538">మీ కంప్యూటర్‌లన్నింటిలో ఈ ఎక్స్‌టెన్షన్‌ను పొందడానికి, అది మీరేనని ధృవీకరించండి</translation>
 <translation id="6581356304040102696">పాస్‌వర్డ్‌లను దిగుమతి చేయడం సాధ్యపడలేదు. ఫైల్ సైజ్ 1 MB కన్నా తక్కువ ఉండాలి.</translation>
 <translation id="6582080224869403177">మీ భద్రతను అప్‌గ్రేడ్ చేయడానికి మీ <ph name="DEVICE_TYPE" />ని రీసెట్ చేయండి</translation>
 <translation id="6582274660680936615">మీరు గెస్ట్‌లాగా బ్రౌజ్ చేస్తున్నారు</translation>
@@ -9584,6 +9586,7 @@
 <translation id="7647403192093989392">ఇటీవలి యాక్టివిటీలు లేవు</translation>
 <translation id="7648023614017258011">Chrome ఇన్‌స్టాలేషన్ బండిల్‌ను వెరిఫై చేస్తోంది</translation>
 <translation id="7648048654005891115">కీమ్యాప్ శైలి</translation>
+<translation id="7648180062672842917">ఈ ఫైల్, గోప్యమైన లేదా హానికరమైన డేటాను కలిగి ఉంది. మీ సంస్థ దీన్ని క్లౌడ్ స్టోరేజ్‌లో సేవ్ చేయడానికి లేదా విస్మరించడానికి మిమ్మల్ని అనుమతిస్తుంది</translation>
 <translation id="7649070708921625228">సహాయం</translation>
 <translation id="7649954700951153978">iOSలో నాకు గుర్తు చేయండి</translation>
 <translation id="7650141368285545431">మరొక పరికరం నుండి పాస్-కీని ఉపయోగించండి</translation>
@@ -10909,6 +10912,7 @@
 <translation id="8535005006684281994">Netscape సర్టిఫికెట్ పునరుద్ధరణ URL</translation>
 <translation id="8536810348276651776">చాలా సైట్‌ల నుండి మిమ్మల్ని సైన్ అవుట్ చేస్తుంది. మీరు Google ఖాతాకు అలాగే సైన్ ఇన్ చేసి ఉంటారు, కనుక Chrome కోసం మీ Family Link సెట్టింగ్‌లు వర్తిస్తాయి.</translation>
 <translation id="8536956381488731905">కీని నొక్కినప్పుడు ధ్వని</translation>
+<translation id="8537854269962256103">మీ Gemini సంభాషణ పాప్-అవుట్ చాట్‌లో ఉంది. ఈ సైడ్ ప్యానెల్‌ను ఇక్కడికి తరలించడానికి దానిలో ఎక్కడైనా క్లిక్ చేయండి.</translation>
 <translation id="8539727552378197395">లేదు (Httpమాత్రమే)</translation>
 <translation id="8539766201049804895">అప్‌గ్రేడ్ చేయి</translation>
 <translation id="8540136935098276800">సరిగ్గా ఫార్మాట్ చేసిన URLను ఎంటర్ చేయండి</translation>
@@ -11156,6 +11160,7 @@
 <translation id="8703766890819308134">సెర్చ్ షార్ట్‌కట్‌లను చూడండి</translation>
 <translation id="8704662571571150811">డొమైన్‌లు</translation>
 <translation id="8705331520020532516">క్రమ సంఖ్య</translation>
+<translation id="870536819717176711">మీరు ప్రస్తుత ట్యాబ్‌ను Geminiతో షేర్ చేయాలని ఎంచుకున్నప్పుడు, ట్యాబ్‌నకు సంబంధించిన పూర్తి కంటెంట్, మీడియా ఇంకా URL, Googleకు పంపబడతాయి.</translation>
 <translation id="8705580154597116082">ఫోన్ ద్వారా Wi-Fi అందుబాటులో ఉంది</translation>
 <translation id="8705629851992224300">మీ 'సెక్యూరిటీ కీ'లోని ఆధారాలను చూడటం సాధ్యం కాలేదు</translation>
 <translation id="8706111173576263877">QR code స్కాన్ చేయబడింది.</translation>
@@ -11434,7 +11439,7 @@
 <translation id="8886745493279779790">యాక్టివ్‌గా లేని ట్యాబ్‌లను రివ్యూ చేయండి</translation>
 <translation id="8888253246822647887">అప్‌గ్రేడ్ చేయడం పూర్తయినప్పుడు మీ యాప్ తెరవబడుతుంది. అప్‌గ్రేడ్‌లు పూర్తవడానికి కొద్ది నిమిషాలు పట్టవచ్చు.</translation>
 <translation id="8888459276890791557">సులభంగా యాక్సెస్ చేయడం కోసం మీరు ఈ సైడ్ ప్యానెల్‌ను పిన్ చేయవచ్చు</translation>
-<translation id="8888621340860433230">ఆప్షన్‌లను చూడండి</translation>
+<translation id="8888621340860433230">ఆప్షన్‌లను చూపించు</translation>
 <translation id="8889294078294184559">మీరు బ్రౌజింగ్ చేస్తూ ఉన్న సమయంలో, మీరు నిజమైన వ్యక్తేనా కాదా అని తెలుసుకోవడానికి, సైట్‌లు Chromeతో చెక్ చేసుకోవచ్చు, అలాగే మీరు ఇంతకు ముందు ఏ సైట్‌కు అయితే వెళ్లారో, ఆ సైట్‌తో కూడా వెరిఫై చేసుకోవచ్చు</translation>
 <translation id="8889651696183044030"><ph name="ORIGIN" /> కింది ఫైళ్లు, ఫోల్డర్‌లను సవరించగలదు</translation>
 <translation id="8890170499370378450">మొబైల్ డేటా ఛార్జీ‌లు విధించబడవచ్చు</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index 631edc1e..09e38fd 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -1060,6 +1060,7 @@
 <translation id="1706586824377653884">เพิ่มโดยผู้ดูแลระบบ</translation>
 <translation id="170658918174941828">นอกเหนือจากข้อมูลที่คุณเลือกให้รวมไว้ข้างต้น จะมีการส่งเวอร์ชัน Chrome, เวอร์ชันระบบปฏิบัติการ, การตั้งค่า Cast, สถิติประสิทธิภาพการมิเรอร์ และบันทึกการวินิจฉัยช่องทางการสื่อสารด้วย ความคิดเห็นนี้จะใช้เพื่อวินิจฉัยปัญหาและช่วยปรับปรุงฟีเจอร์ ทั้งนี้ข้อมูลส่วนบุคคลที่ส่งมาไม่ว่าจะโดยชัดแจ้งหรือโดยไม่ตั้งใจจะได้รับการปกป้องตามนโยบายความเป็นส่วนตัว การส่งความคิดเห็นนี้เป็นการยอมรับว่า Google สามารถใช้ความคิดเห็นเพื่อปรับปรุงผลิตภัณฑ์หรือบริการได้</translation>
 <translation id="17081583771848899">Launcher + Alt + <ph name="TOP_ROW_KEY" /></translation>
+<translation id="170825127491242914">บันทึกลงในพื้นที่เก็บข้อมูลระบบคลาวด์</translation>
 <translation id="1708291623166985230">ปิดใช้ฮอตสปอตแล้ว</translation>
 <translation id="1708338024780164500">(ไม่ใช้งาน)</translation>
 <translation id="1708563369218024896">ไม่ได้เลือกเครื่องมือรวบรวมข้อมูล โปรดเลือกเครื่องมือรวบรวมข้อมูลอย่างน้อย 1 อย่าง</translation>
@@ -1361,7 +1362,7 @@
 <translation id="1918141783557917887">เ&amp;ล็กลง</translation>
 <translation id="1918281588461452432">ขณะที่คุณท่องเว็บ ระบบจะเข้ารหัสและบันทึกเนื้อหาในหน้าเว็บไว้ในอุปกรณ์ของคุณ</translation>
 <translation id="1918761619391445601">ปักหมุด <ph name="EXTENSION_NAME" /> แล้ว ดูตัวเลือกเพิ่มเติม</translation>
-<translation id="1919096511823372013">แทรกลิงก์ อีโมจิ และอื่นๆ คุณยังใช้ AI ของ Google เพื่อช่วยเขียนและสร้างรูปภาพได้ด้วย</translation>
+<translation id="1919096511823372013">แทรกลิงก์ อีโมจิ และอื่นๆ คุณยังใช้ Google AI เพื่อช่วยเขียนและสร้างรูปภาพได้ด้วย</translation>
 <translation id="1919872106782726755">หากต้องการตั้งค่าลายนิ้วมือ ให้บุตรหลานแตะเซ็นเซอร์ลายนิ้วมือที่มุมขวาบนของแป้นพิมพ์ ข้างปุ่มเปิด/ปิด ข้อมูลลายนิ้วมือของบุตรหลานจะจัดเก็บไว้อย่างปลอดภัยและอยู่ใน <ph name="DEVICE_TYPE" /> นี้เสมอ</translation>
 <translation id="192015196730532810">คุณสร้างกลุ่มแท็บของตัวเองได้</translation>
 <translation id="1920314570001095522">ไม่มีแท็บที่คล้ายกันให้จัดระเบียบ แต่คุณอาจชอบกลุ่มเหล่านี้</translation>
@@ -6659,6 +6660,7 @@
 <translation id="5585912436068747822">การจัดรูปแบบล้มเหลว</translation>
 <translation id="5587765208077583036">หากต้องการแชร์ ให้คลิกขวาที่โฟลเดอร์ในแอป Files แล้วเลือก "แชร์กับ <ph name="SPECIFIC_NAME" />"</translation>
 <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation>
+<translation id="5588712142463367677">กรองเว็บไซต์ในหน้า</translation>
 <translation id="558918721941304263">กำลังโหลดแอป...</translation>
 <translation id="5590418976913374224">เล่นเสียงเมื่อเริ่มต้นใช้งานอุปกรณ์</translation>
 <translation id="5591465468509111843">ห่างมาก</translation>
@@ -7649,7 +7651,7 @@
 <translation id="628726841779494414">จัดการเครื่องพิมพ์ของคุณในการตั้งค่าเครื่องพิมพ์</translation>
 <translation id="6287288864483377583">รองรับการนำเข้าใบรับรองฉบับเดียวเท่านั้น</translation>
 <translation id="6287828400772161253">โทรศัพท์ Android (<ph name="HOST_DEVICE_NAME" />)</translation>
-<translation id="6288559570252410796">ถามโหมด AI ของ Google</translation>
+<translation id="6288559570252410796">ถามโหมด Google AI</translation>
 <translation id="6290613030083731160">ไม่มีอุปกรณ์ที่กำลังแชร์อยู่ใกล้เคียง <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation>
 <translation id="6291580570300353047">กู้คืนไม่ได้เนื่องจากมีพื้นที่เก็บข้อมูลไม่เพียงพอ</translation>
 <translation id="6291741848715722067">รหัสยืนยัน</translation>
@@ -8046,6 +8048,7 @@
 <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> - แชร์เนื้อหาบนเดสก์ท็อปอยู่</translation>
 <translation id="6580060371127789208">เสร็จแล้ว <ph name="PERCENTAGE_COMPLETE" />%</translation>
 <translation id="6580203076670148210">ความเร็วในการสแกน</translation>
+<translation id="6580676117087365538">หากต้องการรับส่วนขยายนี้ในคอมพิวเตอร์ทุกเครื่อง โปรดยืนยันว่าเป็นคุณ</translation>
 <translation id="6581356304040102696">นำเข้ารหัสผ่านไม่ได้ ไฟล์ควรมีขนาดไม่เกิน 1 MB</translation>
 <translation id="6582080224869403177">รีเซ็ต <ph name="DEVICE_TYPE" /> เพื่ออัปเกรดความปลอดภัย</translation>
 <translation id="6582274660680936615">คุณกำลังเรียกดูในฐานะผู้มาเยือน</translation>
@@ -8840,7 +8843,7 @@
 <translation id="713122686776214250">เพิ่มห&amp;น้า...</translation>
 <translation id="7131431455372521159">เลิกเชื่อมต่อ TrackPoint ทั้งหมดแล้ว</translation>
 <translation id="7131896909366247105"><ph name="APP_NAME" /> กำลังรอ</translation>
-<translation id="7132886488919643383">ใช้ AI ของ Google เพื่อรับความช่วยเหลือในการอ่าน เขียน และสร้างสรรค์</translation>
+<translation id="7132886488919643383">ใช้ Google AI เพื่อรับความช่วยเหลือในการอ่าน เขียน และสร้างสรรค์</translation>
 <translation id="7134098520442464001">ทำให้ข้อความเล็กลง</translation>
 <translation id="7134951043985383439">ดาวน์โหลดไฟล์อันตรายแล้ว</translation>
 <translation id="7135729336746831607">เปิดบลูทูธไหม</translation>
@@ -9566,6 +9569,7 @@
 <translation id="7647403192093989392">ไม่มีกิจกรรมล่าสุด</translation>
 <translation id="7648023614017258011">Chrome กำลังยืนยันแพ็กเกจการติดตั้ง</translation>
 <translation id="7648048654005891115">รูปแบบ Keymap</translation>
+<translation id="7648180062672842917">ไฟล์นี้มีข้อมูลที่ละเอียดอ่อนหรือเป็นอันตราย องค์กรจะอนุญาตให้คุณบันทึกลงในพื้นที่เก็บข้อมูลระบบคลาวด์หรือทิ้ง</translation>
 <translation id="7649070708921625228">ความช่วยเหลือ</translation>
 <translation id="7649954700951153978">เตือนฉันบน iOS</translation>
 <translation id="7650141368285545431">ใช้พาสคีย์จากอุปกรณ์อื่น</translation>
@@ -10894,6 +10898,7 @@
 <translation id="8535005006684281994">URL การต่ออายุใบรับรองของ Netscape</translation>
 <translation id="8536810348276651776">นำคุณออกจากระบบของเว็บไซต์ส่วนใหญ่ แต่คุณจะยังลงชื่อเข้าใช้บัญชี Google อยู่เพื่อใช้การตั้งค่า Family Link สำหรับ Chrome</translation>
 <translation id="8536956381488731905">ส่งเสียงเมื่อกดปุ่ม</translation>
+<translation id="8537854269962256103">บทสนทนากับ Gemini อยู่ในแชทแบบเปิดหน้าต่างใหม่ คลิกที่ใดก็ได้ในแผงด้านข้างนี้เพื่อย้ายมาที่นี่</translation>
 <translation id="8539727552378197395">ไม่มี (HttpOnly)</translation>
 <translation id="8539766201049804895">อัปเกรด</translation>
 <translation id="8540136935098276800">ป้อน URL ที่มีรูปแบบที่ถูกต้อง</translation>
@@ -11141,6 +11146,7 @@
 <translation id="8703766890819308134">แสดงทางลัดการค้นหา</translation>
 <translation id="8704662571571150811">โดเมน</translation>
 <translation id="8705331520020532516">หมายเลขซีเรียล</translation>
+<translation id="870536819717176711">เมื่อคุณเลือกแชร์แท็บปัจจุบันกับ Gemini ระบบจะส่งเนื้อหาทั้งหมด สื่อ และ URL ของแท็บไปยัง Google</translation>
 <translation id="8705580154597116082">มี Wi-Fi พร้อมให้บริการผ่านโทรศัพท์</translation>
 <translation id="8705629851992224300">อ่านคีย์ความปลอดภัยของคุณไม่ได้</translation>
 <translation id="8706111173576263877">สแกนคิวอาร์โค้ดแล้ว</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb
index 451a5fc..f6572f6a 100644
--- a/chrome/app/resources/generated_resources_vi.xtb
+++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -6677,6 +6677,7 @@
 <translation id="5585912436068747822">Định dạng không thành công</translation>
 <translation id="5587765208077583036">Để chia sẻ, hãy nhấp chuột phải vào một thư mục trong ứng dụng Files rồi chọn "Chia sẻ với <ph name="SPECIFIC_NAME" />".</translation>
 <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation>
+<translation id="5588712142463367677">Lọc các trang web trên trang</translation>
 <translation id="558918721941304263">Đang tải ứng dụng...</translation>
 <translation id="5590418976913374224">Phát âm thanh khi khởi động thiết bị</translation>
 <translation id="5591465468509111843">Rất rộng</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb
index 11ea01e..5f6517c 100644
--- a/chrome/app/resources/generated_resources_zh-HK.xtb
+++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -1068,6 +1068,7 @@
     即表示您同意 Google 可能會使用您所提供的意見改善
     任何 Google 產品或服務。</translation>
 <translation id="17081583771848899">啟動器 + Alt + <ph name="TOP_ROW_KEY" /> 鍵</translation>
+<translation id="170825127491242914">儲存至雲端儲存空間</translation>
 <translation id="1708291623166985230">停用咗熱點</translation>
 <translation id="1708338024780164500">(無法使用)</translation>
 <translation id="1708563369218024896">沒有選取資料收集器。請選取至少一個資料收集器。</translation>
@@ -6668,6 +6669,7 @@
 <translation id="5585912436068747822">無法格式化</translation>
 <translation id="5587765208077583036">如要共用資料夾,請在「檔案」應用程式中的資料夾上按一下右鍵,然後選取 [與 <ph name="SPECIFIC_NAME" /> 共用]。</translation>
 <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation>
+<translation id="5588712142463367677">篩選頁面上的網站</translation>
 <translation id="558918721941304263">正在載入應用程式…</translation>
 <translation id="5590418976913374224">在裝置啟動時播放音效</translation>
 <translation id="5591465468509111843">字間距很寬</translation>
@@ -8055,6 +8057,7 @@
 <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> - 已共用桌面內容</translation>
 <translation id="6580060371127789208">已完成 <ph name="PERCENTAGE_COMPLETE" />%</translation>
 <translation id="6580203076670148210">掃瞄速度</translation>
+<translation id="6580676117087365538">如要在所有電腦上使用此擴充程式,請先驗證身分</translation>
 <translation id="6581356304040102696">無法匯入密碼,檔案大小不得超過 1 MB。</translation>
 <translation id="6582080224869403177">重設您的 <ph name="DEVICE_TYPE" />,以進行安全性升級。</translation>
 <translation id="6582274660680936615">您目前是以訪客身分瀏覽</translation>
@@ -9575,6 +9578,7 @@
 <translation id="7647403192093989392">最近沒有任何活動</translation>
 <translation id="7648023614017258011">Chrome 正在驗證安裝套件</translation>
 <translation id="7648048654005891115">按鍵對應配置樣式</translation>
+<translation id="7648180062672842917">此檔案含有敏感或危險的內容。你的機構允許你將檔案儲存至雲端儲存空間或捨棄</translation>
 <translation id="7649070708921625228">說明</translation>
 <translation id="7649954700951153978">在 iOS 上提醒我</translation>
 <translation id="7650141368285545431">使用另一部裝置的密鑰</translation>
@@ -10901,6 +10905,7 @@
 <translation id="8535005006684281994">Netscape 憑證更新網址</translation>
 <translation id="8536810348276651776">您會登出大多數網站,但會保持登入 Google 帳戶,以便系統套用 Family Link 的設定。</translation>
 <translation id="8536956381488731905">按鍵音效</translation>
+<translation id="8537854269962256103">你的 Gemini 對話目前在彈出式對話框中。按一下側面板的任何一處,即可將對話移到這裡。</translation>
 <translation id="8539727552378197395">否 (限 Http)</translation>
 <translation id="8539766201049804895">升級</translation>
 <translation id="8540136935098276800">請輸入正確格式的網址</translation>
@@ -11148,6 +11153,7 @@
 <translation id="8703766890819308134">顯示搜尋捷徑</translation>
 <translation id="8704662571571150811">網域</translation>
 <translation id="8705331520020532516">序號</translation>
+<translation id="870536819717176711">當你選擇與 Gemini 分享當前分頁,分頁的完整內容、媒體和網址會傳送到 Google。</translation>
 <translation id="8705580154597116082">可透過手機使用 Wi-Fi</translation>
 <translation id="8705629851992224300">無法讀取您的安全密鑰</translation>
 <translation id="8706111173576263877">掃瞄咗 QR 碼。</translation>
diff --git a/chrome/app/resources/google_chrome_strings_af.xtb b/chrome/app/resources/google_chrome_strings_af.xtb
index 10036dbc..da8a11b 100644
--- a/chrome/app/resources/google_chrome_strings_af.xtb
+++ b/chrome/app/resources/google_chrome_strings_af.xtb
@@ -152,7 +152,6 @@
 <translation id="2681444469812712297">Maak <ph name="URL" /> in 'n nuwe oortjie in Google Chrome oop.</translation>
 <translation id="2699790011615497488">Maak Gemini in Chrome Beta oop</translation>
 <translation id="2712141162840347885">Kies enigiets om met Google Lens te soek of druk Escape om uit Google Lens te gaan</translation>
-<translation id="2723860029395667894">Wys altyd Google KI-moduskortpad</translation>
 <translation id="2738871930057338499">Kon nie aan die internet koppel nie. HTTP 403 verbode. Gaan asseblief jou proxy-opstelling na.</translation>
 <translation id="2742320827292110288">Waarskuwing: Google Chrome kan nie keer dat uitbreidings jou blaaigeskiedenis opneem nie. Ontkies hierdie opsie om hierdie uitbreiding in Incognitomodus te deaktiveer.</translation>
 <translation id="2753623023919742414">Klik om te soek</translation>
@@ -692,7 +691,6 @@
 <translation id="8647930742055103497">Hou alles in Chrome</translation>
 <translation id="8656634243791296665">Maak Gemini in Chrome Dev oop</translation>
 <translation id="8669527147644353129">Google Chrome-helper</translation>
-<translation id="8677922833187616101">Wys altyd Google KI-moduskortpad</translation>
 <translation id="8679801911857917785">Dit beheer ook watter bladsy gewys word wanneer jy Chrome begin.</translation>
 <translation id="8712637175834984815">Het dit</translation>
 <translation id="8712767363896337380">Amper op datum! Herbegin Chrome om opdatering te voltooi.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_am.xtb b/chrome/app/resources/google_chrome_strings_am.xtb
index d7510cd..475d1c6 100644
--- a/chrome/app/resources/google_chrome_strings_am.xtb
+++ b/chrome/app/resources/google_chrome_strings_am.xtb
@@ -152,7 +152,6 @@
 <translation id="2681444469812712297"><ph name="URL" /> በGoogle Chrome ውስጥ በአዲስ ትር ይክፈቱ።</translation>
 <translation id="2699790011615497488">Gemini በChrome ቅድመ-ይሁንታ ውስጥ ክፈት</translation>
 <translation id="2712141162840347885">በGoogle ሌንስ ለመፈለግ ማንኛውንም ነገር ይጫኑ ወይም ከGoogle ሌንስ ለመውጣት ዝለልን ይጫኑ</translation>
-<translation id="2723860029395667894">ሁልጊዜ የGoogle ሰው ሠራሽ አስተውሎት ሁነታ አቋራጭን አሳይ</translation>
 <translation id="2738871930057338499">ከበይነመረብ ጋር መገናኘት አልተቻለም። ኤችቲቲፒኤስ 403 ተከልክሏል። እባክዎ ተኪ ውቅረትዎን ይፈትሹ።</translation>
 <translation id="2742320827292110288">ማስጠንቀቂያ፦ የGoogle Chrome ቅጥያዎች የአሰሳ ታሪክዎን እንዳይመዘግቡ መከልከል አይችልም። ይህን ቅጥያ ማንነት በማያሳውቅ ሁነት ላይ ለማሰናከል ይህን አማራጭ አይምረጡ።</translation>
 <translation id="2753623023919742414">ለመፈለግ ጠቅ ያድርጉ</translation>
@@ -692,7 +691,6 @@
 <translation id="8647930742055103497">ሁሉንም ነገር በChrome ውስጥ ያቆዩ</translation>
 <translation id="8656634243791296665">Gemini በChrome ገንቢ ውስጥ ክፈት</translation>
 <translation id="8669527147644353129">Google Chrome አጋዥ</translation>
-<translation id="8677922833187616101">ሁልጊዜ የGoogle ሰው ሠራሽ አስተውሎት ሁነታ አቋራጭን አሳይ</translation>
 <translation id="8679801911857917785">እንዲሁም Chromeን ሲጀምሩት የሚታየውን ገፅ ይቆጣጠራል።</translation>
 <translation id="8712637175834984815">ገባኝ</translation>
 <translation id="8712767363896337380">ሊዘመን ጥቂት ቀርቶታል! ዝማኔውን ለማጠናቀቅ Chromeን እንደገና ያስጀምሩ።</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ar.xtb b/chrome/app/resources/google_chrome_strings_ar.xtb
index 31948d2..70e8812 100644
--- a/chrome/app/resources/google_chrome_strings_ar.xtb
+++ b/chrome/app/resources/google_chrome_strings_ar.xtb
@@ -150,9 +150,9 @@
 <translation id="2681444469812712297">‏افتح <ph name="URL" /> في علامة تبويب جديدة في Google Chrome.</translation>
 <translation id="2699790011615497488">‏فتح Gemini في الإصدار التجريبي من Chrome</translation>
 <translation id="2712141162840347885">‏حدِّد أي محتوى للبحث عنه باستخدام "عدسة Google" أو اضغط على مفتاح Escape للخروج من "عدسة Google"</translation>
-<translation id="2723860029395667894">‏عرض اختصار "وضع Google AI" دائمًا</translation>
 <translation id="2738871930057338499">‏تعذر الاتصال بالإنترنت. بروتوكول HTTP 403 محظور. يُرجى التحقق من إعدادات الخادم الوكيل.</translation>
 <translation id="2742320827292110288">‏تحذير: لا يستطيع Google Chrome منع الإضافات من تسجيل سجل التصفُّح الخاص بك. لإيقاف هذه الإضافة في وضع التصفُّح المتخفي، يجب إلغاء تحديد هذا الخيار.</translation>
+<translation id="2747021967398957654">{count,plural, =1{‏لم يتم حفظ بعض بيانات Chrome في حسابك على Google إلى الآن. يُرجى الانتظار بضع دقائق قبل تسجيل الخروج. إذا سجَّلت الخروج الآن، فسيتم حذف عنصر واحد من هذه البيانات.}zero{‏لم يتم حفظ بعض بيانات Chrome في حسابك على Google إلى الآن. يُرجى الانتظار بضع دقائق قبل تسجيل الخروج. إذا سجَّلت الخروج الآن، فسيتم حذف {count} عنصر من هذه البيانات.}two{‏لم يتم حفظ بعض بيانات Chrome في حسابك على Google إلى الآن. يُرجى الانتظار بضع دقائق قبل تسجيل الخروج. إذا سجَّلت الخروج الآن، فسيتم حذف عنصرَين ({count}) من هذه البيانات.}few{‏لم يتم حفظ بعض بيانات Chrome في حسابك على Google إلى الآن. يُرجى الانتظار بضع دقائق قبل تسجيل الخروج. إذا سجَّلت الخروج الآن، فسيتم حذف {count} عناصر من هذه البيانات.}many{‏لم يتم حفظ بعض بيانات Chrome في حسابك على Google إلى الآن. يُرجى الانتظار بضع دقائق قبل تسجيل الخروج. إذا سجَّلت الخروج الآن، فسيتم حذف {count} عنصرًا من هذه البيانات.}other{‏لم يتم حفظ بعض بيانات Chrome في حسابك على Google إلى الآن. يُرجى الانتظار بضع دقائق قبل تسجيل الخروج. إذا سجَّلت الخروج الآن، فسيتم حذف {count} عنصر من هذه البيانات.}}</translation>
 <translation id="2753623023919742414">انقر للبحث</translation>
 <translation id="2757826245013442432">{COUNT,plural, =0{‏تتطلّب "الحماية المتقدّمة" إعادة تشغيل Chrome لتحديثه}=1{‏تتطلّب "الحماية المتقدّمة" إعادة تشغيل Chrome لتحديثه، ولن تتم إعادة فتح نافذة التصفح المتخفي.}two{‏تتطلّب "الحماية المتقدّمة" إعادة تشغيل Chrome لتحديثه، ولن تتم إعادة فتح نافذتَي التصفح المتخفي.}few{‏تتطلّب "الحماية المتقدّمة" إعادة تشغيل Chrome لتحديثه، ولن تتم إعادة فتح # نوافذ تصفّح متخفٍّ.}many{‏تتطلّب "الحماية المتقدّمة" إعادة تشغيل Chrome لتحديثه، ولن تتم إعادة فتح # نافذة تصفّح متخفٍّ.}other{‏تتطلّب "الحماية المتقدّمة" إعادة تشغيل Chrome لتحديثه، ولن تتم إعادة فتح # نافذة تصفّح متخفٍّ.}}</translation>
 <translation id="2765403129283291972">‏يحتاج Chrome إلى إذن للوصول إلى الميكروفون من أجل الموقع الإلكتروني هذا.</translation>
@@ -370,7 +370,7 @@
 <translation id="5190467473654176081">‏تخصيص Chrome لإضفاء مظهر جديد عليه</translation>
 <translation id="5201744974236816379">‏تحديث Chrome</translation>
 <translation id="521447420733633466">‏في حال مشاركة جهاز مع الأصدقاء والعائلة، يمكنهم الحصول على تجربة تصفّح منفصلة وإعداد Chrome على النحو المفضّل لديهم.</translation>
-<translation id="5234764350956374838">تجاهل</translation>
+<translation id="5234764350956374838">إغلاق</translation>
 <translation id="5239627039202700673">‏يمكنك فتح Chrome عند النقر على الروابط في الرسائل والمستندات والتطبيقات الأخرى.</translation>
 <translation id="5251420635869119124">‏يمكن للضيف استخدام Chrome بدون أن يترك أي أثر وراءه.</translation>
 <translation id="5286907366254680517">تمّ رصد اللغة</translation>
@@ -510,6 +510,7 @@
 <translation id="6676384891291319759">الدخول إلى الإنترنت</translation>
 <translation id="6679975945624592337">‏السماح بتشغيل Google Chrome في الخلفية</translation>
 <translation id="6696915334902295848">‏يحتاج Chrome إلى إذن للوصول إلى الميكروفون من أجل هذا الموقع الإلكتروني.</translation>
+<translation id="6706525880530967390">{count,plural, =1{‏يحتاج Chrome إلى إثبات هويتك قبل حفظ بعض البيانات في حسابك على Google واستخدامها على جميع أجهزتك. إذا سجَّلت الخروج الآن، فسيتم حذف عنصر واحد من هذه البيانات.}zero{‏يحتاج Chrome إلى إثبات هويتك قبل حفظ بعض البيانات في حسابك على Google واستخدامها على جميع أجهزتك. إذا سجَّلت الخروج الآن، فسيتم حذف {count} عنصر من هذه البيانات.}two{‏يحتاج Chrome إلى إثبات هويتك قبل حفظ بعض البيانات في حسابك على Google واستخدامها على جميع أجهزتك. إذا سجَّلت الخروج الآن، فسيتم حذف عنصرَين ({count}) من هذه البيانات.}few{‏يحتاج Chrome إلى إثبات هويتك قبل حفظ بعض البيانات في حسابك على Google واستخدامها على جميع أجهزتك. إذا سجَّلت الخروج الآن، فسيتم حذف {count} عناصر من هذه البيانات.}many{‏يحتاج Chrome إلى إثبات هويتك قبل حفظ بعض البيانات في حسابك على Google واستخدامها على جميع أجهزتك. إذا سجَّلت الخروج الآن، فسيتم حذف {count} عنصرًا من هذه البيانات.}other{‏يحتاج Chrome إلى إثبات هويتك قبل حفظ بعض البيانات في حسابك على Google واستخدامها على جميع أجهزتك. إذا سجَّلت الخروج الآن، فسيتم حذف {count} عنصر من هذه البيانات.}}</translation>
 <translation id="6712881677154121168">حدث خطأ في عملية التنزيل: <ph name="DOWNLOAD_ERROR" />.</translation>
 <translation id="6718739135284199302">‏زيادة سرعة متصفِّح Chrome</translation>
 <translation id="6734827584173583205">‏لم تتم زيارة هذا الموقع الإلكتروني مؤخرًا، لذلك أزال Chrome إذنَي <ph name="PERMISSION_1" /> و<ph name="PERMISSION_2" /> وأذونات أخرى (<ph name="COUNT" />).</translation>
@@ -688,7 +689,6 @@
 <translation id="8647930742055103497">‏الاحتفاظ بكل البيانات في Chrome</translation>
 <translation id="8656634243791296665">‏فتح Gemini في إصدار مطوّري البرامج من Chrome</translation>
 <translation id="8669527147644353129">‏مساعد Google Chrome</translation>
-<translation id="8677922833187616101">‏عرض اختصار "وضع Google AI" دائمًا</translation>
 <translation id="8679801911857917785">‏كما أنها تتحكم في الصفحة التي تظهر عند تشغيل Chrome.</translation>
 <translation id="8712637175834984815">حسنًا</translation>
 <translation id="8712767363896337380">‏أوشك التحديث على الانتهاء. أعِد تشغيل Chrome لإتمام التحديث.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_as.xtb b/chrome/app/resources/google_chrome_strings_as.xtb
index 8e1a4ef..c3c5cf2 100644
--- a/chrome/app/resources/google_chrome_strings_as.xtb
+++ b/chrome/app/resources/google_chrome_strings_as.xtb
@@ -152,7 +152,6 @@
 <translation id="2681444469812712297">Google Chromeত এটা নতুন টেবত <ph name="URL" /> খোলক।</translation>
 <translation id="2699790011615497488">Chrome বিটাত Gemini খোলক</translation>
 <translation id="2712141162840347885">Google Lensৰ জৰিয়তে সন্ধান কৰিবলৈ যিকোনো বস্তু বাছনি কৰক বা Google Lensৰ পৰা বাহিৰ ওলাবলৈ এস্কে’প টিপক</translation>
-<translation id="2723860029395667894">সদায়েই Google AI ম’ডৰ শ্বৰ্টকাট দেখুৱাওক</translation>
 <translation id="2738871930057338499">ইণ্টাৰনেটৰ লগত সংযোগ কৰিব পৰা নাই। HTTP 403 নিষিদ্ধ। অনুগ্ৰহ কৰি আপোনাৰ প্ৰ’ক্সি কনফিগাৰেশ্বন পৰীক্ষা কৰক।</translation>
 <translation id="2742320827292110288">সকীয়নি: Google Chromeএ কোনো এক্সটেনশ্বনক আপোনাৰ ব্ৰাউজিঙৰ ইতিহাস ৰেকৰ্ড কৰাত বাধা দিব নোৱাৰে। এই এক্সটেনশ্বনটো ইনক’গনিট’ ম’ডত অক্ষম কৰিবলৈ এই বিকল্পটো বাছনিৰ পৰা আঁতৰাওক।</translation>
 <translation id="2753623023919742414">সন্ধান কৰিবলৈ ক্লিক কৰক</translation>
@@ -692,7 +691,6 @@
 <translation id="8647930742055103497">আটাইবোৰ Chromeত ৰাখক</translation>
 <translation id="8656634243791296665">Chrome Devত Gemini খোলক</translation>
 <translation id="8669527147644353129">Google Chrome সহায়ক</translation>
-<translation id="8677922833187616101">সদায়েই Google AI ম’ডৰ শ্বৰ্টকাট দেখুৱাওক</translation>
 <translation id="8679801911857917785">আপুনি Chrome আৰম্ভ কৰিলে কি পৃষ্ঠা দেখুওৱা হ’ব সেয়াও ই নিয়ন্ত্ৰণ কৰে।</translation>
 <translation id="8712637175834984815">বুজি পালোঁ</translation>
 <translation id="8712767363896337380">প্ৰায় আপ টু ডে’ট হৈছে! আপডে’ট হোৱাটো সম্পূৰ্ণ কৰিবলৈ Chrome পুনৰ লঞ্চ কৰক।</translation>
diff --git a/chrome/app/resources/google_chrome_strings_az.xtb b/chrome/app/resources/google_chrome_strings_az.xtb
index 72c2cc29..89a47d1 100644
--- a/chrome/app/resources/google_chrome_strings_az.xtb
+++ b/chrome/app/resources/google_chrome_strings_az.xtb
@@ -146,7 +146,6 @@
 <translation id="2681444469812712297">Google Chrome-da yeni tabda <ph name="URL" /> açın.</translation>
 <translation id="2699790011615497488">Gemini-ı Chrome Beta-da açın</translation>
 <translation id="2712141162840347885">Google Linza ilə axtarış etmək üçün istədiyinizi seçin və ya Google Linzadan çıxmaq üçün "escape" düyməsinə basın</translation>
-<translation id="2723860029395667894">Google Sİ rejimi qısayolu həmişə göstərilsin</translation>
 <translation id="2738871930057338499">İnternetə qoşulmaq olmur. HTTP 403 qadağan edilib. Proksi konfiqurasiyasını yoxlayın.</translation>
 <translation id="2742320827292110288">Xəbərdarlıq: Google Chrome artırmaların brauzer tarixçənizi yazmasının qarşısını ala bilməz. Bu artırmanı Anonim rejimdə deaktiv etmək üçün bu seçimi ləğv edin.</translation>
 <translation id="2753623023919742414">Klikləyərək axtarın</translation>
@@ -684,7 +683,6 @@
 <translation id="8647930742055103497">Hər şeyi Chrome-da saxlayın</translation>
 <translation id="8656634243791296665">Gemini-ı Chrome Dev-də açın</translation>
 <translation id="8669527147644353129">Google Chrome Yardımçı</translation>
-<translation id="8677922833187616101">Google Sİ rejimi qısayolu həmişə göstərilsin</translation>
 <translation id="8679801911857917785">O, həmçinin, Chrome açılanda hansı səhifənin göstərildiyini idarə edir.</translation>
 <translation id="8712637175834984815">Anladım</translation>
 <translation id="8712767363896337380">Güncəllənmək üzrədir! Güncəlləməni tamamlamaq üçün Chrome'u yenidən başladın.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_be.xtb b/chrome/app/resources/google_chrome_strings_be.xtb
index 7e9eaa51..ba64372 100644
--- a/chrome/app/resources/google_chrome_strings_be.xtb
+++ b/chrome/app/resources/google_chrome_strings_be.xtb
@@ -152,7 +152,6 @@
 <translation id="2681444469812712297">Адкрыць <ph name="URL" /> у новай укладцы ў Google Chrome.</translation>
 <translation id="2699790011615497488">Адкрыць Gemini ў бэта-версіі Chrome</translation>
 <translation id="2712141162840347885">Паспрабуйце знайсці што-небудзь з дапамогай Google Аб’ектыва або націсніце Esc, каб закрыць яго</translation>
-<translation id="2723860029395667894">Заўсёды паказваць ярлык "Рэжым AI ад Google"</translation>
 <translation id="2738871930057338499">Не ўдалося падключыцца да інтэрнэту. Памылка HTTP 403: доступ забаронены. Праверце налады проксі-сервера.</translation>
 <translation id="2742320827292110288">Увага! Google Chrome не можа забараніць пашырэнням весці запіс гісторыі прагляду сайтаў. Скасуйце выбар гэтай налады, каб адключыць дадзенае пашырэнне ў рэжыме інкогніта.</translation>
 <translation id="2753623023919742414">Націсніце для пошуку</translation>
@@ -691,7 +690,6 @@
 <translation id="8647930742055103497">Захоўвайце ўсё ў Chrome</translation>
 <translation id="8656634243791296665">Адкрыць Gemini ў Chrome для распрацоўшчыкаў</translation>
 <translation id="8669527147644353129">Памочнік Google Chrome</translation>
-<translation id="8677922833187616101">Заўсёды паказваць ярлык "Рэжым AI ад Google"</translation>
 <translation id="8679801911857917785">Таксама вызначае, якая старонка паказваецца пры запуску Chrome.</translation>
 <translation id="8712637175834984815">Зразумела</translation>
 <translation id="8712767363896337380">Амаль гатова! Каб завяршыць абнаўленне, перазапусціце Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bg.xtb b/chrome/app/resources/google_chrome_strings_bg.xtb
index 1a971fb..707fffa4 100644
--- a/chrome/app/resources/google_chrome_strings_bg.xtb
+++ b/chrome/app/resources/google_chrome_strings_bg.xtb
@@ -150,9 +150,9 @@
 <translation id="2681444469812712297">Отваряне на <ph name="URL" /> в нов раздел в Google Chrome.</translation>
 <translation id="2699790011615497488">Отваряне на Gemini в Chrome бета</translation>
 <translation id="2712141162840347885">Изберете каквото и да е, за да търсите с Google Обектив, или натиснете Escape за изход</translation>
-<translation id="2723860029395667894">Прекият път към режима с AI на Google да се показва винаги</translation>
 <translation id="2738871930057338499">Не може да се установи връзка с интернет. HTTP код 403 – Забранено. Проверете конфигурацията на прокси сървъра си.</translation>
 <translation id="2742320827292110288">Предупреждение: Google Chrome не може да попречи на разширенията да записват историята ви на сърфиране. За да деактивирате това разширение в режим „инкогнито“, премахнете отметката от тази опция.</translation>
+<translation id="2747021967398957654">{count,plural, =1{Някои от данните ви в Chrome още не са запазени в профила ви в Google. Изчакайте няколко минути, преди да излезете от браузъра. Ако излезете от профила си сега, тези данни (1 елемент) ще бъдат изтрити.}other{Някои от данните ви в Chrome още не са запазени в профила ви в Google. Изчакайте няколко минути, преди да излезете от браузъра. Ако излезете от профила си сега, тези данни ({count} елемента) ще бъдат изтрити.}}</translation>
 <translation id="2753623023919742414">Кликнете, за да търсите</translation>
 <translation id="2757826245013442432">{COUNT,plural, =0{„Разширена защита“ изисква да рестартирате Chrome, за да се приложи актуализация}=1{„Разширена защита“ изисква да рестартирате Chrome, за да се приложи актуализация. Прозорецът ви в режим „инкогнито“ няма да бъде отворен отново.}other{„Разширена защита“ изисква да рестартирате Chrome, за да се приложи актуализация. # прозореца в режим „инкогнито“ няма да бъдат отворени отново.}}</translation>
 <translation id="2765403129283291972">Chrome се нуждае от разрешение за достъп до микрофона ви за този сайт</translation>
@@ -508,6 +508,7 @@
 <translation id="6676384891291319759">Достъп до интернет</translation>
 <translation id="6679975945624592337">Разрешаване на Google Chrome да се изпълнява на заден план</translation>
 <translation id="6696915334902295848">За този сайт Chrome се нуждае от разрешение за достъп до микрофона</translation>
+<translation id="6706525880530967390">{count,plural, =1{Chrome трябва да потвърди, че това сте вие, преди някои данни да могат да бъдат запазени в профила ви в Google и да се използват на всичките ви устройства. Ако излезете от профила си сега, тези данни (1 елемент) ще бъдат изтрити.}other{Chrome трябва да потвърди, че това сте вие, преди някои данни да могат да бъдат запазени в профила ви в Google и да се използват на всичките ви устройства. Ако излезете от профила си сега, тези данни ({count} елемента) ще бъдат изтрити.}}</translation>
 <translation id="6712881677154121168">Грешка при изтеглянето: <ph name="DOWNLOAD_ERROR" />.</translation>
 <translation id="6718739135284199302">Ускорете Chrome</translation>
 <translation id="6734827584173583205">Не сте посещавали този сайт наскоро. Chrome премахна разрешенията „<ph name="PERMISSION_1" />“, „<ph name="PERMISSION_2" />“ и още <ph name="COUNT" />.</translation>
@@ -686,7 +687,6 @@
 <translation id="8647930742055103497">Съхранявайте всичко в Chrome</translation>
 <translation id="8656634243791296665">Отваряне на Gemini в Chrome Dev</translation>
 <translation id="8669527147644353129">Google Chrome Helper</translation>
-<translation id="8677922833187616101">Прекият път към режима с AI на Google да се показва винаги</translation>
 <translation id="8679801911857917785">То също контролира коя страница се показва при стартиране на Chrome.</translation>
 <translation id="8712637175834984815">Разбрах</translation>
 <translation id="8712767363896337380">Почти приключихме! Стартирайте повторно Chrome, за да завършите актуализирането.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bn.xtb b/chrome/app/resources/google_chrome_strings_bn.xtb
index 73de5b5..04f2847 100644
--- a/chrome/app/resources/google_chrome_strings_bn.xtb
+++ b/chrome/app/resources/google_chrome_strings_bn.xtb
@@ -150,9 +150,9 @@
 <translation id="2681444469812712297">Google Chrome-এর নতুন একটি ট্যাবে <ph name="URL" /> খুলুন।</translation>
 <translation id="2699790011615497488">Chrome Beta-তে Gemini খুলুন</translation>
 <translation id="2712141162840347885">Google Lens ব্যবহার করে সার্চ করার জন্য যেকোনও কিছু বেছে নিন অথবা Google Lens থেকে বেরিয়ে যেতে Escape বোতাম প্রেস করুন</translation>
-<translation id="2723860029395667894">সবসময় Google AI মোড শর্টকাট দেখুন</translation>
 <translation id="2738871930057338499">ইন্টারনেটের সাথে কানেক্ট করা যায়নি। HTTP 403 নিষিদ্ধ। আপনার প্রক্সি কনফিগারেশন চেক করুন।</translation>
 <translation id="2742320827292110288">সতর্কতা: Google Chrome কোনও এক্সটেনশনকে আপনার ব্রাউজিং ইতিহাস রেকর্ড করার কাজে বাধা দিতে পারে না। ছদ্মবেশী মোডে এই এক্সটেনশনটি বন্ধ করতে, আপনার বেছে নেওয়া বিকল্পগুলির মধ্যে থেকে এটিকে সরিয়ে দিন।</translation>
+<translation id="2747021967398957654">{count,plural, =1{আপনার Chrome ডেটার কিছুটা অংশ এখনও Google অ্যাকাউন্টে সেভ হয়নি। সাইন-আউট করার আগে কয়েক মিনিট অপেক্ষা করে দেখুন। আপনি এখনই সাইন-আউট করলে, এই ডেটা (১টি আইটেম) মুছে যাবে।}one{আপনার Chrome ডেটার কিছুটা অংশ এখনও Google অ্যাকাউন্টে সেভ হয়নি। সাইন-আউট করার আগে কয়েক মিনিট অপেক্ষা করে দেখুন। আপনি এখনই সাইন-আউট করলে, এই ডেটা ({count}টি আইটেম) মুছে যাবে।}other{আপনার Chrome ডেটার কিছুটা অংশ এখনও Google অ্যাকাউন্টে সেভ হয়নি। সাইন-আউট করার আগে কয়েক মিনিট অপেক্ষা করে দেখুন। আপনি এখনই সাইন-আউট করলে, এই ডেটা ({count}টি আইটেম) মুছে যাবে।}}</translation>
 <translation id="2753623023919742414">সার্চ করার জন্য ক্লিক করুন</translation>
 <translation id="2757826245013442432">{COUNT,plural, =0{উন্নত সুরক্ষা চালু করতে, আপডেট প্রয়োগ করার জন্য Chrome আবার চালু করতে হবে}=1{উন্নত সুরক্ষা চালু করতে, আপডেট প্রয়োগ করার জন্য Chrome আবার চালু করতে হবে। আপনার ছদ্মবেশী উইন্ডো আবার খুলবে না।}one{উন্নত সুরক্ষা চালু করতে, আপডেট প্রয়োগ করার জন্য Chrome আবার চালু করতে হবে। আপনার #টি ছদ্মবেশী উইন্ডো আবার খুলবে না।}other{উন্নত সুরক্ষা চালু করতে, আপডেট প্রয়োগ করার জন্য Chrome আবার চালু করতে হবে। আপনার #টি ছদ্মবেশী উইন্ডো আবার খুলবে না।}}</translation>
 <translation id="2765403129283291972">এই সাইটটির জন্য Chrome কে আপনার মাইক্রোফোনে অ্যাক্সেস দিতে হবে</translation>
@@ -510,6 +510,7 @@
 <translation id="6676384891291319759">ইন্টারনেটটি অ্যাক্সেস করুন</translation>
 <translation id="6679975945624592337">Google Chrome-কে ব্যাকগ্রাউন্ডে চলতে দিন</translation>
 <translation id="6696915334902295848">এই সাইটের জন্য Chrome-এর মাইক্রোফোন অ্যাক্সেসের অনুমতি প্রয়োজন</translation>
+<translation id="6706525880530967390">{count,plural, =1{Chrome আপনার পরিচয় যাচাই করে নেওয়ার পর আপনি Google অ্যাকাউন্টে কিছু ডেটা সেভ করতে ও সবকটি ডিভাইসে তা ব্যবহার করতে পারবেন। আপনি এখনই সাইন-আউট করলে, এই ডেটা (১টি আইটেম) মুছে যাবে।}one{Chrome আপনার পরিচয় যাচাই করে নেওয়ার পর আপনি Google অ্যাকাউন্টে কিছু ডেটা সেভ করতে ও সবকটি ডিভাইসে তা ব্যবহার করতে পারবেন। আপনি এখনই সাইন-আউট করলে, এই ডেটা ({count}টি আইটেম) মুছে যাবে।}other{Chrome আপনার পরিচয় যাচাই করে নেওয়ার পর আপনি Google অ্যাকাউন্টে কিছু ডেটা সেভ করতে ও সবকটি ডিভাইসে তা ব্যবহার করতে পারবেন। আপনি এখনই সাইন-আউট করলে, এই ডেটা ({count}টি আইটেম) মুছে যাবে।}}</translation>
 <translation id="6712881677154121168">ডাউনলোড করার সমস্যা হয়েছে: <ph name="DOWNLOAD_ERROR" />।</translation>
 <translation id="6718739135284199302">Chrome ব্যবহারের স্পিড বাড়ান</translation>
 <translation id="6734827584173583205">আপনি সম্প্রতি ভিজিট করেননি। Chrome <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> এবং আরও <ph name="COUNT" />টি অনুমতি সরিয়ে দিয়েছে।</translation>
@@ -688,7 +689,6 @@
 <translation id="8647930742055103497">সবকিছু Chrome-এ রাখুন</translation>
 <translation id="8656634243791296665">Chrome Dev-এ Gemini খুলুন</translation>
 <translation id="8669527147644353129">Google Chrome সহায়তাকারী</translation>
-<translation id="8677922833187616101">সবসময় Google AI মোড শর্টকাট দেখুন</translation>
 <translation id="8679801911857917785">আপনি Chrome শুরু করলে কোন পৃষ্ঠাটি দেখানো হবে তাও এটি নিয়ন্ত্রণ করে।</translation>
 <translation id="8712637175834984815">বুঝেছি</translation>
 <translation id="8712767363896337380">প্রায় আপডেট হয়ে গেছে! আপডেট প্রসেস সম্পূর্ণ করতে, Chrome আবার চালু করুন।</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bs.xtb b/chrome/app/resources/google_chrome_strings_bs.xtb
index b2635666..f8853694 100644
--- a/chrome/app/resources/google_chrome_strings_bs.xtb
+++ b/chrome/app/resources/google_chrome_strings_bs.xtb
@@ -152,7 +152,6 @@
 <translation id="2681444469812712297">Otvorite <ph name="URL" /> u novoj kartici u Google Chromeu.</translation>
 <translation id="2699790011615497488">Otvorite Gemini u Chrome Beti</translation>
 <translation id="2712141162840347885">Odaberite bilo šta da pretražite putem Google Objektiva ili pritisnite Esc da izađete iz Google Objektiva</translation>
-<translation id="2723860029395667894">Uvijek prikazuj prečicu Google AI načina rada</translation>
 <translation id="2738871930057338499">Nije moguće povezati se s internetom. HTTP 403 je zabranjen. Provjerite konfiguraciju proksi servera.</translation>
 <translation id="2742320827292110288">Upozorenje: Google Chrome ne može spriječiti da ekstenzije čitaju vašu historiju pregledanja. Da onemogućite ovu ekstenziju u anonimnom načinu rada, poništite odabir ove opcije.</translation>
 <translation id="2753623023919742414">Kliknite da pretražite</translation>
@@ -692,7 +691,6 @@
 <translation id="8647930742055103497">Zadržite sve u Chromeu</translation>
 <translation id="8656634243791296665">Otvorite Gemini u Chrome Devu</translation>
 <translation id="8669527147644353129">Google Chrome Helper</translation>
-<translation id="8677922833187616101">Uvijek prikazuj prečicu Google AI načina rada</translation>
 <translation id="8679801911857917785">Također kontrolira koja stranica se prikazuje kada pokrenete Chrome.</translation>
 <translation id="8712637175834984815">Razumijem</translation>
 <translation id="8712767363896337380">Još malo pa je ažurirano! Ponovo pokrenite Chrome da završite ažuriranje.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ca.xtb b/chrome/app/resources/google_chrome_strings_ca.xtb
index dfd2731..e2f47fc 100644
--- a/chrome/app/resources/google_chrome_strings_ca.xtb
+++ b/chrome/app/resources/google_chrome_strings_ca.xtb
@@ -148,7 +148,6 @@
 <translation id="2681444469812712297">Obre <ph name="URL" /> en una pestanya nova a Google Chrome.</translation>
 <translation id="2699790011615497488">Obre Gemini a Chrome Beta</translation>
 <translation id="2712141162840347885">Selecciona el que vulguis per cercar-ho amb Google Lens o prem Esc per sortir de Google Lens</translation>
-<translation id="2723860029395667894">Mostra sempre la drecera del mode IA de Google</translation>
 <translation id="2738871930057338499">No es pot connectar a Internet. Error d'HTTP "403 Forbidden". Comprova la configuració del servidor intermediari.</translation>
 <translation id="2742320827292110288">Advertiment: Google Chrome no pot evitar que les extensions registrin l'historial de navegació. Per desactivar aquesta extensió en mode d'incògnit, desselecciona aquesta opció.</translation>
 <translation id="2753623023919742414">Fes clic per cercar</translation>
@@ -684,7 +683,6 @@
 <translation id="8647930742055103497">Mantén-ho tot a Chrome</translation>
 <translation id="8656634243791296665">Obre Gemini a Chrome Dev</translation>
 <translation id="8669527147644353129">Aplicació d'ajuda de Google Chrome</translation>
-<translation id="8677922833187616101">Mostra sempre la drecera del mode IA de Google</translation>
 <translation id="8679801911857917785">També controla la pàgina que es mostra quan inicieu Chrome.</translation>
 <translation id="8712637175834984815">Entesos</translation>
 <translation id="8712767363896337380">Gairebé has acabat amb l'actualització. Reinicia Chrome per acabar l'actualització.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_cs.xtb b/chrome/app/resources/google_chrome_strings_cs.xtb
index 8a1fae0..127858c6 100644
--- a/chrome/app/resources/google_chrome_strings_cs.xtb
+++ b/chrome/app/resources/google_chrome_strings_cs.xtb
@@ -152,7 +152,6 @@
 <translation id="2681444469812712297">Otevřít adresu <ph name="URL" /> na nové kartě prohlížeče Google Chrome.</translation>
 <translation id="2699790011615497488">Otevřít Gemini v Chromu Beta</translation>
 <translation id="2712141162840347885">Vyberte cokoli, co chcete vyhledat pomocí Google Lens, nebo Google Lens stisknutím klávesy Escape ukončete</translation>
-<translation id="2723860029395667894">Vždy zobrazovat zkratku režimu AI od Googlu</translation>
 <translation id="2738871930057338499">Nelze se připojit k internetu. HTTP 403 (Zakázáno). Zkontrolujte konfiguraci proxy.</translation>
 <translation id="2742320827292110288">Upozornění: Google Chrome nemůže rozšířením zabránit v zaznamenávání vaší historie prohlížení. Chcete-li toto rozšíření v anonymním režimu deaktivovat, zrušte výběr této možnosti.</translation>
 <translation id="2753623023919742414">Kliknutím spustíte hledání</translation>
@@ -691,7 +690,6 @@
 <translation id="8647930742055103497">Mějte všechno v Chromu</translation>
 <translation id="8656634243791296665">Otevřít Gemini v Chromu Dev</translation>
 <translation id="8669527147644353129">Google Chrome Helper</translation>
-<translation id="8677922833187616101">Vždy zobrazovat zkratku režimu AI od Googlu</translation>
 <translation id="8679801911857917785">Také řídí, která stránka se zobrazí při spuštění Chromu.</translation>
 <translation id="8712637175834984815">Hotovo</translation>
 <translation id="8712767363896337380">Aktualizace je téměř hotová. Aktualizaci dokončíte restartováním prohlížeče Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_cy.xtb b/chrome/app/resources/google_chrome_strings_cy.xtb
index 611ef37..35108d3 100644
--- a/chrome/app/resources/google_chrome_strings_cy.xtb
+++ b/chrome/app/resources/google_chrome_strings_cy.xtb
@@ -152,7 +152,6 @@
 <translation id="2681444469812712297">Agor <ph name="URL" /> mewn tab newydd yn Google Chrome.</translation>
 <translation id="2699790011615497488">Agor Gemini yn Chrome Beta</translation>
 <translation id="2712141162840347885">Dewiswch unrhyw beth i'w chwilio gyda Google Lens neu pwyswch Escape i adael Google Lens</translation>
-<translation id="2723860029395667894">Dangos llwybr byr Dull AI Google bob amser</translation>
 <translation id="2738871930057338499">Methu â chysylltu â'r Rhyngrwyd. HTTP 403 Gwaharddedig. Gwiriwch ffurfweddiad eich dirprwy weinydd.</translation>
 <translation id="2742320827292110288">Rhybudd: Ni all Google Chrome atal estyniadau rhag cofnodi eich hanes pori. I ddiffodd yr estyniad hwn yn y modd Anhysbys, dad-ddewiswch yr opsiwn hwn.</translation>
 <translation id="2753623023919742414">Cliciwch i chwilio</translation>
@@ -692,7 +691,6 @@
 <translation id="8647930742055103497">Cadw popeth yn Chrome</translation>
 <translation id="8656634243791296665">Agor Gemini yn Chrome Dev</translation>
 <translation id="8669527147644353129">Google Chrome Helper</translation>
-<translation id="8677922833187616101">Dangos Llwybr Byr Dull AI Google Bob Amser</translation>
 <translation id="8679801911857917785">Mae hefyd yn rheoli pa dudalen sy'n cael ei dangos pan fyddwch yn dechrau Chrome.</translation>
 <translation id="8712637175834984815">Iawn</translation>
 <translation id="8712767363896337380">Bron yn gyfoes! Ail-lansiwch Chrome i orffen diweddaru.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_da.xtb b/chrome/app/resources/google_chrome_strings_da.xtb
index 2151a56..c4419fd 100644
--- a/chrome/app/resources/google_chrome_strings_da.xtb
+++ b/chrome/app/resources/google_chrome_strings_da.xtb
@@ -148,7 +148,6 @@
 <translation id="2681444469812712297">Åbn <ph name="URL" /> på en ny fane i Google Chrome.</translation>
 <translation id="2699790011615497488">Åbn Gemini i Chrome Beta</translation>
 <translation id="2712141162840347885">Vælg det, du vil søge efter med Google Lens, eller tryk på Escape for at lukke Google Lens</translation>
-<translation id="2723860029395667894">Vis altid genvejen til Google AI-tilstand</translation>
 <translation id="2738871930057338499">Der kan ikke oprettes forbindelse til internettet. HTTP 403 (forbudt). Tjek din proxykonfiguration.</translation>
 <translation id="2742320827292110288">Advarsel! Google Chrome kan ikke forhindre udvidelser i at registrere din browserhistorik. Fjern markeringen af denne valgmulighed for at deaktivere denne udvidelse i inkognitotilstand.</translation>
 <translation id="2753623023919742414">Klik for at søge</translation>
@@ -684,7 +683,6 @@
 <translation id="8647930742055103497">Hold alting samlet i Chrome</translation>
 <translation id="8656634243791296665">Åbn Gemini i Chrome Dev</translation>
 <translation id="8669527147644353129">Hjælp til Google Chrome</translation>
-<translation id="8677922833187616101">Vis altid genvejen til Google AI-tilstand</translation>
 <translation id="8679801911857917785">Den styrer også, hvilken side der vises, når du åbner Chrome.</translation>
 <translation id="8712637175834984815">Forstået</translation>
 <translation id="8712767363896337380">Næsten opdateret! Genstart Chrome for at fuldføre opdateringen.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_de.xtb b/chrome/app/resources/google_chrome_strings_de.xtb
index a3127cf..64e46ab 100644
--- a/chrome/app/resources/google_chrome_strings_de.xtb
+++ b/chrome/app/resources/google_chrome_strings_de.xtb
@@ -148,7 +148,6 @@
 <translation id="2681444469812712297">Öffne <ph name="URL" /> in einem neuen Tab in Google Chrome.</translation>
 <translation id="2699790011615497488">Gemini in Chrome Beta öffnen</translation>
 <translation id="2712141162840347885">Wähle einen beliebigen Gegenstand für die Suche mit Google Lens aus oder drücke die Esc-Taste, um Google Lens zu beenden</translation>
-<translation id="2723860029395667894">Verknüpfung zum KI-Modus von Google immer anzeigen</translation>
 <translation id="2738871930057338499">Internetverbindung kann nicht hergestellt werden. HTTP 403 Forbidden. Bitte prüfe deine Proxykonfiguration.</translation>
 <translation id="2742320827292110288">Achtung: Google Chrome kann nicht verhindern, dass dein Browser-Verlauf von Erweiterungen aufgezeichnet wird. Schalte diese Option aus, um die Erweiterung im Inkognitomodus zu deaktivieren.</translation>
 <translation id="2753623023919742414">Zum Suchen klicken</translation>
@@ -683,7 +682,6 @@
 <translation id="8647930742055103497">Alles in Chrome speichern</translation>
 <translation id="8656634243791296665">Gemini in Chrome Dev öffnen</translation>
 <translation id="8669527147644353129">Google Chrome Helper</translation>
-<translation id="8677922833187616101">Verknüpfung zum KI-Modus von Google immer anzeigen</translation>
 <translation id="8679801911857917785">Die Erweiterung legt auch die Seite fest, die beim Start von Chrome angezeigt wird.</translation>
 <translation id="8712637175834984815">Ok</translation>
 <translation id="8712767363896337380">Fast geschafft! Starte Chrome zum Abschluss der Aktualisierung neu.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_el.xtb b/chrome/app/resources/google_chrome_strings_el.xtb
index 911cc48..fa73a31f 100644
--- a/chrome/app/resources/google_chrome_strings_el.xtb
+++ b/chrome/app/resources/google_chrome_strings_el.xtb
@@ -150,7 +150,6 @@
 <translation id="2681444469812712297">Ανοίξτε τη διεύθυνση <ph name="URL" /> σε νέα καρτέλα στο Google Chrome.</translation>
 <translation id="2699790011615497488">Άνοιγμα του Gemini στο Chrome Beta</translation>
 <translation id="2712141162840347885">Επιλέξτε οτιδήποτε για αναζήτηση με το Google Lens ή πατήστε Escape για έξοδο από το Google Lens</translation>
-<translation id="2723860029395667894">Να εμφανίζεται πάντα η συντόμευση Λειτουργία AI της Google</translation>
 <translation id="2738871930057338499">Δεν είναι δυνατή η σύνδεση στο διαδίκτυο. HTTP 403 Forbidden. Ελέγξτε τη διαμόρφωση των παραμέτρων του διακομιστή μεσολάβησης.</translation>
 <translation id="2742320827292110288">Προειδοποίηση: Το Google Chrome δεν μπορεί να αποτρέψει την καταγραφή του ιστορικού περιήγησής σας από τις επεκτάσεις. Για να απενεργοποιήσετε αυτή την επέκταση σε κατάσταση ανώνυμης περιήγησης, καταργήστε αυτή την επιλογή.</translation>
 <translation id="2753623023919742414">Κάντε κλικ για αναζήτηση</translation>
@@ -688,7 +687,6 @@
 <translation id="8647930742055103497">Διατηρήστε τα πάντα στο Chrome</translation>
 <translation id="8656634243791296665">Άνοιγμα του Gemini στο Chrome Dev</translation>
 <translation id="8669527147644353129">Google Chrome Helper</translation>
-<translation id="8677922833187616101">Να εμφανίζεται πάντα η συντόμευση Λειτουργία AI της Google</translation>
 <translation id="8679801911857917785">Επίσης, ελέγχει τη σελίδα που εμφανίζεται κατά την εκκίνηση του Chrome.</translation>
 <translation id="8712637175834984815">Κατάλαβα!</translation>
 <translation id="8712767363896337380">Σχεδόν ενημερώθηκε! Επανεκκινήστε το Chrome για να ολοκληρώσετε την ενημέρωση.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_en-GB.xtb b/chrome/app/resources/google_chrome_strings_en-GB.xtb
index 0ef4d0d..e5a50db0 100644
--- a/chrome/app/resources/google_chrome_strings_en-GB.xtb
+++ b/chrome/app/resources/google_chrome_strings_en-GB.xtb
@@ -152,9 +152,9 @@
 <translation id="2681444469812712297">Open <ph name="URL" /> in a new tab in Google Chrome.</translation>
 <translation id="2699790011615497488">Open Gemini in Chrome Beta</translation>
 <translation id="2712141162840347885">Select anything to search with Google Lens or press escape to exit Google Lens</translation>
-<translation id="2723860029395667894">Always show Google AI Mode shortcut</translation>
 <translation id="2738871930057338499">Unable to connect to the Internet. HTTP 403 Forbidden. Please check your proxy configuration.</translation>
 <translation id="2742320827292110288">Warning: Google Chrome cannot prevent extensions from recording your browsing history. To disable this extension in Incognito mode, unselect this option.</translation>
+<translation id="2747021967398957654">{count,plural, =1{Some of your Chrome data hasn't been saved in your Google Account yet. Try waiting a few minutes before signing out. If you sign out now, this data (1 item) will be deleted.}other{Some of your Chrome data hasn't been saved in your Google Account yet. Try waiting a few minutes before signing out. If you sign out now, this data ({count} items) will be deleted.}}</translation>
 <translation id="2753623023919742414">Click to search</translation>
 <translation id="2757826245013442432">{COUNT,plural, =0{Advanced Protection requires that you relaunch Chrome to apply an update}=1{Advanced Protection requires that you relaunch Chrome to apply an update. Your Incognito window won't reopen.}other{Advanced Protection requires that you relaunch Chrome to apply an update. Your # Incognito windows won't reopen.}}</translation>
 <translation id="2765403129283291972">Chrome needs permission to access your microphone for this site</translation>
@@ -514,6 +514,7 @@
 <translation id="6676384891291319759">Access the Internet</translation>
 <translation id="6679975945624592337">Let Google Chrome Run in the Background</translation>
 <translation id="6696915334902295848">Chrome needs microphone permission for this site</translation>
+<translation id="6706525880530967390">{count,plural, =1{Chrome needs to verify that it's you before some data can be saved in your Google Account and used on all your devices. If you sign out now, this data (1 item) will be deleted.}other{Chrome needs to verify that it's you before some data can be saved in your Google Account and used on all your devices. If you sign out now, this data ({count} items) will be deleted.}}</translation>
 <translation id="6712881677154121168">Download error: <ph name="DOWNLOAD_ERROR" />.</translation>
 <translation id="6718739135284199302">Make Chrome faster</translation>
 <translation id="6734827584173583205">You haven't visited recently. Chrome removed <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> and <ph name="COUNT" /> more.</translation>
@@ -692,7 +693,6 @@
 <translation id="8647930742055103497">Keep everything in Chrome</translation>
 <translation id="8656634243791296665">Open Gemini in Chrome Dev</translation>
 <translation id="8669527147644353129">Google Chrome Helper</translation>
-<translation id="8677922833187616101">Always show Google AI mode shortcut</translation>
 <translation id="8679801911857917785">It also controls what page is shown when you start Chrome.</translation>
 <translation id="8712637175834984815">Got it</translation>
 <translation id="8712767363896337380">Nearly up to date! Relaunch Chrome to finish updating.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es-419.xtb b/chrome/app/resources/google_chrome_strings_es-419.xtb
index 9f8557c9..5431c5e 100644
--- a/chrome/app/resources/google_chrome_strings_es-419.xtb
+++ b/chrome/app/resources/google_chrome_strings_es-419.xtb
@@ -148,7 +148,6 @@
 <translation id="2681444469812712297">Abre <ph name="URL" /> en una pestaña nueva en Google Chrome.</translation>
 <translation id="2699790011615497488">Abrir Gemini en Chrome Beta</translation>
 <translation id="2712141162840347885">Selecciona cualquier elemento para buscar con Google Lens o presiona Escape para salir de Google Lens</translation>
-<translation id="2723860029395667894">Mostrar siempre el acceso directo al Modo IA de Google</translation>
 <translation id="2738871930057338499">No se puede conectar a Internet. HTTP 403 no permitido. Comprueba la configuración del proxy.</translation>
 <translation id="2742320827292110288">Advertencia: Google Chrome no puede impedir que las extensiones guarden tu historial de navegación. Para inhabilitar esta extensión en modo Incógnito, anula la selección de esta opción.</translation>
 <translation id="2753623023919742414">Hacer clic para buscar</translation>
@@ -684,7 +683,6 @@
 <translation id="8647930742055103497">Guarda todo en Chrome</translation>
 <translation id="8656634243791296665">Abrir Gemini en Chrome Dev</translation>
 <translation id="8669527147644353129">Ayuda de Google Chrome</translation>
-<translation id="8677922833187616101">Mostrar siempre el acceso directo al Modo IA de Google</translation>
 <translation id="8679801911857917785">También controla qué página se muestra al iniciar Chrome.</translation>
 <translation id="8712637175834984815">Entendido</translation>
 <translation id="8712767363896337380">Ya casi completas la actualización. Reinicia Chrome para completar la actualización.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es.xtb b/chrome/app/resources/google_chrome_strings_es.xtb
index 8351ec8..7fe28c2 100644
--- a/chrome/app/resources/google_chrome_strings_es.xtb
+++ b/chrome/app/resources/google_chrome_strings_es.xtb
@@ -152,9 +152,9 @@
 <translation id="2681444469812712297">Abre <ph name="URL" /> en una pestaña nueva en Google Chrome.</translation>
 <translation id="2699790011615497488">Abrir Gemini en Chrome Beta</translation>
 <translation id="2712141162840347885">Selecciona cualquier cosa para buscarla con Google Lens o pulsa la tecla Esc para salir de Google Lens</translation>
-<translation id="2723860029395667894">Mostrar siempre el acceso directo al Modo IA de Google</translation>
 <translation id="2738871930057338499">No se puede conectar a Internet. HTTP 403 no permitido. Comprueba la configuración del proxy.</translation>
 <translation id="2742320827292110288">Advertencia: Google Chrome no puede evitar que las extensiones registren tu historial de navegación. Para inhabilitar esta extensión en el modo Incógnito, desmarca esta opción.</translation>
+<translation id="2747021967398957654">{count,plural, =1{Algunos de tus datos de Chrome aún no se han guardado en tu cuenta de Google. Prueba a esperar unos minutos antes de cerrar sesión. Si cierras sesión ahora, estos datos (1 elemento) se eliminarán.}other{Algunos de tus datos de Chrome aún no se han guardado en tu cuenta de Google. Prueba a esperar unos minutos antes de cerrar sesión. Si cierras sesión ahora, estos datos ({count} elementos) se eliminarán.}}</translation>
 <translation id="2753623023919742414">Haz clic para buscar</translation>
 <translation id="2757826245013442432">{COUNT,plural, =0{Protección Avanzada requiere que reinicies Chrome para aplicar una actualización}=1{Protección Avanzada requiere que reinicies Chrome para aplicar una actualización. La ventana de incógnito no se volverá a abrir.}other{Protección Avanzada requiere que reinicies Chrome para aplicar una actualización. Las # ventanas de incógnito no se volverán a abrir.}}</translation>
 <translation id="2765403129283291972">Chrome necesita permiso para acceder al micrófono en este sitio web</translation>
@@ -514,6 +514,7 @@
 <translation id="6676384891291319759">Accede a Internet.</translation>
 <translation id="6679975945624592337">Permitir que Google Chrome se ejecute en segundo plano</translation>
 <translation id="6696915334902295848">Chrome necesita el permiso del micrófono para este sitio</translation>
+<translation id="6706525880530967390">{count,plural, =1{Chrome debe verificar que eres tú para poder guardar algunos datos en tu cuenta de Google y usarlos en todos tus dispositivos. Si cierras sesión ahora, estos datos (1 elemento) se eliminarán.}other{Chrome debe verificar que eres tú para poder guardar algunos datos en tu cuenta de Google y usarlos en todos tus dispositivos. Si cierras sesión ahora, estos datos ({count} elementos) se eliminarán.}}</translation>
 <translation id="6712881677154121168">Error de descarga: <ph name="DOWNLOAD_ERROR" />.</translation>
 <translation id="6718739135284199302">Aumenta la velocidad de Chrome</translation>
 <translation id="6734827584173583205">No has visitado el sitio recientemente. Chrome ha eliminado <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> y <ph name="COUNT" /> más.</translation>
@@ -692,7 +693,6 @@
 <translation id="8647930742055103497">Mantenlo todo en Chrome</translation>
 <translation id="8656634243791296665">Abrir Gemini en Chrome Dev</translation>
 <translation id="8669527147644353129">Ayudante de Google Chrome</translation>
-<translation id="8677922833187616101">Mostrar siempre el acceso directo al Modo IA de Google</translation>
 <translation id="8679801911857917785">También controla qué página se muestra al iniciar Chrome.</translation>
 <translation id="8712637175834984815">Entendido</translation>
 <translation id="8712767363896337380">La actualización ya casi ha terminado. Reinicia Chrome para completar la actualización.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_et.xtb b/chrome/app/resources/google_chrome_strings_et.xtb
index dd000704..1aea436 100644
--- a/chrome/app/resources/google_chrome_strings_et.xtb
+++ b/chrome/app/resources/google_chrome_strings_et.xtb
@@ -150,7 +150,6 @@
 <translation id="2681444469812712297">Avage <ph name="URL" /> Google Chrome’is uuel vahelehel.</translation>
 <translation id="2699790011615497488">Avage teenuse Gemini Chrome'is beetaversioon</translation>
 <translation id="2712141162840347885">Valige midagi, mida Google Lensiga otsida, või vajutage Google Lensist väljumiseks paoklahvi</translation>
-<translation id="2723860029395667894">Kuva alati Google'i AI-režiimi otsetee</translation>
 <translation id="2738871930057338499">Internetiga ei õnnestu ühendust luua. HTTP 403 on keelatud. Kontrollige puhverserveri seadistust.</translation>
 <translation id="2742320827292110288">Hoiatus: Google Chrome ei saa laiendustel teie sirvimisajaloo salvestamist takistada. Selle laienduse keelamiseks inkognito režiimis tühistage see valik.</translation>
 <translation id="2753623023919742414">Klõpsake otsimiseks</translation>
@@ -688,7 +687,6 @@
 <translation id="8647930742055103497">Hoidke kõike Chrome'is</translation>
 <translation id="8656634243791296665">Avage teenuse Gemini Chrome'is arendusversioon</translation>
 <translation id="8669527147644353129">Google Chrome Helper</translation>
-<translation id="8677922833187616101">Kuva alati Google'i AI-režiimi otsetee</translation>
 <translation id="8679801911857917785">Lisaks juhib see Chrome'i käivitamisel kuvatavat lehte.</translation>
 <translation id="8712637175834984815">Selge</translation>
 <translation id="8712767363896337380">Peaaegu ajakohane! Värskendamise lõpuleviimiseks käivitage Chrome uuesti.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_eu.xtb b/chrome/app/resources/google_chrome_strings_eu.xtb
index 348e89f5f..81a6df9 100644
--- a/chrome/app/resources/google_chrome_strings_eu.xtb
+++ b/chrome/app/resources/google_chrome_strings_eu.xtb
@@ -152,7 +152,6 @@
 <translation id="2681444469812712297">Ireki <ph name="URL" /> Google Chrome-ko fitxa berri batean.</translation>
 <translation id="2699790011615497488">Ireki Chrome Beta-ko Gemini</translation>
 <translation id="2712141162840347885">Hautatu edozer, Google Lens-ekin bilatzeko. Google Lens-etik irteteko, sakatu Ihes.</translation>
-<translation id="2723860029395667894">Erakutsi beti Google-ren AA moduaren lasterbidea</translation>
 <translation id="2738871930057338499">Ezin da konektatu Internetera. HTTP 403 (debekatuta). Egiaztatu proxyaren konfigurazioa.</translation>
 <translation id="2742320827292110288">Abisua: Google Chrome-k ezin die eragotzi luzapenei zure arakatze-historia erregistratzea. Luzapena ezkutuko moduan desgaitzeko, desautatu aukera hau.</translation>
 <translation id="2753623023919742414">Sakatu bilatzeko</translation>
@@ -491,6 +490,7 @@
 <translation id="6417690341895039567">{COUNT,plural, =1{Erakundeak automatikoki itxiko du Chrome minutu batez erabiltzen ez bada. Arakatze-datuak ezabatuko dira. Arakatze-datuetan, historia, automatikoki betetako datuak eta deskargak daude.}other{Erakundeak automatikoki itxiko du Chrome # minutuz erabiltzen ez bada. Arakatze-datuak ezabatuko dira. Arakatze-datuetan, historia, automatikoki betetako datuak eta deskargak daude.}}</translation>
 <translation id="6418662306461808273">Lehendik dagoen Chrome-ko profilera aldatu nahi duzu?</translation>
 <translation id="6426623519983252346"><ph name="FEATURE_NAME" /> probatzeko eskatuko zaizu iOS-erako Chrome irekitzen duzun hurrengo aldian.</translation>
+<translation id="6434035853014503219">Eskerrik asko Chrome arakatzaile lehenetsi gisa aukeratzeagatik!</translation>
 <translation id="6473905796280459355">Joan "Chrome-ri buruz" orrira</translation>
 <translation id="6481963882741794338">Lotu Chrome eta Google-ren beste zerbitzuak pertsonalizaziorako eta bestelako helburuetarako</translation>
 <translation id="648319183876919572">Arakatze seguru hobetuak are gehiago babesten zaitu webgune eta deskarga arriskutsuen aurka</translation>
@@ -587,6 +587,7 @@
 <translation id="756809126120519699">Garbitu dira Chrome-ko datuak</translation>
 <translation id="7572537927358445944">Desaktibatuta • Chrome-k ezin du egiaztatu luzapena nondik datorren</translation>
 <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> zerbitzuaren instalatzailea</translation>
+<translation id="7596160425942761210">Chrome erabili ahalko duzu mezu, dokumentu eta aplikazioetako estekak sakatzen dituzunean</translation>
 <translation id="7602868996817972616">Galdetu Google-ri orri honi buruz</translation>
 <translation id="760353356052806707">Ordenagailuko beste programa batek Chrome-ren funtzionamenduari eragin diezaiokeen aplikazio bat gehitu du.
 
@@ -689,7 +690,6 @@
 <translation id="8647930742055103497">Mantendu dena Chrome-n</translation>
 <translation id="8656634243791296665">Ireki Chrome Dev-eko Gemini</translation>
 <translation id="8669527147644353129">Google Chrome laguntzailea</translation>
-<translation id="8677922833187616101">Erakutsi beti Google-ren AA moduaren lasterbidea</translation>
 <translation id="8679801911857917785">Chrome abiarazten duzunean erakusten den orria ere kontrolatzen du.</translation>
 <translation id="8712637175834984815">Ados</translation>
 <translation id="8712767363896337380">Ia amaitu dugu eguneratzen. Eguneratzen amaitzeko, exekutatu Chrome berriro.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fa.xtb b/chrome/app/resources/google_chrome_strings_fa.xtb
index ab8ed93..2eb172c3 100644
--- a/chrome/app/resources/google_chrome_strings_fa.xtb
+++ b/chrome/app/resources/google_chrome_strings_fa.xtb
@@ -148,7 +148,6 @@
 <translation id="2681444469812712297">‏‫<ph name="URL" /> در زبانه جدیدی در Google Chrome باز می‌شود.</translation>
 <translation id="2699790011615497488">‏باز کردن «Gemini در Chrome نسخه بتا»</translation>
 <translation id="2712141162840347885">‏هرچیزی را که می‌خواهید برای جستجو با «لنز Google» انتخاب کنید یا کلید «گریز» را فشار دهید تا از «لنز Google» خارج شوید</translation>
-<translation id="2723860029395667894">‏همیشه میان‌بر «حالت هوش مصنوعی Google» نشان داده شود</translation>
 <translation id="2738871930057338499">‏اتصال به اینترنت برقرار نشد. HTTP ۴۰۳ ممنوع است. لطفاً پیکربندی پروکسی‌تان را بررسی کنید.</translation>
 <translation id="2742320827292110288">‏اخطار: Google Chrome نمی تواند مانع از ثبت سابقه مرور شما توسط افزونه‌ها شود. برای غیرفعال کردن این افزونه در «حالت ناشناس»، این گزینه را لغو انتخاب کنید.</translation>
 <translation id="2753623023919742414">برای جستجو، کلیک کنید</translation>
@@ -683,7 +682,6 @@
 <translation id="8647930742055103497">‏همه‌چیز را در Chrome نگه دارید</translation>
 <translation id="8656634243791296665">‏باز کردن «Gemini در Chrome Dev»</translation>
 <translation id="8669527147644353129">‏راهنمای Google Chrome</translation>
-<translation id="8677922833187616101">‏همیشه میان‌بر «حالت هوش مصنوعی Google» نشان داده شود</translation>
 <translation id="8679801911857917785">‏این برنامه همچنین صفحه‌ای را که هنگام راه‌اندازی Chrome نشان داده می‌شود، کنترل می‌کند.</translation>
 <translation id="8712637175834984815">متوجه شدم</translation>
 <translation id="8712767363896337380">‏تقریباً به‌روزرسانی شده است! برای تکمیل به‌روزرسانی، Chrome را راه‌اندازی مجدد کنید.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fi.xtb b/chrome/app/resources/google_chrome_strings_fi.xtb
index a5fd4091..12000d54 100644
--- a/chrome/app/resources/google_chrome_strings_fi.xtb
+++ b/chrome/app/resources/google_chrome_strings_fi.xtb
@@ -148,7 +148,6 @@
 <translation id="2681444469812712297">Avaa <ph name="URL" /> Google Chromessa uudella välilehdellä.</translation>
 <translation id="2699790011615497488">Avaa Gemini in Chrome Beta</translation>
 <translation id="2712141162840347885">Valitse, mitä haluat hakea Google Lensilla, tai poistu Google Lensista painamalla Escape</translation>
-<translation id="2723860029395667894">Näytä aina Googlen tekoälytilan pikakuvake</translation>
 <translation id="2738871930057338499">Internetyhteyden muodostaminen ei onnistu. HTTP 403 (kielletty). Tarkista välityspalvelimen asetukset.</translation>
 <translation id="2742320827292110288">Varoitus: Google Chrome ei voi estää laajennuksia tallentamasta selaushistoriaasi. Voit poistaa tämän laajennuksen käytöstä incognito-tilassa poistamalla tämän valinnan.</translation>
 <translation id="2753623023919742414">Hae klikkaamalla</translation>
@@ -684,7 +683,6 @@
 <translation id="8647930742055103497">Pidä kaikki Chromessa</translation>
 <translation id="8656634243791296665">Avaa Gemini in Chrome Dev</translation>
 <translation id="8669527147644353129">Google Chrome Helper</translation>
-<translation id="8677922833187616101">Näytä aina Googlen tekoälytilan pikakuvake</translation>
 <translation id="8679801911857917785">Määrittää myös Chromen aloitussivun.</translation>
 <translation id="8712637175834984815">Ymmärretty</translation>
 <translation id="8712767363896337380">Melkein ajan tasalla. Viimeistele päivitys käynnistämällä Chrome uudelleen.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fil.xtb b/chrome/app/resources/google_chrome_strings_fil.xtb
index 499ffeaf..fd50533 100644
--- a/chrome/app/resources/google_chrome_strings_fil.xtb
+++ b/chrome/app/resources/google_chrome_strings_fil.xtb
@@ -152,9 +152,9 @@
 <translation id="2681444469812712297">Buksan ang <ph name="URL" /> sa bagong tab sa Google Chrome.</translation>
 <translation id="2699790011615497488">Buksan ang Gemini sa Chrome Beta</translation>
 <translation id="2712141162840347885">Pumili ng kahit anong bagay na hahanapin gamit ang Google Lens o pindutin ang escape para lumabas sa Google Lens</translation>
-<translation id="2723860029395667894">Palaging ipakita ang shortcut ng Google AI Mode</translation>
 <translation id="2738871930057338499">Hindi makakonekta sa Internet. HTTP 403 Forbidden. Tingnan ang configuration ng iyong proxy.</translation>
 <translation id="2742320827292110288">Babala: Hindi mapipigilan ng Google Chrome ang pagtatala ng mga extension ng iyong history ng pag-browse. Upang i-disable ang extension na ito sa Incognito mode, alisin sa pagkakapili ang opsyong ito.</translation>
+<translation id="2747021967398957654">{count,plural, =1{Hindi pa nase-save sa Google Account mo ang ilan sa iyong data sa Chrome. Subukang maghintay nang ilang minuto bago mag-sign out. Kung magsa-sign out ka ngayon, made-delete ang data na ito (1 item).}one{Hindi pa nase-save sa Google Account mo ang ilan sa iyong data sa Chrome. Subukang maghintay nang ilang minuto bago mag-sign out. Kung magsa-sign out ka ngayon, made-delete ang data na ito ({count} item).}other{Hindi pa nase-save sa Google Account mo ang ilan sa iyong data sa Chrome. Subukang maghintay nang ilang minuto bago mag-sign out. Kung magsa-sign out ka ngayon, made-delete ang data na ito ({count} na item).}}</translation>
 <translation id="2753623023919742414">I-click para maghanap</translation>
 <translation id="2757826245013442432">{COUNT,plural, =0{Nire-require ng Advanced na Proteksyon na ilunsad mo ulit ang Chrome para ma-apply ang isang update}=1{Nire-require ng Advanced na Proteksyon na ilunsad mo ulit ang Chrome para ma-apply ang isang update. Hindi magbubukas ulit ang iyong Incognito window.}one{Nire-require ng Advanced na Proteksyon na ilunsad mo ulit ang Chrome para ma-apply ang isang update. Hindi magbubukas ulit ang iyong # Incognito window.}other{Nire-require ng Advanced na Proteksyon na ilunsad mo ulit ang Chrome para ma-apply ang isang update. Hindi magbubukas ulit ang iyong # na Incognito window.}}</translation>
 <translation id="2765403129283291972">Kailangan ng Chrome ng pahintulot na i-access ang iyong mikropono para sa site na ito</translation>
@@ -514,6 +514,7 @@
 <translation id="6676384891291319759">I-access ang Internet</translation>
 <translation id="6679975945624592337">Hayaang Tumakbo sa Background ang Google Chrome</translation>
 <translation id="6696915334902295848">Kailangan ng Chrome ng pahintulot sa mikropono para sa site na ito</translation>
+<translation id="6706525880530967390">{count,plural, =1{Kailangang i-verify ng Chrome na ikaw ito bago ma-save ang ilang data sa iyong Google Account at magamit ito sa lahat ng device mo. Kung magsa-sign out ka ngayon, made-delete ang data na ito (1 item).}one{Kailangang i-verify ng Chrome na ikaw ito bago ma-save ang ilang data sa iyong Google Account at magamit ito sa lahat ng device mo. Kung magsa-sign out ka ngayon, made-delete ang data na ito ({count} item).}other{Kailangang i-verify ng Chrome na ikaw ito bago ma-save ang ilang data sa iyong Google Account at magamit ito sa lahat ng device mo. Kung magsa-sign out ka ngayon, made-delete ang data na ito ({count} na item).}}</translation>
 <translation id="6712881677154121168">Error sa pag-download: <ph name="DOWNLOAD_ERROR" />.</translation>
 <translation id="6718739135284199302">Gawing mas mabilis ang Chrome</translation>
 <translation id="6734827584173583205">Hindi mo ito binisita kamakailan. Inalis ng Chrome ang <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, at <ph name="COUNT" /> pa.</translation>
@@ -692,7 +693,6 @@
 <translation id="8647930742055103497">Panatilihin ang lahat sa Chrome</translation>
 <translation id="8656634243791296665">Buksan ang Gemini sa Chrome Dev</translation>
 <translation id="8669527147644353129">Google Chrome Helper</translation>
-<translation id="8677922833187616101">Palaging Ipakita ang Shortcut ng Google AI Mode</translation>
 <translation id="8679801911857917785">Kinokontrol din nito kung anong pahina ang ipinapakita kapag sinimulan mo ang Chrome.</translation>
 <translation id="8712637175834984815">Nakuha ko</translation>
 <translation id="8712767363896337380">Malapit nang ma-update! Muling ilunsad ang Chrome para matapos ang pag-update.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fr-CA.xtb b/chrome/app/resources/google_chrome_strings_fr-CA.xtb
index 9a02031..9c94853 100644
--- a/chrome/app/resources/google_chrome_strings_fr-CA.xtb
+++ b/chrome/app/resources/google_chrome_strings_fr-CA.xtb
@@ -152,9 +152,9 @@
 <translation id="2681444469812712297">Ouvrez l'URL <ph name="URL" /> dans un nouvel onglet dans Google Chrome.</translation>
 <translation id="2699790011615497488">Ouvrir Gemini dans la version bêta de Chrome</translation>
 <translation id="2712141162840347885">Sélectionnez n'importe quel élément pour effectuer une recherche avec Lentille Google ou appuyez sur Échap. pour quitter Lentille Google</translation>
-<translation id="2723860029395667894">Toujours afficher le raccourci du mode IA de Google</translation>
 <translation id="2738871930057338499">Impossible de se connecter à Internet. HTTP 403 Forbidden. Veuillez vérifier la configuration de votre mandataire.</translation>
 <translation id="2742320827292110288">Avertissement : Google Chrome ne peut pas empêcher les extensions d'enregistrer votre historique de navigation. Pour désactiver cette extension en mode de navigation privée, désélectionnez cette option.</translation>
+<translation id="2747021967398957654">{count,plural, =1{Certaines de vos données Chrome n'ont pas encore été enregistrées dans votre compte Google. Essayez d'attendre quelques minutes avant de vous déconnecter. Si vous vous déconnectez maintenant, ces données (1 élément) seront supprimées.}one{Certaines de vos données Chrome n'ont pas encore été enregistrées dans votre compte Google. Essayez d'attendre quelques minutes avant de vous déconnecter. Si vous vous déconnectez maintenant, ces données ({count} élément) seront supprimées.}other{Certaines de vos données Chrome n'ont pas encore été enregistrées dans votre compte Google. Essayez d'attendre quelques minutes avant de vous déconnecter. Si vous vous déconnectez maintenant, ces données ({count} éléments) seront supprimées.}}</translation>
 <translation id="2753623023919742414">Cliquer pour rechercher</translation>
 <translation id="2757826245013442432">{COUNT,plural, =0{La protection avancée nécessite que vous relanciez Chrome pour appliquer une mise à jour}=1{La protection avancée nécessite que vous relanciez Chrome pour appliquer une mise à jour. Votre fenêtre de navigation privée ne sera pas rouverte.}one{La protection avancée nécessite que vous relanciez Chrome pour appliquer une mise à jour. # fenêtre de navigation privée ne sera pas rouverte.}other{La protection avancée nécessite que vous relanciez Chrome pour appliquer une mise à jour. Vos # fenêtres de navigation privée ne seront pas rouvertes.}}</translation>
 <translation id="2765403129283291972">Chrome a besoin de votre autorisation pour accéder à votre appareil photo pour ce site</translation>
@@ -512,6 +512,7 @@
 <translation id="6676384891291319759">Accéder à Internet</translation>
 <translation id="6679975945624592337">Laisser Google Chrome s'exécuter en arrière-plan</translation>
 <translation id="6696915334902295848">Chrome requiert l'autorisation d'accéder au microphone pour ce site</translation>
+<translation id="6706525880530967390">{count,plural, =1{Chrome doit vérifier votre identité avant que certaines données puissent être enregistrées dans votre compte Google et utilisées sur tous vos appareils. Si vous vous déconnectez maintenant, ces données (1 élément) seront supprimées.}one{Chrome doit vérifier votre identité avant que certaines données puissent être enregistrées dans votre compte Google et utilisées sur tous vos appareils. Si vous vous déconnectez maintenant, ces données ({count} élément) seront supprimées.}other{Chrome doit vérifier votre identité avant que certaines données puissent être enregistrées dans votre compte Google et utilisées sur tous vos appareils. Si vous vous déconnectez maintenant, ces données ({count} éléments) seront supprimées.}}</translation>
 <translation id="6712881677154121168">Erreur de téléchargement : <ph name="DOWNLOAD_ERROR" />.</translation>
 <translation id="6718739135284199302">Rendre Chrome plus rapide</translation>
 <translation id="6734827584173583205">Vous n'avez pas effectué de visite récemment. Chrome a retiré <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> et <ph name="COUNT" /> autres.</translation>
@@ -690,7 +691,6 @@
 <translation id="8647930742055103497">Tout conserver dans Chrome</translation>
 <translation id="8656634243791296665">Ouvrir Gemini dans Chrome pour les développeurs</translation>
 <translation id="8669527147644353129">Application d'aide de Google Chrome</translation>
-<translation id="8677922833187616101">Toujours afficher le raccourci du mode IA de Google</translation>
 <translation id="8679801911857917785">Elle contrôle également la page qui s'affiche au démarrage de Chrome.</translation>
 <translation id="8712637175834984815">OK</translation>
 <translation id="8712767363896337380">La mise à jour est presque terminée! Redémarrez Chrome pour terminer la mise à jour.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fr.xtb b/chrome/app/resources/google_chrome_strings_fr.xtb
index 37acb82c..a3c5bb6 100644
--- a/chrome/app/resources/google_chrome_strings_fr.xtb
+++ b/chrome/app/resources/google_chrome_strings_fr.xtb
@@ -151,7 +151,6 @@
 <translation id="2681444469812712297">Ouvrir <ph name="URL" /> dans un nouvel onglet dans Google Chrome.</translation>
 <translation id="2699790011615497488">Ouvrir Gemini dans Chrome Beta</translation>
 <translation id="2712141162840347885">Sélectionnez quelque chose à rechercher avec Google Lens ou appuyez sur Échap pour quitter Google Lens</translation>
-<translation id="2723860029395667894">Toujours afficher le raccourci vers le Mode IA de Google</translation>
 <translation id="2738871930057338499">Impossible de se connecter à Internet : erreur HTTP 403 (accès interdit). Veuillez vérifier la configuration de votre proxy.</translation>
 <translation id="2742320827292110288">Avertissement : Google Chrome ne peut pas empêcher les extensions d'enregistrer l'historique de votre navigation. Pour désactiver cette extension en mode navigation privée, désélectionnez cette option.</translation>
 <translation id="2753623023919742414">Cliquer pour rechercher</translation>
@@ -691,7 +690,6 @@
 <translation id="8647930742055103497">Conservez tout dans Chrome</translation>
 <translation id="8656634243791296665">Ouvrir Gemini dans Chrome Dev</translation>
 <translation id="8669527147644353129">Application d'aide de Google Chrome</translation>
-<translation id="8677922833187616101">Toujours afficher le raccourci vers le Mode IA de Google</translation>
 <translation id="8679801911857917785">Elle contrôle également la page qui s'affiche au démarrage de Chrome.</translation>
 <translation id="8712637175834984815">OK</translation>
 <translation id="8712767363896337380">Presque à jour ! Relancez Chrome pour terminer la mise à jour.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_gl.xtb b/chrome/app/resources/google_chrome_strings_gl.xtb
index e819898..e5d6b60 100644
--- a/chrome/app/resources/google_chrome_strings_gl.xtb
+++ b/chrome/app/resources/google_chrome_strings_gl.xtb
@@ -152,7 +152,6 @@
 <translation id="2681444469812712297">Abre <ph name="URL" /> nunha nova pestana de Google Chrome.</translation>
 <translation id="2699790011615497488">Abrir Gemini en Chrome Beta</translation>
 <translation id="2712141162840347885">Selecciona o que queiras buscar con Google Lens ou preme Escape para saír da función</translation>
-<translation id="2723860029395667894">Mostrar sempre o atallo do modo IA de Google</translation>
 <translation id="2738871930057338499">Non se puido establecer conexión con Internet. Erro: HTTP 403 Forbidden (acceso non permitido). Revisa a configuración do proxy.</translation>
 <translation id="2742320827292110288">Advertencia: Google Chrome non pode evitar que as extensións rexistren o teu historial de navegación. Para desactivar esta extensión no modo de incógnito, anula a selección da caixa correspondente a esta opción.</translation>
 <translation id="2753623023919742414">Fai clic nun obxecto para buscalo</translation>
@@ -692,7 +691,6 @@
 <translation id="8647930742055103497">Garda todo en Chrome</translation>
 <translation id="8656634243791296665">Abrir Gemini en Chrome Dev</translation>
 <translation id="8669527147644353129">Axudante de Google Chrome</translation>
-<translation id="8677922833187616101">Mostrar sempre o atallo do modo IA de Google</translation>
 <translation id="8679801911857917785">Tamén controla a páxina que se mostra ao iniciar Chrome.</translation>
 <translation id="8712637175834984815">De acordo</translation>
 <translation id="8712767363896337380">A actualización está a piques de rematar. Para que finalice, reinicia Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_gu.xtb b/chrome/app/resources/google_chrome_strings_gu.xtb
index e4bdad4b..0340711 100644
--- a/chrome/app/resources/google_chrome_strings_gu.xtb
+++ b/chrome/app/resources/google_chrome_strings_gu.xtb
@@ -151,9 +151,9 @@
 <translation id="2681444469812712297">Google Chromeમાં નવા ટૅબમાં <ph name="URL" /> ખોલો.</translation>
 <translation id="2699790011615497488">Chrome બીટામાં Gemini ખોલો</translation>
 <translation id="2712141162840347885">Google Lens વડે શોધવા માટે કંઈપણ પસંદ કરો અથવા Google Lensમાંથી બહાર નીકળવા માટે Esc કી દબાવો</translation>
-<translation id="2723860029395667894">હંમેશાં Google AI મોડનો શૉર્ટકટ બતાવો</translation>
 <translation id="2738871930057338499">ઇન્ટરનેટ સાથે કનેક્ટ કરી શકતા નથી. HTTP 403 પ્રતિબંધિત. કૃપા કરીને તમારું પ્રૉક્સી કન્ફિગ્યુરેશન ચેક કરો.</translation>
 <translation id="2742320827292110288">ચેતવણી: Google Chrome તમારો બ્રાઉઝિંગ ઇતિહાસ રેકોર્ડ કરવાથી એક્સ્ટેન્શનને અટકાવી શકતું નથી. છૂપા મોડમાં આ એક્સ્ટેન્શનને બંધ કરવા માટે, આ વિકલ્પની પસંદગીને નાપસંદ કરો.</translation>
+<translation id="2747021967398957654">{count,plural, =1{Chromeનો તમારો કેટલોક ડેટા હજી સુધી તમારા Google એકાઉન્ટમાં સાચવવામાં આવ્યો નથી. સાઇન આઉટ કરતા પહેલાં થોડી મિનિટ રાહ જોવાનો પ્રયાસ કરી જુઓ. જો તમે હમણાં જ સાઇન આઉટ કરશો, તો આ ડેટા (1 આઇટમ) ડિલીટ કરવામાં આવશે.}one{Chromeનો તમારો કેટલોક ડેટા હજી સુધી તમારા Google એકાઉન્ટમાં સાચવવામાં આવ્યો નથી. સાઇન આઉટ કરતા પહેલાં થોડી મિનિટ રાહ જોવાનો પ્રયાસ કરી જુઓ. જો તમે હમણાં જ સાઇન આઉટ કરશો, તો આ ડેટા ({count} આઇટમ) ડિલીટ કરવામાં આવશે.}other{Chromeનો તમારો કેટલોક ડેટા હજી સુધી તમારા Google એકાઉન્ટમાં સાચવવામાં આવ્યો નથી. સાઇન આઉટ કરતા પહેલાં થોડી મિનિટ રાહ જોવાનો પ્રયાસ કરી જુઓ. જો તમે હમણાં જ સાઇન આઉટ કરશો, તો આ ડેટા ({count} આઇટમ) ડિલીટ કરવામાં આવશે.}}</translation>
 <translation id="2753623023919742414">શોધવા માટે ક્લિક કરો</translation>
 <translation id="2757826245013442432">{COUNT,plural, =0{અપડેટ લાગુ કરવા માટે, અદ્યતન સુરક્ષા માટે જરૂરી છે કે તમે Chrome ફરીથી લૉન્ચ કરો}=1{અપડેટ લાગુ કરવા માટે, અદ્યતન સુરક્ષા માટે જરૂરી છે કે તમે Chrome ફરીથી લૉન્ચ કરો. તમારી છૂપી વિન્ડો ફરીથી ખૂલશે નહીં.}one{અપડેટ લાગુ કરવા માટે, અદ્યતન સુરક્ષા માટે જરૂરી છે કે તમે Chrome ફરીથી લૉન્ચ કરો. તમારી # છૂપી વિન્ડો ફરીથી ખૂલશે નહીં.}other{અપડેટ લાગુ કરવા માટે, અદ્યતન સુરક્ષા માટે જરૂરી છે કે તમે Chrome ફરીથી લૉન્ચ કરો. તમારી # છૂપી વિન્ડો ફરીથી ખૂલશે નહીં.}}</translation>
 <translation id="2765403129283291972">Chromeને આ સાઇટ માટે તમારા માઇક્રોફોનના ઍક્સેસની પરવાનગીની જરૂર પડે છે</translation>
@@ -513,6 +513,7 @@
 <translation id="6676384891291319759">ઇંટરનેટ ઍક્સેસ કરો</translation>
 <translation id="6679975945624592337">Google Chromeને બૅકગ્રાઉન્ડમાં ચાલવા દો</translation>
 <translation id="6696915334902295848">આ સાઇટ માટે Chromeને માઇક્રોફોનની પરવાનગીની જરૂર છે</translation>
+<translation id="6706525880530967390">{count,plural, =1{તમારા Google એકાઉન્ટમાં કેટલોક ડેટા સાચવી શકાય અને તમારા બધા ડિવાઇસ પર તેનો ઉપયોગ કરી શકાય તે પહેલાં, Chrome માટે એ તમે જ છો તેની ચકાસણી કરવી જરૂરી છે. જો તમે હમણાં જ સાઇન આઉટ કરશો, તો આ ડેટા (1 આઇટમ) ડિલીટ કરવામાં આવશે.}one{તમારા Google એકાઉન્ટમાં કેટલોક ડેટા સાચવી શકાય અને તમારા બધા ડિવાઇસ પર તેનો ઉપયોગ કરી શકાય તે પહેલાં, Chrome માટે એ તમે જ છો તેની ચકાસણી કરવી જરૂરી છે. જો તમે હમણાં જ સાઇન આઉટ કરશો, તો આ ડેટા ({count} આઇટમ) ડિલીટ કરવામાં આવશે.}other{તમારા Google એકાઉન્ટમાં કેટલોક ડેટા સાચવી શકાય અને તમારા બધા ડિવાઇસ પર તેનો ઉપયોગ કરી શકાય તે પહેલાં, Chrome માટે એ તમે જ છો તેની ચકાસણી કરવી જરૂરી છે. જો તમે હમણાં જ સાઇન આઉટ કરશો, તો આ ડેટા ({count} આઇટમ) ડિલીટ કરવામાં આવશે.}}</translation>
 <translation id="6712881677154121168">ડાઉનલોડ કરવામાં ભૂલ: <ph name="DOWNLOAD_ERROR" />.</translation>
 <translation id="6718739135284199302">Chromeને વધુ ઝડપી બનાવો</translation>
 <translation id="6734827584173583205">તમે તાજેતરમાં આ સાઇટની મુલાકાત લીધી નથી. Chrome દ્વારા <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />ની અને વધુ <ph name="COUNT" /> પરવાનગી કાઢી નાખવામાં આવી.</translation>
@@ -691,7 +692,6 @@
 <translation id="8647930742055103497">Chromeમાં બધું જ રાખો</translation>
 <translation id="8656634243791296665">Chrome Devમાં Gemini ખોલો</translation>
 <translation id="8669527147644353129">Google Chrome સહાયક</translation>
-<translation id="8677922833187616101">હંમેશાં Google AI મોડનો શૉર્ટકટ બતાવો</translation>
 <translation id="8679801911857917785">જ્યારે તમે Chrome શરૂ કરો ત્યારે કયું પેજ બતાવવામાં આવે તે તેનું પણ નિયંત્રણ કરે છે.</translation>
 <translation id="8712637175834984815">સમજાઈ ગયું</translation>
 <translation id="8712767363896337380">લગભગ અપ ટૂ ડેટ છે! અપડેટ કરવાનું સમાપ્ત કરવા માટે, Chrome ફરીથી લૉન્ચ કરો.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hi.xtb b/chrome/app/resources/google_chrome_strings_hi.xtb
index 43b6fd3..05d942e7 100644
--- a/chrome/app/resources/google_chrome_strings_hi.xtb
+++ b/chrome/app/resources/google_chrome_strings_hi.xtb
@@ -148,9 +148,9 @@
 <translation id="2681444469812712297"><ph name="URL" /> को Google Chrome के नए टैब में खोलें.</translation>
 <translation id="2699790011615497488">Chrome बीटा में Gemini खोलें</translation>
 <translation id="2712141162840347885">Google Lens की मदद से जानकारी खोजने के लिए, कोई भी एलिमेंट चुनें. Google Lens को बंद करने के लिए Escape दबाएं</translation>
-<translation id="2723860029395667894">Google के एआई मोड का शॉर्टकट हमेशा दिखाएं</translation>
 <translation id="2738871930057338499">इंटरनेट से कनेक्ट नहीं किया जा सका. एचटीटीपी 403 फॉरबिडन रिस्पॉन्स दिख रहा है. कृपया अपने प्रॉक्सी कॉन्फ़िगरेशन की जांच करें.</translation>
 <translation id="2742320827292110288">चेतावनी: Google Chrome, एक्सटेंशन को आपका ब्राउज़िंग इतिहास रिकॉर्ड करने से नहीं रोक सकता. गुप्त मोड में इस एक्सटेंशन को बंद करने के लिए, इस विकल्प से चुने हुए का निशान हटाएं.</translation>
+<translation id="2747021967398957654">{count,plural, =1{आपके Chrome का कुछ डेटा, अब तक आपके Google खाते में सेव नहीं किया गया. साइन आउट करने से पहले, कुछ मिनट इंतज़ार करें. अभी साइन आउट करने पर यह डेटा (1 आइटम) मिट जाएगा.}one{आपके Chrome का कुछ डेटा, अब तक आपके Google खाते में सेव नहीं किया गया. साइन आउट करने से पहले, कुछ मिनट इंतज़ार करें. अभी साइन आउट करने पर यह डेटा ({count} आइटम) मिट जाएगा.}other{आपके Chrome का कुछ डेटा, अब तक आपके Google खाते में सेव नहीं किया गया. साइन आउट करने से पहले, कुछ मिनट इंतज़ार करें. अभी साइन आउट करने पर यह डेटा ({count} आइटम) मिट जाएगा.}}</translation>
 <translation id="2753623023919742414">खोजने के लिए क्लिक करें</translation>
 <translation id="2757826245013442432">{COUNT,plural, =0{ऐडवांस सुरक्षा के तहत, अपडेट लागू करने के लिए आपको Chrome को फिर से लॉन्च करना होगा}=1{ऐडवांस सुरक्षा के तहत, अपडेट लागू करने के लिए आपको Chrome को फिर से लॉन्च करना होगा. आपकी गुप्त विंडो दोबारा नहीं खुलेगी.}one{ऐडवांस सुरक्षा के तहत, अपडेट लागू करने के लिए आपको Chrome को फिर से लॉन्च करना होगा. आपकी # गुप्त विंडो दोबारा नहीं खुलेगी.}other{ऐडवांस सुरक्षा के तहत, अपडेट लागू करने के लिए आपको Chrome को फिर से लॉन्च करना होगा. आपकी # गुप्त विंडो दोबारा नहीं खुलेंगी.}}</translation>
 <translation id="2765403129283291972">Chrome को इस साइट के लिए आपका माइक्रोफ़ोन एक्सेस करने की अनुमति चाहिए</translation>
@@ -509,6 +509,7 @@
 <translation id="6676384891291319759">इंटरनेट एक्सेस करें</translation>
 <translation id="6679975945624592337">Google Chrome को बैकग्राउंड में चलने दें</translation>
 <translation id="6696915334902295848">Chrome को इस साइट के लिए, माइक्रोफ़ोन ऐक्सेस करने की अनुमति चाहिए</translation>
+<translation id="6706525880530967390">{count,plural, =1{आपके Google खाते में डेटा सेव करने और सभी डिवाइसों पर उसका इस्तेमाल करने से पहले, Chrome को आपकी पहचान की पुष्टि करनी होगी. अभी साइन आउट करने पर यह डेटा (1 आइटम) मिट जाएगा.}one{आपके Google खाते में डेटा सेव करने और सभी डिवाइसों पर उसका इस्तेमाल करने से पहले, Chrome को आपकी पहचान की पुष्टि करनी होगी. अभी साइन आउट करने पर यह डेटा ({count} आइटम) मिट जाएगा.}other{आपके Google खाते में डेटा सेव करने और सभी डिवाइसों पर उसका इस्तेमाल करने से पहले, Chrome को आपकी पहचान की पुष्टि करनी होगी. अभी साइन आउट करने पर यह डेटा ({count} आइटम) मिट जाएगा.}}</translation>
 <translation id="6712881677154121168">डाउनलोड करने में गड़बड़ी: <ph name="DOWNLOAD_ERROR" />.</translation>
 <translation id="6718739135284199302">Chrome को ज़्यादा तेज़ बनाएं</translation>
 <translation id="6734827584173583205">आपने हाल ही में इस वेबसाइट का इस्तेमाल नहीं किया है. Chrome ने <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, और <ph name="COUNT" /> अन्य अनुमतियां हटा दी हैं.</translation>
@@ -687,7 +688,6 @@
 <translation id="8647930742055103497">Chrome में सब कुछ सेव रखें</translation>
 <translation id="8656634243791296665">Chrome Dev में Gemini खोलें</translation>
 <translation id="8669527147644353129">Google Chrome सहायक</translation>
-<translation id="8677922833187616101">Google के एआई मोड का शॉर्टकट हमेशा दिखाएं</translation>
 <translation id="8679801911857917785">इससे यह भी नियंत्रित होता है कि जब आप Chrome प्रारंभ करते हैं तब कौन सा पेज दिखाया जाए.</translation>
 <translation id="8712637175834984815">समझ लिया</translation>
 <translation id="8712767363896337380">अपडेट होने ही वाला है! अपडेट पूरा करने के लिए, Chrome को फिर से लॉन्च करें.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hr.xtb b/chrome/app/resources/google_chrome_strings_hr.xtb
index 5892fd68..a19ac891 100644
--- a/chrome/app/resources/google_chrome_strings_hr.xtb
+++ b/chrome/app/resources/google_chrome_strings_hr.xtb
@@ -148,7 +148,6 @@
 <translation id="2681444469812712297">Otvorite <ph name="URL" /> u novoj kartici u Google Chromeu.</translation>
 <translation id="2699790011615497488">Otvorite Gemini u verziji preglednika Chrome Beta</translation>
 <translation id="2712141162840347885">Odaberite bilo što za pretraživanje pomoću Google objektiva ili pritisnite Escape da biste zatvorili Google objektiv</translation>
-<translation id="2723860029395667894">Uvijek prikaži prečac za Googleov AI način</translation>
 <translation id="2738871930057338499">Povezivanje s internetom nije moguće. HTTP 403 Zabranjeno je. Provjerite konfiguraciju proxyja.</translation>
 <translation id="2742320827292110288">Upozorenje: Google Chrome ne može onemogućiti proširenjima da bilježe vašu povijest pregledavanja. Da biste onemogućili to proširenje u anonimnom načinu, poništite odabir te opcije.</translation>
 <translation id="2753623023919742414">Kliknite za pretraživanje</translation>
@@ -684,7 +683,6 @@
 <translation id="8647930742055103497">Zadržite sve u Chromeu</translation>
 <translation id="8656634243791296665">Otvorite Gemini u verziji preglednika Chrome Dev</translation>
 <translation id="8669527147644353129">Google Chrome Helper</translation>
-<translation id="8677922833187616101">Uvijek prikaži prečac za Googleov AI način</translation>
 <translation id="8679801911857917785">Upravlja i time koja se stranica prikazuje prilikom pokretanja Chromea.</translation>
 <translation id="8712637175834984815">Shvaćam</translation>
 <translation id="8712767363896337380">Ažuriranje je skoro gotovo! Ponovo pokrenite Chrome da biste završili ažuriranje.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hu.xtb b/chrome/app/resources/google_chrome_strings_hu.xtb
index 2ff90e0..8155b3f 100644
--- a/chrome/app/resources/google_chrome_strings_hu.xtb
+++ b/chrome/app/resources/google_chrome_strings_hu.xtb
@@ -148,7 +148,6 @@
 <translation id="2681444469812712297">A(z) <ph name="URL" /> megnyitása új Google Chrome-lapon.</translation>
 <translation id="2699790011615497488">A Gemini megnyitása a Chrome Bétában</translation>
 <translation id="2712141162840347885">Válasszon ki bármit a Google Lens segítségével való kereséshez, vagy nyomja meg az Esc billentyűt a Google Lensből való kilépéshez</translation>
-<translation id="2723860029395667894">A Google AI-mód gyorsparancsa mindig jelenjen meg</translation>
 <translation id="2738871930057338499">Nem lehet csatlakozni az internethez. HTTP 403 tiltás. Ellenőrizze a proxybeállításokat.</translation>
 <translation id="2742320827292110288">Figyelmeztetés: A Google Chrome nem tudja megakadályozni, hogy a bővítmények rögzítsék a böngészési előzményeket. A bővítmény inkognitó módban való használatának letiltásához törölje e lehetőség bejelölését.</translation>
 <translation id="2753623023919742414">Kattintson a kereséshez</translation>
@@ -684,7 +683,6 @@
 <translation id="8647930742055103497">Mindent a Chrome-ban tarthat</translation>
 <translation id="8656634243791296665">A Gemini megnyitása a Chrome Devben</translation>
 <translation id="8669527147644353129">Google Chrome segéd</translation>
-<translation id="8677922833187616101">A Google AI-mód gyorsparancsa mindig jelenjen meg</translation>
 <translation id="8679801911857917785">Továbbá azt is szabályozza, hogy melyik oldal jelenik meg a Chrome indításakor.</translation>
 <translation id="8712637175834984815">Értem</translation>
 <translation id="8712767363896337380">Már majdnem naprakész! Indítsa újra a Chrome-ot a frissítés befejezéséhez.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hy.xtb b/chrome/app/resources/google_chrome_strings_hy.xtb
index e688949..dfcdeef 100644
--- a/chrome/app/resources/google_chrome_strings_hy.xtb
+++ b/chrome/app/resources/google_chrome_strings_hy.xtb
@@ -150,7 +150,6 @@
 <translation id="2681444469812712297">Բացել <ph name="URL" /> հղումը Google Chrome-ի նոր ներդիրում։</translation>
 <translation id="2699790011615497488">Բացել Gemini-ը Chrome Beta-ում</translation>
 <translation id="2712141162840347885">Ընտրեք ցանկացած բան՝ Google Տեսապակու միջոցով որոնելու համար, կամ սեղմեք Escape՝ Google Տեսապակին փակելու համար</translation>
-<translation id="2723860029395667894">Միշտ ցույց տալ Google-ի ԱԲ ռեժիմի դյուրանցումը</translation>
 <translation id="2738871930057338499">Հնարավոր չէ միանալ ինտերնետին։ HTTP 403 Forbidden։ Ստուգեք ձեր պրոքսի սերվերի կազմաձևը։</translation>
 <translation id="2742320827292110288">Ուշադրություն. Google Chrome-ը չի կարող արգելել ընդլայնումներին գրանցել ձեր այցելությունների պատմությունը։ Ընդլայնումն ինկոգնիտո ռեժիմում անջատելու համար ապանշեք այս պարամետրը։</translation>
 <translation id="2753623023919742414">Սեղմեք որոնելու համար</translation>
@@ -689,7 +688,6 @@
 <translation id="8647930742055103497">Պահեք ամեն ինչ Chrome-ում</translation>
 <translation id="8656634243791296665">Բացել Gemini-ը Chrome Dev-ում</translation>
 <translation id="8669527147644353129">Google Chrome Helper</translation>
-<translation id="8677922833187616101">Միշտ ցույց տալ Google-ի ԱԲ ռեժիմի դյուրանցումը</translation>
 <translation id="8679801911857917785">Այն նաև վերահսկում է Chrome-ի մեկնարկման ժամանակ ցուցադրվող էջը:</translation>
 <translation id="8712637175834984815">Պատրաստ է</translation>
 <translation id="8712767363896337380">Գրեթե պատրաստ է։ Վերագործարկեք Chrome-ը՝ թարմացումն ավարտելու համար։</translation>
diff --git a/chrome/app/resources/google_chrome_strings_id.xtb b/chrome/app/resources/google_chrome_strings_id.xtb
index 7c5dfb2..46d08da 100644
--- a/chrome/app/resources/google_chrome_strings_id.xtb
+++ b/chrome/app/resources/google_chrome_strings_id.xtb
@@ -148,7 +148,6 @@
 <translation id="2681444469812712297">Buka <ph name="URL" /> di tab baru di Google Chrome.</translation>
 <translation id="2699790011615497488">Buka Gemini di Chrome Beta</translation>
 <translation id="2712141162840347885">Pilih item untuk ditelusuri dengan Google Lens atau tekan escape untuk keluar dari Google Lens</translation>
-<translation id="2723860029395667894">Selalu tampilkan pintasan Mode AI Google</translation>
 <translation id="2738871930057338499">Tidak dapat terhubung ke internet. HTTP 403 Terlarang. Periksa konfigurasi proxy Anda.</translation>
 <translation id="2742320827292110288">Peringatan: Google Chrome tidak dapat mencegah ekstensi merekam histori penjelajahan Anda. Untuk menonaktifkan ekstensi ini dalam mode Samaran, batalkan pilihan opsi ini.</translation>
 <translation id="2753623023919742414">Klik untuk menelusuri</translation>
@@ -684,7 +683,6 @@
 <translation id="8647930742055103497">Simpan semuanya di Chrome</translation>
 <translation id="8656634243791296665">Buka Gemini di Chrome Dev</translation>
 <translation id="8669527147644353129">Pembantu Google Chrome</translation>
-<translation id="8677922833187616101">Selalu Tampilkan Pintasan Mode AI Google</translation>
 <translation id="8679801911857917785">Juga mengontrol halaman apa yang ditampilkan saat Anda memulai Chrome.</translation>
 <translation id="8712637175834984815">Mengerti</translation>
 <translation id="8712767363896337380">Update hampir selesai. Luncurkan kembali Chrome untuk menyelesaikan update.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_is.xtb b/chrome/app/resources/google_chrome_strings_is.xtb
index 7182ac1..b8356dfd 100644
--- a/chrome/app/resources/google_chrome_strings_is.xtb
+++ b/chrome/app/resources/google_chrome_strings_is.xtb
@@ -152,7 +152,6 @@
 <translation id="2681444469812712297">Opna <ph name="URL" /> í nýjum flipa í Google Chrome.</translation>
 <translation id="2699790011615497488">Opna Gemini í Chrome Beta</translation>
 <translation id="2712141162840347885">Veldu hvað sem er til að leita með Google-linsu eða ýttu á Esc til að loka Linsunni</translation>
-<translation id="2723860029395667894">Alltaf sýna flýtileið gervigreindarstillingar Google</translation>
 <translation id="2738871930057338499">Ekki er hægt að tengjast internetinu. HTTP 403 bannað. Kannaðu uppsetningu staðgengilsþjóna.</translation>
 <translation id="2742320827292110288">Viðvörun: Google Chrome getur ekki komið í veg fyrir að viðbætur skrái vafraferilinn þinn. Afturkallaðu þennan valkost til að gera þessa viðbót óvirka í huliðsstillingu.</translation>
 <translation id="2753623023919742414">Smelltu til að leita</translation>
@@ -221,7 +220,7 @@
 <translation id="3360895254066713204">Chrome hjálpari</translation>
 <translation id="3379938682270551431">{0,plural, =0{Chrome verður endurræst núna}=1{Chrome verður endurræst eftir 1 sekúndu}one{Chrome verður endurræst eftir # sekúndu}other{Chrome verður endurræst eftir # sekúndur}}</translation>
 <translation id="3396977131400919238">Stýrikerfisvilla kom upp við uppsetningu. Sæktu Google Chrome aftur.</translation>
-<translation id="3428747202529429621">Tryggir öryggi þitt í Chrome og kann að vera notað til að auka öryggi þitt í öðrum Google forritum þegar þú ert skráð(ur) inn</translation>
+<translation id="3428747202529429621">Tryggir öryggi þitt í Chrome og kann að vera notað til að auka öryggi þitt í öðrum Google-forritum þegar þú ert skráð(ur) inn</translation>
 <translation id="3434246496373299699">Chrome getur athugað aðgangsorðin þín þegar þú skráir þig inn með Google reikningnum þínum</translation>
 <translation id="3438681572027105609">Skráðu þig inn á Chromium til að fá aðgang að aðgangsorðum og fleiru í öllum tækjunum þínum</translation>
 <translation id="3450887623636316740">Þessi skrá kann að vera hættuleg<ph name="LINE_BREAK" />Chrome getur athugað niðurhalið fyrir þig ef þú gefur upp aðgangsorðið. Upplýsingar um skrána verða sendar í örugga vefskoðun Google en efni og aðgangsorð hennar verða eftir í tækinu þínu.</translation>
@@ -615,7 +614,7 @@
 <translation id="7761834446675418963">Smelltu á nafnið þitt til að opna Chrome og byrja að vafra.</translation>
 <translation id="7777080907402804672">Ef gagnlega lýsingu vantar við mynd reynir Chrome að útvega þér lýsingu. Til að búa til lýsingar eru myndir sendar til Google. Þú getur slökkt á þessu hvenær sem er í stillingunum.</translation>
 <translation id="778331955594035129">Chrome verður að fá staðsetningarheimild fyrir þetta vefsvæði</translation>
-<translation id="7787950393032327779">Annað Google Chrome ferli (<ph name="PROCESS_ID" />) virðist vera að nota þennan prófíl í annarri tölvu (<ph name="HOST_NAME" />). Chrome hefur læst prófílnum svo hann skemmist ekki. Ef þú ert viss um að engin önnur ferli séu að nota þennan prófíl geturðu tekið hann úr lás og endurræst Chrome.</translation>
+<translation id="7787950393032327779">Annað Google Chrome-ferli (<ph name="PROCESS_ID" />) virðist vera að nota þennan prófíl í annarri tölvu (<ph name="HOST_NAME" />). Chrome hefur læst prófílnum svo hann skemmist ekki. Ef þú ert viss um að engin önnur ferli séu að nota þennan prófíl geturðu tekið hann úr lás og endurræst Chrome.</translation>
 <translation id="7792336732117553384">&amp;Stjórna Chrome-prófílum</translation>
 <translation id="7801699035218095297">Google Chrome er að reyna að afrita aðgangsorð. Sláðu inn Windows-aðgangsorðið þitt til að leyfa það.</translation>
 <translation id="7804364787702057554">Reikningurinn þinn í Chrome</translation>
@@ -692,7 +691,6 @@
 <translation id="8647930742055103497">Hafðu allt í Chrome</translation>
 <translation id="8656634243791296665">Opna Gemini í Chrome Dev</translation>
 <translation id="8669527147644353129">Hjálparforrit Google Chrome</translation>
-<translation id="8677922833187616101">Alltaf sýna flýtileið gervigreindarstillingar Google</translation>
 <translation id="8679801911857917785">Þetta stýrir því einnig hvaða síða birtist þegar þú ræsir Chrome.</translation>
 <translation id="8712637175834984815">Ég skil</translation>
 <translation id="8712767363896337380">Næstum því uppfært! Endurræstu Chrome til að ljúka við uppfærsluna.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_it.xtb b/chrome/app/resources/google_chrome_strings_it.xtb
index 021b1fe5..26a96e86 100644
--- a/chrome/app/resources/google_chrome_strings_it.xtb
+++ b/chrome/app/resources/google_chrome_strings_it.xtb
@@ -148,7 +148,6 @@
 <translation id="2681444469812712297">Apri <ph name="URL" /> in una nuova scheda in Google Chrome.</translation>
 <translation id="2699790011615497488">Apri Gemini in Chrome Beta</translation>
 <translation id="2712141162840347885">Seleziona un elemento da cercare con Google Lens o premi Esc per uscire</translation>
-<translation id="2723860029395667894">Mostra sempre la scorciatoia di Google AI Mode</translation>
 <translation id="2738871930057338499">Impossibile connettersi a internet. HTTP 403 Accesso negato. Controlla la configurazione del proxy.</translation>
 <translation id="2742320827292110288">Avviso: Google Chrome non è in grado di impedire alle estensioni di registrare la tua cronologia di navigazione. Per disattivare questa estensione in modalità di navigazione in incognito, deseleziona questa opzione.</translation>
 <translation id="2753623023919742414">Fai clic per cercare</translation>
@@ -683,7 +682,6 @@
 <translation id="8647930742055103497">Tieni tutte le tue attività in Chrome</translation>
 <translation id="8656634243791296665">Apri Gemini in Chrome Dev</translation>
 <translation id="8669527147644353129">Supporto Google Chrome</translation>
-<translation id="8677922833187616101">Mostra sempre la scorciatoia di Google AI Mode</translation>
 <translation id="8679801911857917785">Controlla anche la pagina visualizzata all'avvio di Chrome.</translation>
 <translation id="8712637175834984815">Ok</translation>
 <translation id="8712767363896337380">Aggiornamento quasi terminato. Riavvia Chrome per terminare l'aggiornamento.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_iw.xtb b/chrome/app/resources/google_chrome_strings_iw.xtb
index 0a8d537..50abc6fa 100644
--- a/chrome/app/resources/google_chrome_strings_iw.xtb
+++ b/chrome/app/resources/google_chrome_strings_iw.xtb
@@ -148,9 +148,9 @@
 <translation id="2681444469812712297">‏פתיחה של <ph name="URL" /> בכרטיסייה חדשה ב-Google Chrome.</translation>
 <translation id="2699790011615497488">‏פתיחת Gemini ב-Chrome בטא</translation>
 <translation id="2712141162840347885">‏אפשר לבחור משהו לחיפוש באמצעות Google Lens או ללחוץ על Escape כדי לצאת מ-Google Lens</translation>
-<translation id="2723860029395667894">‏להציג תמיד את קיצור הדרך למצב AI של Google</translation>
 <translation id="2738871930057338499">‏לא ניתן להתחבר לאינטרנט. HTTP 403: קוד איסור. צריך לבדוק את ההגדרה של שרת ה-proxy.</translation>
 <translation id="2742320827292110288">‏אזהרה: Google Chrome לא יכול למנוע מתוספים לתעד את היסטוריית הגלישה שלך. כדי להשבית את התוסף הזה במצב אנונימי, יש לבטל את הבחירה באפשרות הזו.</translation>
+<translation id="2747021967398957654">{count,plural, =1{‏חלק מהנתונים ב-Chrome עדיין לא נשמרו בחשבון Google. כדאי לחכות כמה דקות לפני היציאה מהחשבון. אם תתבצע יציאה מהחשבון, הנתונים האלה יימחקו (פריט אחד).}one{‏חלק מהנתונים ב-Chrome עדיין לא נשמרו בחשבון שלך ב-Google. כדאי לחכות כמה דקות לפני היציאה מהחשבון. אם תתבצע יציאה מהחשבון, הנתונים האלה יימחקו ({count} פריטים).}two{‏חלק מהנתונים ב-Chrome עדיין לא נשמרו בחשבון Google. כדאי לחכות כמה דקות לפני היציאה מהחשבון. אם תתבצע יציאה מהחשבון, הנתונים האלה יימחקו ({count} פריטים).}other{‏חלק מהנתונים ב-Chrome עדיין לא נשמרו בחשבון Google. כדאי לחכות כמה דקות לפני היציאה מהחשבון. אם תתבצע יציאה מהחשבון, הנתונים האלה יימחקו ({count} פריטים).}}</translation>
 <translation id="2753623023919742414">צריך ללחוץ כדי לחפש</translation>
 <translation id="2757826245013442432">{COUNT,plural, =0{‏כדי שהעדכון ייכנס לתוקף, צריך להפעיל מחדש את Chrome במסגרת ההגנה המתקדמת}=1{‏כדי שהעדכון ייכנס לתוקף, צריך להפעיל מחדש את Chrome במסגרת ההגנה המתקדמת. החלון הפרטי לא ייפתח מחדש.}one{‏כדי שהעדכון ייכנס לתוקף, צריך להפעיל מחדש את Chrome במסגרת ההגנה המתקדמת. # החלונות הפרטיים לא ייפתחו מחדש.}two{‏כדי שהעדכון ייכנס לתוקף, צריך להפעיל מחדש את Chrome במסגרת ההגנה המתקדמת. # החלונות הפרטיים לא ייפתחו מחדש.}other{‏כדי שהעדכון ייכנס לתוקף, צריך להפעיל מחדש את Chrome במסגרת ההגנה המתקדמת. # החלונות הפרטיים לא ייפתחו מחדש.}}</translation>
 <translation id="2765403129283291972">‏Chrome זקוק להרשאת גישה למיקרופון בשביל האתר הזה</translation>
@@ -442,7 +442,7 @@
 <translation id="6025087594896450715">‏Google Chrome יופעל מחדש בעוד <ph name="REMAINING_TIME" /></translation>
 <translation id="6040143037577758943">סגירה</translation>
 <translation id="604424701295382420">‏התכונה הוצמדה. מעכשיו אפשר לגשת אל Google Lens דרך הכפתור החדש בסרגל הכלים</translation>
-<translation id="6046028983725193307">‏כדי לשתף את אודיו המערכת, צריך לפתוח את הגדרות המערכת ולבחור באפשרות "הקלטת אודיו המערכת בלבד" ב-Chrome. לאחר מכן צריך להפעיל מחדש את Chrome.</translation>
+<translation id="6046028983725193307">‏כדי לשתף אודיו מהמערכת, צריך לפתוח את הגדרות המערכת ולבחור באפשרות "הקלטת אודיו של המערכת בלבד" ל-Chrome. לאחר מכן צריך להפעיל מחדש את Chrome.</translation>
 <translation id="6069027071882229820">העתקה כתמונה</translation>
 <translation id="6070348360322141662">‏לשיפור האבטחה, Google Chrome יצפין את הנתונים</translation>
 <translation id="6075300983329039771">‏לפי דרישת הארגון שלך, <ph name="MANAGER" />, עליך להיכנס לחשבון ב-Chrome</translation>
@@ -506,6 +506,7 @@
 <translation id="6676384891291319759">גישה אל האינטרנט</translation>
 <translation id="6679975945624592337">‏Google Chrome יכול לפעול ברקע</translation>
 <translation id="6696915334902295848">‏נדרשת הרשאת גישה למיקרופון ב-Chrome עבור האתר הזה</translation>
+<translation id="6706525880530967390">{count,plural, =1{‏‫Chrome צריך לאמת את הזהות שלך לפני שאפשר יהיה לשמור חלק מהנתונים בחשבון Google ולהשתמש בהם בכל המכשירים שלך. אם תתבצע יציאה מהחשבון, הנתונים האלה יימחקו (פריט אחד).}one{‏‫Chrome צריך לאמת את הזהות שלך לפני שאפשר יהיה לשמור חלק מהנתונים בחשבון Google ולהשתמש בהם בכל המכשירים שלך. אם תתבצע יציאה מהחשבון, הנתונים האלה יימחקו ({count} פריטים).}two{‏‫Chrome צריך לאמת את הזהות שלך לפני שאפשר יהיה לשמור חלק מהנתונים בחשבון Google ולהשתמש בהם בכל המכשירים שלך. אם תתבצע יציאה מהחשבון, הנתונים האלה יימחקו ({count} פריטים).}other{‏‫Chrome צריך לאמת את הזהות שלך לפני שאפשר יהיה לשמור חלק מהנתונים בחשבון Google ולהשתמש בהם בכל המכשירים שלך. אם תתבצע יציאה מהחשבון, הנתונים האלה יימחקו ({count} פריטים).}}</translation>
 <translation id="6712881677154121168">שגיאה בהורדה: <ph name="DOWNLOAD_ERROR" />.</translation>
 <translation id="6718739135284199302">‏שיפור המהירות ב-Chrome</translation>
 <translation id="6734827584173583205">‏לא נכנסת לאתר הזה בזמן האחרון. ההרשאות "<ph name="PERMISSION_1" />", "<ph name="PERMISSION_2" />" ועוד <ph name="COUNT" /> הרשאות הוסרו על ידי Chrome</translation>
@@ -684,7 +685,6 @@
 <translation id="8647930742055103497">‏הכל נשאר ב-Chrome</translation>
 <translation id="8656634243791296665">‏פתיחת Gemini ב-Chrome פיתוח</translation>
 <translation id="8669527147644353129">Google Chrome Helper</translation>
-<translation id="8677922833187616101">‏להציג תמיד את קיצור הדרך למצב AI של Google</translation>
 <translation id="8679801911857917785">‏הגדרה זו גם קובעת איזה דף מוצג כשמפעילים את Chrome.</translation>
 <translation id="8712637175834984815">הבנתי</translation>
 <translation id="8712767363896337380">‏העדכון כמעט הושלם. כדי להשלים את העדכון, עליך להפעיל את Chrome מחדש.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ja.xtb b/chrome/app/resources/google_chrome_strings_ja.xtb
index a06ec64..4da66fa8 100644
--- a/chrome/app/resources/google_chrome_strings_ja.xtb
+++ b/chrome/app/resources/google_chrome_strings_ja.xtb
@@ -148,9 +148,9 @@
 <translation id="2681444469812712297">Google Chrome の新しいタブで <ph name="URL" /> を開きます。</translation>
 <translation id="2699790011615497488">Gemini in Chrome Beta を開く</translation>
 <translation id="2712141162840347885">Google レンズで検索する範囲を選択してください。Esc キーを押すと Google レンズを終了します</translation>
-<translation id="2723860029395667894">Google AI モードのショートカットを常に表示する</translation>
 <translation id="2738871930057338499">インターネットに接続できません。HTTP 403 アクセス不可エラーが発生しました。プロキシ設定をご確認ください。</translation>
 <translation id="2742320827292110288">警告: 拡張機能による閲覧履歴の記録を Google Chrome で停止することはできません。シークレット モードでこの拡張機能を無効にするには、このオプションの選択を解除してください。</translation>
+<translation id="2747021967398957654">{count,plural, =1{Chrome データの一部が Google アカウントにまだ保存されていません。数分待ってからログアウトしてください。今すぐログアウトすると、このデータ(1 個のアイテム)は削除されます。}other{Chrome データの一部が Google アカウントにまだ保存されていません。数分待ってからログアウトしてください。今すぐログアウトすると、このデータ({count} 個のアイテム)は削除されます。}}</translation>
 <translation id="2753623023919742414">クリックして検索</translation>
 <translation id="2757826245013442432">{COUNT,plural, =0{高度な保護機能を使用している場合は、アップデートを適用するために Chrome を再起動する必要があります}=1{高度な保護機能を使用している場合は、アップデートを適用するために Chrome を再起動する必要があります。シークレット ウィンドウは、再起動後は自動的には開きません。}other{高度な保護機能を使用している場合は、アップデートを適用するために Chrome を再起動する必要があります。現在開いている # 個のシークレット ウィンドウは、再起動後は自動的には開きません。}}</translation>
 <translation id="2765403129283291972">このサイトを利用するには、Chrome でマイクの使用を許可する必要があります</translation>
@@ -505,6 +505,7 @@
 <translation id="6676384891291319759">インターネットにアクセス</translation>
 <translation id="6679975945624592337">Google Chrome をバックグラウンドで実行する</translation>
 <translation id="6696915334902295848">このサイトを利用するには、Chrome でマイクの使用を許可する必要があります</translation>
+<translation id="6706525880530967390">{count,plural, =1{Google アカウントに一部のデータを保存して、すべてのデバイスで使用できるようにするには、Chrome で本人確認を行う必要があります。今すぐログアウトすると、このデータ(1 個のアイテム)は削除されます。}other{Google アカウントに一部のデータを保存して、すべてのデバイスで使用できるようにするには、Chrome で本人確認を行う必要があります。今すぐログアウトすると、このデータ({count} 個のアイテム)は削除されます。}}</translation>
 <translation id="6712881677154121168">ダウンロード エラー: <ph name="DOWNLOAD_ERROR" />。</translation>
 <translation id="6718739135284199302">Chrome を高速化する</translation>
 <translation id="6734827584173583205">最近アクセスしていないため、Chrome で <ph name="PERMISSION_1" />、<ph name="PERMISSION_2" />、他 <ph name="COUNT" /> 件の権限を削除しました。</translation>
@@ -683,7 +684,6 @@
 <translation id="8647930742055103497">Chrome ですべて管理</translation>
 <translation id="8656634243791296665">Gemini in Chrome Dev を開く</translation>
 <translation id="8669527147644353129">Google Chrome Helper</translation>
-<translation id="8677922833187616101">Google AI モードのショートカットを常に表示する</translation>
 <translation id="8679801911857917785">この拡張機能では、Chrome の起動時に表示されるページも制御されます。</translation>
 <translation id="8712637175834984815">理解しました</translation>
 <translation id="8712767363896337380">アップデートが適用されました。更新を完了するには Chrome を再起動してください。</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ka.xtb b/chrome/app/resources/google_chrome_strings_ka.xtb
index 233f797e..f5b4ae2 100644
--- a/chrome/app/resources/google_chrome_strings_ka.xtb
+++ b/chrome/app/resources/google_chrome_strings_ka.xtb
@@ -152,7 +152,6 @@
 <translation id="2681444469812712297">გახსენით <ph name="URL" /> Google Chrome-ის ახალ ჩანართში.</translation>
 <translation id="2699790011615497488">Gemini Chrome Beta-ში გახსნა</translation>
 <translation id="2712141162840347885">აირჩიეთ ის, რისი მოძებნაც გსურთ Google Lens-ით, ან დააჭირეთ Escape-ს Google Lens-იდან გასასვლელად</translation>
-<translation id="2723860029395667894">Google-ის ხელოვნური ინტელექტის რეჟიმის მალსახმობის ყოველთვის ჩვენება</translation>
 <translation id="2738871930057338499">ინტერნეტთან დაკავშირება ვერ ხერხდება. HTTP 403 — აკრძალულია. შეამოწმეთ პროქსი-სერვერის კონფიგურაცია.</translation>
 <translation id="2742320827292110288">გაფრთხილება: Google Chrome ვერ შეუშლის ხელს გაფართოებებს ვების დათვალიერების ისტორიის შენახვაში. ამ გაფართოების ინკოგნიტო რეჟიმში გამოსართავად მოხსენით მონიშვნა ამ ვარიანტზე.</translation>
 <translation id="2747021967398957654">{count,plural, =1{თქვენი Chrome-ის ზოგიერთი მონაცემი თქვენს Google ანგარიშში ჯერ არ შენახულა. ანგარიშიდან გასვლამდე მოითმინეთ რამდენიმე წუთი. ახლა გასვლის შემთხვევაში, აღნიშნული მონაცემები (1 ერთეული) წაიშლება.}other{თქვენი Chrome-ის ზოგიერთი მონაცემი თქვენს Google ანგარიშში ჯერ არ შენახულა. ანგარიშიდან გასვლამდე მოითმინეთ რამდენიმე წუთი. ახლა გასვლის შემთხვევაში, აღნიშნული მონაცემები ({count} ერთეული) წაიშლება.}}</translation>
@@ -694,7 +693,6 @@
 <translation id="8647930742055103497">შეინახეთ ყველაფერი Chrome-ში</translation>
 <translation id="8656634243791296665">Gemini Chrome Dev-ში გახსნა</translation>
 <translation id="8669527147644353129">Google Chrome-ის დახმარება</translation>
-<translation id="8677922833187616101">Google-ის ხელოვნური ინტელექტის რეჟიმის მალსახმობის ყოველთვის ჩვენება</translation>
 <translation id="8679801911857917785">იგი, ასევე, აკონტროლებს, თუ რომელი გვერდი გამოჩნდება Chrome-ის გაშვებისას.</translation>
 <translation id="8712637175834984815">კარგი</translation>
 <translation id="8712767363896337380">ყველაფერი თითქმის მზადაა! განახლების დასასრულებლად ხელახლა გაუშვით Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_kk.xtb b/chrome/app/resources/google_chrome_strings_kk.xtb
index d3e2be0d..23b3cd0 100644
--- a/chrome/app/resources/google_chrome_strings_kk.xtb
+++ b/chrome/app/resources/google_chrome_strings_kk.xtb
@@ -152,7 +152,6 @@
 <translation id="2681444469812712297"><ph name="URL" /> сілтемесін Google Chrome-дағы жаңа қойындыдан ашады.</translation>
 <translation id="2699790011615497488">Chrome Beta-дағы Gemini-ды ашу</translation>
 <translation id="2712141162840347885">Google Lens-бен іздеу үшін кез келген нәрсені таңдаңыз немесе Google Lens-ден шығу үшін Escape пернесін басыңыз.</translation>
-<translation id="2723860029395667894">Google AI режимінің жылдам пәрменін үнемі көрсету</translation>
 <translation id="2738871930057338499">Интернетке қосылу мүмкін емес. HTTP 403 бойынша тыйым салынған. Прокси конфигурациясын тексеріңіз.</translation>
 <translation id="2742320827292110288">Ескерту: Google Chrome кеңейтімдердің браузерді қолдану тарихын жазуына кедергі бола алмайды. Бұл кеңейтімді Инкогнито режимінде өшіру үшін бұл опцияның белгісін алып тастаңыз.</translation>
 <translation id="2753623023919742414">Іздеу үшін басыңыз.</translation>
@@ -691,7 +690,6 @@
 <translation id="8647930742055103497">Барлығын Chrome-да сақтаңыз</translation>
 <translation id="8656634243791296665">Chrome Dev-дегі Gemini-ды ашу</translation>
 <translation id="8669527147644353129">Google Chrome Helper</translation>
-<translation id="8677922833187616101">Google AI режимінің жылдам пәрменін үнемі көрсету</translation>
 <translation id="8679801911857917785">Сонымен қатар Chrome бастапқы бетін де бақылайды.</translation>
 <translation id="8712637175834984815">Түсінікті</translation>
 <translation id="8712767363896337380">Дайын болып қалды. Жаңартуды аяқтау үшін Chrome браузерін қайта іске қосыңыз.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_km.xtb b/chrome/app/resources/google_chrome_strings_km.xtb
index 95a2c683..6d4877c 100644
--- a/chrome/app/resources/google_chrome_strings_km.xtb
+++ b/chrome/app/resources/google_chrome_strings_km.xtb
@@ -152,7 +152,6 @@
 <translation id="2681444469812712297">បើក <ph name="URL" /> នៅក្នុង​ផ្ទាំងថ្មី​នៅក្នុង Google Chrome។</translation>
 <translation id="2699790011615497488">បើក Gemini ក្នុង Chrome បេតា</translation>
 <translation id="2712141162840347885">ជ្រើសរើសអ្វីមួយ ដើម្បីស្វែងរកដោយប្រើ Google Lens ឬចុច escape ដើម្បីចាកចេញពី Google Lens</translation>
-<translation id="2723860029395667894">បង្ហាញ​ផ្លូវកាត់​មុខងារ Google AI ជានិច្ច</translation>
 <translation id="2738871930057338499">មិនអាចភ្ជាប់ទៅអ៊ីនធឺណិតបានទេ។ បាន​ហាមឃាត់ HTTP 403។ សូម​ពិនិត្យមើល​ការកំណត់​រចនាសម្ព័ន្ធ​ប្រូកស៊ី​របស់អ្នក។</translation>
 <translation id="2742320827292110288">ការព្រមាន៖ Google Chrome មិនអាច​ទប់ស្កាត់​កម្មវិធីបន្ថែម​មិនឱ្យថត​ប្រវត្តិរុករក​តាមអ៊ីនធឺណិត​របស់អ្នក​បានទេ។ ដើម្បីបិទ​កម្មវិធីបន្ថែមនេះ​នៅក្នុង​មុខងារ​ឯកជន សូមដក​ការជ្រើសរើស​ជម្រើសនេះ។</translation>
 <translation id="2747021967398957654">{count,plural, =1{ទិន្នន័យ Chrome មួយចំនួន​របស់អ្នក​មិនទាន់ត្រូវបាន​រក្សាទុក​នៅក្នុង​គណនី Google របស់អ្នក​ទេ។ សូម​សាកល្បង​រង់ចាំ​បន្តិច មុនពេល​ចេញពី​គណនី។ ប្រសិនបើអ្នក​ចេញពីគណនី​ឥឡូវនេះ ទិន្នន័យនេះ (ធាតុ 1) នឹងត្រូវបាន​លុប។}other{ទិន្នន័យ Chrome មួយចំនួន​របស់អ្នក​មិនទាន់ត្រូវបាន​រក្សាទុក​នៅក្នុង​គណនី Google របស់អ្នក​ទេ។ សូម​សាកល្បង​រង់ចាំ​បន្តិច មុនពេល​ចេញពី​គណនី។ ប្រសិនបើអ្នក​ចេញពីគណនី​ឥឡូវនេះ (ធាតុ {count}) នឹងត្រូវបាន​លុប។}}</translation>
@@ -693,7 +692,6 @@
 <translation id="8647930742055103497">រក្សាទុក​អ្វីគ្រប់យ៉ាង​នៅក្នុង Chrome</translation>
 <translation id="8656634243791296665">បើក Gemini ក្នុង Chrome Dev</translation>
 <translation id="8669527147644353129">ជំនួួយការ Google Chrome</translation>
-<translation id="8677922833187616101">បង្ហាញ​ផ្លូវកាត់​មុខងារ Google AI ជានិច្ច</translation>
 <translation id="8679801911857917785">វាក៏គ្រប់គ្រងអ្វីដែលត្រូវបានបង្ហាញនៅលើទំព័រដែរ នៅពេលអ្នកចាប់ផ្តើម Chrome។</translation>
 <translation id="8712637175834984815">យល់ហើយ</translation>
 <translation id="8712767363896337380">ជិតដំឡើង​កំណែរួចរាល់ហើយ! សូមចាប់ផ្ដើម Chrome ឡើងវិញ ដើម្បី​បញ្ចប់​ការដំឡើង​កំណែ។</translation>
diff --git a/chrome/app/resources/google_chrome_strings_kn.xtb b/chrome/app/resources/google_chrome_strings_kn.xtb
index fc88a332..60c0eb3 100644
--- a/chrome/app/resources/google_chrome_strings_kn.xtb
+++ b/chrome/app/resources/google_chrome_strings_kn.xtb
@@ -150,9 +150,9 @@
 <translation id="2681444469812712297">Google Chrome ನಲ್ಲಿ <ph name="URL" /> ಅನ್ನು ಹೊಸ ಟ್ಯಾಬ್‌ನಲ್ಲಿ ತೆರೆಯಿರಿ.</translation>
 <translation id="2699790011615497488">Chrome ಬೀಟಾನಲ್ಲಿ Gemini ಅನ್ನು ತೆರೆಯಿರಿ</translation>
 <translation id="2712141162840347885">Google Lens ನೊಂದಿಗೆ ಹುಡುಕಲು ಯಾವುದನ್ನಾದರೂ ಆಯ್ಕೆಮಾಡಿ ಅಥವಾ Google Lens ನಿಂದ ನಿರ್ಗಮಿಸಲು escape ಒತ್ತಿರಿ</translation>
-<translation id="2723860029395667894">ಯಾವಾಗಲೂ Google AI ಮೋಡ್ ಶಾರ್ಟ್‌ಕಟ್ ಅನ್ನು ತೋರಿಸಿ</translation>
 <translation id="2738871930057338499">ಇಂಟರ್ನೆಟ್‌ಗೆ ಕನೆಕ್ಟ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. HTTP 403 ನಿಷೇಧಿಸಲಾಗಿದೆ. ನಿಮ್ಮ ಪ್ರಾಕ್ಸಿ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿ.</translation>
 <translation id="2742320827292110288">ಎಚ್ಚರಿಕೆ: ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಇತಿಹಾಸವನ್ನು ರೆಕಾರ್ಡ್ ಮಾಡದಂತೆ ವಿಸ್ತರಣೆಗಳನ್ನು ತಡೆಯಲು Google Chrome ಗೆ ಸಾಧ್ಯವಿಲ್ಲ. ಅಜ್ಞಾತ ಮೋಡ್‌ನಲ್ಲಿ ವಿಸ್ತರಣೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ಈ ಆಯ್ಕೆಯನ್ನು ಆರಿಸಬೇಡಿ.</translation>
+<translation id="2747021967398957654">{count,plural, =1{ನಿಮ್ಮ ಕೆಲವು Chrome ಡೇಟಾವನ್ನು ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಇನ್ನೂ ಸೇವ್ ಮಾಡಲಾಗಿಲ್ಲ. ಸೈನ್ ಔಟ್ ಮಾಡುವ ಮೊದಲು ಕೆಲವು ನಿಮಿಷ ಕಾಯಲು ಪ್ರಯತ್ನಿಸಿ. ನೀವು ಈಗ ಸೈನ್ ಔಟ್ ಮಾಡಿದರೆ, ಈ ಡೇಟಾವನ್ನು (1 ಐಟಂ) ಅಳಿಸಲಾಗುತ್ತದೆ.}one{ನಿಮ್ಮ ಕೆಲವು Chrome ಡೇಟಾವನ್ನು ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಇನ್ನೂ ಸೇವ್ ಮಾಡಲಾಗಿಲ್ಲ. ಸೈನ್ ಔಟ್ ಮಾಡುವ ಮೊದಲು ಕೆಲವು ನಿಮಿಷ ಕಾಯಲು ಪ್ರಯತ್ನಿಸಿ. ನೀವು ಈಗ ಸೈನ್ ಔಟ್ ಮಾಡಿದರೆ, ಈ ಡೇಟಾ ({count} ಐಟಂಗಳನ್ನು) ಅಳಿಸಲಾಗುತ್ತದೆ.}other{ನಿಮ್ಮ ಕೆಲವು Chrome ಡೇಟಾವನ್ನು ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಇನ್ನೂ ಸೇವ್ ಮಾಡಲಾಗಿಲ್ಲ. ಸೈನ್ ಔಟ್ ಮಾಡುವ ಮೊದಲು ಕೆಲವು ನಿಮಿಷ ಕಾಯಲು ಪ್ರಯತ್ನಿಸಿ. ನೀವು ಈಗ ಸೈನ್ ಔಟ್ ಮಾಡಿದರೆ, ಈ ಡೇಟಾ ({count} ಐಟಂಗಳನ್ನು) ಅಳಿಸಲಾಗುತ್ತದೆ.}}</translation>
 <translation id="2753623023919742414">ಹುಡುಕಲು ಕ್ಲಿಕ್ ಮಾಡಿ</translation>
 <translation id="2757826245013442432">{COUNT,plural, =0{ಅಪ್‌ಡೇಟ್ ಅನ್ನು ಅನ್ವಯಿಸಲು ನೀವು Chrome ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಬೇಕೆಂದು ಸುಧಾರಿತ ಸಂರಕ್ಷಣೆಯು ಬಯಸುತ್ತದೆ}=1{ಅಪ್‌ಡೇಟ್ ಅನ್ನು ಅನ್ವಯಿಸಲು ನೀವು Chrome ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಬೇಕೆಂದು ಸುಧಾರಿತ ಸಂರಕ್ಷಣೆಯು ಬಯಸುತ್ತದೆ. ನಿಮ್ಮ ಅಜ್ಞಾತ ವಿಂಡೋವನ್ನು ತೆರೆಯಲಾಗುವುದಿಲ್ಲ.}one{ಅಪ್‌ಡೇಟ್ ಅನ್ನು ಅನ್ವಯಿಸಲು ನೀವು Chrome ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಬೇಕೆಂದು ಸುಧಾರಿತ ಸಂರಕ್ಷಣೆಯು ಬಯಸುತ್ತದೆ. ನಿಮ್ಮ # ಅಜ್ಞಾತ ವಿಂಡೋಗಳನ್ನು ತೆರೆಯಲಾಗುವುದಿಲ್ಲ.}other{ಅಪ್‌ಡೇಟ್ ಅನ್ನು ಅನ್ವಯಿಸಲು ನೀವು Chrome ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಬೇಕೆಂದು ಸುಧಾರಿತ ಸಂರಕ್ಷಣೆಯು ಬಯಸುತ್ತದೆ. ನಿಮ್ಮ # ಅಜ್ಞಾತ ವಿಂಡೋಗಳನ್ನು ತೆರೆಯಲಾಗುವುದಿಲ್ಲ.}}</translation>
 <translation id="2765403129283291972">ಈ ಸೈಟ್‌ಗಾಗಿ ನಿಮ್ಮ ಮೈಕ್ರೊಫೋನ್‌ಗೆ ಪ್ರವೇಶಿಸಲು Chrome ಗೆ ಅನುಮತಿಯ ಅಗತ್ಯವಿದೆ</translation>
@@ -508,6 +508,7 @@
 <translation id="6676384891291319759">ಇಂಟರ್ನೆಟ್ ಅನ್ನು ಪ್ರವೇಶಿಸಿ</translation>
 <translation id="6679975945624592337">Google Chrome ಹಿನ್ನೆಲೆಯಲ್ಲಿ ರನ್ ಆಗಲು ಅನುಮತಿಸಿ</translation>
 <translation id="6696915334902295848">ಈ ಸೈಟ್‌ಗೆ ಸಂಬಂಧಿಸಿದಂತೆ Chrome ಗೆ ಮೈಕ್ರೊಫೋನ್ ಅನುಮತಿಯ ಅಗತ್ಯವಿದೆ</translation>
+<translation id="6706525880530967390">{count,plural, =1{ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಕೆಲವು ಡೇಟಾವನ್ನು ಸೇವ್‌ ಮಾಡುವ ಮತ್ತು ನಿಮ್ಮ ಎಲ್ಲಾ ಸಾಧನಗಳಲ್ಲಿ ಬಳಸುವ ಮೊದಲು, Chrome ಇದು ನೀವೇ ಎಂದು ದೃಢೀಕರಿಸುವ ಅಗತ್ಯವಿದೆ. ನೀವು ಈಗ ಸೈನ್ ಔಟ್ ಮಾಡಿದರೆ, ಈ ಡೇಟಾವನ್ನು (1 ಐಟಂ) ಅಳಿಸಲಾಗುತ್ತದೆ.}one{ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಕೆಲವು ಡೇಟಾವನ್ನು ಸೇವ್‌ ಮಾಡುವ ಮತ್ತು ನಿಮ್ಮ ಎಲ್ಲಾ ಸಾಧನಗಳಲ್ಲಿ ಬಳಸುವ ಮೊದಲು, Chrome ಇದು ನೀವೇ ಎಂದು ದೃಢೀಕರಿಸುವ ಅಗತ್ಯವಿದೆ. ನೀವು ಈಗ ಸೈನ್ ಔಟ್ ಮಾಡಿದರೆ, ಈ ಡೇಟಾ ({count} ಐಟಂಗಳನ್ನು) ಅಳಿಸಲಾಗುತ್ತದೆ.}other{ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಕೆಲವು ಡೇಟಾವನ್ನು ಸೇವ್‌ ಮಾಡುವ ಮತ್ತು ನಿಮ್ಮ ಎಲ್ಲಾ ಸಾಧನಗಳಲ್ಲಿ ಬಳಸುವ ಮೊದಲು, Chrome ಇದು ನೀವೇ ಎಂದು ದೃಢೀಕರಿಸುವ ಅಗತ್ಯವಿದೆ. ನೀವು ಈಗ ಸೈನ್ ಔಟ್ ಮಾಡಿದರೆ, ಈ ಡೇಟಾ ({count} ಐಟಂಗಳನ್ನು) ಅಳಿಸಲಾಗುತ್ತದೆ.}}</translation>
 <translation id="6712881677154121168">ಡೌನ್‌ಲೋಡ್ ದೋಷ: <ph name="DOWNLOAD_ERROR" />.</translation>
 <translation id="6718739135284199302">Chrome ಅನ್ನು ವೇಗಗೊಳಿಸಿ</translation>
 <translation id="6734827584173583205">ನೀವು ಇತ್ತೀಚೆಗೆ ಭೇಟಿ ನೀಡಿಲ್ಲ. <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, ಮತ್ತು ಇನ್ನೂ <ph name="COUNT" /> ಅನ್ನು Chrome ತೆಗೆದುಹಾಕಿದೆ.</translation>
@@ -687,7 +688,6 @@
 <translation id="8647930742055103497">ಎಲ್ಲವನ್ನೂ Chrome ನಲ್ಲಿ ಇರಿಸಿ</translation>
 <translation id="8656634243791296665">Chrome Dev ನಲ್ಲಿ Gemini ಅನ್ನು ತೆರೆಯಿರಿ</translation>
 <translation id="8669527147644353129">Google Chrome ಸಹಾಯಕ</translation>
-<translation id="8677922833187616101">ಯಾವಾಗಲೂ Google AI ಮೋಡ್ ಶಾರ್ಟ್‌ಕಟ್ ಅನ್ನು ತೋರಿಸಿ</translation>
 <translation id="8679801911857917785">ನೀವು Chrome ಪ್ರಾರಂಭಿಸಿದಾಗ ಕಾಣಿಸಿಕೊಳ್ಳುವ ಪುಟವನ್ನು ಕೂಡಾ ಇದು ನಿಯಂತ್ರಿಸುತ್ತದೆ.</translation>
 <translation id="8712637175834984815">ಅರ್ಥವಾಯಿತು</translation>
 <translation id="8712767363896337380">ಬಹುತೇಕ ಅಪ್ ಟು ಡೇಟ್ ಆಗಿದೆ! ಅಪ್‌ಡೇಟ್ ಅನ್ನು ಪೂರ್ಣಗೊಳಿಸಲು Chrome ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ko.xtb b/chrome/app/resources/google_chrome_strings_ko.xtb
index fb90394c7..05dc0d1d 100644
--- a/chrome/app/resources/google_chrome_strings_ko.xtb
+++ b/chrome/app/resources/google_chrome_strings_ko.xtb
@@ -152,7 +152,6 @@
 <translation id="2681444469812712297">Chrome의 새 탭에서 <ph name="URL" /> 주소를 엽니다.</translation>
 <translation id="2699790011615497488">Chrome 베타의 Gemini 열기</translation>
 <translation id="2712141162840347885">Google 렌즈로 검색할 항목을 선택하거나 Esc 키를 눌러 Google 렌즈를 종료하세요</translation>
-<translation id="2723860029395667894">Google AI 모드 바로가기 항상 표시</translation>
 <translation id="2738871930057338499">인터넷에 연결할 수 없습니다(HTTP 403 Forbidden). 프록시 설정을 확인하시기 바랍니다.</translation>
 <translation id="2742320827292110288">경고: Chrome에서는 확장 프로그램에 방문 기록이 저장될 수 있습니다. 시크릿 모드에서 이 확장 프로그램을 사용 중지하려면 옵션을 선택 해제하세요.</translation>
 <translation id="2753623023919742414">클릭하여 검색</translation>
@@ -691,7 +690,6 @@
 <translation id="8647930742055103497">Chrome에서 모든 항목을 보관하세요</translation>
 <translation id="8656634243791296665">Chrome 개발자의 Gemini 열기</translation>
 <translation id="8669527147644353129">Chrome 도우미</translation>
-<translation id="8677922833187616101">Google AI 모드 바로가기 항상 표시</translation>
 <translation id="8679801911857917785">또한 Chrome을 시작할 때 표시되는 페이지를 설정합니다.</translation>
 <translation id="8712637175834984815">확인</translation>
 <translation id="8712767363896337380">업데이트가 거의 완료되었습니다. 업데이트를 마치려면 Chrome을 다시 실행하세요.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ky.xtb b/chrome/app/resources/google_chrome_strings_ky.xtb
index 26ee6a2..df1b2424 100644
--- a/chrome/app/resources/google_chrome_strings_ky.xtb
+++ b/chrome/app/resources/google_chrome_strings_ky.xtb
@@ -152,7 +152,6 @@
 <translation id="2681444469812712297"><ph name="URL" /> сайтын Google Chrome'догу жаңы өтмөктө ачыңыз.</translation>
 <translation id="2699790011615497488">Chrome Бетадагы Gemini'ды ачуу</translation>
 <translation id="2712141162840347885">Google Lens менен издөө үчүн каалаган нерсени тандаңыз же Google Lens кызматынан чыгуу үчүн Escape баскычын басыңыз.</translation>
-<translation id="2723860029395667894">Google ЖИ режиминин ыкчам баскычы ар дайым көрсөтүлсүн</translation>
 <translation id="2738871930057338499">Интернетке туташуу мүмкүн болбой жатат. HTTP 403 Тыюу салынган. Прокси конфигурациясын текшериңиз.</translation>
 <translation id="2742320827292110288">Эскертүү: Google Chrome кеңейтүүлөргө көрүлгөн вебсайттарды жазып алууга тыюу сала албайт. Бул кеңейтүүнү жашыруун режимде өчүрүү үчүн бул параметрди тандоодон чыгарыңыз.</translation>
 <translation id="2753623023919742414">Издөө үчүн чыкылдатыңыз</translation>
@@ -692,7 +691,6 @@
 <translation id="8647930742055103497">Баарын Chrome'до сактаңыз</translation>
 <translation id="8656634243791296665">Chrome Dev'деги Gemini'ды ачуу</translation>
 <translation id="8669527147644353129">Google Chrome Жардамчы</translation>
-<translation id="8677922833187616101">Google ЖИ режиминин ыкчам баскычы ар дайым көрсөтүлсүн</translation>
 <translation id="8679801911857917785">Ал ошондой эле Chrome иштеп баштаганда көрүнө турган бетти көзөмөлдөйт.</translation>
 <translation id="8712637175834984815">Түшүндүм</translation>
 <translation id="8712767363896337380">Жаңыртылганы аз калды! Жаңыртууну аягына чыгаруу үчүн Chrome'ду кайра иштетиңиз.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lo.xtb b/chrome/app/resources/google_chrome_strings_lo.xtb
index e5857a1..0bd6aabe 100644
--- a/chrome/app/resources/google_chrome_strings_lo.xtb
+++ b/chrome/app/resources/google_chrome_strings_lo.xtb
@@ -152,7 +152,6 @@
 <translation id="2681444469812712297">ເປີດ <ph name="URL" /> ໃນແຖບໃໝ່ໃນ Google Chrome.</translation>
 <translation id="2699790011615497488">ເປີດ Gemini ໃນ Chrome Beta</translation>
 <translation id="2712141162840347885">ເລືອກຫຍັງກໍໄດ້ເພື່ອຊອກຫາດ້ວຍ Google Lens ຫຼື ກົດ Escape ເພື່ອອອກຈາກ Google Lens</translation>
-<translation id="2723860029395667894">ສະແດງທາງລັດຂອງໂໝດ Google AI ສະເໝີ</translation>
 <translation id="2738871930057338499">ບໍ່ສາມາດເຊື່ອມຕໍ່ກັບອິນເຕີເນັດໄດ້. HTTP 403 ຖືກຫ້າມ. ກະລຸນາກວດສອບການຕັ້ງຄ່າພຣັອກຊີຂອງທ່ານ.</translation>
 <translation id="2742320827292110288">ຄຳເຕືອນ: Google Chrome ບໍ່ສາມາດປ້ອງກັນບໍ່ໃຫ້ສ່ວນຂະຫຍາຍບັນທຶກປະຫວັດການທ່ອງເວັບຂອງທ່ານໄດ້. ເພື່ອປິດການນຳໃຊ້ສ່ວນຂະຫຍາຍນີ້ໃນໂໝດບໍ່ເປີດເຜີຍຕົວຕົນ, ກະລຸນາບໍ່ເລືອກຕົວເລືອກນີ້.</translation>
 <translation id="2753623023919742414">ຄລິກເພື່ອຊອກຫາ</translation>
@@ -692,7 +691,6 @@
 <translation id="8647930742055103497">ເກັບທຸກຢ່າງໄວ້ໃນ Chrome</translation>
 <translation id="8656634243791296665">ເປີດ Gemini ໃນ Chrome Dev</translation>
 <translation id="8669527147644353129">ຕົວຊ່ວຍ Google Chrome</translation>
-<translation id="8677922833187616101">ສະແດງທາງລັດຂອງໂໝດ Google AI ສະເໝີ</translation>
 <translation id="8679801911857917785">ມັນຍັງຄວບຄຸມວ່າຈະໃຫ້ສະແດງໜ້າໃດຂຶ້ນ ເມື່ອທ່ານເລີ່ມຕົ້ນເປີດ Chrome.</translation>
 <translation id="8712637175834984815">ເຂົ້າໃຈແລ້ວ</translation>
 <translation id="8712767363896337380">ອັບເດດໃກ້ແລ້ວໆ! ເລີ່ມເປີດໃຊ້ Chrome ໃໝ່ເພື່ອອັບເດດໃຫ້ແລ້ວ.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lt.xtb b/chrome/app/resources/google_chrome_strings_lt.xtb
index ce588683..a6e9ca1 100644
--- a/chrome/app/resources/google_chrome_strings_lt.xtb
+++ b/chrome/app/resources/google_chrome_strings_lt.xtb
@@ -152,7 +152,6 @@
 <translation id="2681444469812712297">Atidarykite <ph name="URL" /> naujame „Google Chrome“ skirtuke.</translation>
 <translation id="2699790011615497488">Atidaryti „Gemini“ beta versijos naršyklėje „Chrome“</translation>
 <translation id="2712141162840347885">Pasirinkite bet kąbet ką, ko norite ieškoti naudodami „Google Lens“, arba paspauskite „Escape“, kad išeitumėte iš „Google Lens“</translation>
-<translation id="2723860029395667894">Visada rodyti „Google“ DI režimo spartųjį klavišą</translation>
 <translation id="2738871930057338499">Nepavyko prisijungti prie interneto. HTTP 403 uždrausta. Patikrinkite tarpinio serverio konfigūraciją.</translation>
 <translation id="2742320827292110288">Įspėjimas: „Google Chrome“ negali neleisti plėtiniams įrašyti jūsų naršymo istorijos. Jei norite neleisti šio plėtinio inkognito režimu, atšaukite šios parinkties pasirinkimą.</translation>
 <translation id="2747021967398957654">{count,plural, =1{Kai kurie „Chrome“ duomenys dar neišsaugoti „Google“ paskyroje. Pabandykite palaukti kelias minutes prieš atsijungdami. Jei atsijungsite dabar, šie duomenys (1 elementas) bus ištrinti.}one{Kai kurie „Chrome“ duomenys dar neišsaugoti „Google“ paskyroje. Pabandykite palaukti kelias minutes prieš atsijungdami. Jei atsijungsite dabar, šie duomenys ({count} elementas) bus ištrinti.}few{Kai kurie „Chrome“ duomenys dar neišsaugoti „Google“ paskyroje. Pabandykite palaukti kelias minutes prieš atsijungdami. Jei atsijungsite dabar, šie duomenys ({count} elementai) bus ištrinti.}many{Kai kurie „Chrome“ duomenys dar neišsaugoti „Google“ paskyroje. Pabandykite palaukti kelias minutes prieš atsijungdami. Jei atsijungsite dabar, šie duomenys ({count} elemento) bus ištrinti.}other{Kai kurie „Chrome“ duomenys dar neišsaugoti „Google“ paskyroje. Pabandykite palaukti kelias minutes prieš atsijungdami. Jei atsijungsite dabar, šie duomenys ({count} elementų) bus ištrinti.}}</translation>
@@ -694,7 +693,6 @@
 <translation id="8647930742055103497">Viską laikykite naršyklėje „Chrome“</translation>
 <translation id="8656634243791296665">Atidaryti „Gemini“ kūrėjams skirtoje „Chrome“ naršyklėje</translation>
 <translation id="8669527147644353129">„Google Chrome“ pagalbos priemonė</translation>
-<translation id="8677922833187616101">Visada rodyti „Google“ DI režimo spartųjį klavišą</translation>
 <translation id="8679801911857917785">Ji taip pat kontroliuoja, koks puslapis rodomas, kai paleidžiate „Chrome“.</translation>
 <translation id="8712637175834984815">Supratau</translation>
 <translation id="8712767363896337380">Beveik atnaujinta! Paleiskite „Chrome“ iš naujo, kad būtų užbaigtas atnaujinimas.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lv.xtb b/chrome/app/resources/google_chrome_strings_lv.xtb
index 8bdf540..5bdf901 100644
--- a/chrome/app/resources/google_chrome_strings_lv.xtb
+++ b/chrome/app/resources/google_chrome_strings_lv.xtb
@@ -150,7 +150,6 @@
 <translation id="2681444469812712297">Atveriet vietrādi <ph name="URL" /> jaunā cilnē pārlūkā Google Chrome.</translation>
 <translation id="2699790011615497488">Atvērt Gemini pārlūka Chrome beta versijā</translation>
 <translation id="2712141162840347885">Atlasiet jebko, lai meklētu ar Google Lens, vai nospiediet atsoļa taustiņu, lai izietu no Google Lens</translation>
-<translation id="2723860029395667894">Vienmēr rādīt Google MI režīma saīsni</translation>
 <translation id="2738871930057338499">Nevar izveidot savienojumu ar internetu. HTTP 403 — aizliegts. Lūdzu, pārbaudiet starpniekservera konfigurāciju.</translation>
 <translation id="2742320827292110288">Brīdinājums! Google Chrome nevar novērst to, ka paplašinājumi ieraksta jūsu pārlūkošanas vēsturi. Lai atspējotu šo paplašinājumu inkognito režīmā, noņemiet šīs opcijas atlasi.</translation>
 <translation id="2753623023919742414">Noklikšķiniet, lai meklētu</translation>
@@ -687,7 +686,6 @@
 <translation id="8647930742055103497">Glabājiet visu pārlūkā Chrome</translation>
 <translation id="8656634243791296665">Atvērt Gemini pārlūka Chrome izstrādātāju versijā</translation>
 <translation id="8669527147644353129">Google Chrome Helper</translation>
-<translation id="8677922833187616101">Vienmēr rādīt Google MI režīma saīsni</translation>
 <translation id="8679801911857917785">Tas nosaka arī to, kāda lapa tiks rādīta, kad atvērsiet pārlūku Chrome.</translation>
 <translation id="8712637175834984815">Sapratu!</translation>
 <translation id="8712767363896337380">Gandrīz atjaunināts! Lai pabeigtu atjaunināšanu, atkārtoti palaidiet pārlūkprogrammu Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mk.xtb b/chrome/app/resources/google_chrome_strings_mk.xtb
index 38d9b1b..c2af6bf 100644
--- a/chrome/app/resources/google_chrome_strings_mk.xtb
+++ b/chrome/app/resources/google_chrome_strings_mk.xtb
@@ -152,9 +152,9 @@
 <translation id="2681444469812712297"><ph name="URL" /> ќе се отвори во нова картичка во Google Chrome.</translation>
 <translation id="2699790011615497488">Отворете го Gemini во Chrome Beta</translation>
 <translation id="2712141162840347885">Изберете што било за да пребарате со Google Lens или притиснете го копчето Escape за да излезете од Google Lens</translation>
-<translation id="2723860029395667894">Секогаш прикажувај ја кратенката за „AI-режим“ на Google</translation>
 <translation id="2738871930057338499">Не може да се поврзе на интернет. HTTP-грешка 403: забранет пристап. Проверете ја вашата конфигурација на прокси.</translation>
 <translation id="2742320827292110288">Предупредување: Google Chrome не може да ги спречи екстензиите да ја снимаат вашата историја на прелистувањето. За да ја оневозможите оваа екстензија во режимот „Инкогнито“, поништете го изборот на опцијава.</translation>
+<translation id="2747021967398957654">{count,plural, =1{Некои од вашите податоци од Chrome сѐ уште не се зачувани во вашата сметка на Google. Почекајте неколку минути пред да се одјавите. Ако се одјавите сега, податоциве (1 ставка) ќе се избришат.}one{Некои од вашите податоци од Chrome сѐ уште не се зачувани во вашата сметка на Google. Почекајте неколку минути пред да се одјавите. Ако се одјавите сега, податоциве ({count} ставка) ќе се избришат.}other{Некои од вашите податоци од Chrome сѐ уште не се зачувани во вашата сметка на Google. Почекајте неколку минути пред да се одјавите. Ако се одјавите сега, податоциве ({count} ставки) ќе се избришат.}}</translation>
 <translation id="2753623023919742414">Кликнете за да пребарате</translation>
 <translation id="2757826245013442432">{COUNT,plural, =0{„Напредна заштита“ бара да го рестартирате Chrome за да се примени ажурирање}=1{„Напредна заштита“ бара да го рестартирате Chrome за да се примени ажурирање. Прозорецот „Инкогнито“ нема да се отвори повторно.}one{„Напредна заштита“ бара да го рестартирате Chrome за да се примени ажурирање. # прозорец „Инкогнито“ нема да се отворат повторно.}other{„Напредна заштита“ бара да го рестартирате Chrome за да се примени ажурирање. # прозорци „Инкогнито“ нема да се отворат повторно.}}</translation>
 <translation id="2765403129283291972">На Chrome му треба дозвола за да пристапи до микрофонот за сајтов</translation>
@@ -514,6 +514,7 @@
 <translation id="6676384891291319759">Пристап до интернет</translation>
 <translation id="6679975945624592337">Остави Google Chrome да работи во заднина</translation>
 <translation id="6696915334902295848">На Chrome му треба дозвола за микрофонот за сајтов</translation>
+<translation id="6706525880530967390">{count,plural, =1{Chrome треба да потврди дека сте вие пред да може да се зачуваат некои податоци во вашата сметка на Google и да се користат на сите ваши уреди. Ако се одјавите сега, податоциве (1 ставка) ќе се избришат.}one{Chrome треба да потврди дека сте вие пред да може да се зачуваат некои податоци во вашата сметка на Google и да се користат на сите ваши уреди. Ако се одјавите сега, податоциве ({count} ставка) ќе се избришат.}other{Chrome треба да потврди дека сте вие пред да може да се зачуваат некои податоци во вашата сметка на Google и да се користат на сите ваши уреди. Ако се одјавите сега, податоциве ({count} ставки) ќе се избришат.}}</translation>
 <translation id="6712881677154121168">Грешка при преземање: <ph name="DOWNLOAD_ERROR" /></translation>
 <translation id="6718739135284199302">Имајте побрз Chrome</translation>
 <translation id="6734827584173583205">Не сте дошле одамна. Chrome ги отстрани следниве дозволи: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и уште <ph name="COUNT" />.</translation>
@@ -692,7 +693,6 @@
 <translation id="8647930742055103497">Чувајте сѐ во Chrome</translation>
 <translation id="8656634243791296665">Отворете го Gemini во Chrome Dev</translation>
 <translation id="8669527147644353129">Google Chrome Helper</translation>
-<translation id="8677922833187616101">Секогаш прикажувај ја кратенката за „AI-режим“ на Google</translation>
 <translation id="8679801911857917785">Контролира и која страница се прикажува кога ќе стартувате Chrome.</translation>
 <translation id="8712637175834984815">Сфатив</translation>
 <translation id="8712767363896337380">Речиси сте готови! Рестартирајте го Chrome за да заврши ажурирањето.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ml.xtb b/chrome/app/resources/google_chrome_strings_ml.xtb
index b4d093af..37810c8d 100644
--- a/chrome/app/resources/google_chrome_strings_ml.xtb
+++ b/chrome/app/resources/google_chrome_strings_ml.xtb
@@ -152,9 +152,9 @@
 <translation id="2681444469812712297">Google Chrome-ൽ പുതിയ ടാബിൽ <ph name="URL" /> തുറക്കുക.</translation>
 <translation id="2699790011615497488">Chrome ബീറ്റയിലെ Gemini തുറക്കുക</translation>
 <translation id="2712141162840347885">Google Lens ഉപയോഗിച്ച് തിരയാൻ എന്തെങ്കിലും തിരഞ്ഞെടുക്കുക അല്ലെങ്കിൽ Google Lens-ൽ നിന്ന് പുറത്ത് കടക്കാൻ 'Escape' അമർത്തുക</translation>
-<translation id="2723860029395667894">എല്ലായ്‌പ്പോഴും Google AI മോഡ് കുറുക്കുവഴി കാണിക്കുക</translation>
 <translation id="2738871930057338499">ഇന്റർനെറ്റിലേക്ക് കണക്റ്റ് ചെയ്യാനാകുന്നില്ല. HTTP 403 നിരോധിച്ചിരിക്കുന്നു. നിങ്ങളുടെ പ്രോക്‌സി കോൺഫിഗറേഷൻ പരിശോധിക്കുക.</translation>
 <translation id="2742320827292110288">മുന്നറിയിപ്പ്: നിങ്ങളുടെ ബ്രൗസിംഗ് ചരിത്രം റെക്കോർഡ് ചെയ്യുന്നതിൽ നിന്ന് വിപുലീകരണങ്ങളെ തടയാൻ Google Chrome-ന് കഴിയില്ല. അദൃശ്യമോഡിൽ ഈ വിപുലീകരണം പ്രവർത്തനരഹിതമാക്കാൻ, ഈ ഓപ്ഷൻ തിരഞ്ഞെടുത്തത് റദ്ദാക്കുക.</translation>
+<translation id="2747021967398957654">{count,plural, =1{നിങ്ങളുടെ Chrome ഡാറ്റയിൽ ചിലത് ഇതുവരെ നിങ്ങളുടെ Google Account-ൽ സംരക്ഷിച്ചിട്ടില്ല. സൈൻ ഔട്ട് ചെയ്യുന്നതിന് മുമ്പ് അൽപ്പസമയം കാത്തിരിക്കുക. നിങ്ങൾ ഇപ്പോൾ സൈൻ ഔട്ട് ചെയ്താൽ, ഈ ഡാറ്റ (1 ഇനം) ഇല്ലാതാക്കും.}other{നിങ്ങളുടെ Chrome ഡാറ്റയിൽ ചിലത് ഇതുവരെ നിങ്ങളുടെ Google Account-ൽ സംരക്ഷിച്ചിട്ടില്ല. സൈൻ ഔട്ട് ചെയ്യുന്നതിന് മുമ്പ് അൽപ്പസമയം കാത്തിരിക്കുക. നിങ്ങൾ ഇപ്പോൾ സൈൻ ഔട്ട് ചെയ്താൽ ഈ ഡാറ്റ ({count} ഇനങ്ങൾ) ഇല്ലാതാക്കും.}}</translation>
 <translation id="2753623023919742414">തിരയാൻ ക്ലിക്ക് ചെയ്യുക</translation>
 <translation id="2757826245013442432">{COUNT,plural, =0{അപ്‌ഡേറ്റ് ബാധകമാക്കുന്നതിന് Chrome വീണ്ടും ആരംഭിക്കാൻ വിപുലമായ പരിരക്ഷ ആവശ്യപ്പെടുന്നു}=1{അപ്‌ഡേറ്റ് ബാധകമാക്കാൻ Chrome വീണ്ടും ആരംഭിക്കാൻ വിപുലമായ പരിരക്ഷ ആവശ്യപ്പെടുന്നു. നിങ്ങളുടെ അദൃശ്യ വിൻഡോ വീണ്ടും തുറക്കില്ല.}other{അപ്‌ഡേറ്റ് ബാധകമാക്കാൻ Chrome വീണ്ടും ആരംഭിക്കാൻ വിപുലമായ പരിരക്ഷ ആവശ്യപ്പെടുന്നു. നിങ്ങളുടെ # അദൃശ്യ വിൻഡോകൾ വീണ്ടും തുറക്കില്ല.}}</translation>
 <translation id="2765403129283291972">ഈ സൈറ്റിനായി, Chrome-ന് നിങ്ങളുടെ മൈക്രോഫോൺ ആക്‌സസ് ചെയ്യാനുള്ള അനുമതി ആവശ്യമാണ്</translation>
@@ -514,6 +514,7 @@
 <translation id="6676384891291319759">ഇന്റര്‍‌നെറ്റ് ആക്‌സസ് ചെയ്യുക</translation>
 <translation id="6679975945624592337">പശ്ചാത്തലത്തില്‍ Google Chrome പ്രവര്‍ത്തിക്കാന്‍ അനുവദിക്കുക</translation>
 <translation id="6696915334902295848">Chrome-ന് ഈ സൈറ്റിനായി മൈക്രോഫോൺ അനുമതി ആവശ്യമാണ്</translation>
+<translation id="6706525880530967390">{count,plural, =1{നിങ്ങളുടെ Google Account-ൽ ചില ഡാറ്റ സംരക്ഷിക്കുന്നതിനും അത് നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും ഉപയോഗിക്കുന്നതിനും മുമ്പ് ഇത് നിങ്ങൾ തന്നെയാണെന്ന് Chrome-ന് പരിശോധിച്ചുറപ്പിക്കേണ്ടതുണ്ട്. നിങ്ങൾ ഇപ്പോൾ സൈൻ ഔട്ട് ചെയ്താൽ, ഈ ഡാറ്റ (1 ഇനം) ഇല്ലാതാക്കും.}other{നിങ്ങളുടെ Google Account-ൽ ചില ഡാറ്റ സംരക്ഷിക്കുന്നതിനും അത് നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും ഉപയോഗിക്കുന്നതിനും മുമ്പ് ഇത് നിങ്ങൾ തന്നെയാണെന്ന് Chrome-ന് പരിശോധിച്ചുറപ്പിക്കേണ്ടതുണ്ട്. നിങ്ങൾ ഇപ്പോൾ സൈൻ ഔട്ട് ചെയ്താൽ ഈ ഡാറ്റ ({count} ഇനങ്ങൾ) ഇല്ലാതാക്കും.}}</translation>
 <translation id="6712881677154121168">ഡൗൺലോഡ് ചെയ്യുന്നതിൽ പിശക്: <ph name="DOWNLOAD_ERROR" /></translation>
 <translation id="6718739135284199302">Chrome കൂടുതൽ വേഗതയുള്ളതാക്കുക</translation>
 <translation id="6734827584173583205">നിങ്ങൾ അടുത്തിടെ സന്ദർശിച്ചിട്ടില്ല. <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> എന്നിവയും മറ്റ് <ph name="COUNT" /> അനുമതികളും Chrome നീക്കം ചെയ്തു.</translation>
@@ -692,7 +693,6 @@
 <translation id="8647930742055103497">എല്ലാം Chrome-ൽ നിലനിർത്തുക</translation>
 <translation id="8656634243791296665">Chrome Dev-ലെ Gemini തുറക്കുക</translation>
 <translation id="8669527147644353129">Google Chrome സഹായി</translation>
-<translation id="8677922833187616101">എല്ലായ്‌പ്പോഴും Google AI മോഡ് കുറുക്കുവഴി കാണിക്കുക</translation>
 <translation id="8679801911857917785">നിങ്ങൾ Chrome ആരംഭിയ്ക്കുമ്പോൾ ഏത് പേജാണ് കാണിക്കേണ്ടതെന്നും അത് നിയന്ത്രിയ്ക്കുന്നു.</translation>
 <translation id="8712637175834984815">മനസ്സിലായി</translation>
 <translation id="8712767363896337380">എകദേശം അപ് റ്റു ഡേറ്റാണ്! അപ്‌ഡേറ്റ് പൂർത്തിയാക്കുന്നതിന് Chrome വീണ്ടും ആരംഭിക്കുക.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mn.xtb b/chrome/app/resources/google_chrome_strings_mn.xtb
index 87f5fddf..fb3eb63 100644
--- a/chrome/app/resources/google_chrome_strings_mn.xtb
+++ b/chrome/app/resources/google_chrome_strings_mn.xtb
@@ -151,9 +151,9 @@
 <translation id="2681444469812712297"><ph name="URL" />-г Google Chrome-д шинэ табд нээнэ үү.</translation>
 <translation id="2699790011615497488">Chrome Бета дахь Gemini-г нээх</translation>
 <translation id="2712141162840347885">Google Lens-р хайхыг хүссэн зүйлээ сонгох эсвэл Google Lens-с гарахын тулд escape дээр дарна уу</translation>
-<translation id="2723860029395667894">Google-н ХОУ-ы горимын товчлолыг үргэлж харуулах</translation>
 <translation id="2738871930057338499">Интернэтэд холбогдох боломжгүй байна. HTTP 403 хориотой. Прокси тохируулгаа шалгана уу.</translation>
 <translation id="2742320827292110288">Анхааруулга: Google Chrome өргөтгөлүүдийг таны хөтчийн түүхийг бичихээс хамгаалж чадахгүй. Энэ өргөтгөлийг Нууцлалтай горимд идэвхгүй болгохын тулд энэ сонголтыг болиулна уу.</translation>
+<translation id="2747021967398957654">{count,plural, =1{Таны Chrome-н зарим өгөгдлийг Google Бүртгэлд тань хараахан хадгалаагүй байна. Гарахаасаа өмнө хэдэн минут хүлээж үзнэ үү. Хэрэв та одоо гарвал энэ өгөгдлийг (1 зүйл) устгана.}other{Таны Chrome-н зарим өгөгдлийг Google Бүртгэлд тань хараахан хадгалаагүй байна. Гарахаасаа өмнө хэдэн минут хүлээж үзнэ үү. Хэрэв та одоо гарвал энэ өгөгдлийг ({count} зүйл) устгана.}}</translation>
 <translation id="2753623023919742414">Хайхын тулд товшино уу</translation>
 <translation id="2757826245013442432">{COUNT,plural, =0{Дэвшилтэт хамгаалалт нь шинэчлэлтийг хэрэгжүүлэхийн тулд танаас Chrome-г дахин ачаалахыг шаарддаг}=1{Дэвшилтэт хамгаалалт нь шинэчлэлтийг хэрэгжүүлэхийн тулд танаас Chrome-г дахин ачаалахыг шаарддаг. Таны нууцлалтай цонх дахин нээгдэхгүй.}other{Дэвшилтэт хамгаалалт нь шинэчлэлтийг хэрэгжүүлэхийн тулд танаас Chrome-г дахин ачаалахыг шаарддаг. Таны нууцлалтай # цонх дахин нээгдэхгүй.}}</translation>
 <translation id="2765403129283291972">Энэ сайтыг ашиглахын тулд Chrome-д таны микрофонд хандах зөвшөөрөл шаардлагатай</translation>
@@ -513,6 +513,7 @@
 <translation id="6676384891291319759">Интернэтэд нэвтрэх</translation>
 <translation id="6679975945624592337">Google Chrome-г цаана ажиллуулахыг зөвшөөрөх</translation>
 <translation id="6696915334902295848">Chrome-д энэ сайтад зориулж микрофоны зөвшөөрөл шаардлагатай</translation>
+<translation id="6706525880530967390">{count,plural, =1{Зарим өгөгдлийг таны Google Бүртгэлд хадгалж, бүх төхөөрөмж дээр тань ашиглах боломжтой болохын өмнө Chrome таныг мөн болохыг баталгаажуулах шаардлагатай байна. Хэрэв та одоо гарвал энэ өгөгдлийг (1 зүйл) устгана.}other{Зарим өгөгдлийг таны Google Бүртгэлд хадгалж, бүх төхөөрөмж дээр тань ашиглах боломжтой болохын өмнө Chrome таныг мөн болохыг баталгаажуулах шаардлагатай байна. Хэрэв та одоо гарвал энэ өгөгдлийг ({count} зүйл) устгана.}}</translation>
 <translation id="6712881677154121168">Татахад алдаа гарлаа: <ph name="DOWNLOAD_ERROR" />.</translation>
 <translation id="6718739135284199302">Chrome-г илүү хурдан болгоорой</translation>
 <translation id="6734827584173583205">Та ойрын үед зочлоогүй байна. Chrome <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> болон өөр <ph name="COUNT" /> зөвшөөрлийг хассан.</translation>
@@ -691,7 +692,6 @@
 <translation id="8647930742055103497">Бүх зүйлийг Chrome-д байлгах</translation>
 <translation id="8656634243791296665">Chrome Dev дэх Gemini-г нээх</translation>
 <translation id="8669527147644353129">Google Chrome Туслагч</translation>
-<translation id="8677922833187616101">Google-н ХОУ-ы горимын товчлолыг үргэлж харуулах</translation>
 <translation id="8679801911857917785">Энэ нь мөн таныг Chrome-ыг эхлүүлэх үед гарч ирдэг хуудсыг хянадаг.</translation>
 <translation id="8712637175834984815">Ойлголоо</translation>
 <translation id="8712767363896337380">Шинэчилж дуусаж байна! Шинэчилж дуусгахын тулд Chrome-г дахин ачаална уу.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mr.xtb b/chrome/app/resources/google_chrome_strings_mr.xtb
index d883630..6acaaa6 100644
--- a/chrome/app/resources/google_chrome_strings_mr.xtb
+++ b/chrome/app/resources/google_chrome_strings_mr.xtb
@@ -150,7 +150,6 @@
 <translation id="2681444469812712297">Google Chrome मध्ये नवीन टॅबमध्ये <ph name="URL" /> उघडा.</translation>
 <translation id="2699790011615497488">Chrome बीटा मधील Gemini उघडा</translation>
 <translation id="2712141162840347885">Google Lens वापरून शोधण्यासाठी काहीही निवडा किंवा Google Lens मधून बाहेर पडण्यासाठी एस्केप प्रेस करा</translation>
-<translation id="2723860029395667894">Google AI मोड शॉर्टकट नेहमी दाखवा</translation>
 <translation id="2738871930057338499">इंटरनेटशी कनेक्ट करता आले नाही. HTTP 403 प्रतिबंधित. कृपया तुमचे प्रॉक्सी कॉन्फिगरेशन तपासा.</translation>
 <translation id="2742320827292110288">चेतावणी: Google Chrome हे एक्स्टेंशनला तुमचा ब्राउझिंग इतिहास रेकॉर्ड करण्यापासून रोखू शकत नाही. हे एक्स्टेंशन गुप्त मोडमध्ये बंद करण्यासाठी, या पर्यायाची निवड रद्द करा.</translation>
 <translation id="2753623023919742414">शोधण्यासाठी क्लिक करा</translation>
@@ -688,7 +687,6 @@
 <translation id="8647930742055103497">Chrome मध्ये सर्व गोष्टी ठेवा</translation>
 <translation id="8656634243791296665">Chrome डेव्हलपर मधील Gemini उघडा</translation>
 <translation id="8669527147644353129">Google Chrome मदतनीस</translation>
-<translation id="8677922833187616101">Google AI मोड शॉर्टकट नेहमी दाखवा</translation>
 <translation id="8679801911857917785">तुम्ही Chrome सुरू करता तेव्हा कोणते पेज दर्शविले जाते हेदेखील हे नियंत्रित करते.</translation>
 <translation id="8712637175834984815">समजले</translation>
 <translation id="8712767363896337380">जवळजवळ अप टू डेट! अपडेट करणे पूर्ण करण्यासाठी, Chrome पुन्हा लाँच करा.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ms.xtb b/chrome/app/resources/google_chrome_strings_ms.xtb
index ee9171d0..0d565db 100644
--- a/chrome/app/resources/google_chrome_strings_ms.xtb
+++ b/chrome/app/resources/google_chrome_strings_ms.xtb
@@ -148,7 +148,6 @@
 <translation id="2681444469812712297">Buka <ph name="URL" /> dalam tab baharu dalam Google Chrome.</translation>
 <translation id="2699790011615497488">Buka Gemini dalam Chrome Beta</translation>
 <translation id="2712141162840347885">Pilih apa-apa sahaja untuk mencari dengan Google Lens atau tekan kekunci Esc untuk keluar daripada Google Lens</translation>
-<translation id="2723860029395667894">Sentiasa paparkan pintasan AI Mode Google</translation>
 <translation id="2738871930057338499">Tidak dapat disambungkan kepada Internet. HTTP 403 Dilarang. Sila semak konfigurasi proksi anda.</translation>
 <translation id="2742320827292110288">Amaran: Google Chrome tidak dapat menghalang sambungan daripada merakam sejarah penyemakan imbas anda. Untuk melumpuhkan sambungan ini dalam mod Inkognito, nyahpilih pilihan ini.</translation>
 <translation id="2747021967398957654">{count,plural, =1{Sesetengah data Chrome anda belum disimpan dalam Google Account anda. Tunggu beberapa minit sebelum log keluar. Jika anda log keluar sekarang, data ini (1 item) akan dipadamkan.}other{Sesetengah data Chrome anda belum disimpan dalam Google Account anda. Tunggu beberapa minit sebelum log keluar. Jika anda log keluar sekarang, data ini ({count} item) akan dipadamkan.}}</translation>
@@ -686,7 +685,6 @@
 <translation id="8647930742055103497">Simpan semua perkara dalam Chrome</translation>
 <translation id="8656634243791296665">Buka Gemini dalam Chrome Dev</translation>
 <translation id="8669527147644353129">Pembantu Google Chrome</translation>
-<translation id="8677922833187616101">Sentiasa Paparkan Pintasan AI Mode Google</translation>
 <translation id="8679801911857917785">Sambungan turut mengawal halaman yang ditunjukkan apabila anda memulakan Chrome.</translation>
 <translation id="8712637175834984815">Faham</translation>
 <translation id="8712767363896337380">Kemas kini hampir selesai! Lancarkan semula Chrome untuk menyelesaikan kemas kini.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_my.xtb b/chrome/app/resources/google_chrome_strings_my.xtb
index 34d83a6..7d60f81 100644
--- a/chrome/app/resources/google_chrome_strings_my.xtb
+++ b/chrome/app/resources/google_chrome_strings_my.xtb
@@ -152,7 +152,6 @@
 <translation id="2681444469812712297"><ph name="URL" /> ကို Google Chrome ၌ တဘ်အသစ်တွင် ဖွင့်မည်။</translation>
 <translation id="2699790011615497488">Chrome စမ်းသပ်ဆော့ဖ်ဝဲတွင် Gemini ဖွင့်ပါ</translation>
 <translation id="2712141162840347885">Google Lens ဖြင့် ရှာရန် တစ်ခုခုရွေးပါ (သို့) Google Lens မှ ထွက်ရန် Escape နှိပ်ပါ</translation>
-<translation id="2723860029395667894">‘Google AI မုဒ်’ ဖြတ်လမ်းလင့်ခ်ကို အမြဲပြပါ</translation>
 <translation id="2738871930057338499">အင်တာနက် ချိတ်ဆက်၍ မရပါ။ တားမြစ်ထားသည့်အမှား HTTP 403။ သင့်ပရောက်စီ စီစဉ်သတ်မှတ်ချက်ကို စစ်ဆေးပါ။</translation>
 <translation id="2742320827292110288">သတိပေးချက်- Google Chrome သည် နောက်ဆက်တွဲများက သင်၏ကြည့်ရှုခြင်းမှတ်တမ်းကို မှတ်သားမထားရန် တားမြစ်၍မရပါ။ ရုပ်ဖျက်မုဒ်တွင် ဤနောက်ဆက်တွဲကို ပိတ်ရန်အတွက် ဤရွေးချယ်မှုကို ပြန်ဖြုတ်ပါ။</translation>
 <translation id="2753623023919742414">ရှာဖွေရန် နှိပ်ပါ</translation>
@@ -692,7 +691,6 @@
 <translation id="8647930742055103497">Chrome တွင် အရာအားလုံးကို သိမ်းခြင်း</translation>
 <translation id="8656634243791296665">Chrome Dev တွင် Gemini ဖွင့်ပါ</translation>
 <translation id="8669527147644353129">Google Chrome ကူညီပေးသူ</translation>
-<translation id="8677922833187616101">‘Google AI မုဒ်’ ဖြတ်လမ်းလင့်ခ်ကို အမြဲပြပါ</translation>
 <translation id="8679801911857917785">သင်က Chrome ကို စတင်စဉ် ဘယ်စာမျက်နှာ ပြကြောင်းကိုပါ ၎င်းက ထိန်းချုပ်ပါသည်။</translation>
 <translation id="8712637175834984815">ရပါပြီ!</translation>
 <translation id="8712767363896337380">အပ်ဒိတ်ဖြစ်ပါတော့မည်။ အပ်ဒိတ်လုပ်ခြင်း အပြီးသတ်ရန် Chrome ပြန်ဖွင့်ပါ။</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ne.xtb b/chrome/app/resources/google_chrome_strings_ne.xtb
index de872eb6..f1b6a40 100644
--- a/chrome/app/resources/google_chrome_strings_ne.xtb
+++ b/chrome/app/resources/google_chrome_strings_ne.xtb
@@ -146,7 +146,6 @@
 <translation id="2681444469812712297">Google Chrome को नयाँ ट्याबमा <ph name="URL" /> खोल्नुहोस्।</translation>
 <translation id="2699790011615497488">Chrome बिटामा उपलब्ध Gemini खोल्नुहोस्</translation>
 <translation id="2712141162840347885">Google लेन्स प्रयोग गरी खोज्नका निम्ति जुनसुकै कुरा चयन गर्नुहोस् वा Google लेन्सबाट बाहिरिन इस्केप की थिच्नुहोस्</translation>
-<translation id="2723860029395667894">Google AI मोडको सर्टकट सधैँ देखाउनुहोस्</translation>
 <translation id="2738871930057338499">इन्टरनेटमा कनेक्ट गर्न सकिएन। HTTP ४०३ निषेधित। कृपया आफ्नो प्रोक्सी कन्फिगुरेसन जाँच्नुहोस्।</translation>
 <translation id="2742320827292110288">चेतावनी: Google Chrome ले एक्स्टेन्सनहरूलाई तपाईंको ब्राउजिङ इतिहास रेकर्ड गर्नबाट रोक्न सक्दैन। यो एक्स्टेन्सन इन्कोग्निटो मोडमा अफ गर्न यो विकल्पको चयन रद्द गर्नुहोस्।</translation>
 <translation id="2753623023919742414">खोज्न क्लिक गर्नुहोस्</translation>
@@ -682,7 +681,6 @@
 <translation id="8647930742055103497">Chrome मा सबै कुरा राख्नुहोस्</translation>
 <translation id="8656634243791296665">Chrome Dev मा उपलब्ध Gemini खोल्नुहोस्</translation>
 <translation id="8669527147644353129">Google Chrome सहायक</translation>
-<translation id="8677922833187616101">Google AI मोडको सर्टकट सधैँ देखाउनुहोस्</translation>
 <translation id="8679801911857917785">तपाइँले Chrome सुरु गर्दा कुन पृष्ठ देखाउँछ भनेर पनि यसले नियन्त्रण गर्छ।</translation>
 <translation id="8712637175834984815">भयो</translation>
 <translation id="8712767363896337380">अपडेट गर्ने कार्य लगभग पूरा हुन लाग्यो! अपडेट गर्ने कार्य पूरा गर्न Chrome बन्द गरेर फेरि खोल्नुहोस्।</translation>
diff --git a/chrome/app/resources/google_chrome_strings_nl.xtb b/chrome/app/resources/google_chrome_strings_nl.xtb
index 840f321..90eb7b3 100644
--- a/chrome/app/resources/google_chrome_strings_nl.xtb
+++ b/chrome/app/resources/google_chrome_strings_nl.xtb
@@ -152,7 +152,6 @@
 <translation id="2681444469812712297">Open <ph name="URL" /> op een nieuw tabblad in Google Chrome.</translation>
 <translation id="2699790011615497488">Gemini in Chrome Bèta openen</translation>
 <translation id="2712141162840347885">Selecteer iets om te zoeken met Google Lens of druk op Escape om Google Lens te sluiten</translation>
-<translation id="2723860029395667894">Snelkoppeling voor AI-modus van Google altijd tonen</translation>
 <translation id="2738871930057338499">Kan geen verbinding maken met internet. HTTP 403 Verboden. Check je proxyconfiguratie.</translation>
 <translation id="2742320827292110288">Waarschuwing: Google Chrome kan niet voorkomen dat extensies je browsegeschiedenis registreren. Als je deze extensie in de incognitomodus wilt uitzetten, vink je deze optie uit.</translation>
 <translation id="2753623023919742414">Klik om te zoeken</translation>
@@ -689,7 +688,6 @@
 <translation id="8647930742055103497">Alles in Chrome houden</translation>
 <translation id="8656634243791296665">Gemini in Chrome Dev openen</translation>
 <translation id="8669527147644353129">Google Chrome Helper</translation>
-<translation id="8677922833187616101">Snelkoppeling voor AI-modus van Google altijd tonen</translation>
 <translation id="8679801911857917785">Hiermee wordt ook gecontroleerd welke pagina wordt getoond wanneer je Chrome start.</translation>
 <translation id="8712637175834984815">Begrepen</translation>
 <translation id="8712767363896337380">Bijna klaar met updaten. Start Chrome opnieuw om de update af te ronden.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_no.xtb b/chrome/app/resources/google_chrome_strings_no.xtb
index 4b32792..71146b93 100644
--- a/chrome/app/resources/google_chrome_strings_no.xtb
+++ b/chrome/app/resources/google_chrome_strings_no.xtb
@@ -148,9 +148,9 @@
 <translation id="2681444469812712297">Åpne <ph name="URL" /> i en ny fane i Google Chrome.</translation>
 <translation id="2699790011615497488">Åpne Gemini i Chrome Beta</translation>
 <translation id="2712141162840347885">Velg hva som helst for å søke med Google Lens, eller trykk på Esc for å avslutte Google Lens</translation>
-<translation id="2723860029395667894">Vis alltid snarveien til AI-modus fra Google</translation>
 <translation id="2738871930057338499">Kan ikke koble til internett. HTTP 403 – forbudt. Kontroller proxy-tjenerkonfigurasjonen.</translation>
 <translation id="2742320827292110288">Advarsel: Google Chrome kan ikke forhindre utvidelser fra å registrere nettleserloggen din. For å deaktivere denne utvidelsen i Inkognitomodus, fjern merkingen for dette alternativet.</translation>
+<translation id="2747021967398957654">{count,plural, =1{Noen av Chrome-dataene dine er ikke lagret i Google-kontoen din ennå. Prøv å vente i noen minutter før du logger av. Hvis du logger av nå, slettes disse dataene (1 element).}other{Noen av Chrome-dataene dine er ikke lagret i Google-kontoen din ennå. Prøv å vente i noen minutter før du logger av. Hvis du logger av nå, slettes disse dataene ({count} elementer).}}</translation>
 <translation id="2753623023919742414">Klikk for å søke</translation>
 <translation id="2757826245013442432">{COUNT,plural, =0{Avansert beskyttelse krever at du starter Chrome på nytt for å ta i bruk en oppdatering}=1{Avansert beskyttelse krever at du starter Chrome på nytt for å ta i bruk en oppdatering. Inkognitovinduet ditt blir ikke gjenåpnet.}other{Avansert beskyttelse krever at du starter Chrome på nytt for å ta i bruk en oppdatering. Dine # inkognitovinduer gjenåpnes ikke.}}</translation>
 <translation id="2765403129283291972">Chrome trenger tilgang til mikrofonen din for dette nettstedet</translation>
@@ -506,6 +506,7 @@
 <translation id="6676384891291319759">Gå til Internett</translation>
 <translation id="6679975945624592337">La Google Chrome kjøre i bakgrunnen</translation>
 <translation id="6696915334902295848">Chrome trenger mikrofontillatelse for dette nettstedet</translation>
+<translation id="6706525880530967390">{count,plural, =1{Chrome må bekrefte at det er deg, før enkelte data kan lagres i Google-kontoen din og brukes på alle enhetene dine. Hvis du logger av nå, slettes disse dataene (1 element).}other{Chrome må bekrefte at det er deg, før enkelte data kan lagres i Google-kontoen din og brukes på alle enhetene dine. Hvis du logger av nå, slettes disse dataene ({count} elementer).}}</translation>
 <translation id="6712881677154121168">Nedlastingsfeil: <ph name="DOWNLOAD_ERROR" />.</translation>
 <translation id="6718739135284199302">Gjør Chrome raskere</translation>
 <translation id="6734827584173583205">Du har ikke vært her i det siste. Chrome har fjernet <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> og <ph name="COUNT" /> til</translation>
@@ -684,7 +685,6 @@
 <translation id="8647930742055103497">Hold alt i Chrome</translation>
 <translation id="8656634243791296665">Åpne Gemini i Chrome Dev</translation>
 <translation id="8669527147644353129">Google Chrome-hjelper</translation>
-<translation id="8677922833187616101">Vis alltid snarveien til AI-modus fra Google</translation>
 <translation id="8679801911857917785">Den styrer også hvilken side som vises når du starter Chrome.</translation>
 <translation id="8712637175834984815">Skjønner</translation>
 <translation id="8712767363896337380">Nesten ferdig oppdatert! Start Chrome på nytt for å fullføre oppdateringen.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_or.xtb b/chrome/app/resources/google_chrome_strings_or.xtb
index 4fdecdd..e89ed03 100644
--- a/chrome/app/resources/google_chrome_strings_or.xtb
+++ b/chrome/app/resources/google_chrome_strings_or.xtb
@@ -152,7 +152,6 @@
 <translation id="2681444469812712297">Chromeରେ ଏକ ନୂଆ ଟାବରେ <ph name="URL" /> ଖୋଲନ୍ତୁ।</translation>
 <translation id="2699790011615497488">Chrome ବିଟାରେ Gemini ଖୋଲନ୍ତୁ</translation>
 <translation id="2712141162840347885">Google Lens ସହ ସର୍ଚ୍ଚ କରିବା ପାଇଁ ଯେ କୌଣସି ବିଷୟକୁ ଚୟନ କରନ୍ତୁ କିମ୍ବା Google Lensରୁ ବାହାରି ଯିବା ପାଇଁ ଏସକେପ କୀ'କୁ ଦବାନ୍ତୁ</translation>
-<translation id="2723860029395667894">ସର୍ବଦା Google AI ମୋଡ ସର୍ଟକଟ ଦେଖାନ୍ତୁ</translation>
 <translation id="2738871930057338499">ଇଣ୍ଟରନେଟ ସହ କନେକ୍ଟ କରିବାରେ ଅସମର୍ଥ। HTTP 403 ନିଷିଦ୍ଧ। ଦୟାକରି ଆପଣଙ୍କ ପ୍ରକ୍ସି କନଫିଗରେସନ ଯାଞ୍ଚ କରନ୍ତୁ।</translation>
 <translation id="2742320827292110288">ଚେତାବନୀ: Google Chrome କୌଣସି ଏକ୍ସଟେନସନକୁ ଆପଣଙ୍କ ବ୍ରାଉଜିଂ ଇତିହାସ ରେକର୍ଡ କରିବାରୁ ପ୍ରତିରୋଧ କରିପାରିବ ନାହିଁ। ଇନକଗ୍ନିଟୋ ମୋଡରେ ଏହି ଏକ୍ସଟେନସନକୁ ଅକ୍ଷମ କରିବା ପାଇଁ, ଏହି ବିକଳ୍ପକୁ ଅଚୟନ କରନ୍ତୁ।</translation>
 <translation id="2753623023919742414">ସର୍ଚ୍ଚ କରିବାକୁ କ୍ଲିକ କରନ୍ତୁ</translation>
@@ -691,7 +690,6 @@
 <translation id="8647930742055103497">Chromeରେ ସବୁକିଛି ରଖନ୍ତୁ</translation>
 <translation id="8656634243791296665">Chrome Devରେ Gemini ଖୋଲନ୍ତୁ</translation>
 <translation id="8669527147644353129">Google Chrome ସାହାଯ୍ୟକାରୀ</translation>
-<translation id="8677922833187616101">ସର୍ବଦା Google AI ମୋଡ ସର୍ଟକଟ ଦେଖାନ୍ତୁ</translation>
 <translation id="8679801911857917785">ଏଥିରୁ ଏହା ମଧ୍ୟ ନିୟନ୍ତ୍ରଣ ହୋ‍ଇଥାଏ ଯେ ଯେତେବେଳେ ଆପଣ Chrome ଆରମ୍ଭ କରନ୍ତି, ସେତେବେଳେ କେଉଁ ପୃଷ୍ଠା ଦେଖାଯିବ।</translation>
 <translation id="8712637175834984815">ବୁଝିଗଲି</translation>
 <translation id="8712767363896337380">ପ୍ରାୟ ଅପ ଟୁ ଡେଟ! ଅପଡେଟ ସମ୍ପୂର୍ଣ୍ଣ କରିବା ପାଇଁ Chromeକୁ ପୁଣି ଲଞ୍ଚ କରନ୍ତୁ।</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pa.xtb b/chrome/app/resources/google_chrome_strings_pa.xtb
index 99b164bc2..37f47f8 100644
--- a/chrome/app/resources/google_chrome_strings_pa.xtb
+++ b/chrome/app/resources/google_chrome_strings_pa.xtb
@@ -152,9 +152,9 @@
 <translation id="2681444469812712297">Google Chrome ਵਿੱਚ ਨਵੀਂ ਟੈਬ ਵਿੱਚ <ph name="URL" /> ਖੋਲ੍ਹੋ।</translation>
 <translation id="2699790011615497488">Chrome ਬੀਟਾ ਵਿੱਚ Gemini ਨੂੰ ਖੋਲ੍ਹੋ</translation>
 <translation id="2712141162840347885">Google Lens ਨਾਲ ਖੋਜਣ ਲਈ ਕੁਝ ਵੀ ਚੁਣੋ ਜਾਂ Google Lens ਤੋਂ ਬਾਹਰ ਜਾਣ ਕਰਨ Escape ਦਬਾਓ</translation>
-<translation id="2723860029395667894">ਹਮੇਸ਼ਾਂ Google AI ਮੋਡ ਸ਼ਾਰਟਕੱਟ ਦਿਖਾਓ</translation>
 <translation id="2738871930057338499">ਇੰਟਰਨੈੱਟ ਨਾਲ ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। HTTP 403 ਪਾਬੰਦੀਸ਼ੁਦਾ। ਕਿਰਪਾ ਕਰਕੇ ਆਪਣੇ ਪ੍ਰੌਕਸੀ ਸੰਰੂਪਣ ਦੀ ਜਾਂਚ ਕਰੋ।</translation>
 <translation id="2742320827292110288">ਚਿਤਾਵਨੀ: Google Chrome ਐਕਸਟੈਂਸ਼ਨਾਂ ਨੂੰ ਤੁਹਾਡੇ ਬ੍ਰਾਊਜ਼ਿੰਗ ਇਤਿਹਾਸ ਨੂੰ ਰਿਕਾਰਡ ਕਰਨ ਤੋਂ ਨਹੀਂ ਰੋਕ ਸਕਦਾ। ਇਨਕੋਗਨਿਟੋ ਮੋਡ ਵਿੱਚ ਇਸ ਐਕਸਟੈਂਸ਼ਨ ਨੂੰ ਬੰਦ ਕਰਨ ਲਈ, ਇਸ ਵਿਕਲਪ ਨੂੰ ਅਣਚੁਣਿਆ ਕਰੋ।</translation>
+<translation id="2747021967398957654">{count,plural, =1{ਤੁਹਾਡੇ ਕੁਝ Chrome ਡਾਟੇ ਨੂੰ ਹਾਲੇ ਤੁਹਾਡੇ Google ਖਾਤੇ ਵਿੱਚ ਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤਾ ਗਿਆ ਹੈ। ਸਾਈਨ-ਆਊਟ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਕੁਝ ਮਿੰਟਾਂ ਦੀ ਉਡੀਕ ਕਰ ਕੇ ਦੇਖੋ। ਜੇ ਤੁਸੀਂ ਹੁਣੇ ਸਾਈਨ-ਆਊਟ ਕਰਦੇ ਹੋ, ਤਾਂ ਇਸ ਡਾਟੇ (1 ਆਈਟਮ) ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।}one{ਤੁਹਾਡੇ ਕੁਝ Chrome ਡਾਟੇ ਨੂੰ ਹਾਲੇ ਤੁਹਾਡੇ Google ਖਾਤੇ ਵਿੱਚ ਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤਾ ਗਿਆ ਹੈ। ਸਾਈਨ-ਆਊਟ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਕੁਝ ਮਿੰਟਾਂ ਦੀ ਉਡੀਕ ਕਰ ਕੇ ਦੇਖੋ। ਜੇ ਤੁਸੀਂ ਹੁਣੇ ਸਾਈਨ-ਆਊਟ ਕਰਦੇ ਹੋ, ਤਾਂ ਇਸ ਡਾਟੇ ({count} ਆਈਟਮ) ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।}other{ਤੁਹਾਡੇ ਕੁਝ Chrome ਡਾਟੇ ਨੂੰ ਹਾਲੇ ਤੁਹਾਡੇ Google ਖਾਤੇ ਵਿੱਚ ਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤਾ ਗਿਆ ਹੈ। ਸਾਈਨ-ਆਊਟ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਕੁਝ ਮਿੰਟਾਂ ਦੀ ਉਡੀਕ ਕਰ ਕੇ ਦੇਖੋ। ਜੇ ਤੁਸੀਂ ਹੁਣੇ ਸਾਈਨ-ਆਊਟ ਕਰਦੇ ਹੋ, ਤਾਂ ਇਸ ਡਾਟੇ ({count} ਆਈਟਮਾਂ) ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।}}</translation>
 <translation id="2753623023919742414">ਖੋਜਣ ਲਈ ਕਲਿੱਕ ਕਰੋ</translation>
 <translation id="2757826245013442432">{COUNT,plural, =0{ਅੱਪਡੇਟ ਲਾਗੂ ਕਰਨ ਲਈ, ਅਡਵਾਂਸ ਸੁਰੱਖਿਆ ਵਾਸਤੇ ਇਹ ਲੋੜੀਂਦਾ ਹੈ ਕਿ ਤੁਸੀਂ Chrome ਨੂੰ ਮੁੜ-ਲਾਂਚ ਕਰੋ}=1{ਅੱਪਡੇਟ ਲਾਗੂ ਕਰਨ ਲਈ, ਅਡਵਾਂਸ ਸੁਰੱਖਿਆ ਵਾਸਤੇ ਇਹ ਲੋੜੀਂਦਾ ਹੈ ਕਿ ਤੁਸੀਂ Chrome ਨੂੰ ਮੁੜ-ਲਾਂਚ ਕਰੋ। ਤੁਹਾਡੀ ਇਨਕੋਗਨਿਟੋ ਵਿੰਡੋ ਮੁੜ ਨਹੀਂ ਖੁੱਲ੍ਹੇਗੀ।}other{ਅੱਪਡੇਟ ਲਾਗੂ ਕਰਨ ਲਈ, ਅਡਵਾਂਸ ਸੁਰੱਖਿਆ ਵਾਸਤੇ ਇਹ ਲੋੜੀਂਦਾ ਹੈ ਕਿ ਤੁਸੀਂ Chrome ਨੂੰ ਮੁੜ-ਲਾਂਚ ਕਰੋ। ਤੁਹਾਡੀਆਂ # ਇਨਕੋਗਨਿਟੋ ਵਿੰਡੋਆਂ ਮੁੜ ਨਹੀਂ ਖੁੱਲ੍ਹਣਗੀਆਂ।}}</translation>
 <translation id="2765403129283291972">Chrome ਨੂੰ ਇਸ ਸਾਈਟ ਵਾਸਤੇ ਤੁਹਾਡੇ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਲਈ ਇਜਾਜ਼ਤ ਦੀ ਲੋੜ ਹੈ</translation>
@@ -514,6 +514,7 @@
 <translation id="6676384891291319759">ਇੰਟਰਨੈਟ ਤੱਕ ਪਹੁੰਚੋ</translation>
 <translation id="6679975945624592337">Google Chrome ਨੂੰ ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚੱਲਣ ਦਿਓ</translation>
 <translation id="6696915334902295848">Chrome ਨੂੰ ਇਸ ਸਾਈਟ ਲਈ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਇਜਾਜ਼ਤ ਦੀ ਲੋੜ ਹੈ</translation>
+<translation id="6706525880530967390">{count,plural, =1{ਇਸ ਤੋਂ ਪਹਿਲਾਂ ਕਿ ਕੁਝ ਡਾਟੇ ਨੂੰ ਤੁਹਾਡੇ Google ਖਾਤੇ 'ਤੇ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾ ਸਕੇ ਅਤੇ ਤੁਹਾਡੇ ਸਾਰੇ ਡੀਵਾਈਸਾਂ 'ਤੇ ਵਰਤਿਆ ਜਾ ਸਕੇ, Chrome ਨੂੰ ਤੁਹਾਡੀ ਪਛਾਣ ਦੀ ਪੁਸ਼ਟੀ ਕਰਨ ਦੀ ਲੋੜ ਹੈ। ਜੇ ਤੁਸੀਂ ਹੁਣੇ ਸਾਈਨ-ਆਊਟ ਕਰਦੇ ਹੋ, ਤਾਂ ਇਸ ਡਾਟੇ (1 ਆਈਟਮ) ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।}one{ਇਸ ਤੋਂ ਪਹਿਲਾਂ ਕਿ ਕੁਝ ਡਾਟੇ ਨੂੰ ਤੁਹਾਡੇ Google ਖਾਤੇ 'ਤੇ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾ ਸਕੇ ਅਤੇ ਤੁਹਾਡੇ ਸਾਰੇ ਡੀਵਾਈਸਾਂ 'ਤੇ ਵਰਤਿਆ ਜਾ ਸਕੇ, Chrome ਨੂੰ ਤੁਹਾਡੀ ਪਛਾਣ ਦੀ ਪੁਸ਼ਟੀ ਕਰਨ ਦੀ ਲੋੜ ਹੈ। ਜੇ ਤੁਸੀਂ ਹੁਣੇ ਸਾਈਨ-ਆਊਟ ਕਰਦੇ ਹੋ, ਤਾਂ ਇਸ ਡਾਟੇ ({count} ਆਈਟਮ) ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।}other{ਇਸ ਤੋਂ ਪਹਿਲਾਂ ਕਿ ਕੁਝ ਡਾਟੇ ਨੂੰ ਤੁਹਾਡੇ Google ਖਾਤੇ 'ਤੇ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾ ਸਕੇ ਅਤੇ ਤੁਹਾਡੇ ਸਾਰੇ ਡੀਵਾਈਸਾਂ 'ਤੇ ਵਰਤਿਆ ਜਾ ਸਕੇ, Chrome ਨੂੰ ਤੁਹਾਡੀ ਪਛਾਣ ਦੀ ਪੁਸ਼ਟੀ ਕਰਨ ਦੀ ਲੋੜ ਹੈ। ਜੇ ਤੁਸੀਂ ਹੁਣੇ ਸਾਈਨ-ਆਊਟ ਕਰਦੇ ਹੋ, ਤਾਂ ਇਸ ਡਾਟੇ ({count} ਆਈਟਮਾਂ) ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।}}</translation>
 <translation id="6712881677154121168">ਡਾਊਨਲੋਡ ਸੰਬੰਧੀ ਗੜਬੜ: <ph name="DOWNLOAD_ERROR" />।</translation>
 <translation id="6718739135284199302">Chrome ਨੂੰ ਵਧੇਰੇ ਤੇਜ਼ ਬਣਾਓ</translation>
 <translation id="6734827584173583205">ਜਿਨ੍ਹਾਂ 'ਤੇ ਤੁਸੀਂ ਹਾਲ ਹੀ ਵਿੱਚ ਨਹੀਂ ਗਏ ਹੋ। Chrome ਨੇ <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ਅਤੇ <ph name="COUNT" /> ਹੋਰ ਨੂੰ ਹਟਾ ਦਿੱਤਾ ਹੈ।</translation>
@@ -692,7 +693,6 @@
 <translation id="8647930742055103497">ਸਭ ਕੁਝ Chrome ਵਿੱਚ ਰੱਖੋ</translation>
 <translation id="8656634243791296665">Chrome Dev ਵਿੱਚ Gemini ਨੂੰ ਖੋਲ੍ਹੋ</translation>
 <translation id="8669527147644353129">Google Chrome ਸਹਾਇਕ</translation>
-<translation id="8677922833187616101">ਹਮੇਸ਼ਾਂ Google AI ਮੋਡ ਸ਼ਾਰਟਕੱਟ ਦਿਖਾਓ</translation>
 <translation id="8679801911857917785">ਇਹ ਇਸ ਨੂੰ ਵੀ ਕੰਟਰੋਲ ਕਰਦਾ ਹੈ ਕਿ ਜਦੋਂ ਤੁਸੀਂ Chrome ਨੂੰ ਸ਼ੁਰੂ ਕਰਦੇ ਹੋ ਤਾਂ ਕਿਹੜਾ ਪੰਨਾ ਦਿਖਾਇਆ ਜਾਵੇ।</translation>
 <translation id="8712637175834984815">ਸਮਝ ਲਿਆ</translation>
 <translation id="8712767363896337380">ਲਗਭਗ ਅੱਪ-ਟੂ-ਡੇਟ! ਅੱਪਡੇਟ ਨੂੰ ਪੂਰਾ ਕਰਨ ਲਈ Chrome ਨੂੰ ਮੁੜ-ਲਾਂਚ ਕਰੋ।</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pl.xtb b/chrome/app/resources/google_chrome_strings_pl.xtb
index 30e5118..848895d 100644
--- a/chrome/app/resources/google_chrome_strings_pl.xtb
+++ b/chrome/app/resources/google_chrome_strings_pl.xtb
@@ -148,7 +148,6 @@
 <translation id="2681444469812712297">Otwórz nową kartę <ph name="URL" /> w Google Chrome.</translation>
 <translation id="2699790011615497488">Otwórz Gemini w Chrome Beta</translation>
 <translation id="2712141162840347885">Wybierz, co chcesz wyszukać go za pomocą Obiektywu Google, lub naciśnij Escape, aby zamknąć Obiektyw</translation>
-<translation id="2723860029395667894">Zawsze pokazuj skrót do trybu AI od Google</translation>
 <translation id="2738871930057338499">Nie można połączyć się z internetem. Kod HTTP 403 (Zabroniony). Sprawdź konfigurację proxy.</translation>
 <translation id="2742320827292110288">Ostrzeżenie: Google Chrome nie może uniemożliwić rozszerzeniom zapisywania historii przeglądania. Aby wyłączyć to rozszerzenie w trybie incognito, odznacz tę opcję.</translation>
 <translation id="2747021967398957654">{count,plural, =1{Niektóre dane z Chrome nie zostały jeszcze zapisane na Twoim koncie Google. Zanim się wylogujesz, odczekaj kilka minut. Jeśli wylogujesz się teraz, te dane (1 element) zostaną usunięte.}few{Niektóre dane z Chrome nie zostały jeszcze zapisane na Twoim koncie Google. Zanim się wylogujesz, odczekaj kilka minut. Jeśli wylogujesz się teraz, te dane ({count} elementy) zostaną usunięte.}many{Niektóre dane z Chrome nie zostały jeszcze zapisane na Twoim koncie Google. Zanim się wylogujesz, odczekaj kilka minut. Jeśli wylogujesz się teraz, te dane ({count} elementów) zostaną usunięte.}other{Niektóre dane z Chrome nie zostały jeszcze zapisane na Twoim koncie Google. Zanim się wylogujesz, odczekaj kilka minut. Jeśli wylogujesz się teraz, te dane ({count} elementu) zostaną usunięte.}}</translation>
@@ -685,7 +684,6 @@
 <translation id="8647930742055103497">Przechowuj wszystko w Chrome</translation>
 <translation id="8656634243791296665">Otwórz Gemini w wersji deweloperskiej Chrome</translation>
 <translation id="8669527147644353129">Pomoc Google Chrome</translation>
-<translation id="8677922833187616101">Zawsze pokazuj skrót do trybu AI od Google</translation>
 <translation id="8679801911857917785">Kontroluje także to, jaka strona wyświetla się po uruchomieniu Chrome.</translation>
 <translation id="8712637175834984815">OK</translation>
 <translation id="8712767363896337380">Prawie gotowe. Aby dokończyć aktualizowanie, uruchom ponownie Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pt-BR.xtb b/chrome/app/resources/google_chrome_strings_pt-BR.xtb
index 215d602f..367f9fe 100644
--- a/chrome/app/resources/google_chrome_strings_pt-BR.xtb
+++ b/chrome/app/resources/google_chrome_strings_pt-BR.xtb
@@ -148,7 +148,6 @@
 <translation id="2681444469812712297">Abrir <ph name="URL" /> em uma nova guia do Google Chrome.</translation>
 <translation id="2699790011615497488">Abrir o Gemini no Chrome Beta</translation>
 <translation id="2712141162840347885">Selecione o que quiser para pesquisar com o Google Lens ou pressione "Esc" para sair</translation>
-<translation id="2723860029395667894">Sempre mostrar o atalho do Modo IA do Google</translation>
 <translation id="2738871930057338499">Não foi possível conectar à Internet. HTTP 403 Proibido. Verifique sua configuração do proxy.</translation>
 <translation id="2742320827292110288">Aviso: o Google Chrome não pode impedir que as extensões registrem seu histórico de navegação. Para desativar a extensão no modo de navegação anônima, desmarque esta opção.</translation>
 <translation id="2753623023919742414">Clique para pesquisar</translation>
@@ -684,7 +683,6 @@
 <translation id="8647930742055103497">Organize tudo no Chrome</translation>
 <translation id="8656634243791296665">Abrir o Gemini no Chrome Dev</translation>
 <translation id="8669527147644353129">Auxiliar do Google Chrome</translation>
-<translation id="8677922833187616101">Sempre mostrar o atalho do Modo IA do Google</translation>
 <translation id="8679801911857917785">Controla também qual página deve ser exibida quando você inicia o Chrome.</translation>
 <translation id="8712637175834984815">Entendi</translation>
 <translation id="8712767363896337380">Falta pouco para a atualização terminar. Reinicie o Chrome para concluir.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pt-PT.xtb b/chrome/app/resources/google_chrome_strings_pt-PT.xtb
index 08e86c2..22cc69a 100644
--- a/chrome/app/resources/google_chrome_strings_pt-PT.xtb
+++ b/chrome/app/resources/google_chrome_strings_pt-PT.xtb
@@ -148,7 +148,6 @@
 <translation id="2681444469812712297">Abra <ph name="URL" /> num novo separador no Google Chrome.</translation>
 <translation id="2699790011615497488">Abra o Gemini no Chrome Beta</translation>
 <translation id="2712141162840347885">Selecione o que quer pesquisar com o Google Lens ou prima a tecla Escape para sair do Google Lens</translation>
-<translation id="2723860029395667894">Mostrar sempre o atalho do Modo IA da Google</translation>
 <translation id="2738871930057338499">Não é possível ligar à Internet. HTTP 403 proibido. Verifique a sua configuração de proxy.</translation>
 <translation id="2742320827292110288">Aviso: o Google Chrome não pode impedir que as extensões gravem o seu histórico de navegação. Para desativar esta extensão no Modo de navegação anónima, desselecione esta opção.</translation>
 <translation id="2747021967398957654">{count,plural, =1{Alguns dos seus dados do Chrome ainda não foram guardados na sua Conta Google. Experimente aguardar alguns minutos antes de terminar sessão. Se terminar sessão agora, estes dados (1 item) são eliminados.}other{Alguns dos seus dados do Chrome ainda não foram guardados na sua Conta Google. Experimente aguardar alguns minutos antes de terminar sessão. Se terminar sessão agora, estes dados ({count} itens) vão ser eliminados.}}</translation>
@@ -686,7 +685,6 @@
 <translation id="8647930742055103497">Mantenha tudo no Chrome</translation>
 <translation id="8656634243791296665">Abra o Gemini no Chrome Dev</translation>
 <translation id="8669527147644353129">Ajudante do Google Chrome</translation>
-<translation id="8677922833187616101">Mostrar sempre o atalho do Modo IA da Google</translation>
 <translation id="8679801911857917785">Também controla a página apresentada quando inicia o Chrome.</translation>
 <translation id="8712637175834984815">OK</translation>
 <translation id="8712767363896337380">Quase atualizado! Reinicie o Chrome para concluir a atualização.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ro.xtb b/chrome/app/resources/google_chrome_strings_ro.xtb
index 72fd150..d3571942 100644
--- a/chrome/app/resources/google_chrome_strings_ro.xtb
+++ b/chrome/app/resources/google_chrome_strings_ro.xtb
@@ -148,7 +148,6 @@
 <translation id="2681444469812712297">Deschide <ph name="URL" /> într-o filă nouă în Google Chrome.</translation>
 <translation id="2699790011615497488">Deschide Gemini în Chrome Beta</translation>
 <translation id="2712141162840347885">Selectează orice vrei să cauți cu Google Lens sau apasă Escape pentru a ieși din Google Lens</translation>
-<translation id="2723860029395667894">Afișează întotdeauna comanda rapidă pentru Modul Google AI</translation>
 <translation id="2738871930057338499">Nu se poate realiza conexiunea la internet. HTTP Eroare 403 – Acces interzis. Verifică-ți configurația de proxy.</translation>
 <translation id="2742320827292110288">Avertisment: Google Chrome nu poate împiedica extensiile să înregistreze istoricul navigării. Pentru a dezactiva această extensie în modul incognito, debifează această opțiune.</translation>
 <translation id="2753623023919742414">Dă clic pentru a căuta</translation>
@@ -684,7 +683,6 @@
 <translation id="8647930742055103497">Păstrează totul în Chrome</translation>
 <translation id="8656634243791296665">Deschide Gemini în Chrome Dev</translation>
 <translation id="8669527147644353129">Google Chrome Helper</translation>
-<translation id="8677922833187616101">Afișează întotdeauna comanda rapidă pentru Modul Google AI</translation>
 <translation id="8679801911857917785">Stabilește și ce pagină se afișează când porniți Chrome.</translation>
 <translation id="8712637175834984815">Am înțeles</translation>
 <translation id="8712767363896337380">Actualizarea este aproape gata! Relansează Chrome pentru a finaliza actualizarea.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ru.xtb b/chrome/app/resources/google_chrome_strings_ru.xtb
index 436ca63..4ef9e8f 100644
--- a/chrome/app/resources/google_chrome_strings_ru.xtb
+++ b/chrome/app/resources/google_chrome_strings_ru.xtb
@@ -148,7 +148,6 @@
 <translation id="2681444469812712297">Открыть <ph name="URL" /> в новой вкладке в Google Chrome.</translation>
 <translation id="2699790011615497488">Открыть Gemini в бета-версии Chrome</translation>
 <translation id="2712141162840347885">Выберите что-нибудь для поиска с помощью Google Объектива. Что закрыть его, нажмите клавишу Esc.</translation>
-<translation id="2723860029395667894">Всегда показывать ярлык режима ИИ от Google</translation>
 <translation id="2738871930057338499">Не удалось подключиться к интернету. Ошибка HTTP 403: доступ запрещен. Проверьте настройки прокси-сервера.</translation>
 <translation id="2742320827292110288">Внимание! Google Chrome не может запретить расширениям записывать историю браузера. Чтобы отключить это расширение в режиме инкогнито, снимите этот флажок.</translation>
 <translation id="2747021967398957654">{count,plural, =1{Некоторые данные Chrome ещё не сохранены в аккаунте Google. Подождите несколько минут. Если вы выйдете прямо сейчас, эти данные (1 объект) будут удалены.}one{Некоторые данные Chrome ещё не сохранены в аккаунте Google. Подождите несколько минут. Если вы выйдете прямо сейчас, эти данные ({count} объект) будут удалены.}few{Некоторые данные Chrome ещё не сохранены в аккаунте Google. Подождите несколько минут. Если вы выйдете прямо сейчас, эти данные ({count} объекта) будут удалены.}many{Некоторые данные Chrome ещё не сохранены в аккаунте Google. Подождите несколько минут. Если вы выйдете прямо сейчас, эти данные ({count} объектов) будут удалены.}other{Некоторые данные Chrome ещё не сохранены в аккаунте Google. Подождите несколько минут. Если вы выйдете прямо сейчас, эти данные ({count} объекта) будут удалены.}}</translation>
@@ -685,7 +684,6 @@
 <translation id="8647930742055103497">Храните все в Chrome</translation>
 <translation id="8656634243791296665">Открыть Gemini в Chrome для разработчиков</translation>
 <translation id="8669527147644353129">Google Chrome Helper</translation>
-<translation id="8677922833187616101">Всегда показывать ярлык режима ИИ от Google</translation>
 <translation id="8679801911857917785">Кроме того, расширение изменило стартовую страницу Chrome.</translation>
 <translation id="8712637175834984815">OK</translation>
 <translation id="8712767363896337380">Почти готово! Чтобы завершить обновление, перезапустите Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_si.xtb b/chrome/app/resources/google_chrome_strings_si.xtb
index 427589e..8732522a 100644
--- a/chrome/app/resources/google_chrome_strings_si.xtb
+++ b/chrome/app/resources/google_chrome_strings_si.xtb
@@ -152,7 +152,6 @@
 <translation id="2681444469812712297">Google Chrome තුළ නව පටිත්තක් තුළ <ph name="URL" /> විවෘත කරන්න.</translation>
 <translation id="2699790011615497488">Chrome බීටා හි Gemini විවෘත කරන්න</translation>
 <translation id="2712141162840347885">Google Lens සමග සෙවීමට කිසිවක් තෝරන්න හෝ Google Lens වෙතින් පිටවීමට Escape ඔබන්න</translation>
-<translation id="2723860029395667894">සැම විටම Google AI මාදිලි කෙටිමඟ පෙන්වන්න</translation>
 <translation id="2738871930057338499">අන්තර්ජාලය වෙත සම්බන්ධ වීමට නොහැකි වේ. HTTP 403 තහනම්. ඔබේ ප්‍රොක්සි වින්‍යාසය පරීක්ෂා කරන්න.</translation>
 <translation id="2742320827292110288">අනතුරු ඇඟවීමයි: Google Chrome හට ඔබගේ බ්‍රවුස් කිරීමේ ඉතිහාසය පටිගත කිරීමෙන් දිගු වැළැක්විය නොහැකිය. මෙම දිගුව අප්‍රසිද්ධ ප්‍රකාරය තුළ අබල කිරීමට, මෙම විකල්පය තේරීම ඉවත් කරන්න.</translation>
 <translation id="2753623023919742414">සෙවීමට ක්ලික් කරන්න</translation>
@@ -691,7 +690,6 @@
 <translation id="8647930742055103497">සියල්ල Chrome තුළ තබා ගන්න</translation>
 <translation id="8656634243791296665">Chrome සංවර්ධක හි Gemini විවෘත කරන්න</translation>
 <translation id="8669527147644353129">Google Chrome උදව් කරන්නා</translation>
-<translation id="8677922833187616101">සැම විටම Google AI මාදිලි කෙටිමඟ පෙන්වන්න</translation>
 <translation id="8679801911857917785">තවද එය ඔබ Chrome ආරම්භයේදී දකින පිටුවද වෙනස් කරයි.</translation>
 <translation id="8712637175834984815">එය ලැබුණා</translation>
 <translation id="8712767363896337380">බොහෝ දුරට යාවත්කාලීනයි! යාවත්කාලීනය අවසන් කිරීමට Chrome යළි දියත් කරන්න.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sk.xtb b/chrome/app/resources/google_chrome_strings_sk.xtb
index 948dfa9..f6309cf 100644
--- a/chrome/app/resources/google_chrome_strings_sk.xtb
+++ b/chrome/app/resources/google_chrome_strings_sk.xtb
@@ -150,9 +150,9 @@
 <translation id="2681444469812712297">Otvorte <ph name="URL" /> na novej karte v prehliadači Google Chrome.</translation>
 <translation id="2699790011615497488">Otvoriť Gemini v Chrome Beta</translation>
 <translation id="2712141162840347885">Vyberte niečo na vyhľadávanie pomocou funkcie Google Lens alebo stlačením klávesa Escape Google Lens zavrite</translation>
-<translation id="2723860029395667894">Vždy zobrazovať odkaz na režim AI od Googlu</translation>
 <translation id="2738871930057338499">Nepodarilo sa pripojiť k internetu. Chyba odmietnutia prístupu HTTP 403. Skontrolujte konfiguráciu servera proxy.</translation>
 <translation id="2742320827292110288">Upozornenie: Google Chrome nemôže zabrániť rozšíreniam v zaznamenávaní vašej histórie prehliadania. Ak chcete dané rozšírenie v režime inkognito zakázať, zrušte výber tejto možnosti.</translation>
+<translation id="2747021967398957654">{count,plural, =1{Niektoré údaje Chromu zatiaľ neboli uložené vo vašom účte Google. Pred odhlásením skúste počkať niekoľko minút. Ak sa odhlásite teraz, tieto údaje (1 položka) budú odstránené.}few{Niektoré údaje Chromu zatiaľ neboli uložené vo vašom účte Google. Pred odhlásením skúste počkať niekoľko minút. Ak sa odhlásite teraz, tieto údaje ({count} položky) budú odstránené.}many{Some of your Chrome data hasn't been saved in your Google Account yet. Try waiting a few minutes before signing out. If you sign out now, this data ({count} items) will be deleted.}other{Niektoré údaje Chromu zatiaľ neboli uložené vo vašom účte Google. Pred odhlásením skúste počkať niekoľko minút. Ak sa odhlásite teraz, tieto údaje ({count} položiek) budú odstránené.}}</translation>
 <translation id="2753623023919742414">Vyhľadávanie spustíte kliknutím</translation>
 <translation id="2757826245013442432">{COUNT,plural, =0{Rozšírená ochrana vyžaduje na použitie aktualizácie, aby ste znova spustili Chrome}=1{Rozšírená ochrana vyžaduje na použitie aktualizácie, aby ste znova spustili Chrome. Okno inkognito sa znova neotvorí.}few{Rozšírená ochrana vyžaduje na použitie aktualizácie, aby ste znova spustili Chrome. # okná inkognito sa znova neotvoria.}many{Advanced Protection requires that you relaunch Chrome to apply an update. Your # Incognito windows won't reopen.}other{Rozšírená ochrana vyžaduje na použitie aktualizácie, aby ste znova spustili Chrome. # okien inkognito sa znova neotvorí.}}</translation>
 <translation id="2765403129283291972">Chrome potrebuje povolenie pre tento web na prístup k mikrofónu</translation>
@@ -511,6 +511,7 @@
 <translation id="6676384891291319759">Prístup do siete Internet</translation>
 <translation id="6679975945624592337">Povoliť prehliadaču Google Chrome spustenie na pozadí</translation>
 <translation id="6696915334902295848">Chrome vyžaduje pre tento web povolený prístup k mikrofónu</translation>
+<translation id="6706525880530967390">{count,plural, =1{Než sa niektoré údaje uložia do vášho účtu Google a začnú používať vo všetkých zariadeniach, musí Chrome overiť vašu totožnosť. Ak sa odhlásite teraz, tieto údaje (1 položka) budú odstránené.}few{Než sa niektoré údaje uložia do vášho účtu Google a začnú používať vo všetkých zariadeniach, musí Chrome overiť vašu totožnosť. Ak sa odhlásite teraz, tieto údaje ({count} položky) budú odstránené.}many{Chrome needs to verify it’s you before some data can be saved in your Google Account and used on all your devices. If you sign out now, this data ({count} items) will be deleted.}other{Než sa niektoré údaje uložia do vášho účtu Google a začnú používať vo všetkých zariadeniach, musí Chrome overiť vašu totožnosť. Ak sa odhlásite teraz, tieto údaje ({count} položiek) budú odstránené.}}</translation>
 <translation id="6712881677154121168">Chyba sťahovania: <ph name="DOWNLOAD_ERROR" />.</translation>
 <translation id="6718739135284199302">Zrýchlenie Chromu</translation>
 <translation id="6734827584173583205">Tento web ste v poslednom čase nenavštívili. Chrome odstránil povolenia <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> a ďalšie (<ph name="COUNT" />).</translation>
@@ -689,7 +690,6 @@
 <translation id="8647930742055103497">Majte všetko k dispozícii v Chrome</translation>
 <translation id="8656634243791296665">Otvoriť Gemini v Chrome Dev</translation>
 <translation id="8669527147644353129">Google Chrome Helper</translation>
-<translation id="8677922833187616101">Vždy zobrazovať odkaz na režim AI od Googlu</translation>
 <translation id="8679801911857917785">Tiež určuje, ktorá stránka sa zobrazí pri spustení prehliadača Chrome.</translation>
 <translation id="8712637175834984815">Dobre</translation>
 <translation id="8712767363896337380">Takmer aktualizované. Dokončite aktualizáciu opätovným spustením Chromu.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sl.xtb b/chrome/app/resources/google_chrome_strings_sl.xtb
index 8d0e8469..68e12f6 100644
--- a/chrome/app/resources/google_chrome_strings_sl.xtb
+++ b/chrome/app/resources/google_chrome_strings_sl.xtb
@@ -152,7 +152,6 @@
 <translation id="2681444469812712297">Odprite <ph name="URL" /> na novem zavihku v Google Chromu.</translation>
 <translation id="2699790011615497488">Odpiranje Geminija v Chromu beta</translation>
 <translation id="2712141162840347885">Izberite kar koli za iskanje z Googlom Lens ali pritisnite tipko Esc, če želite zapreti Google Lens</translation>
-<translation id="2723860029395667894">Vedno pokaži bližnjico do Googlovega načina umetne inteligence</translation>
 <translation id="2738871930057338499">Internetne povezave ni mogoče vzpostaviti. Koda napake HTTP je »403 Forbidden«. Preverite konfiguracijo strežnika proxy configuration.</translation>
 <translation id="2742320827292110288">Opozorilo: Google Chrome razširitvam ne more preprečiti beleženja zgodovine brskanja. Če želite onemogočiti to razširitev v anonimnem načinu, počistite to možnost.</translation>
 <translation id="2753623023919742414">Kliknite, če želite iskati</translation>
@@ -692,7 +691,6 @@
 <translation id="8647930742055103497">Vse shranite v Chromu</translation>
 <translation id="8656634243791296665">Odpiranje Geminija v Chromu Dev</translation>
 <translation id="8669527147644353129">Pomočnik za Google Chrome</translation>
-<translation id="8677922833187616101">Vedno pokaži bližnjico do Googlovega načina umetne inteligence</translation>
 <translation id="8679801911857917785">Določa tudi, katera stran je prikazana, ko zaženete Chrome.</translation>
 <translation id="8712637175834984815">Razumem</translation>
 <translation id="8712767363896337380">Skoraj je posodobljen. Znova zaženite Chrome, da dokončate posodobitev.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sq.xtb b/chrome/app/resources/google_chrome_strings_sq.xtb
index fc90733..fdaa0dc 100644
--- a/chrome/app/resources/google_chrome_strings_sq.xtb
+++ b/chrome/app/resources/google_chrome_strings_sq.xtb
@@ -152,7 +152,6 @@
 <translation id="2681444469812712297">Hap <ph name="URL" /> në një skedë të re në Google Chrome.</translation>
 <translation id="2699790011615497488">Hap Gemini në Chrome Beta</translation>
 <translation id="2712141162840347885">Zgjidh çdo gjë për të kërkuar me "Lenten e Google" ose shtyp butonin "Escape" për të dalë nga "Lentja e Google"</translation>
-<translation id="2723860029395667894">Shfaq gjithmonë shkurtoren e "Modalitetit të IA-së së Google"</translation>
 <translation id="2738871930057338499">Lidhja me internetin nuk mund të kryhej. HTTP 403 (E ndaluar). Kontrollo konfigurimin e proxy-t.</translation>
 <translation id="2742320827292110288">Paralajmërim: Google Chrome nuk mund të parandalojë regjistrimin e historikut të shfletimit nga shtesat. Për ta çaktivizuar këtë shtesë në modalitetin "e fshehtë", anulo zgjedhjen e këtij opsioni.</translation>
 <translation id="2753623023919742414">Kliko për të kërkuar</translation>
@@ -691,7 +690,6 @@
 <translation id="8647930742055103497">Mbaji të gjitha në Chrome</translation>
 <translation id="8656634243791296665">Hap Gemini në Chrome Dev</translation>
 <translation id="8669527147644353129">Ndihmësi i Google Chrome</translation>
-<translation id="8677922833187616101">Shfaq gjithmonë shkurtoren e "Modalitetit të IA-së së Google"</translation>
 <translation id="8679801911857917785">Kontrollon gjithashtu se cila faqe shfaqet kur fillon Chrome.</translation>
 <translation id="8712637175834984815">E kuptova</translation>
 <translation id="8712767363896337380">Pothuajse u përditësua! Nis Chrome sërish për të përfunduar përditësimin.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sr-Latn.xtb b/chrome/app/resources/google_chrome_strings_sr-Latn.xtb
index e4082e6..2745bd16 100644
--- a/chrome/app/resources/google_chrome_strings_sr-Latn.xtb
+++ b/chrome/app/resources/google_chrome_strings_sr-Latn.xtb
@@ -152,7 +152,6 @@
 <translation id="2681444469812712297">Otvorite <ph name="URL" /> na novoj kartici u Google Chrome-u.</translation>
 <translation id="2699790011615497488">Otvorite Gemini u Chrome beta verziji</translation>
 <translation id="2712141162840347885">Izaberite bilo šta za pretragu pomoću Google objektiva ili pritisnite Escape da biste izašli iz Google objektiva</translation>
-<translation id="2723860029395667894">Uvek prikazuj prečicu za Google AI režim</translation>
 <translation id="2738871930057338499">Povezivanje sa internetom nije uspelo. Zabranjen je pristup (HTTP 403). Proverite konfiguraciju proksija.</translation>
 <translation id="2742320827292110288">Upozorenje: Google Chrome ne može da spreči dodatke da snimaju vašu istoriju pregledanja. Da biste onemogućili ovaj dodatak u režimu bez arhiviranja, poništite izbor ove opcije.</translation>
 <translation id="2747021967398957654">{count,plural, =1{Neki Chrome podaci još nisu sačuvani na Google nalogu. Sačekajte nekoliko minuta pre nego što se odjavite. Ako se odjavite odmah, ovi podaci (1 stavka) će se izbrisati.}one{Neki Chrome podaci još nisu sačuvani na Google nalogu. Sačekajte nekoliko minuta pre nego što se odjavite. Ako se odjavite odmah, ovi podaci ({count} stavka) će se izbrisati.}few{Neki Chrome podaci još nisu sačuvani na Google nalogu. Sačekajte nekoliko minuta pre nego što se odjavite. Ako se odjavite odmah, ovi podaci ({count} stavke) će se izbrisati.}other{Neki Chrome podaci još nisu sačuvani na Google nalogu. Sačekajte nekoliko minuta pre nego što se odjavite. Ako se odjavite odmah, ovi podaci ({count} stavki) će se izbrisati.}}</translation>
@@ -694,7 +693,6 @@
 <translation id="8647930742055103497">Čuvajte sve u Chrome-u</translation>
 <translation id="8656634243791296665">Otvorite Gemini u Chrome Dev-u</translation>
 <translation id="8669527147644353129">Google Chrome pomoćnik</translation>
-<translation id="8677922833187616101">Uvek prikazuj prečicu za Google AI režim</translation>
 <translation id="8679801911857917785">Kontroliše i stranicu koja se prikazuje kada pokrenete Chrome.</translation>
 <translation id="8712637175834984815">Važi</translation>
 <translation id="8712767363896337380">Skoro je ažuriran! Ponovo pokrenite Chrome da biste završili ažuriranje.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sr.xtb b/chrome/app/resources/google_chrome_strings_sr.xtb
index 382fae84..6ff4c559 100644
--- a/chrome/app/resources/google_chrome_strings_sr.xtb
+++ b/chrome/app/resources/google_chrome_strings_sr.xtb
@@ -152,7 +152,6 @@
 <translation id="2681444469812712297">Отворите <ph name="URL" /> на новој картици у Google Chrome-у.</translation>
 <translation id="2699790011615497488">Отворите Gemini у Chrome бета верзији</translation>
 <translation id="2712141162840347885">Изаберите било шта за претрагу помоћу Google објектива или притисните Escape да бисте изашли из Google објектива</translation>
-<translation id="2723860029395667894">Увек приказуј пречицу за Google AI режим</translation>
 <translation id="2738871930057338499">Повезивање са интернетом није успело. Забрањен је приступ (HTTP 403). Проверите конфигурацију проксија.</translation>
 <translation id="2742320827292110288">Упозорење: Google Chrome не може да спречи додатке да снимају вашу историју прегледања. Да бисте онемогућили овај додатак у режиму без архивирања, поништите избор ове опције.</translation>
 <translation id="2747021967398957654">{count,plural, =1{Неки Chrome подаци још нису сачувани на Google налогу. Сачекајте неколико минута пре него што се одјавите. Ако се одјавите одмах, ови подаци (1 ставка) ће се избрисати.}one{Неки Chrome подаци још нису сачувани на Google налогу. Сачекајте неколико минута пре него што се одјавите. Ако се одјавите одмах, ови подаци ({count} ставка) ће се избрисати.}few{Неки Chrome подаци још нису сачувани на Google налогу. Сачекајте неколико минута пре него што се одјавите. Ако се одјавите одмах, ови подаци ({count} ставке) ће се избрисати.}other{Неки Chrome подаци још нису сачувани на Google налогу. Сачекајте неколико минута пре него што се одјавите. Ако се одјавите одмах, ови подаци ({count} ставки) ће се избрисати.}}</translation>
@@ -694,7 +693,6 @@
 <translation id="8647930742055103497">Чувајте све у Chrome-у</translation>
 <translation id="8656634243791296665">Отворите Gemini у Chrome Dev-у</translation>
 <translation id="8669527147644353129">Google Chrome помоћник</translation>
-<translation id="8677922833187616101">Увек приказуј пречицу за Google AI режим</translation>
 <translation id="8679801911857917785">Контролише и страницу која се приказује када покренете Chrome.</translation>
 <translation id="8712637175834984815">Важи</translation>
 <translation id="8712767363896337380">Скоро је ажуриран! Поново покрените Chrome да бисте завршили ажурирање.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sv.xtb b/chrome/app/resources/google_chrome_strings_sv.xtb
index 7bdf298..c1a2b8c 100644
--- a/chrome/app/resources/google_chrome_strings_sv.xtb
+++ b/chrome/app/resources/google_chrome_strings_sv.xtb
@@ -152,7 +152,6 @@
 <translation id="2681444469812712297">Öppna <ph name="URL" /> på en ny flik i Google Chrome.</translation>
 <translation id="2699790011615497488">Öppna Gemini i Chrome Beta</translation>
 <translation id="2712141162840347885">Välj vad du vill söka efter med Google Lens eller tryck på Escape för att avsluta Google Lens</translation>
-<translation id="2723860029395667894">Visa alltid genvägen till Google AI-läget</translation>
 <translation id="2738871930057338499">Det går inte att ansluta till internet. HTTP 403 Förbjuden. Kontrollera proxykonfigurationen.</translation>
 <translation id="2742320827292110288">Varning! Google Chrome kan inte förhindra att tillägg registrerar din webbhistorik. Om du vill inaktivera det här tillägget i inkognitoläge avmarkerar du detta alternativ.</translation>
 <translation id="2753623023919742414">Klicka för att söka</translation>
@@ -692,7 +691,6 @@
 <translation id="8647930742055103497">Ha allt i Chrome</translation>
 <translation id="8656634243791296665">Öppna Gemini i Chrome Dev</translation>
 <translation id="8669527147644353129">Google Chrome Helper</translation>
-<translation id="8677922833187616101">Visa alltid genvägen till Google AI-läget</translation>
 <translation id="8679801911857917785">Det styr också vilken sida som visas när du startar Chrome.</translation>
 <translation id="8712637175834984815">Uppfattat</translation>
 <translation id="8712767363896337380">Uppdateringen är snart klar! Starta om Chrome för att slutföra uppdateringen.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sw.xtb b/chrome/app/resources/google_chrome_strings_sw.xtb
index 1d66ea8..d1c0a16 100644
--- a/chrome/app/resources/google_chrome_strings_sw.xtb
+++ b/chrome/app/resources/google_chrome_strings_sw.xtb
@@ -152,7 +152,6 @@
 <translation id="2681444469812712297">Fungua <ph name="URL" /> kwenye kichupo kipya katika Google Chrome.</translation>
 <translation id="2699790011615497488">Fungua Gemini kwenye Chrome - toleo la Beta</translation>
 <translation id="2712141162840347885">Chagua chochote unachotaka kutafuta ukitumia Lenzi ya Google au ubonyeze "escape" ili ufunge Lenzi ya Google</translation>
-<translation id="2723860029395667894">Onyesha njia ya mkato ya Matumizi ya Google AI kila wakati</translation>
 <translation id="2738871930057338499">Imeshindwa kuunganisha kwenye Intaneti. HTTP 403 Hairuhusiwi. Tafadhali angalia mipangilio yako ya seva mbadala.</translation>
 <translation id="2742320827292110288">Onyo: Google Chrome haiwezi kuzuia viendelezi kurekodi historia yako ya kuvinjari. Ili uzime kiendelezi hiki katika Hali fiche, usiteue chaguo hili.</translation>
 <translation id="2747021967398957654">{count,plural, =1{Baadhi ya data yako ya Chrome bado haijahifadhiwa kwenye Akaunti yako ya Google. Jaribu kusubiri kwa dakika chache kabla ya kuondoka kwenye akaunti. Ukiondoka kwenye akaunti sasa, data hii (kipengee 1) itafutwa.}other{Baadhi ya data yako ya Chrome bado haijahifadhiwa kwenye Akaunti yako ya Google. Jaribu kusubiri kwa dakika chache kabla ya kuondoka kwenye akaunti. Ukiondoka kwenye akaunti sasa, data hii (vipengee {count}) itafutwa.}}</translation>
@@ -694,7 +693,6 @@
 <translation id="8647930742055103497">Hifadhi kila kitu kwenye Chrome</translation>
 <translation id="8656634243791296665">Fungua Gemini kwenye Chrome - toleo la Dev</translation>
 <translation id="8669527147644353129">Msaidizi wa Google Chrome</translation>
-<translation id="8677922833187616101">Onyesha Njia ya Mkato ya Matumizi ya Google AI Kila Wakati</translation>
 <translation id="8679801911857917785">Pia inadhibiti ukurasa unaoonyeshwa unapoanzisha Chrome.</translation>
 <translation id="8712637175834984815">Nimeelewa</translation>
 <translation id="8712767363896337380">Inakaribia kukamilisha usasishaji! Fungua Chrome tena ili ukamilishe mchakato wa kusasisha.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ta.xtb b/chrome/app/resources/google_chrome_strings_ta.xtb
index 18b0896..f8d7b05a 100644
--- a/chrome/app/resources/google_chrome_strings_ta.xtb
+++ b/chrome/app/resources/google_chrome_strings_ta.xtb
@@ -148,7 +148,6 @@
 <translation id="2681444469812712297">Google Chromeமில் புதிய பக்கத்தில் <ph name="URL" /> ஐத் திறக்கும்.</translation>
 <translation id="2699790011615497488">Chrome பீட்டாவில் Geminiயைத் திறக்கும்</translation>
 <translation id="2712141162840347885">Google Lens மூலம் தேட எதையேனும் தேர்ந்தெடுக்கவும் அல்லது Google Lensஸில் இருந்து வெளியேற escape பட்டனை அழுத்தவும்</translation>
-<translation id="2723860029395667894">Google AI மோட் ஷார்ட்கட்டை எப்போதும் காட்டு</translation>
 <translation id="2738871930057338499">இணையத்துடன் இணைக்க முடியவில்லை. HTTP 403 தடுக்கப்பட்டது. உங்கள் ப்ராக்ஸி உள்ளமைவைச் சரிபார்க்கவும்.</translation>
 <translation id="2742320827292110288">எச்சரிக்கை: நீங்கள் உலாவியவை குறித்த தகவல்களை நீட்டிப்புகள் பதிவுசெய்வதை Google Chromeமால் தடுக்க முடியாது. மறைநிலைப் பயன்முறையில் இந்த நீட்டிப்பை முடக்க, இந்த விருப்பத்தைத் தேர்வுநீக்கவும்.</translation>
 <translation id="2747021967398957654">{count,plural, =1{உங்களின் Chrome தரவுகளில் சில உங்கள் Google கணக்கில் இன்னமும் சேமிக்கப்படவில்லை. வெளியேறும் முன் சில நிமிடங்கள் காத்திருக்கவும். நீங்கள் இப்போதே வெளியேறினால் இந்தத் தரவு (1 தரவு) நீக்கப்படும்.}other{உங்களின் Chrome தரவுகளில் சில உங்கள் Google கணக்கில் இன்னமும் சேமிக்கப்படவில்லை. வெளியேறும் முன் சில நிமிடங்கள் காத்திருக்கவும். இப்போதே வெளியேறினால் இந்தத் தரவு ({count} தரவுகள்) நீக்கப்படும்.}}</translation>
@@ -686,7 +685,6 @@
 <translation id="8647930742055103497">எல்லாவற்றையும் Chromeமில் வைத்திருங்கள்</translation>
 <translation id="8656634243791296665">Chrome Devவில் Geminiயைத் திறக்கும்</translation>
 <translation id="8669527147644353129">Google Chrome உதவி</translation>
-<translation id="8677922833187616101">Google AI மோட் ஷார்ட்கட்டை எப்போதும் காட்டு</translation>
 <translation id="8679801911857917785">Chrome ஐத் தொடங்கும்போது காண்பிக்கப்படும் பக்கத்தையும் இது கட்டுப்படுத்துகிறது.</translation>
 <translation id="8712637175834984815">புரிந்தது</translation>
 <translation id="8712767363896337380">கிட்டத்தட்ட புதுப்பிக்கப்பட்டுவிட்டது! அதை நிறைவுசெய்ய Chromeமை மீண்டும் தொடங்கவும்.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_te.xtb b/chrome/app/resources/google_chrome_strings_te.xtb
index c0ddbe9d..e6ffbc6 100644
--- a/chrome/app/resources/google_chrome_strings_te.xtb
+++ b/chrome/app/resources/google_chrome_strings_te.xtb
@@ -148,9 +148,9 @@
 <translation id="2681444469812712297"><ph name="URL" /> ను Google Chromeలో కొత్త ట్యాబ్‌లో తెరవండి.</translation>
 <translation id="2699790011615497488">బీటా Chromeలో Geminiని తెరవండి</translation>
 <translation id="2712141162840347885">Google Lensతో సెర్చ్ చేయడానికి ఏదైనా ఎంచుకోండి లేదా Google Lens నుండి ఎగ్జిట్ అవ్వడానికి ఎస్కేప్ బటన్‌ను నొక్కండి</translation>
-<translation id="2723860029395667894">Google AI మోడ్ షార్ట్‌కట్‌ను ఎల్లప్పుడూ చూపండి</translation>
 <translation id="2738871930057338499">ఇంటర్నెట్‌కు కనెక్ట్ చేయడం సాధ్యపడలేదు. HTTP 403 అనుమతి లేదు. దయచేసి మీ ప్రాక్సీ కాన్ఫిగరేషన్‌ను చెక్ చేయండి.</translation>
 <translation id="2742320827292110288">హెచ్చరిక: Google Chrome మీ బ్రౌజింగ్ హిస్టరీని రికార్డ్ చేయకుండా ఎక్స్‌టెన్ష‌న్‌లను నివారించలేదు. ఈ ఎక్స్‌టెన్షన్‌ను అజ్ఞాత మోడ్‌లో డిజేబుల్ చేయడానికి, ఈ ఆప్షన్‌ను రద్దు చేయండి.</translation>
+<translation id="2747021967398957654">{count,plural, =1{మీ Chrome డేటాలో కొంత భాగం, ఇంకా మీ Google ఖాతాలో సేవ్ కాలేదు. సైన్ అవుట్ చేయడానికి ముందు, కొన్ని నిమిషాలు వేచి ఉండటానికి ట్రై చేయండి. మీరు ఇప్పుడు సైన్ అవుట్ చేస్తే, ఈ డేటా (1 ఐటెమ్) తొలగించబడుతుంది.}other{మీ Chrome డేటాలో కొంత భాగం, ఇంకా మీ Google ఖాతాలో సేవ్ కాలేదు. సైన్ అవుట్ చేయడానికి ముందు, కొన్ని నిమిషాలు వేచి ఉండటానికి ట్రై చేయండి. మీరు ఇప్పుడు సైన్ అవుట్ చేస్తే, ఈ డేటా ({count} ఐటెమ్‌లు) తొలగించబడుతుంది.}}</translation>
 <translation id="2753623023919742414">సెర్చ్ చేయడానికి క్లిక్ చేయండి</translation>
 <translation id="2757826245013442432">{COUNT,plural, =0{అప్‌డేట్‌ను వర్తింపజేయడానికి, మీరు Chromeను రీ-లాంచ్ చేయాలని అడ్వాన్స్‌డ్ ప్రొటెక్షన్ కోరుతోంది}=1{అడ్వాన్స్‌డ్ ప్రొటెక్షన్ కోసం మీరు అప్‌డేట్‌ను వర్తింపజేయడానికి, Chromeను రీ-లాంచ్ చేయాలి. మీ అజ్ఞాత విండో మళ్లీ తెరవబడదు.}other{అడ్వాన్స్‌డ్ ప్రొటెక్షన్ కోసం మీరు అప్‌డేట్‌ను వర్తింపజేయడానికి, Chromeను రీ-లాంచ్ చేయాలి. మీ # అజ్ఞాత విండోలు మళ్లీ తెరవబడవు.}}</translation>
 <translation id="2765403129283291972">ఈ సైట్ కోసం మీ మైక్రోఫోన్‌ను యాక్సెస్ చేయడానికి Chromeకు అనుమతి అవసరం</translation>
@@ -506,6 +506,7 @@
 <translation id="6676384891291319759">ఇంటర్నెట్‌ను యాక్సెస్ చేయండి</translation>
 <translation id="6679975945624592337">Google Chromeను బ్యాక్‌గ్రౌండ్‌లో అమలు అయ్యేందుకు అనుమతించండి</translation>
 <translation id="6696915334902295848">ఈ సైట్ కోసం Chromeకు మైక్రోఫోన్ అనుమతి అవసరం</translation>
+<translation id="6706525880530967390">{count,plural, =1{మీ Google ఖాతాలో కొంత డేటాను సేవ్ చేయడానికి, దాన్ని మీ డివైజ్‌లన్నింటిలో ఉపయోగించుకోవడానికి ముందు, అది మీరేనని Chrome ధృవీకరించాలి. మీరు ఇప్పుడు సైన్ అవుట్ చేస్తే, ఈ డేటా (1 ఐటెమ్) తొలగించబడుతుంది.}other{మీ Google ఖాతాలో కొంత డేటాను సేవ్ చేయడానికి, దాన్ని మీ డివైజ్‌లన్నింటిలో ఉపయోగించుకోవడానికి ముందు, అది మీరేనని Chrome ధృవీకరించాలి. మీరు ఇప్పుడు సైన్ అవుట్ చేస్తే, ఈ డేటా ({count} ఐటెమ్‌లు) తొలగించబడుతుంది.}}</translation>
 <translation id="6712881677154121168">డౌన్‌లోడ్ చేయడంలో ఎర్రర్ ఏర్పడింది: <ph name="DOWNLOAD_ERROR" />.</translation>
 <translation id="6718739135284199302">Chromeను వేగవంతం చేయండి</translation>
 <translation id="6734827584173583205">మీరు ఇటీవల వెళ్లలేదు. Chrome <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, అలాగే మరో <ph name="COUNT" />‌ను తీసివేసింది.</translation>
@@ -684,7 +685,6 @@
 <translation id="8647930742055103497">అన్నింటినీ Chromeలోనే ఉంచండి</translation>
 <translation id="8656634243791296665">డెవలపర్ Chromeలో Geminiని తెరవండి</translation>
 <translation id="8669527147644353129">Google Chrome సహాయకారుడు</translation>
-<translation id="8677922833187616101">Google AI మోడ్ షార్ట్‌కట్‌ను ఎల్లప్పుడూ చూపండి</translation>
 <translation id="8679801911857917785">ఇది మీరు Chromeని ప్రారంభించేటప్పుడు చూపబడే పేజీని కూడా నియంత్రిస్తుంది.</translation>
 <translation id="8712637175834984815">అర్థమైంది</translation>
 <translation id="8712767363896337380">దాదాపుగా అప్‌డేట్ అయ్యి ఉంది! అప్‌డేట్ చేయడాన్ని పూర్తి చేయడానికి Chromeను రీ-లాంచ్ చేయండి.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_th.xtb b/chrome/app/resources/google_chrome_strings_th.xtb
index 9d198ce..50978ae 100644
--- a/chrome/app/resources/google_chrome_strings_th.xtb
+++ b/chrome/app/resources/google_chrome_strings_th.xtb
@@ -148,9 +148,9 @@
 <translation id="2681444469812712297">เปิด <ph name="URL" /> ในแท็บใหม่ใน Google Chrome</translation>
 <translation id="2699790011615497488">เปิด Gemini ใน Chrome Beta</translation>
 <translation id="2712141162840347885">เลือกอะไรก็ได้เพื่อค้นหาด้วย Google Lens หรือกด Escape เพื่อออกจาก Google Lens</translation>
-<translation id="2723860029395667894">แสดงทางลัดโหมด AI ของ Google เสมอ</translation>
 <translation id="2738871930057338499">เชื่อมต่อกับอินเทอร์เน็ตไม่ได้ HTTP 403 Forbidden โปรดตรวจสอบการกำหนดค่าพร็อกซีของคุณ</translation>
 <translation id="2742320827292110288">คำเตือน: Google Chrome ไม่สามารถป้องกันไม่ให้ส่วนขยายบันทึกประวัติการท่องเว็บ หากต้องการปิดใช้ส่วนขยายนี้ในโหมดไม่ระบุตัวตน ให้ยกเลิกการเลือกตัวเลือกนี้</translation>
+<translation id="2747021967398957654">{count,plural, =1{ยังไม่ได้บันทึกข้อมูล Chrome บางอย่างของคุณลงในบัญชี Google โปรดรอสักครู่ก่อนออกจากระบบ หากคุณออกจากระบบตอนนี้ ระบบจะลบข้อมูลนี้ (1 รายการ)}other{ยังไม่ได้บันทึกข้อมูล Chrome บางอย่างของคุณลงในบัญชี Google โปรดรอสักครู่ก่อนออกจากระบบ หากคุณออกจากระบบตอนนี้ ระบบจะลบข้อมูลนี้ ({count} รายการ)}}</translation>
 <translation id="2753623023919742414">คลิกเพื่อค้นหา</translation>
 <translation id="2757826245013442432">{COUNT,plural, =0{การปกป้องขั้นสูงกำหนดให้คุณต้องเปิด Chrome ขึ้นมาใหม่เพื่อใช้การอัปเดต}=1{การปกป้องขั้นสูงกำหนดให้คุณต้องเปิด Chrome ขึ้นมาใหม่เพื่อใช้การอัปเดต หน้าต่างที่ไม่ระบุตัวตนจะไม่เปิดให้อีก}other{การปกป้องขั้นสูงกำหนดให้คุณต้องเปิด Chrome ขึ้นมาใหม่เพื่อใช้การอัปเดต หน้าต่างที่ไม่ระบุตัวตนจำนวน # หน้าต่างจะไม่เปิดให้อีก}}</translation>
 <translation id="2765403129283291972">Chrome ต้องการสิทธิ์เข้าถึงไมโครโฟนของคุณสำหรับเว็บไซต์นี้</translation>
@@ -505,6 +505,7 @@
 <translation id="6676384891291319759">เข้าถึงอินเทอร์เน็ต</translation>
 <translation id="6679975945624592337">ให้ Google Chrome ทำงานในพื้นหลัง</translation>
 <translation id="6696915334902295848">Chrome ต้องการสิทธิ์เข้าถึงไมโครโฟนสำหรับเว็บไซต์นี้</translation>
+<translation id="6706525880530967390">{count,plural, =1{Chrome จำเป็นต้องยืนยันว่าเป็นคุณก่อนจึงจะบันทึกข้อมูลบางอย่างในบัญชี Google และใช้ในอุปกรณ์ทุกเครื่องได้ หากคุณออกจากระบบตอนนี้ ระบบจะลบข้อมูลนี้ (1 รายการ)}other{Chrome จำเป็นต้องยืนยันว่าเป็นคุณก่อนจึงจะบันทึกข้อมูลบางอย่างในบัญชี Google และใช้ในอุปกรณ์ทุกเครื่องได้ หากคุณออกจากระบบตอนนี้ ระบบจะลบข้อมูลนี้ ({count} รายการ)}}</translation>
 <translation id="6712881677154121168">ข้อผิดพลาดในการดาวน์โหลด: <ph name="DOWNLOAD_ERROR" /></translation>
 <translation id="6718739135284199302">ทำให้ Chrome เร็วขึ้น</translation>
 <translation id="6734827584173583205">คุณไม่ได้เข้าชมเมื่อเร็วๆ นี้ Chrome นำสิทธิ์เข้าถึง<ph name="PERMISSION_1" /> <ph name="PERMISSION_2" /> และอีก <ph name="COUNT" /> รายการออกแล้ว</translation>
@@ -683,7 +684,6 @@
 <translation id="8647930742055103497">เก็บทุกอย่างไว้ใน Chrome</translation>
 <translation id="8656634243791296665">เปิด Gemini ใน Chrome Dev</translation>
 <translation id="8669527147644353129">ตัวช่วยเหลือของ Google Chrome</translation>
-<translation id="8677922833187616101">แสดงทางลัดโหมด AI ของ Google เสมอ</translation>
 <translation id="8679801911857917785">อีกทั้งยังควบคุมหน้าที่จะแสดงเมื่อคุณเปิด Chrome ด้วย</translation>
 <translation id="8712637175834984815">รับทราบ</translation>
 <translation id="8712767363896337380">ใกล้จะอัปเดตเสร็จแล้ว เปิด Chrome อีกครั้งเพื่อให้การอัปเดตเสร็จสมบูรณ์</translation>
diff --git a/chrome/app/resources/google_chrome_strings_tr.xtb b/chrome/app/resources/google_chrome_strings_tr.xtb
index 2f22e51..c07ffddf 100644
--- a/chrome/app/resources/google_chrome_strings_tr.xtb
+++ b/chrome/app/resources/google_chrome_strings_tr.xtb
@@ -148,7 +148,6 @@
 <translation id="2681444469812712297">Google Chrome'da yeni bir sekmede <ph name="URL" /> adresini açın.</translation>
 <translation id="2699790011615497488">Chrome Beta'da Gemini'ı aç</translation>
 <translation id="2712141162840347885">Google Lens ile aramak istediğiniz öğeyi seçin veya Google Lens'ten çıkmak için Escape tuşuna basın</translation>
-<translation id="2723860029395667894">Google AI Modu kısayolunu her zaman göster</translation>
 <translation id="2738871930057338499">İnternet'e bağlanılamadı. HTTP 403 Yasak. Lütfen proxy yapılandırmanızı kontrol edin.</translation>
 <translation id="2742320827292110288">Uyarı: Google Chrome, uzantıların tarama geçmişinizi kaydetmesini önleyemez. Gizli modda bu uzantıyı devre dışı bırakmak için bu seçeneğin onay işaretini kaldırın.</translation>
 <translation id="2753623023919742414">Aramak için tıklayın</translation>
@@ -685,7 +684,6 @@
 <translation id="8647930742055103497">Her şeyi Chrome'da tutun</translation>
 <translation id="8656634243791296665">Chrome Dev'de Gemini'ı aç</translation>
 <translation id="8669527147644353129">Google Chrome Helper</translation>
-<translation id="8677922833187616101">Google AI Modu Kısayolunu Her Zaman Göster</translation>
 <translation id="8679801911857917785">Ayrıca Chrome'u başlattığınızda gösterilecek sayfayı da denetler.</translation>
 <translation id="8712637175834984815">Anladım</translation>
 <translation id="8712767363896337380">Güncel hale gelmek üzere. Güncellemenin tamamlanması için Chrome'u yeniden başlatın.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_uk.xtb b/chrome/app/resources/google_chrome_strings_uk.xtb
index 827f837..e239e6c 100644
--- a/chrome/app/resources/google_chrome_strings_uk.xtb
+++ b/chrome/app/resources/google_chrome_strings_uk.xtb
@@ -148,7 +148,6 @@
 <translation id="2681444469812712297">Відкрити сторінку <ph name="URL" /> у новій вкладці в Google Chrome.</translation>
 <translation id="2699790011615497488">Відкрити Gemini у бета-версії Chrome</translation>
 <translation id="2712141162840347885">Виберіть об’єкт, за яким хочете виконати пошук через Google Об’єктив, або натисніть клавішу Escape, щоб вийти</translation>
-<translation id="2723860029395667894">Завжди показувати ярлик режиму ШІ від Google</translation>
 <translation id="2738871930057338499">Не вдалося підключитися до Інтернету. Помилка "HTTP 403 заборонено". Перевірте конфігурацію свого проксі-сервера.</translation>
 <translation id="2742320827292110288">Попередження. Google Chrome не може заборонити розширенням записувати вашу історію веб-перегляду. Щоб розширення не працювало в режимі анонімного перегляду, зніміть прапорець біля цієї опції.</translation>
 <translation id="2753623023919742414">Натисніть, щоб шукати</translation>
@@ -684,7 +683,6 @@
 <translation id="8647930742055103497">Зберігайте все в Chrome</translation>
 <translation id="8656634243791296665">Відкрити Gemini у Chrome для розробників</translation>
 <translation id="8669527147644353129">Помічник Google Chrome</translation>
-<translation id="8677922833187616101">Завжди показувати ярлик режиму ШІ від Google</translation>
 <translation id="8679801911857917785">Розширення також змінило сторінку, яка відкривається під час запуску Chrome.</translation>
 <translation id="8712637175834984815">OK</translation>
 <translation id="8712767363896337380">Майже готово. Перезапустіть Chrome, щоб завершити оновлення.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ur.xtb b/chrome/app/resources/google_chrome_strings_ur.xtb
index b36c826..33d2cef 100644
--- a/chrome/app/resources/google_chrome_strings_ur.xtb
+++ b/chrome/app/resources/google_chrome_strings_ur.xtb
@@ -152,7 +152,6 @@
 <translation id="2681444469812712297">‏<ph name="URL" /> کو Google Chrome میں ایک نئے ٹیب میں کھولیں۔</translation>
 <translation id="2699790011615497488">‏‫Chrome بی ٹا میں Gemini کھولیں</translation>
 <translation id="2712141162840347885">‏‫Google لینز کے ساتھ تلاش کرنے کے لیے کچھ بھی منتخب کریں یا Google لینز سے باہر نکلنے کے لیے Escape کو دبائیں</translation>
-<translation id="2723860029395667894">‏ہمیشہ Google AI وضع کا شارٹ کٹ دکھائیں</translation>
 <translation id="2738871930057338499">‏انٹرنیٹ سے منسلک ہونے سے قاصر ہے۔ HTTP 403 ممنوع ہے۔ براہ کرم اپنی پراکسی کنفیگریشن چیک کریں۔</translation>
 <translation id="2742320827292110288">‏وارننگ: Google Chrome ایکسٹینشنز کو آپ کی براؤزنگ سرگزشت ریکارڈ کرنے سے نہیں روک سکتا۔ اس ایکسٹینشن کو پوشیدگی وضع میں غیر فعال کرنے کے لیے اس اختیار کو غیر منتخب کریں۔</translation>
 <translation id="2753623023919742414">تلاش کرنے کیلئے کلک کریں</translation>
@@ -691,7 +690,6 @@
 <translation id="8647930742055103497">‏ہر چیز کو Chrome میں رکھیں</translation>
 <translation id="8656634243791296665">‏‫Chrome Dev میں Gemini کھولیں</translation>
 <translation id="8669527147644353129">‏Google Chrome مدد کنندہ</translation>
-<translation id="8677922833187616101">‏ہمیشہ Google AI وضع کا شارٹ کٹ دکھائیں</translation>
 <translation id="8679801911857917785">‏یہ آپ کی جانب سے Chrome شروع کیے جانے پر دکھائی دینے والے صفحہ کو بھی کنٹرول کرتا ہے۔</translation>
 <translation id="8712637175834984815">سمجھ آ گئی</translation>
 <translation id="8712767363896337380">‏تقریباً اپ ٹو ڈیٹ! اپ ڈیٹ مکمل کرنے کے لیے Chrome کو بند کر کے دوبارہ چلائیں۔</translation>
diff --git a/chrome/app/resources/google_chrome_strings_uz.xtb b/chrome/app/resources/google_chrome_strings_uz.xtb
index 68e9afb..dbf52c8 100644
--- a/chrome/app/resources/google_chrome_strings_uz.xtb
+++ b/chrome/app/resources/google_chrome_strings_uz.xtb
@@ -149,7 +149,6 @@
 <translation id="2681444469812712297">Chromeda yangi varaqda ochish: <ph name="URL" /></translation>
 <translation id="2699790011615497488">Chrome Beta ichida Gemini ochish</translation>
 <translation id="2712141162840347885">Google Lens bilan qidirish uchun istalgan obyektni tanlang yoki Google Lens panelidan chiqish uchun Escape tugmasini bosing</translation>
-<translation id="2723860029395667894">Google AI rejimi tezkor tugmasini doim chiqarish</translation>
 <translation id="2738871930057338499">Internetga ulanmadi. HTTP 403, taqiqlangan. Proksi konfiguratsiyasini tekshiring.</translation>
 <translation id="2742320827292110288">Diqqat: Google Chrome kengaytmalar kezish tarixini yozib olishiga to‘sqinlik qilolmaydi. Bu kengaytmani inkognito rejimida o‘chirish uchun ushbu parametrdan belgini olib tashlang.</translation>
 <translation id="2747021967398957654">{count,plural, =1{Ayrim Chrome maʼlumotlari Google hisobingizga hali saqlanmagan. Hisobdan chiqishga shoshilmang. Hozir chiqsangiz, bu maʼlumotlar (1 obyekt) oʻchib ketadi.}other{Ayrim Chrome maʼlumotlari Google hisobingizga hali saqlanmagan. Hisobdan chiqishga shoshilmang. Hozir chiqsangiz, bu maʼlumotlar ({count} obyekt) oʻchib ketadi.}}</translation>
@@ -690,7 +689,6 @@
 <translation id="8647930742055103497">Barcha maʼlumotlarni Chromeda saqlang</translation>
 <translation id="8656634243791296665">Chrome Dev ichida Gemini ochish</translation>
 <translation id="8669527147644353129">Google Chrome yordamchisi</translation>
-<translation id="8677922833187616101">Google AI rejimi tezkor tugmasini doim chiqarish</translation>
 <translation id="8679801911857917785">Bundan tashqari, kengaytma Chrome bosh sahifasini o‘zgarib qo‘ydi.</translation>
 <translation id="8712637175834984815">Tushunarli</translation>
 <translation id="8712767363896337380">Deyarli yangilandi! Yangilash tugashi uchun Chrome brauzerini qayta ishga tushiring.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_vi.xtb b/chrome/app/resources/google_chrome_strings_vi.xtb
index d034790e..d87ce0f 100644
--- a/chrome/app/resources/google_chrome_strings_vi.xtb
+++ b/chrome/app/resources/google_chrome_strings_vi.xtb
@@ -150,7 +150,6 @@
 <translation id="2681444469812712297">Mở <ph name="URL" /> trong thẻ mới trên Google Chrome.</translation>
 <translation id="2699790011615497488">Mở Gemini trong Chrome Beta</translation>
 <translation id="2712141162840347885">Chọn nội dung bạn muốn tìm bằng Google Ống kính hoặc nhấn phím Escape để thoát khỏi Google Ống kính</translation>
-<translation id="2723860029395667894">Luôn hiện lối tắt đến Chế độ AI của Google</translation>
 <translation id="2738871930057338499">Không thể kết nối với Internet. HTTP 403 bị cấm. Vui lòng kiểm tra cấu hình proxy.</translation>
 <translation id="2742320827292110288">Cảnh báo: Google Chrome không thể ngăn các tiện ích ghi lại nhật ký duyệt web của bạn. Để tắt tiện ích này trong chế độ ẩn danh, hãy bỏ chọn tuỳ chọn này.</translation>
 <translation id="2747021967398957654">{count,plural, =1{Một số dữ liệu Chrome của bạn chưa được lưu vào Tài khoản Google. Hãy đợi một vài phút trước khi đăng xuất. Nếu bạn đăng xuất ngay, dữ liệu này (1 mục) sẽ bị xoá.}other{Một số dữ liệu Chrome của bạn chưa được lưu vào Tài khoản Google. Hãy đợi một vài phút trước khi đăng xuất. Nếu bạn đăng xuất ngay, dữ liệu này ({count}) sẽ bị xoá.}}</translation>
@@ -690,7 +689,6 @@
 <translation id="8647930742055103497">Lưu mọi thứ trong Chrome</translation>
 <translation id="8656634243791296665">Mở Gemini trong Chrome Dev</translation>
 <translation id="8669527147644353129">Trình trợ giúp của Google Chrome</translation>
-<translation id="8677922833187616101">Luôn hiện lối tắt đến Chế độ AI của Google</translation>
 <translation id="8679801911857917785">Tiện ích này cũng điều khiển trang nào được hiển thị khi bạn khởi động Chrome.</translation>
 <translation id="8712637175834984815">Tôi hiểu</translation>
 <translation id="8712767363896337380">Sắp xong rồi! Hãy chạy lại Chrome để hoàn tất quá trình cập nhật.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-CN.xtb b/chrome/app/resources/google_chrome_strings_zh-CN.xtb
index d0c6b12..0796750 100644
--- a/chrome/app/resources/google_chrome_strings_zh-CN.xtb
+++ b/chrome/app/resources/google_chrome_strings_zh-CN.xtb
@@ -148,7 +148,6 @@
 <translation id="2681444469812712297">在 Google Chrome 的新标签页中打开 <ph name="URL" />。</translation>
 <translation id="2699790011615497488">打开 Chrome Beta 版中的 Gemini</translation>
 <translation id="2712141162840347885">选择任意内容即可使用 Google 智能镜头进行搜索,按 Esc 键可退出 Google 智能镜头</translation>
-<translation id="2723860029395667894">始终显示 Google AI 模式快捷方式</translation>
 <translation id="2738871930057338499">无法连接到互联网。发生 HTTP 403 Forbidden 错误,请检查您的代理配置。</translation>
 <translation id="2742320827292110288">警告:Google Chrome 无法阻止扩展程序记录您的浏览活动。若要在无痕模式下停用该扩展程序,请取消选中此选项。</translation>
 <translation id="2753623023919742414">点击即可搜索</translation>
@@ -683,7 +682,6 @@
 <translation id="8647930742055103497">在 Chrome 中集中管理一切内容</translation>
 <translation id="8656634243791296665">打开 Chrome 开发者版中的 Gemini</translation>
 <translation id="8669527147644353129">Google Chrome 浏览器帮助程序</translation>
-<translation id="8677922833187616101">始终显示 Google AI 模式快捷方式</translation>
 <translation id="8679801911857917785">它还能够控制Chrome启动后显示的页面。</translation>
 <translation id="8712637175834984815">知道了</translation>
 <translation id="8712767363896337380">离最新版本只有一步之遥了!重新启动 Chrome 即可完成更新。</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-HK.xtb b/chrome/app/resources/google_chrome_strings_zh-HK.xtb
index e9d3cc3..a6ad9bf 100644
--- a/chrome/app/resources/google_chrome_strings_zh-HK.xtb
+++ b/chrome/app/resources/google_chrome_strings_zh-HK.xtb
@@ -152,9 +152,9 @@
 <translation id="2681444469812712297">在 Google Chrome 中的新分頁開啟 <ph name="URL" />。</translation>
 <translation id="2699790011615497488">開啟 Chrome Beta 版 Gemini</translation>
 <translation id="2712141162840347885">揀任何要用「Google 智能鏡頭」搜尋嘅內容,㩒 Esc 掣就可以退出「Google 智能鏡頭」</translation>
-<translation id="2723860029395667894">一律顯示 Google AI 模式捷徑</translation>
 <translation id="2738871930057338499">無法連線至互聯網。發生 HTTP 403 禁止錯誤,請檢查 Proxy 設定。</translation>
 <translation id="2742320827292110288">警告:Google Chrome 無法阻止擴充程式記錄您的瀏覽活動。如要在無痕模式中停用這個擴充程式,請取消選取這個選項。</translation>
+<translation id="2747021967398957654">{count,plural, =1{部分 Chrome 資料尚未儲存至 Google 帳戶。請等待幾分鐘後再嘗試登出。如果你現在登出,系統將刪除有關資料 (1 個項目)。}other{部分 Chrome 資料尚未儲存至 Google 帳戶。請等待幾分鐘後再嘗試登出。如果你現在登出,系統將刪除有關資料 ({count} 個項目)。}}</translation>
 <translation id="2753623023919742414">按一下即可搜尋</translation>
 <translation id="2757826245013442432">{COUNT,plural, =0{「進階保護功能」要求你重新啟動 Chrome 以套用更新}=1{「進階保護功能」要求你重新啟動 Chrome 以套用更新。無痕式視窗不會重新開啟。}other{「進階保護功能」要求你重新啟動 Chrome 以套用更新。# 個無痕式視窗不會重新開啟。}}</translation>
 <translation id="2765403129283291972">Chrome 需要取得權限,才能讓這個網站存取您的麥克風</translation>
@@ -513,6 +513,7 @@
 <translation id="6676384891291319759">連線到互聯網</translation>
 <translation id="6679975945624592337">讓 Google Chrome 在背景執行</translation>
 <translation id="6696915334902295848">Chrome 需要麥克風權限,才能執行此網站要求的功能</translation>
+<translation id="6706525880530967390">{count,plural, =1{Chrome 需要先驗證身分,才能將部分資料儲存至 Google 帳戶,並在所有裝置上使用。如果你現在登出,系統將刪除有關資料 (1 個項目)。}other{Chrome 需要先驗證身分,才能將部分資料儲存至 Google 帳戶,並在所有裝置上使用。如果你現在登出,系統將刪除有關資料 ({count} 個項目)。}}</translation>
 <translation id="6712881677154121168">下載錯誤:<ph name="DOWNLOAD_ERROR" />。</translation>
 <translation id="6718739135284199302">加快 Chrome 的運作速度</translation>
 <translation id="6734827584173583205">由於最近沒有瀏覽記錄,Chrome 已移除<ph name="PERMISSION_1" />、<ph name="PERMISSION_2" />和另外 <ph name="COUNT" /> 項權限。</translation>
@@ -691,7 +692,6 @@
 <translation id="8647930742055103497">將一切保留在 Chrome 中</translation>
 <translation id="8656634243791296665">開啟 Chrome 開發人員版 Gemini</translation>
 <translation id="8669527147644353129">Google Chrome 輔助工具</translation>
-<translation id="8677922833187616101">一律顯示 Google AI 模式捷徑</translation>
 <translation id="8679801911857917785">這個擴充功能也會管制 Chrome 啟動時所顯示的網頁。</translation>
 <translation id="8712637175834984815">我知道了</translation>
 <translation id="8712767363896337380">即將更新至最新版本!重新啟動 Chrome 即可完成更新程序。</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-TW.xtb b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
index 0a5c5f1..8094d94 100644
--- a/chrome/app/resources/google_chrome_strings_zh-TW.xtb
+++ b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
@@ -148,7 +148,6 @@
 <translation id="2681444469812712297">在 Google Chrome 的新分頁中開啟 <ph name="URL" />。</translation>
 <translation id="2699790011615497488">開啟 Chrome 內建 Gemini (Beta 版)</translation>
 <translation id="2712141162840347885">選取任何要使用 Google 智慧鏡頭搜尋的內容,按下 Esc 鍵即可退出 Google 智慧鏡頭</translation>
-<translation id="2723860029395667894">一律顯示 Google AI 模式捷徑</translation>
 <translation id="2738871930057338499">無法連線至網際網路。發生 HTTP 403 禁止錯誤,請檢查 Proxy 設定。</translation>
 <translation id="2742320827292110288">警告:Google Chrome 無法禁止擴充功能記錄你的瀏覽記錄。如要在無痕模式中停用這個擴充功能,請取消選取這個選項。</translation>
 <translation id="2753623023919742414">按一下即可搜尋</translation>
@@ -685,7 +684,6 @@
 <translation id="8647930742055103497">用 Chrome 集中管理所有內容</translation>
 <translation id="8656634243791296665">開啟 Chrome 內建 Gemini (開發人員版)</translation>
 <translation id="8669527147644353129">Google Chrome 小幫手</translation>
-<translation id="8677922833187616101">一律顯示 Google AI 模式捷徑</translation>
 <translation id="8679801911857917785">這個擴充功能也會控管 Chrome 啟動時所顯示的網頁。</translation>
 <translation id="8712637175834984815">我瞭解了</translation>
 <translation id="8712767363896337380">即將更新為最新版本!重新啟動 Chrome 即可完成更新程序。</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zu.xtb b/chrome/app/resources/google_chrome_strings_zu.xtb
index f78ec34..6f3e889d 100644
--- a/chrome/app/resources/google_chrome_strings_zu.xtb
+++ b/chrome/app/resources/google_chrome_strings_zu.xtb
@@ -152,7 +152,6 @@
 <translation id="2681444469812712297">Vula i-<ph name="URL" /> ethebhini entsha ye-Google Chrome.</translation>
 <translation id="2699790011615497488">Vula iGemini kuChrome Beta</translation>
 <translation id="2712141162840347885">Khetha noma yini ukuze useshe ngeGoogle Lens noma ucindezele okuthi escape ukuze uphume kuGoogle Lens</translation>
-<translation id="2723860029395667894">Bonisa njalo isinqamuleli Semodi ye-AI yeGoogle</translation>
 <translation id="2738871930057338499">Ayikwazi ukuxhuma ku-inthanethi I-HTTP 403 Yenqatshelwe. Sicela uchekhe ukulungiselelwa kommeleli wakho.</translation>
 <translation id="2742320827292110288">Isexwayiso: I-Google Chrome ayikwazi ukuvimbela izandiso kusukela ekurekhodeni umlando wesiphequluli sakho. Ukuze ukhubaze lesi sandiso kumodi ye-incognito, yekisa ukukhetha le nketho.</translation>
 <translation id="2753623023919742414">Chofoza ukuze useshe</translation>
@@ -691,7 +690,6 @@
 <translation id="8647930742055103497">Gcina yonke into kuChrome</translation>
 <translation id="8656634243791296665">Vula iGemini kuChrome Dev</translation>
 <translation id="8669527147644353129">Isisizi se-Google Chrome</translation>
-<translation id="8677922833187616101">Bonisa Njalo Isinqamuleli Semodi ye-AI yeGoogle</translation>
 <translation id="8679801911857917785">Iphinda ilawule ukuthi yiliphi ikhasi eliboniswayo uma uqala i-Chrome.</translation>
 <translation id="8712637175834984815">Ngiyitholile</translation>
 <translation id="8712767363896337380">Cishe isisesikhathini! Qalisa kabusha i-Chrome ukuqedela ukubuyekeza.</translation>
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp
index e94a52d..fa540811 100644
--- a/chrome/app/settings_strings.grdp
+++ b/chrome/app/settings_strings.grdp
@@ -4485,4 +4485,7 @@
   <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_OFF_TOAST_MESSAGE" desc="When Chrome shows a toast notification after the user turned off the Enhanced Protection setting, this is the text on the toast letting the user know that the Enhanced Protection setting is off.">
     Enhanced protection is off
   </message>
+  <message name="IDS_SYNC_ERROR_BOOKMARKS_LIMIT_EXCEEDED_DESCRIPTION" desc="Description of the sync error when the user has exceeded the bookmarks limit.">
+    To save bookmarks in your account, delete your unused bookmarks
+  </message>
 </grit-part>
diff --git a/chrome/app/settings_strings_grdp/IDS_SYNC_ERROR_BOOKMARKS_LIMIT_EXCEEDED_DESCRIPTION.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SYNC_ERROR_BOOKMARKS_LIMIT_EXCEEDED_DESCRIPTION.png.sha1
new file mode 100644
index 0000000..2a31d8f
--- /dev/null
+++ b/chrome/app/settings_strings_grdp/IDS_SYNC_ERROR_BOOKMARKS_LIMIT_EXCEEDED_DESCRIPTION.png.sha1
@@ -0,0 +1 @@
+62d3d7d46b41d5cb21ed5b560145f62f2f209407
\ No newline at end of file
diff --git a/chrome/browser/android/restore_id_associator_builder_android.cc b/chrome/browser/android/restore_id_associator_builder_android.cc
index fd634bd..7ea4714e 100644
--- a/chrome/browser/android/restore_id_associator_builder_android.cc
+++ b/chrome/browser/android/restore_id_associator_builder_android.cc
@@ -5,6 +5,8 @@
 #include "chrome/browser/android/restore_id_associator_builder_android.h"
 
 #include "chrome/browser/android/restore_id_associator_android.h"
+#include "chrome/browser/tab/protocol/token.pb.h"
+#include "chrome/browser/tab/storage_id.h"
 #include "chrome/browser/tab/tab_storage_type.h"
 
 namespace tabs {
@@ -27,8 +29,8 @@
   state_->id_to_parent_id.reserve(children.storage_id_size());
 
   // Build a mapping of children IDs to parent IDs;
-  for (const auto& child_id : children.storage_id()) {
-    state_->id_to_parent_id[child_id] = storage_id;
+  for (const tabs_pb::Token& child_id : children.storage_id()) {
+    state_->id_to_parent_id[StorageIdFromTokenProto(child_id)] = storage_id;
   }
 
   if (type == TabStorageType::kPinned) {
diff --git a/chrome/browser/android/storage_loaded_data_android.cc b/chrome/browser/android/storage_loaded_data_android.cc
index ab64e7ba..8ad5b52 100644
--- a/chrome/browser/android/storage_loaded_data_android.cc
+++ b/chrome/browser/android/storage_loaded_data_android.cc
@@ -57,8 +57,8 @@
         reinterpret_cast<long>(web_contents_state_bytes_ptr);
   }
 
-  base::Token tab_group_token(tab_state.tab_group_id_high(),
-                              tab_state.tab_group_id_low());
+  const tabs_pb::Token& tab_group_id = tab_state.tab_group_id();
+  base::Token tab_group_token(tab_group_id.high(), tab_group_id.low());
   base::android::ScopedJavaLocalRef<jobject> j_tab_group_id;
   if (!tab_group_token.is_zero()) {
     j_tab_group_id = base::android::TokenAndroid::Create(env, tab_group_token);
diff --git a/chrome/browser/android/tab_storage_packager_android.cc b/chrome/browser/android/tab_storage_packager_android.cc
index 6f70d33..71e58eb 100644
--- a/chrome/browser/android/tab_storage_packager_android.cc
+++ b/chrome/browser/android/tab_storage_packager_android.cc
@@ -98,7 +98,10 @@
   tabs_pb::TabStripCollectionState state = unmapped_data->TakeState();
   TabAndroid* active_tab = unmapped_data->active_tab();
   if (active_tab) {
-    state.set_active_tab_storage_id(mapping.GetStorageId(active_tab));
+    tabs_pb::Token* active_tab_storage_id =
+        state.mutable_active_tab_storage_id();
+    StorageIdToTokenProto(mapping.GetStorageId(active_tab),
+                          active_tab_storage_id);
   }
   delete unmapped_data;
   return std::make_unique<TabStripCollectionStorageData>(std::move(state));
diff --git a/chrome/browser/apps/app_service/intent_util.cc b/chrome/browser/apps/app_service/intent_util.cc
index 6bf22da..1039642 100644
--- a/chrome/browser/apps/app_service/intent_util.cc
+++ b/chrome/browser/apps/app_service/intent_util.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/browser/apps/app_service/intent_util.h"
 
 #include <algorithm>
@@ -20,6 +15,7 @@
 
 #include "base/check.h"
 #include "base/check_op.h"
+#include "base/compiler_specific.h"
 #include "base/containers/flat_map.h"
 #include "base/containers/flat_set.h"
 #include "base/debug/dump_without_crashing.h"
@@ -480,18 +476,21 @@
   auto extras = base::flat_map<std::string, std::string>();
   if (intent->share_text.has_value()) {
     // Slice off the "S." prefix for the key.
-    extras.insert(std::make_pair(kIntentExtraText + kIntentPrefixLength,
-                                 intent->share_text.value()));
+    extras.insert(
+        std::make_pair(UNSAFE_TODO(kIntentExtraText + kIntentPrefixLength),
+                       intent->share_text.value()));
   }
   if (intent->share_title.has_value()) {
     // Slice off the "S." prefix for the key.
-    extras.insert(std::make_pair(kIntentExtraSubject + kIntentPrefixLength,
-                                 intent->share_title.value()));
+    extras.insert(
+        std::make_pair(UNSAFE_TODO(kIntentExtraSubject + kIntentPrefixLength),
+                       intent->share_title.value()));
   }
   if (intent->start_type.has_value()) {
     // Slice off the "S." prefix for the key.
-    extras.insert(std::make_pair(kIntentExtraStartType + kIntentPrefixLength,
-                                 intent->start_type.value()));
+    extras.insert(
+        std::make_pair(UNSAFE_TODO(kIntentExtraStartType + kIntentPrefixLength),
+                       intent->start_type.value()));
   }
   if (!intent->extras.empty()) {
     extras.insert(intent->extras.begin(), intent->extras.end());
@@ -578,7 +577,7 @@
     const std::string& activity = intent->activity_name.value();
     const char* activity_compact_name =
         activity.find(package_name.c_str()) == 0
-            ? activity.c_str() + package_name.length()
+            ? UNSAFE_TODO(activity.c_str() + package_name.length())
             : activity.c_str();
     ret += base::StringPrintf("%s=%s/%s;", arc::kComponent,
                               package_name.c_str(), activity_compact_name);
diff --git a/chrome/browser/apps/app_service/publishers/extension_apps_chromeos_browsertest.cc b/chrome/browser/apps/app_service/publishers/extension_apps_chromeos_browsertest.cc
index 109f5a7..484a955 100644
--- a/chrome/browser/apps/app_service/publishers/extension_apps_chromeos_browsertest.cc
+++ b/chrome/browser/apps/app_service/publishers/extension_apps_chromeos_browsertest.cc
@@ -2,15 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include <memory>
 #include <string_view>
 #include <utility>
 
+#include "base/compiler_specific.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/memory/scoped_refptr.h"
@@ -255,7 +251,8 @@
   content::WebContents* web_contents[2];
   for (unsigned short i = 0; i < 2; i++) {
     LaunchExtensionAndCatchResult(*extension);
-    web_contents[i] = browser()->tab_strip_model()->GetActiveWebContents();
+    UNSAFE_TODO(web_contents[i]) =
+        browser()->tab_strip_model()->GetActiveWebContents();
   }
 
   // GetWindowIdOfTab() returns -1 for SessionID::InvalidValue().
diff --git a/chrome/browser/apps/app_shim/app_shim_manager_mac_unittest.cc b/chrome/browser/apps/app_shim/app_shim_manager_mac_unittest.cc
index 1ffa792..b1ee1d5 100644
--- a/chrome/browser/apps/app_shim/app_shim_manager_mac_unittest.cc
+++ b/chrome/browser/apps/app_shim/app_shim_manager_mac_unittest.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/browser/apps/app_shim/app_shim_manager_mac.h"
 
 #include <unistd.h>
@@ -18,6 +13,7 @@
 #include <vector>
 
 #include "base/apple/scoped_cftyperef.h"
+#include "base/compiler_specific.h"
 #include "base/functional/bind.h"
 #include "base/memory/raw_ptr.h"
 #include "base/strings/sys_string_conversions.h"
@@ -1860,8 +1856,8 @@
     std::vector<chrome::mojom::ApplicationDockMenuItemPtr> mock_dock_menu_items;
     for (size_t i = 0; i < menu_items_size; i++) {
       auto dock_menu_item = chrome::mojom::ApplicationDockMenuItem::New();
-      dock_menu_item->name = menu_items[i].name;
-      dock_menu_item->url = menu_items[i].url;
+      dock_menu_item->name = UNSAFE_TODO(menu_items[i]).name;
+      dock_menu_item->url = UNSAFE_TODO(menu_items[i]).url;
       mock_dock_menu_items.push_back(std::move(dock_menu_item));
     }
     return mock_dock_menu_items;
@@ -1872,8 +1868,10 @@
     const auto& dock_menu_items = host_aa_->test_app_shim_->dock_menu_items_;
     EXPECT_EQ(expected_menu_items_size, dock_menu_items.size());
     for (size_t i = 0; i < dock_menu_items.size(); i++) {
-      EXPECT_EQ(expected_menu_items[i].name, dock_menu_items[i]->name);
-      EXPECT_EQ(expected_menu_items[i].url, dock_menu_items[i]->url);
+      UNSAFE_TODO(
+          EXPECT_EQ(expected_menu_items[i].name, dock_menu_items[i]->name));
+      UNSAFE_TODO(
+          EXPECT_EQ(expected_menu_items[i].url, dock_menu_items[i]->url));
     }
   };
 
diff --git a/chrome/browser/ash/crosapi/BUILD.gn b/chrome/browser/ash/crosapi/BUILD.gn
index 9bca1190..7830b87 100644
--- a/chrome/browser/ash/crosapi/BUILD.gn
+++ b/chrome/browser/ash/crosapi/BUILD.gn
@@ -141,7 +141,6 @@
     "//chromeos/ash/components/nearby/common/connections_manager",
     "//chromeos/ash/components/network",
     "//chromeos/ash/components/network:vpn_providers_observer",
-    "//chromeos/ash/components/network/portal_detector",
     "//chromeos/ash/components/osauth/public",
     "//chromeos/ash/components/platform_keys",
     "//chromeos/ash/components/settings",
diff --git a/chrome/browser/ash/customization/customization_document_unittest.cc b/chrome/browser/ash/customization/customization_document_unittest.cc
index 6c468035..f233f8d6 100644
--- a/chrome/browser/ash/customization/customization_document_unittest.cc
+++ b/chrome/browser/ash/customization/customization_document_unittest.cc
@@ -11,7 +11,6 @@
 #include "base/strings/stringprintf.h"
 #include "chrome/browser/ash/app_list/app_list_syncable_service.h"
 #include "chrome/browser/ash/app_list/app_list_syncable_service_factory.h"
-#include "chrome/browser/ash/net/network_portal_detector_test_impl.h"
 #include "chrome/browser/ash/settings/scoped_cros_settings_test_helper.h"
 #include "chrome/browser/extensions/external_provider_impl.h"
 #include "chrome/browser/prefs/browser_prefs.h"
@@ -205,17 +204,11 @@
     std::string default_network_path =
         default_network ? default_network->path() : "";
 
-    network_portal_detector::InitializeForTesting(&network_portal_detector_);
-    std::string guid =
-        default_network ? default_network->guid() : std::string();
-    network_portal_detector_.SetDefaultNetworkForTesting(guid);
-
     interceptor_ =
         std::make_unique<TestURLLoaderFactoryInterceptor>(&loader_factory_);
   }
 
   void TearDown() override {
-    network_portal_detector::InitializeForTesting(nullptr);
     loader_factory_.ClearResponses();
     interceptor_.reset();
 
@@ -279,7 +272,6 @@
   ScopedCrosSettingsTestHelper scoped_cros_settings_test_helper_;
   network::TestURLLoaderFactory loader_factory_;
   std::unique_ptr<TestURLLoaderFactoryInterceptor> interceptor_;
-  NetworkPortalDetectorTestImpl network_portal_detector_;
 };
 
 TEST_F(ServicesCustomizationDocumentTest, Basic) {
diff --git a/chrome/browser/ash/login/app_mode/test/BUILD.gn b/chrome/browser/ash/login/app_mode/test/BUILD.gn
index 583e346..5abf839 100644
--- a/chrome/browser/ash/login/app_mode/test/BUILD.gn
+++ b/chrome/browser/ash/login/app_mode/test/BUILD.gn
@@ -144,7 +144,6 @@
     "//chromeos/ash/components/disks",
     "//chromeos/ash/components/disks:test_support",
     "//chromeos/ash/components/install_attributes:test_support",
-    "//chromeos/ash/components/network/portal_detector",
     "//chromeos/ash/components/policy/device_policy:test_support",
     "//chromeos/ash/components/settings",
     "//chromeos/ash/components/system",
diff --git a/chrome/browser/ash/login/enrollment/BUILD.gn b/chrome/browser/ash/login/enrollment/BUILD.gn
index d22d5d4..dacaaec 100644
--- a/chrome/browser/ash/login/enrollment/BUILD.gn
+++ b/chrome/browser/ash/login/enrollment/BUILD.gn
@@ -165,7 +165,6 @@
     "//chrome/test:test_support",
     "//chromeos/ash/components/install_attributes:test_support",
     "//chromeos/ash/components/network:test_support",
-    "//chromeos/ash/components/network/portal_detector:test_support",
     "//chromeos/ash/components/system",
     "//components/policy/core/common:common_constants",
     "//components/prefs:test_support",
diff --git a/chrome/browser/ash/login/enrollment/enrollment_screen_unittest.cc b/chrome/browser/ash/login/enrollment/enrollment_screen_unittest.cc
index 57aa5ba..615c419 100644
--- a/chrome/browser/ash/login/enrollment/enrollment_screen_unittest.cc
+++ b/chrome/browser/ash/login/enrollment/enrollment_screen_unittest.cc
@@ -40,7 +40,6 @@
 #include "chrome/test/base/testing_browser_process.h"
 #include "chromeos/ash/components/install_attributes/stub_install_attributes.h"
 #include "chromeos/ash/components/network/network_handler_test_helper.h"
-#include "chromeos/ash/components/network/portal_detector/mock_network_portal_detector.h"
 #include "chromeos/ash/components/system/fake_statistics_provider.h"
 #include "components/policy/core/common/cloud/cloud_policy_constants.h"
 #include "components/prefs/pref_service.h"
@@ -70,18 +69,9 @@
  public:
   ScopedNetworkInitializer() {
     network_handler_test_helper_.AddDefaultProfiles();
-    // Will be deleted in `network_portal_detector::Shutdown()`.
-    MockNetworkPortalDetector* mock_network_portal_detector =
-        new MockNetworkPortalDetector();
-    network_portal_detector::SetNetworkPortalDetector(
-        mock_network_portal_detector);
-
-    EXPECT_CALL(*mock_network_portal_detector, IsEnabled())
-        .Times(AnyNumber())
-        .WillRepeatedly(testing::Return(false));
   }
 
-  ~ScopedNetworkInitializer() { network_portal_detector::Shutdown(); }
+  ~ScopedNetworkInitializer() = default;
 
  private:
   // Initializes NetworkHandler and required DBus clients.
diff --git a/chrome/browser/ash/login/screens/BUILD.gn b/chrome/browser/ash/login/screens/BUILD.gn
index 3ff1fcbf..a31ab3a 100644
--- a/chrome/browser/ash/login/screens/BUILD.gn
+++ b/chrome/browser/ash/login/screens/BUILD.gn
@@ -287,7 +287,6 @@
     "//chromeos/ash/components/demo_mode",
     "//chromeos/ash/components/growth",
     "//chromeos/ash/components/install_attributes",
-    "//chromeos/ash/components/network/portal_detector",
     "//chromeos/ash/components/osauth/public",
     "//chromeos/ash/components/policy",
     "//chromeos/ash/components/quick_start",
@@ -620,8 +619,6 @@
     "//chromeos/ash/components/dbus/upstart",
     "//chromeos/ash/components/install_attributes:test_support",
     "//chromeos/ash/components/network:test_support",
-    "//chromeos/ash/components/network/portal_detector",
-    "//chromeos/ash/components/network/portal_detector:test_support",
     "//chromeos/ash/components/settings",
     "//chromeos/ash/components/system",
     "//chromeos/ash/experiences/arc:arc_base_utils",
diff --git a/chrome/browser/ash/login/screens/consolidated_consent_screen.cc b/chrome/browser/ash/login/screens/consolidated_consent_screen.cc
index 60a4ea7..6257bc6 100644
--- a/chrome/browser/ash/login/screens/consolidated_consent_screen.cc
+++ b/chrome/browser/ash/login/screens/consolidated_consent_screen.cc
@@ -44,7 +44,6 @@
 #include "chrome/grit/branded_strings.h"
 #include "chrome/grit/generated_resources.h"
 #include "chromeos/ash/components/install_attributes/install_attributes.h"
-#include "chromeos/ash/components/network/portal_detector/network_portal_detector.h"
 #include "chromeos/ash/components/osauth/public/auth_session_storage.h"
 #include "chromeos/ash/experiences/arc/arc_prefs.h"
 #include "components/consent_auditor/consent_auditor.h"
@@ -558,7 +557,6 @@
     RecordRecoveryOptinResult(context()->recovery_setup);
   }
   StartupUtils::MarkEulaAccepted();
-  network_portal_detector::GetInstance()->Enable();
 
   const DemoSetupController* const demo_setup_controller =
       WizardController::default_controller()->demo_setup_controller();
diff --git a/chrome/browser/ash/login/screens/consumer_update_screen_browsertest.cc b/chrome/browser/ash/login/screens/consumer_update_screen_browsertest.cc
index 2f5fb20..3e0fbd8 100644
--- a/chrome/browser/ash/login/screens/consumer_update_screen_browsertest.cc
+++ b/chrome/browser/ash/login/screens/consumer_update_screen_browsertest.cc
@@ -28,7 +28,6 @@
 #include "chrome/browser/ash/login/test/oobe_screen_waiter.h"
 #include "chrome/browser/ash/login/version_updater/version_updater.h"
 #include "chrome/browser/ash/login/wizard_controller.h"
-#include "chrome/browser/ash/net/network_portal_detector_test_impl.h"
 #include "chrome/browser/ash/policy/core/device_policy_cros_browser_test.h"
 #include "chrome/browser/ash/policy/handlers/minimum_version_policy_test_helpers.h"
 #include "chrome/browser/ui/ash/login/login_display_host.h"
diff --git a/chrome/browser/ash/login/screens/update_required_screen_browsertest.cc b/chrome/browser/ash/login/screens/update_required_screen_browsertest.cc
index 39a3c00f..0ea5cf8 100644
--- a/chrome/browser/ash/login/screens/update_required_screen_browsertest.cc
+++ b/chrome/browser/ash/login/screens/update_required_screen_browsertest.cc
@@ -23,7 +23,6 @@
 #include "chrome/browser/ash/login/test/oobe_screen_waiter.h"
 #include "chrome/browser/ash/login/version_updater/version_updater.h"
 #include "chrome/browser/ash/login/wizard_controller.h"
-#include "chrome/browser/ash/net/network_portal_detector_test_impl.h"
 #include "chrome/browser/ash/policy/core/device_policy_cros_browser_test.h"
 #include "chrome/browser/ash/policy/handlers/minimum_version_policy_test_helpers.h"
 #include "chrome/browser/ui/ash/login/login_display_host.h"
@@ -217,10 +216,6 @@
   std::string wifi_path =
       network_state_test_helper_->ConfigureWiFi(shill::kStateRedirectFound);
 
-  network_portal_detector::InitializeForTesting(
-      new NetworkPortalDetectorTestImpl());
-  network_portal_detector::GetInstance()->Enable();
-
   static_cast<UpdateRequiredScreen*>(
       WizardController::default_controller()->current_screen())
       ->SetErrorMessageDelayForTesting(base::Milliseconds(10));
@@ -255,7 +250,6 @@
 
   test::OobeJS().ExpectVisiblePath(kUpdateRequiredScreen);
   test::OobeJS().ExpectVisiblePath(kUpdateProcessStep);
-  network_portal_detector::Shutdown();
 }
 
 IN_PROC_BROWSER_TEST_F(UpdateRequiredScreenTest, TestEolReached) {
diff --git a/chrome/browser/ash/login/screens/update_required_screen_unittest.cc b/chrome/browser/ash/login/screens/update_required_screen_unittest.cc
index 868dc1b..cd30f5622 100644
--- a/chrome/browser/ash/login/screens/update_required_screen_unittest.cc
+++ b/chrome/browser/ash/login/screens/update_required_screen_unittest.cc
@@ -23,8 +23,6 @@
 #include "chromeos/ash/components/dbus/update_engine/update_engine_client.h"
 #include "chromeos/ash/components/install_attributes/stub_install_attributes.h"
 #include "chromeos/ash/components/network/network_handler_test_helper.h"
-#include "chromeos/ash/components/network/portal_detector/mock_network_portal_detector.h"
-#include "chromeos/ash/components/network/portal_detector/network_portal_detector.h"
 #include "chromeos/ash/components/settings/cros_settings.h"
 #include "content/public/test/browser_task_environment.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -60,17 +58,9 @@
     network_handler_test_helper_ = std::make_unique<NetworkHandlerTestHelper>();
     network_handler_test_helper_->AddDefaultProfiles();
 
-    mock_network_portal_detector_ = new MockNetworkPortalDetector();
-    network_portal_detector::SetNetworkPortalDetector(
-        mock_network_portal_detector_);
     mock_error_screen_ =
         std::make_unique<MockErrorScreen>(mock_error_view_.AsWeakPtr());
 
-    // Ensure proper behavior of `UpdateRequiredScreen`'s supporting objects.
-    EXPECT_CALL(*mock_network_portal_detector_, IsEnabled())
-        .Times(AnyNumber())
-        .WillRepeatedly(Return(false));
-
     update_required_screen_ = std::make_unique<UpdateRequiredScreen>(
         fake_view_.get()->AsWeakPtr(), mock_error_screen_.get(),
         base::DoNothing());
@@ -86,7 +76,6 @@
     update_required_screen_.reset();
     mock_error_screen_.reset();
 
-    network_portal_detector::Shutdown();
     network_handler_test_helper_.reset();
     UpdateEngineClient::Shutdown();
   }
@@ -101,9 +90,6 @@
   MockErrorScreenView mock_error_view_;
   std::unique_ptr<MockErrorScreen> mock_error_screen_;
   std::unique_ptr<WizardContext> wizard_context_;
-  // Will be deleted in `network_portal_detector::Shutdown()`.
-  raw_ptr<MockNetworkPortalDetector, DanglingUntriaged>
-      mock_network_portal_detector_;
   // Will be deleted in `DBusThreadManager::Shutdown()`.
   raw_ptr<FakeUpdateEngineClient, DanglingUntriaged> fake_update_engine_client_;
   // Initializes NetworkHandler and required DBus clients.
diff --git a/chrome/browser/ash/login/session/BUILD.gn b/chrome/browser/ash/login/session/BUILD.gn
index 21b23be..025ac95 100644
--- a/chrome/browser/ash/login/session/BUILD.gn
+++ b/chrome/browser/ash/login/session/BUILD.gn
@@ -91,7 +91,6 @@
     "//chromeos/ash/components/install_attributes",
     "//chromeos/ash/components/login/session",
     "//chromeos/ash/components/network",
-    "//chromeos/ash/components/network/portal_detector",
     "//chromeos/ash/components/osauth/public",
     "//chromeos/ash/components/peripheral_notification",
     "//chromeos/ash/components/settings",
diff --git a/chrome/browser/ash/login/session/user_session_manager.cc b/chrome/browser/ash/login/session/user_session_manager.cc
index ef2931a..044c69c 100644
--- a/chrome/browser/ash/login/session/user_session_manager.cc
+++ b/chrome/browser/ash/login/session/user_session_manager.cc
@@ -146,7 +146,6 @@
 #include "chromeos/ash/components/login/auth/public/user_context.h"
 #include "chromeos/ash/components/login/auth/stub_authenticator_builder.h"
 #include "chromeos/ash/components/login/session/session_termination_manager.h"
-#include "chromeos/ash/components/network/portal_detector/network_portal_detector.h"
 #include "chromeos/ash/components/settings/cros_settings.h"
 #include "chromeos/ash/components/settings/cros_settings_names.h"
 #include "chromeos/ash/components/tpm/prepare_tpm.h"
@@ -546,7 +545,6 @@
   // mark it here.
   if (ash::InstallAttributes::Get()->IsEnterpriseManaged()) {
     StartupUtils::MarkEulaAccepted();
-    network_portal_detector::GetInstance()->Enable();
     return false;
   }
   if (!IsRevenUpdatedToFlex()) {
diff --git a/chrome/browser/ash/login/test/BUILD.gn b/chrome/browser/ash/login/test/BUILD.gn
index bade1e6..812d6b1e 100644
--- a/chrome/browser/ash/login/test/BUILD.gn
+++ b/chrome/browser/ash/login/test/BUILD.gn
@@ -105,7 +105,6 @@
     "//chromeos/ash/components/dbus/userdataauth",
     "//chromeos/ash/components/login/auth",
     "//chromeos/ash/components/login/auth/public:authpublic",
-    "//chromeos/ash/components/network/portal_detector",
     "//chromeos/ash/components/osauth/public",
     "//components/account_id",
     "//components/policy/core/common:test_support",
diff --git a/chrome/browser/ash/login/test/network_portal_detector_mixin.cc b/chrome/browser/ash/login/test/network_portal_detector_mixin.cc
index 675adf79..1c3f914380 100644
--- a/chrome/browser/ash/login/test/network_portal_detector_mixin.cc
+++ b/chrome/browser/ash/login/test/network_portal_detector_mixin.cc
@@ -6,7 +6,6 @@
 
 #include "base/run_loop.h"
 #include "base/strings/stringprintf.h"
-#include "chrome/browser/ash/net/network_portal_detector_test_impl.h"
 #include "chromeos/ash/components/dbus/shill/fake_shill_manager_client.h"
 #include "chromeos/ash/components/dbus/shill/fake_shill_profile_client.h"
 #include "chromeos/ash/components/dbus/shill/fake_shill_service_client.h"
@@ -48,31 +47,26 @@
     const std::string& network_type,
     NetworkStatus status) {
   SetShillDefaultNetwork(network_guid, network_type, status);
-  network_portal_detector_->SetDefaultNetworkForTesting(network_guid);
 
   SimulateDefaultNetworkState(status);
 }
 
 void NetworkPortalDetectorMixin::SimulateNoNetwork() {
   SetShillDefaultNetwork("", "", NetworkStatus::kOffline);
-  network_portal_detector_->SetDefaultNetworkForTesting("");
 }
 
 void NetworkPortalDetectorMixin::SimulateDefaultNetworkState(
     NetworkStatus status) {
-  std::string default_network_guid =
-      network_portal_detector_->GetDefaultNetworkGuid();
-  DCHECK(!default_network_guid.empty());
+  DCHECK(!default_network_guid_.empty());
   std::string default_network_type =
-      default_network_guid.compare(0, 4, "wifi") == 0 ? shill::kTypeWifi
-                                                      : shill::kTypeEthernet;
+      default_network_guid_.compare(0, 4, "wifi") == 0 ? shill::kTypeWifi
+                                                       : shill::kTypeEthernet;
 
   if (NetworkHandler::IsInitialized()) {
     const NetworkState* default_network =
         NetworkHandler::Get()->network_state_handler()->DefaultNetwork();
-    if (default_network_guid != default_network_guid_ || !default_network ||
-        default_network->guid() != default_network_guid) {
-      SetShillDefaultNetwork(default_network_guid, default_network_type,
+    if (!default_network || default_network->guid() != default_network_guid_) {
+      SetShillDefaultNetwork(default_network_guid_, default_network_type,
                              status);
     } else {
       std::string state = StatusToState(status);
@@ -84,18 +78,10 @@
 }
 
 void NetworkPortalDetectorMixin::SetUpOnMainThread() {
-  // Setup network portal detector to return online for the default network.
-  network_portal_detector_ = new NetworkPortalDetectorTestImpl();
-  network_portal_detector::InitializeForTesting(network_portal_detector_);
-  network_portal_detector_->Enable();
   SetDefaultNetwork(FakeShillManagerClient::kFakeEthernetNetworkGuid,
                     shill::kTypeEthernet, NetworkStatus::kOnline);
 }
 
-void NetworkPortalDetectorMixin::TearDownOnMainThread() {
-  network_portal_detector::Shutdown();
-}
-
 void NetworkPortalDetectorMixin::SetShillDefaultNetwork(
     const std::string& network_guid,
     const std::string& network_type,
diff --git a/chrome/browser/ash/login/test/network_portal_detector_mixin.h b/chrome/browser/ash/login/test/network_portal_detector_mixin.h
index 50065d66c..1584d161 100644
--- a/chrome/browser/ash/login/test/network_portal_detector_mixin.h
+++ b/chrome/browser/ash/login/test/network_portal_detector_mixin.h
@@ -7,13 +7,10 @@
 
 #include "base/memory/raw_ptr.h"
 #include "chrome/test/base/mixin_based_in_process_browser_test.h"
-#include "chromeos/ash/components/network/portal_detector/network_portal_detector.h"
 #include "third_party/cros_system_api/dbus/service_constants.h"
 
 namespace ash {
 
-class NetworkPortalDetectorTestImpl;
-
 // DEPRECATED, DO NOT USE IN NEW TESTS. NetworkStateHandler should be used
 // to track portal state. This mixin is maintained for compatibility with
 // existing tests. See NetworkStateTestHelper for testing with NetworkState.
@@ -53,15 +50,12 @@
 
   // InProcessBrowserTestMixin:
   void SetUpOnMainThread() override;
-  void TearDownOnMainThread() override;
 
  private:
   void SetShillDefaultNetwork(const std::string& network_guid,
                               const std::string& network_type,
                               NetworkStatus status);
 
-  raw_ptr<NetworkPortalDetectorTestImpl, DanglingUntriaged>
-      network_portal_detector_ = nullptr;
   std::string default_network_guid_;
 };
 
diff --git a/chrome/browser/ash/login/version_updater/BUILD.gn b/chrome/browser/ash/login/version_updater/BUILD.gn
index d32ad5e19..c561f1b9 100644
--- a/chrome/browser/ash/login/version_updater/BUILD.gn
+++ b/chrome/browser/ash/login/version_updater/BUILD.gn
@@ -21,7 +21,6 @@
   deps = [
     "//chrome/app:branded_strings",
     "//chrome/app:generated_resources",
-    "//chromeos/ash/components/network/portal_detector",
     "//ui/base",
   ]
 }
@@ -56,8 +55,6 @@
     "//chrome/test:test_support",
     "//chromeos/ash/components/dbus/update_engine",
     "//chromeos/ash/components/network:test_support",
-    "//chromeos/ash/components/network/portal_detector",
-    "//chromeos/ash/components/network/portal_detector:test_support",
     "//content/test:test_support",
     "//testing/gtest",
   ]
diff --git a/chrome/browser/ash/login/version_updater/version_updater.cc b/chrome/browser/ash/login/version_updater/version_updater.cc
index f10b175..f401b6f 100644
--- a/chrome/browser/ash/login/version_updater/version_updater.cc
+++ b/chrome/browser/ash/login/version_updater/version_updater.cc
@@ -20,7 +20,6 @@
 #include "chromeos/ash/components/dbus/update_engine/update_engine_client.h"
 #include "chromeos/ash/components/network/network_handler.h"
 #include "chromeos/ash/components/network/network_state_handler.h"
-#include "chromeos/ash/components/network/portal_detector/network_portal_detector.h"
 #include "ui/base/l10n/l10n_util.h"
 
 namespace ash {
diff --git a/chrome/browser/ash/login/wizard_controller_browsertest.cc b/chrome/browser/ash/login/wizard_controller_browsertest.cc
index f417932..7ee9c5b 100644
--- a/chrome/browser/ash/login/wizard_controller_browsertest.cc
+++ b/chrome/browser/ash/login/wizard_controller_browsertest.cc
@@ -66,7 +66,6 @@
 #include "chrome/browser/ash/login/test/js_checker.h"
 #include "chrome/browser/ash/login/test/local_state_mixin.h"
 #include "chrome/browser/ash/login/test/login_manager_mixin.h"
-#include "chrome/browser/ash/login/test/network_portal_detector_mixin.h"
 #include "chrome/browser/ash/login/test/oobe_base_test.h"
 #include "chrome/browser/ash/login/test/oobe_configuration_waiter.h"
 #include "chrome/browser/ash/login/test/oobe_screen_exit_waiter.h"
@@ -74,7 +73,6 @@
 #include "chrome/browser/ash/login/test/oobe_screens_utils.h"
 #include "chrome/browser/ash/login/test/test_predicate_waiter.h"
 #include "chrome/browser/ash/login/test/user_auth_config.h"
-#include "chrome/browser/ash/net/network_portal_detector_test_impl.h"
 #include "chrome/browser/ash/policy/core/browser_policy_connector_ash.h"
 #include "chrome/browser/ash/policy/enrollment/auto_enrollment_controller.h"
 #include "chrome/browser/ash/policy/enrollment/auto_enrollment_state.h"
@@ -668,18 +666,6 @@
         policy::AutoEnrollmentTypeChecker::kUnifiedStateDeterminationNever);
   }
 
-  void InitNetworkPortalDetector() {
-    network_portal_detector_ = new NetworkPortalDetectorTestImpl();
-    network_portal_detector::InitializeForTesting(network_portal_detector_);
-
-    // Default networks defaults to "eth1" in tests.
-    const NetworkState* default_network =
-        NetworkHandler::Get()->network_state_handler()->DefaultNetwork();
-    ASSERT_TRUE(default_network);
-    network_portal_detector_->SetDefaultNetworkForTesting(
-        default_network->guid());
-  }
-
   void WaitUntilTimezoneResolved() {
     base::RunLoop loop;
     if (!WizardController::default_controller()
@@ -723,8 +709,6 @@
     CheckCurrentScreen(NetworkScreenView::kScreenId);
     EXPECT_CALL(*mock_network_screen_, HideImpl()).Times(1);
 
-    InitNetworkPortalDetector();
-
     EXPECT_CALL(*mock_update_screen_, ShowImpl()).Times(1);
     mock_network_screen_->ExitScreen(NetworkScreen::Result::CONNECTED);
 
@@ -806,8 +790,6 @@
   network::TestURLLoaderFactory test_url_loader_factory_;
 
  private:
-  raw_ptr<NetworkPortalDetectorTestImpl, DanglingUntriaged>
-      network_portal_detector_ = nullptr;
   std::unique_ptr<base::AutoReset<bool>> branded_build_override_;
 };
 
@@ -876,8 +858,6 @@
 }
 
 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowSkipUpdateEnroll) {
-  InitNetworkPortalDetector();
-
   CheckCurrentScreen(WelcomeView::kScreenId);
   EXPECT_CALL(*mock_update_screen_, ShowImpl()).Times(0);
   EXPECT_CALL(*mock_network_screen_, ShowImpl()).Times(1);
diff --git a/chrome/browser/ash/login/wizard_controller_unittest.cc b/chrome/browser/ash/login/wizard_controller_unittest.cc
index a368fe3d..ec697a4 100644
--- a/chrome/browser/ash/login/wizard_controller_unittest.cc
+++ b/chrome/browser/ash/login/wizard_controller_unittest.cc
@@ -23,7 +23,6 @@
 #include "chrome/browser/ash/login/enrollment/mock_enrollment_launcher.h"
 #include "chrome/browser/ash/login/startup_utils.h"
 #include "chrome/browser/ash/login/wizard_context.h"
-#include "chrome/browser/ash/net/network_portal_detector_test_impl.h"
 #include "chrome/browser/ash/net/rollback_network_config/fake_rollback_network_config.h"
 #include "chrome/browser/ash/net/rollback_network_config/rollback_network_config_service.h"
 #include "chrome/browser/ash/policy/enrollment/auto_enrollment_type_checker.h"
@@ -238,7 +237,6 @@
         std::make_unique<ScopedEnrollmentLauncherFactoryOverrideForTesting>(
             base::BindRepeating(FakeEnrollmentLauncher::Create,
                                 &mock_enrollment_launcher_));
-    network_portal_detector::InitializeForTesting(&network_portal_detector_);
     chromeos::TpmManagerClient::InitializeFake();
     StatsReportingController::Initialize(
         TestingBrowserProcess::GetGlobal()->local_state());
@@ -258,7 +256,6 @@
     auth_events_recorder_.reset();
     StatsReportingController::Shutdown();
     chromeos::TpmManagerClient::Shutdown();
-    network_portal_detector::InitializeForTesting(nullptr);
     enrollment_launcher_factory_.reset();
     OobeConfigurationClient::Shutdown();
     DBusThreadManager::Shutdown();
@@ -321,7 +318,6 @@
   ash::system::ScopedFakeStatisticsProvider statistics_provider_;
   std::unique_ptr<ScopedEnrollmentLauncherFactoryOverrideForTesting>
       enrollment_launcher_factory_;
-  NetworkPortalDetectorTestImpl network_portal_detector_;
   std::unique_ptr<AuthEventsRecorder> auth_events_recorder_;
   std::unique_ptr<WallpaperControllerClientImpl> wallpaper_controller_client_;
 };
diff --git a/chrome/browser/autofill/BUILD.gn b/chrome/browser/autofill/BUILD.gn
index e7d5ab3..b8497dc 100644
--- a/chrome/browser/autofill/BUILD.gn
+++ b/chrome/browser/autofill/BUILD.gn
@@ -92,6 +92,8 @@
       "android/autofill_image_fetcher_impl.h",
       "android/autofill_profile_bridge.cc",
       "android/autofill_profile_bridge.h",
+      "android/entity_data_manager_android.cc",
+      "android/entity_data_manager_android.h",
       "android/personal_data_manager_android.cc",
       "android/personal_data_manager_android.h",
       "android/phone_number_util_android.cc",
diff --git a/chrome/browser/autofill/android/BUILD.gn b/chrome/browser/autofill/android/BUILD.gn
index b4f16a0..c7c00f8 100644
--- a/chrome/browser/autofill/android/BUILD.gn
+++ b/chrome/browser/autofill/android/BUILD.gn
@@ -40,6 +40,8 @@
     "java/src/org/chromium/chrome/browser/autofill/PersonalDataManagerFactory.java",
     "java/src/org/chromium/chrome/browser/autofill/PhoneNumberUtil.java",
     "java/src/org/chromium/chrome/browser/autofill/SubKeyRequesterFactory.java",
+    "java/src/org/chromium/chrome/browser/autofill/autofill_ai/EntityDataManager.java",
+    "java/src/org/chromium/chrome/browser/autofill/autofill_ai/EntityDataManagerFactory.java",
     "java/src/org/chromium/chrome/browser/autofill/editors/AddressEditorCoordinator.java",
     "java/src/org/chromium/chrome/browser/autofill/editors/AddressEditorMediator.java",
     "java/src/org/chromium/chrome/browser/autofill/editors/DropdownFieldAdapter.java",
@@ -168,6 +170,7 @@
     "java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java",
     "java/src/org/chromium/chrome/browser/autofill/PhoneNumberUtil.java",
     "java/src/org/chromium/chrome/browser/autofill/SubKeyRequesterFactory.java",
+    "java/src/org/chromium/chrome/browser/autofill/autofill_ai/EntityDataManager.java",
   ]
 }
 
diff --git a/chrome/browser/autofill/android/entity_data_manager_android.cc b/chrome/browser/autofill/android/entity_data_manager_android.cc
new file mode 100644
index 0000000..e6a833c
--- /dev/null
+++ b/chrome/browser/autofill/android/entity_data_manager_android.cc
@@ -0,0 +1,46 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/autofill/android/entity_data_manager_android.h"
+
+#include "base/android/jni_string.h"
+#include "base/check_deref.h"
+#include "chrome/browser/autofill/autofill_entity_data_manager_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "components/autofill/core/browser/data_manager/autofill_ai/entity_data_manager.h"
+
+// Must come after all headers that specialize FromJniType() / ToJniType().
+#include "chrome/browser/autofill/android/jni_headers/EntityDataManager_jni.h"
+
+namespace autofill {
+
+EntityDataManagerAndroid::EntityDataManagerAndroid(
+    JNIEnv* env,
+    const jni_zero::JavaRef<jobject>& obj,
+    EntityDataManager* entity_data_manager)
+    : weak_java_obj_(env, obj),
+      entity_data_manager_(CHECK_DEREF(entity_data_manager)) {}
+
+EntityDataManagerAndroid::~EntityDataManagerAndroid() = default;
+
+static jlong JNI_EntityDataManager_Init(JNIEnv* env,
+                                        const jni_zero::JavaRef<jobject>& obj,
+                                        Profile* profile) {
+  CHECK(profile);
+  EntityDataManagerAndroid* entity_data_manager_android =
+      new EntityDataManagerAndroid(
+          env, obj, AutofillEntityDataManagerFactory::GetForProfile(profile));
+  return reinterpret_cast<intptr_t>(entity_data_manager_android);
+}
+
+void EntityDataManagerAndroid::Destroy(JNIEnv* env) {
+  delete this;
+}
+
+void EntityDataManagerAndroid::RemoveEntityInstance(JNIEnv* env,
+                                                    const std::string& guid) {
+  entity_data_manager().RemoveEntityInstance(EntityInstance::EntityId(guid));
+}
+
+}  // namespace autofill
diff --git a/chrome/browser/autofill/android/entity_data_manager_android.h b/chrome/browser/autofill/android/entity_data_manager_android.h
new file mode 100644
index 0000000..8628e7a
--- /dev/null
+++ b/chrome/browser/autofill/android/entity_data_manager_android.h
@@ -0,0 +1,49 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_AUTOFILL_ANDROID_ENTITY_DATA_MANAGER_ANDROID_H_
+#define CHROME_BROWSER_AUTOFILL_ANDROID_ENTITY_DATA_MANAGER_ANDROID_H_
+
+#include "base/android/jni_weak_ref.h"
+#include "base/android/scoped_java_ref.h"
+#include "base/memory/raw_ref.h"
+#include "components/autofill/core/browser/data_manager/autofill_ai/entity_data_manager.h"
+#include "components/autofill/core/browser/data_model/autofill_ai/entity_instance.h"
+
+namespace autofill {
+
+// Android wrapper of the EntityDataManager which provides access from the
+// Java layer.
+class EntityDataManagerAndroid {
+ public:
+  EntityDataManagerAndroid(JNIEnv* env,
+                           const jni_zero::JavaRef<jobject>& obj,
+                           EntityDataManager* entity_data_manager);
+
+  EntityDataManagerAndroid(const EntityDataManagerAndroid&) = delete;
+  EntityDataManagerAndroid& operator=(const EntityDataManagerAndroid&) = delete;
+
+  // Trigger the destruction of the C++ object from Java.
+  void Destroy(JNIEnv* env);
+
+  // Removes the entity instance represented by `guid`.
+  void RemoveEntityInstance(JNIEnv* env, const std::string& guid);
+
+ private:
+  ~EntityDataManagerAndroid();
+
+  EntityDataManager& entity_data_manager() {
+    return entity_data_manager_.get();
+  }
+
+  // Pointer to the java counterpart.
+  JavaObjectWeakGlobalRef weak_java_obj_;
+
+  // Pointer to the EntityDataManager.
+  raw_ref<EntityDataManager> entity_data_manager_;
+};
+
+}  // namespace autofill
+
+#endif  // CHROME_BROWSER_AUTOFILL_ANDROID_ENTITY_DATA_MANAGER_ANDROID_H_
diff --git a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/autofill_ai/EntityDataManager.java b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/autofill_ai/EntityDataManager.java
new file mode 100644
index 0000000..ca335113
--- /dev/null
+++ b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/autofill_ai/EntityDataManager.java
@@ -0,0 +1,62 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.autofill.autofill_ai;
+
+import androidx.annotation.VisibleForTesting;
+
+import org.jni_zero.JNINamespace;
+import org.jni_zero.JniType;
+import org.jni_zero.NativeMethods;
+
+import org.chromium.base.ThreadUtils;
+import org.chromium.base.lifetime.Destroyable;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.chrome.browser.profiles.Profile;
+
+/**
+ * Android wrapper of the EntityDataManager which provides access from the Java layer.
+ *
+ * <p>Only usable from the UI thread.
+ *
+ * <p>See components/autofill/core/browser/data_manager/autofill_ai/entity_data_manager.h for more
+ * details.
+ */
+@NullMarked
+@JNINamespace("autofill")
+public class EntityDataManager implements Destroyable {
+
+    private long mNativeEntityDataManagerAndroid;
+
+    EntityDataManager(Profile profile) {
+        mNativeEntityDataManagerAndroid = EntityDataManagerJni.get().init(this, profile);
+    }
+
+    @Override
+    public void destroy() {
+        EntityDataManagerJni.get().destroy(mNativeEntityDataManagerAndroid);
+        mNativeEntityDataManagerAndroid = 0;
+    }
+
+    /**
+     * Removes the entity instance represented by the given GUID.
+     *
+     * @param guid The GUID of the entity instance to remove.
+     */
+    public void removeEntityInstance(String guid) {
+        ThreadUtils.assertOnUiThread();
+        EntityDataManagerJni.get().removeEntityInstance(mNativeEntityDataManagerAndroid, guid);
+    }
+
+    @NativeMethods
+    @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
+    public interface Natives {
+        long init(EntityDataManager self, @JniType("Profile*") Profile profile);
+
+        void destroy(long nativeEntityDataManagerAndroid);
+
+        void removeEntityInstance(
+                long nativeEntityDataManagerAndroid, @JniType("std::string") String guid);
+    }
+}
diff --git a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/autofill_ai/EntityDataManagerFactory.java b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/autofill_ai/EntityDataManagerFactory.java
new file mode 100644
index 0000000..0fbf6da
--- /dev/null
+++ b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/autofill_ai/EntityDataManagerFactory.java
@@ -0,0 +1,34 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.autofill.autofill_ai;
+
+import org.chromium.base.ResettersForTesting;
+import org.chromium.base.ThreadUtils;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
+import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.profiles.ProfileKeyedMap;
+
+/** Provides access to {@link EntityDataManager}s for a given {@link Profile}. */
+@NullMarked
+public class EntityDataManagerFactory {
+    private static final ProfileKeyedMap<EntityDataManager> sProfileMap =
+            ProfileKeyedMap.createMapOfDestroyables(
+                    ProfileKeyedMap.ProfileSelection.REDIRECTED_TO_ORIGINAL);
+    private static @Nullable EntityDataManager sManagerForTesting;
+
+    /** Return the {@link EntityDataManager} associated with the passed in {@link Profile}. */
+    public static EntityDataManager getForProfile(Profile profile) {
+        if (sManagerForTesting != null) return sManagerForTesting;
+        ThreadUtils.assertOnUiThread();
+        return sProfileMap.getForProfile(profile, EntityDataManager::new);
+    }
+
+    public static void setInstanceForTesting(EntityDataManager manager) {
+        var oldValue = sManagerForTesting;
+        sManagerForTesting = manager;
+        ResettersForTesting.register(() -> sManagerForTesting = oldValue);
+    }
+}
diff --git a/chrome/browser/autofill/glic/actor_filling_observer.cc b/chrome/browser/autofill/glic/actor_filling_observer.cc
index a4f83cb9..07d2174b 100644
--- a/chrome/browser/autofill/glic/actor_filling_observer.cc
+++ b/chrome/browser/autofill/glic/actor_filling_observer.cc
@@ -34,19 +34,11 @@
   // If `remaining_field_ids_` is empty, this will stop the observation and
   // execute `callback_`.
   FinalizeIfComplete();
+  UpdateTimeout();
 }
 
 ActorFillingObserver::~ActorFillingObserver() {
-  if (callback_) {
-    // TODO(crbug.com/455788947): Consider introducing a different type of
-    // error.
-    // TODO(crbug.com/455788947): Consider not sending an error if some
-    // fields were filled.
-    base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
-        FROM_HERE,
-        base::BindOnce(std::move(callback_),
-                       base::unexpected(ActorFormFillingError::kNoForm)));
-  }
+  Reset();
 }
 
 std::optional<bool> ActorFillingObserver::IsCreditCardFetchOngoing() const {
@@ -77,14 +69,17 @@
 void ActorFillingObserver::OnCreditCardFetchStarted(CreditCardAccessManager&,
                                                     const CreditCard&) {
   ++ongoing_credit_card_fetches_;
+  UpdateTimeout();
 }
 void ActorFillingObserver::OnCreditCardFetchSucceeded(CreditCardAccessManager&,
                                                       const CreditCard&) {
   DecreaseOngoingCreditCardFetches();
+  UpdateTimeout();
 }
 void ActorFillingObserver::OnCreditCardFetchFailed(CreditCardAccessManager&,
                                                    const CreditCard*) {
   DecreaseOngoingCreditCardFetches();
+  UpdateTimeout();
 }
 
 void ActorFillingObserver::DecreaseOngoingCreditCardFetches() {
@@ -103,8 +98,35 @@
   }
   base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
       FROM_HERE, base::BindOnce(std::move(callback_), base::ok()));
+  Reset();
+}
+
+void ActorFillingObserver::Reset() {
   autofill_managers_observation_.Reset();
   credit_card_access_managers_observation_.Reset();
+  ongoing_credit_card_fetches_ = 0;
+  if (callback_) {
+    // TODO(crbug.com/455788947): Consider introducing a different type of
+    // error.
+    // TODO(crbug.com/455788947): Consider not sending an error if some
+    // fields were filled.
+    base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
+        FROM_HERE,
+        base::BindOnce(std::move(callback_),
+                       base::unexpected(ActorFormFillingError::kNoForm)));
+  }
+}
+
+void ActorFillingObserver::UpdateTimeout() {
+  if (IsCreditCardFetchOngoing().value_or(false)) {
+    timeout_timer_.Stop();
+    return;
+  }
+  if (!timeout_timer_.IsRunning()) {
+    timeout_timer_.Start(FROM_HERE, GetFillingTimeout(),
+                         base::BindRepeating(&ActorFillingObserver::Reset,
+                                             base::Unretained(this)));
+  }
 }
 
 }  // namespace autofill
diff --git a/chrome/browser/autofill/glic/actor_filling_observer.h b/chrome/browser/autofill/glic/actor_filling_observer.h
index 9c29751..3e9737b9 100644
--- a/chrome/browser/autofill/glic/actor_filling_observer.h
+++ b/chrome/browser/autofill/glic/actor_filling_observer.h
@@ -9,6 +9,8 @@
 
 #include "base/containers/span.h"
 #include "base/functional/callback.h"
+#include "base/time/time.h"
+#include "base/timer/timer.h"
 #include "base/types/expected.h"
 #include "components/autofill/core/browser/foundations/autofill_manager.h"
 #include "components/autofill/core/browser/foundations/scoped_autofill_managers_observation.h"
@@ -40,6 +42,13 @@
                        Callback callback);
   ~ActorFillingObserver() override;
 
+  // The maximum amount of time to wait for a fill to happen if no credit card
+  // fetch is ongoing.
+  static base::TimeDelta GetFillingTimeout() { return base::Seconds(2); }
+
+  // The maximum amount of time for which this filling observer should exist.
+  static base::TimeDelta GetMaximumTimeout() { return base::Minutes(1); }
+
   // Returns whether there is least one credit card fetch that was started and
   // that has not yet finished while this observer is active.
   // Returns `std::nullopt` if the observer if all fills have completed and
@@ -69,6 +78,16 @@
   // remaining field ids. Otherwise does nothing.
   void FinalizeIfComplete();
 
+  // Stops all observations and runs `callback_` with an error if it is not
+  // null.
+  void Reset();
+
+  // Updates `timeout_timer_` as follows:
+  // - If a credit card fetch is ongoing, stops the timer.
+  // - Otherwise starts a timer for resetting `this` (unless one is already
+  // running).
+  void UpdateTimeout();
+
   // The fields that have not yet been filled.
   absl::flat_hash_set<FieldGlobalId> remaining_field_ids_;
 
@@ -84,6 +103,9 @@
 
   // The number of currently ongoing credit card fetches.
   size_t ongoing_credit_card_fetches_ = 0;
+
+  // A timer that resets `this` when triggered.
+  base::OneShotTimer timeout_timer_;
 };
 
 }  // namespace autofill
diff --git a/chrome/browser/autofill/glic/actor_filling_observer_unittest.cc b/chrome/browser/autofill/glic/actor_filling_observer_unittest.cc
index 131b183..d65af8f 100644
--- a/chrome/browser/autofill/glic/actor_filling_observer_unittest.cc
+++ b/chrome/browser/autofill/glic/actor_filling_observer_unittest.cc
@@ -7,6 +7,7 @@
 #include "base/test/gmock_expected_support.h"
 #include "base/test/task_environment.h"
 #include "base/test/test_future.h"
+#include "base/time/time.h"
 #include "components/autofill/core/browser/data_model/payments/credit_card.h"
 #include "components/autofill/core/browser/foundations/autofill_manager.h"
 #include "components/autofill/core/browser/foundations/with_test_autofill_client_driver_manager.h"
@@ -53,8 +54,13 @@
     return *autofill_manager(index).GetCreditCardAccessManager();
   }
 
+  void FastForwardBy(base::TimeDelta delta) {
+    task_environment_.FastForwardBy(delta);
+  }
+
  private:
-  base::test::TaskEnvironment task_environment_;
+  base::test::TaskEnvironment task_environment_{
+      base::test::TaskEnvironment::TimeSource::MOCK_TIME};
   test::AutofillUnitTestEnvironment autofill_unit_test_environment_;
 };
 
@@ -184,6 +190,66 @@
   EXPECT_EQ(observer.IsCreditCardFetchOngoing(), std::nullopt);
 }
 
+// Tests that the filling observer times out after `GetFillingTimeout()` if no
+// credit card fetch is ongoing.
+TEST_F(ActorFillingObserverTest, FillingTimeout) {
+  Future future;
+
+  ActorFillingObserver observer(
+      autofill_client(),
+      /*field_ids=*/base::span_from_ref(MakeFieldGlobalId()),
+      future.GetCallback());
+
+  ASSERT_GT(ActorFillingObserver::GetFillingTimeout(), base::Milliseconds(1));
+  EXPECT_FALSE(future.IsReady());
+
+  FastForwardBy(ActorFillingObserver::GetFillingTimeout() -
+                base::Milliseconds(1));
+  EXPECT_FALSE(future.IsReady());
+
+  FastForwardBy(base::Milliseconds(1));
+  EXPECT_TRUE(future.IsReady());
+  EXPECT_THAT(future.Get(), ErrorIs(ActorFormFillingError::kNoForm));
+}
+
+// Tests that no timeout happens while a credit card fetch is ongoing. After
+// fetch success/failure, the timeout is restarted.
+TEST_F(ActorFillingObserverTest, FillingTimeoutWithCreditCardFetch) {
+  CreateAutofillDriver();
+
+  using Observer = CreditCardAccessManager::Observer;
+  Future future;
+  CreditCard card;
+  ActorFillingObserver observer(
+      autofill_client(),
+      /*field_ids=*/base::span_from_ref(MakeFieldGlobalId()),
+      future.GetCallback());
+
+  ASSERT_GT(ActorFillingObserver::GetFillingTimeout(), base::Milliseconds(1));
+  FastForwardBy(ActorFillingObserver::GetFillingTimeout() -
+                base::Milliseconds(1));
+  EXPECT_FALSE(future.IsReady());
+
+  // The start of the fetch stops all timeouts.
+  test_api(credit_card_access_manager(1))
+      .NotifyObservers(&Observer::OnCreditCardFetchStarted, card);
+  EXPECT_FALSE(future.IsReady());
+  FastForwardBy(base::Milliseconds(1));
+  EXPECT_FALSE(future.IsReady());
+  FastForwardBy(2 * ActorFillingObserver::GetFillingTimeout());
+  EXPECT_FALSE(future.IsReady());
+
+  // The fetch completion (successful or not) restarts the timer.
+  test_api(credit_card_access_manager(1))
+      .NotifyObservers(&Observer::OnCreditCardFetchFailed, &card);
+  FastForwardBy(ActorFillingObserver::GetFillingTimeout() -
+                base::Milliseconds(1));
+  EXPECT_FALSE(future.IsReady());
+  FastForwardBy(base::Milliseconds(1));
+  EXPECT_TRUE(future.IsReady());
+  EXPECT_THAT(future.Get(), ErrorIs(ActorFormFillingError::kNoForm));
+}
+
 }  // namespace
 
 }  // namespace autofill
diff --git a/chrome/browser/autofill/glic/actor_form_filling_service_impl.cc b/chrome/browser/autofill/glic/actor_form_filling_service_impl.cc
index 5ce59fc8..4ecc3f1 100644
--- a/chrome/browser/autofill/glic/actor_form_filling_service_impl.cc
+++ b/chrome/browser/autofill/glic/actor_form_filling_service_impl.cc
@@ -419,16 +419,14 @@
     }
   }
 
-  // TODO(crbug.com/455788947): Adjust time-out for filling that requires
-  // re-auth.
-  constexpr base::TimeDelta kFillingTimeout = base::Seconds(3);
-  // Create a filling observer and keep it around for `kFillingTimeout`.
+  // Create a filling observer and keep it around until the maximum timeout is
+  // reached.
   base::SequencedTaskRunner::GetCurrentDefault()->PostDelayedTask(
       FROM_HERE,
       base::BindOnce([](auto) {}, std::make_unique<ActorFillingObserver>(
                                       autofill_manager.client(), all_field_ids,
                                       std::move(callback))),
-      kFillingTimeout);
+      ActorFillingObserver::GetMaximumTimeout());
 
   // Fill.
   for (const auto [selection, form_datas_for_suggestion] :
diff --git a/chrome/browser/autofill/glic/actor_form_filling_service_unittest.cc b/chrome/browser/autofill/glic/actor_form_filling_service_unittest.cc
index 59e50b29..c665af60 100644
--- a/chrome/browser/autofill/glic/actor_form_filling_service_unittest.cc
+++ b/chrome/browser/autofill/glic/actor_form_filling_service_unittest.cc
@@ -8,8 +8,10 @@
 
 #include "base/check_deref.h"
 #include "base/test/gmock_expected_support.h"
+#include "base/test/task_environment.h"
 #include "base/test/test_future.h"
 #include "base/types/expected.h"
+#include "chrome/browser/autofill/glic/actor_filling_observer.h"
 #include "chrome/browser/autofill/glic/actor_form_filling_service_impl.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
 #include "chrome/test/base/testing_profile.h"
@@ -21,6 +23,9 @@
 #include "components/autofill/content/browser/test_content_autofill_driver.h"
 #include "components/autofill/core/browser/foundations/test_browser_autofill_manager.h"
 #include "components/autofill/core/browser/integrators/glic/actor_form_filling_types.h"
+#include "components/autofill/core/browser/payments/credit_card_access_manager.h"
+#include "components/autofill/core/browser/payments/credit_card_access_manager_test_api.h"
+#include "components/autofill/core/browser/payments/payments_autofill_client.h"
 #include "components/autofill/core/browser/test_utils/autofill_form_test_utils.h"
 #include "components/autofill/core/browser/test_utils/autofill_test_utils.h"
 #include "components/autofill/core/common/autofill_test_utils.h"
@@ -130,9 +135,56 @@
   absl::flat_hash_map<FieldGlobalId, std::u16string> last_filled_values_;
 };
 
+// A simple `CreditCardAccessManager` test class that allows intercepting the
+// `FetchCreditCard` request.
+class TestCreditCardAccessManager : public CreditCardAccessManager {
+ public:
+  explicit TestCreditCardAccessManager(BrowserAutofillManager* manager)
+      : CreditCardAccessManager(manager) {}
+  ~TestCreditCardAccessManager() override = default;
+
+  void PrepareToFetchCreditCard() override {}
+
+  void FetchCreditCard(const CreditCard*,
+                       OnCreditCardFetchedCallback callback) override {
+    callback_ = std::move(callback);
+  }
+
+  [[nodiscard]] bool RunCreditCardFetchedCallback(const CreditCard& card) {
+    if (!callback_) {
+      return false;
+    }
+    std::move(callback_).Run(card);
+    return true;
+  }
+
+ private:
+  OnCreditCardFetchedCallback callback_;
+};
+
+// A `TestBrowserAutofillManager` with a custom `CreditCardAccessManager`.
+class TestBrowserAutofillManagerWithTestCCAM
+    : public TestBrowserAutofillManager {
+ public:
+  explicit TestBrowserAutofillManagerWithTestCCAM(AutofillDriver* driver)
+      : TestBrowserAutofillManager(driver) {
+    test_api(*this).set_credit_card_access_manager(
+        std::make_unique<TestCreditCardAccessManager>(this));
+  }
+  ~TestBrowserAutofillManagerWithTestCCAM() override = default;
+
+  void Reset() override {
+    TestBrowserAutofillManager::Reset();
+    test_api(*this).set_credit_card_access_manager(
+        std::make_unique<TestCreditCardAccessManager>(this));
+  }
+};
+
 class ActorFormFillingServiceTest : public ChromeRenderViewHostTestHarness {
  public:
-  ActorFormFillingServiceTest() = default;
+  ActorFormFillingServiceTest()
+      : ChromeRenderViewHostTestHarness(
+            base::test::TaskEnvironment::TimeSource::MOCK_TIME) {}
 
   void SetUp() override {
     ChromeRenderViewHostTestHarness::SetUp();
@@ -140,8 +192,6 @@
     NavigateAndCommit(GURL("about:blank"));
     client().GetPersonalDataManager().address_data_manager().AddProfile(
         GetProfile1());
-    client().GetPersonalDataManager().payments_data_manager().AddCreditCard(
-        GetCreditCard1());
   }
 
   FormData SeeForm(test::FormDescription form_description) {
@@ -152,9 +202,19 @@
   }
 
  protected:
-  AutofillClient& client() {
+  TestContentAutofillClient& client() {
     return CHECK_DEREF(autofill_client_injector_[web_contents()]);
   }
+  TestCreditCardAccessManager& credit_card_access_manager() {
+    return CHECK_DEREF(static_cast<TestCreditCardAccessManager*>(
+        manager().GetCreditCardAccessManager()));
+  }
+  payments::TestPaymentsAutofillClient& payments_client() {
+    return CHECK_DEREF(client().GetPaymentsAutofillClient());
+  }
+  PaymentsDataManager& payments_data_manager() {
+    return client().GetPersonalDataManager().payments_data_manager();
+  }
   RecordingTestContentAutofillDriver& driver() {
     return CHECK_DEREF(autofill_driver_injector_[web_contents()]);
   }
@@ -164,12 +224,9 @@
   ActorFormFillingService& service() { return service_; }
   tabs::TabInterface& tab() { return mock_tab; }
 
-  // Returns the test data available in `AddressDataManager`.
+  // Returns an address that is available in `AddressDataManager`.
   AutofillProfile GetProfile1() { return test::GetFullProfile(); }
 
-  // Returns the test data available in `PaymentsDataManager`.
-  CreditCard GetCreditCard1() { return test::GetCreditCard(); }
-
  private:
   test::AutofillUnitTestEnvironment autofill_test_environment_;
   tabs::MockTabInterface mock_tab;
@@ -177,7 +234,7 @@
       autofill_client_injector_;
   TestAutofillDriverInjector<RecordingTestContentAutofillDriver>
       autofill_driver_injector_;
-  TestAutofillManagerInjector<TestBrowserAutofillManager>
+  TestAutofillManagerInjector<TestBrowserAutofillManagerWithTestCCAM>
       autofill_manager_injector_;
   ActorFormFillingServiceImpl service_;
 };
@@ -276,6 +333,8 @@
 // Tests that a suggestion generation and filling work with simple credit card
 // forms.
 TEST_F(ActorFormFillingServiceTest, SimpleCreditCardForm) {
+  const CreditCard card = test::GetCreditCard();
+  payments_data_manager().AddCreditCard(card);
   FormData form =
       SeeForm({.fields = {{.server_type = CREDIT_CARD_NAME_FULL},
                           {.server_type = CREDIT_CARD_NUMBER},
@@ -295,11 +354,103 @@
   service().FillSuggestions(
       tab(), {ActorFormFillingSelection(requests[0].suggestions[0].id)},
       fill_future.GetCallback());
+  ASSERT_TRUE(credit_card_access_manager().RunCreditCardFetchedCallback(card));
   EXPECT_THAT(fill_future.Get(), HasValue());
   EXPECT_THAT(driver().last_filled_values(),
-              Contains(std::pair(
-                  form.fields()[0].global_id(),
-                  GetFillValue(GetCreditCard1(), CREDIT_CARD_NAME_FULL))));
+              Contains(std::pair(form.fields()[0].global_id(),
+                                 GetFillValue(card, CREDIT_CARD_NAME_FULL))));
+}
+
+// Tests that filling a credit card after fetching it from the server works.
+TEST_F(ActorFormFillingServiceTest, FillAfterFetchingServerCard) {
+  const CreditCard card = test::GetMaskedServerCard();
+  payments_data_manager().AddCreditCard(card);
+  FormData form =
+      SeeForm({.fields = {{.server_type = CREDIT_CARD_NAME_FULL},
+                          {.server_type = CREDIT_CARD_NUMBER},
+                          {.server_type = CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR}}});
+
+  GetSuggestionsFuture future;
+  service().GetSuggestions(
+      tab(), {CreditCardFillRequest({form.fields()[0].global_id()})},
+      future.GetCallback());
+  EXPECT_THAT(future.Get(),
+              ValueIs(ElementsAre(IsActorFormFillingRequest(
+                  ActorFormFillingRequest::RequestedData::
+                      FormFillingRequest_RequestedData_CREDIT_CARD))));
+
+  std::vector<ActorFormFillingRequest> requests = future.Take().value();
+  FillSuggestionsFuture fill_future;
+  service().FillSuggestions(
+      tab(), {ActorFormFillingSelection(requests[0].suggestions[0].id)},
+      fill_future.GetCallback());
+
+  ASSERT_GT(ActorFillingObserver::GetMaximumTimeout(), base::Seconds(2));
+  task_environment()->FastForwardBy(base::Seconds(1));
+  EXPECT_FALSE(fill_future.IsReady());
+
+  // Now we notify observers that a credit card fetch was started.
+  using Observer = CreditCardAccessManager::Observer;
+  test_api(credit_card_access_manager())
+      .NotifyObservers(&Observer::OnCreditCardFetchStarted, card);
+  task_environment()->FastForwardBy(ActorFillingObserver::GetMaximumTimeout() -
+                                    base::Seconds(2));
+  EXPECT_FALSE(fill_future.IsReady());
+
+  // Simulate successful fetching.
+  ASSERT_TRUE(credit_card_access_manager().RunCreditCardFetchedCallback(card));
+  test_api(credit_card_access_manager())
+      .NotifyObservers(&Observer::OnCreditCardFetchSucceeded, card);
+
+  task_environment()->FastForwardBy(base::Seconds(1));
+  EXPECT_TRUE(fill_future.IsReady());
+  EXPECT_THAT(fill_future.Get(), HasValue());
+  EXPECT_THAT(driver().last_filled_values(),
+              Contains(std::pair(form.fields()[0].global_id(),
+                                 GetFillValue(card, CREDIT_CARD_NAME_FULL))));
+}
+
+// Tests that even if a credit card fetch is ongoing, there is a timeout if
+// fills do not complete after a minute.
+TEST_F(ActorFormFillingServiceTest, TimeoutWithFetching) {
+  const CreditCard card = test::GetMaskedServerCard();
+  payments_data_manager().AddCreditCard(card);
+  FormData form =
+      SeeForm({.fields = {{.server_type = CREDIT_CARD_NAME_FULL},
+                          {.server_type = CREDIT_CARD_NUMBER},
+                          {.server_type = CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR}}});
+
+  GetSuggestionsFuture future;
+  service().GetSuggestions(
+      tab(), {CreditCardFillRequest({form.fields()[0].global_id()})},
+      future.GetCallback());
+  EXPECT_THAT(future.Get(),
+              ValueIs(ElementsAre(IsActorFormFillingRequest(
+                  ActorFormFillingRequest::RequestedData::
+                      FormFillingRequest_RequestedData_CREDIT_CARD))));
+
+  std::vector<ActorFormFillingRequest> requests = future.Take().value();
+  FillSuggestionsFuture fill_future;
+  service().FillSuggestions(
+      tab(), {ActorFormFillingSelection(requests[0].suggestions[0].id)},
+      fill_future.GetCallback());
+
+  ASSERT_GT(ActorFillingObserver::GetMaximumTimeout(), base::Seconds(2));
+  task_environment()->FastForwardBy(base::Seconds(1));
+  EXPECT_FALSE(fill_future.IsReady());
+
+  // Now we notify observers that a credit card fetch was started.
+  test_api(credit_card_access_manager())
+      .NotifyObservers(
+          &CreditCardAccessManager::Observer::OnCreditCardFetchStarted, card);
+  task_environment()->FastForwardBy(ActorFillingObserver::GetMaximumTimeout() -
+                                    base::Seconds(2));
+  EXPECT_FALSE(fill_future.IsReady());
+
+  task_environment()->FastForwardBy(base::Seconds(1));
+  EXPECT_TRUE(fill_future.IsReady());
+  EXPECT_THAT(fill_future.Get(), ErrorIs(ActorFormFillingError::kNoForm));
+  EXPECT_THAT(driver().last_filled_values(), IsEmpty());
 }
 
 // Tests that a `kOther` error is returned if an invalid suggestion id is passed
diff --git a/chrome/browser/bookmarks/android/bookmark_bridge.cc b/chrome/browser/bookmarks/android/bookmark_bridge.cc
index 093adb2a..5c4e241 100644
--- a/chrome/browser/bookmarks/android/bookmark_bridge.cc
+++ b/chrome/browser/bookmarks/android/bookmark_bridge.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/browser/bookmarks/android/bookmark_bridge.h"
 
 #include <stddef.h>
@@ -25,6 +20,7 @@
 #include "base/android/jni_array.h"
 #include "base/android/jni_string.h"
 #include "base/check.h"
+#include "base/compiler_specific.h"
 #include "base/containers/adapters.h"
 #include "base/containers/stack.h"
 #include "base/functional/bind.h"
@@ -1735,11 +1731,12 @@
 
   // iterate through array, adding the BookmarkNode*s of the objects
   for (int i = 0; i < arraySize; ++i) {
-    const BookmarkNode* child_node = GetNodeByID(elements[i], bookmark_type);
+    const BookmarkNode* child_node =
+        GetNodeByID(UNSAFE_TODO(elements[i]), bookmark_type);
     CHECK(child_node->parent() == parent_node);
     CHECK(base::checked_cast<jsize>(parent_node->children().size()) ==
           arraySize);
-    ordered_nodes.push_back(GetNodeByID(elements[i], 0));
+    ordered_nodes.push_back(GetNodeByID(UNSAFE_TODO(elements[i]), 0));
   }
 
   bookmark_model_->ReorderChildren(parent_node, ordered_nodes);
diff --git a/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkFolderViewRenderTest.java b/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkFolderViewRenderTest.java
index 4676a6b..de75abc 100644
--- a/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkFolderViewRenderTest.java
+++ b/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkFolderViewRenderTest.java
@@ -17,6 +17,7 @@
 import android.widget.LinearLayout;
 
 import androidx.appcompat.content.res.AppCompatResources;
+import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.MediumTest;
 
 import org.junit.Before;
@@ -95,6 +96,7 @@
     @Before
     public void setUp() throws Exception {
         mBookmarkModel = ThreadUtils.runOnUiThreadBlocking(() -> Mockito.mock(BookmarkModel.class));
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
         mActivityTestRule.launchActivity(null);
         mActivityTestRule.getActivity().setTheme(R.style.Theme_BrowserUI_DayNight);
 
@@ -133,6 +135,7 @@
                             ImprovedBookmarkRowProperties.FOLDER_CHILD_COUNT_TEXT_STYLE,
                             R.style.TextAppearance_RegularFolderChildCount);
                 });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
     }
 
     @Test
diff --git a/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowRenderTest.java b/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowRenderTest.java
index 5ef0a4cd..0ce2ebe 100644
--- a/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowRenderTest.java
+++ b/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowRenderTest.java
@@ -17,6 +17,7 @@
 import android.widget.FrameLayout;
 import android.widget.LinearLayout;
 
+import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.MediumTest;
 
 import org.junit.Before;
@@ -174,6 +175,8 @@
                     PropertyModelChangeProcessor.create(
                             mModel, mImprovedBookmarkRow, ImprovedBookmarkRowViewBinder::bind);
                 });
+
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
     }
 
     ListMenu buildListMenu() {
diff --git a/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkSaveFlowRenderTest.java b/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkSaveFlowRenderTest.java
index 966bff8d..e03cc583 100644
--- a/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkSaveFlowRenderTest.java
+++ b/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkSaveFlowRenderTest.java
@@ -13,6 +13,7 @@
 import android.widget.FrameLayout;
 import android.widget.LinearLayout;
 
+import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.MediumTest;
 
 import org.junit.Before;
@@ -126,6 +127,7 @@
                     PropertyModelChangeProcessor.create(
                             mModel, mView, ImprovedBookmarkSaveFlowViewBinder::bind);
                 });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
     }
 
     @Test
@@ -147,6 +149,7 @@
                             BookmarkSaveFlowMediator.createHighlightedCharSequence(
                                     mActivity, new FolderText(folderText, 3, 51)));
                 });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
         mRenderTestRule.render(mContentView, "long_text");
     }
 
@@ -163,6 +166,7 @@
                             ImprovedBookmarkSaveFlowProperties.BOOKMARK_ROW_ICON,
                             new BitmapDrawable(mActivity.getResources(), bitmap));
                 });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
         mRenderTestRule.render(mContentView, "favicon");
     }
 
@@ -176,6 +180,7 @@
                     mModel.set(
                             ImprovedBookmarkSaveFlowProperties.PRICE_TRACKING_SWITCH_CHECKED, true);
                 });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
         mRenderTestRule.render(mContentView, "price_tracking");
     }
 
@@ -190,6 +195,7 @@
                             ImprovedBookmarkSaveFlowProperties.PRICE_TRACKING_SWITCH_CHECKED,
                             false);
                 });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
         mRenderTestRule.render(mContentView, "price_tracking_switch_unchecked");
     }
 
@@ -204,6 +210,7 @@
                             ImprovedBookmarkSaveFlowProperties.PRICE_TRACKING_SWITCH_CHECKED, true);
                     mModel.set(ImprovedBookmarkSaveFlowProperties.PRICE_TRACKING_ENABLED, false);
                 });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
         mRenderTestRule.render(mContentView, "price_tracking_visible_not_enabled");
     }
 
@@ -219,6 +226,7 @@
                                     mActivity, new FolderText("Saved in Mobile bookmarks", 9, 16)));
                     mModel.set(ImprovedBookmarkSaveFlowProperties.SUBTITLE, "On this device ");
                 });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
         mRenderTestRule.render(mContentView, "title_and_subtitle");
     }
 
@@ -235,6 +243,7 @@
                                     mActivity, new FolderText("Saved in Mobile bookmarks", 9, 16)));
                     mModel.set(ImprovedBookmarkSaveFlowProperties.SUBTITLE, "On this device ");
                 });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
 
         mRenderTestRule.render(mContentView, "rtl_chevron");
         ThreadUtils.runOnUiThreadBlocking(() -> LocalizationUtils.setRtlForTesting(true));
@@ -258,6 +267,7 @@
                             true);
                     mModel.set(ImprovedBookmarkSaveFlowProperties.SUBTITLE, "test@gmail.com");
                 });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
 
         mRenderTestRule.render(mContentView, "rtl_with_account_bookmark_subtitle");
         ThreadUtils.runOnUiThreadBlocking(() -> LocalizationUtils.setRtlForTesting(true));
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 99af03e..9f972d8 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -5130,7 +5130,7 @@
     case sandbox::mojom::Sandbox::kServiceWithJit:
     case sandbox::mojom::Sandbox::kIconReader:
     case sandbox::mojom::Sandbox::kMediaFoundationCdm:
-    case sandbox::mojom::Sandbox::kWindowsSystemProxyResolver:
+    case sandbox::mojom::Sandbox::kProxyResolver:
       // Should never reach here.
       NOTREACHED();
   }
@@ -5227,7 +5227,7 @@
     case sandbox::mojom::Sandbox::kService:
     case sandbox::mojom::Sandbox::kIconReader:
     case sandbox::mojom::Sandbox::kMediaFoundationCdm:
-    case sandbox::mojom::Sandbox::kWindowsSystemProxyResolver:
+    case sandbox::mojom::Sandbox::kProxyResolver:
       break;
   }
 
diff --git a/chrome/browser/chromeos/extensions/telemetry/DEPS b/chrome/browser/chromeos/extensions/telemetry/DEPS
index 910d1838..8c0b941 100644
--- a/chrome/browser/chromeos/extensions/telemetry/DEPS
+++ b/chrome/browser/chromeos/extensions/telemetry/DEPS
@@ -11,7 +11,6 @@
   # refactor chromeos codes in //chrome to break these dependencies; see
   # b/332804822. Whenever possible, avoid adding new //chrome dependencies to
   # this list.
-  "+chrome/browser/extensions/permissions/permissions_test_util.h",
   "+chrome/browser/extensions/test_extension_environment.h",
   "+chrome/common",
   "+chrome/test",
diff --git a/chrome/browser/chromeos/extensions/telemetry/chromeos_permission_messages_unittest.cc b/chrome/browser/chromeos/extensions/telemetry/chromeos_permission_messages_unittest.cc
index 82fa6fb..fd48f9d 100644
--- a/chrome/browser/chromeos/extensions/telemetry/chromeos_permission_messages_unittest.cc
+++ b/chrome/browser/chromeos/extensions/telemetry/chromeos_permission_messages_unittest.cc
@@ -10,11 +10,11 @@
 #include "base/memory/scoped_refptr.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/values.h"
-#include "chrome/browser/extensions/permissions/permissions_test_util.h"
 #include "chrome/browser/extensions/test_extension_environment.h"
 #include "chrome/common/extensions/permissions/chrome_permission_message_provider.h"
 #include "chrome/test/base/testing_profile.h"
 #include "extensions/browser/extension_registrar.h"
+#include "extensions/browser/permissions/permissions_test_util.h"
 #include "extensions/common/extension.h"
 #include "extensions/common/extension_builder.h"
 #include "extensions/common/extension_features.h"
diff --git a/chrome/browser/chromeos/network/BUILD.gn b/chrome/browser/chromeos/network/BUILD.gn
index 912f293..baa2838 100644
--- a/chrome/browser/chromeos/network/BUILD.gn
+++ b/chrome/browser/chromeos/network/BUILD.gn
@@ -44,7 +44,6 @@
     "//chrome/browser/ui",
     "//chrome/browser/ui:browser_navigator_params_headers",
     "//chrome/test:test_support_ui",
-    "//chromeos/ash/components/network/portal_detector",
     "//components/captive_portal/content",
     "//content/test:test_support",
     "//testing/gtest",
diff --git a/chrome/browser/chromeos/network/DEPS b/chrome/browser/chromeos/network/DEPS
index fbcf9e9c..f742b54 100644
--- a/chrome/browser/chromeos/network/DEPS
+++ b/chrome/browser/chromeos/network/DEPS
@@ -28,7 +28,4 @@
   "network_portal_signin_window\.cc": [
     "+chromeos/ash/components/network",
   ],
-  "network_portal_signin_window_ash_browsertest\.cc": [
-    "+chrome/browser/ash/net/network_portal_detector_test_impl.h",
-  ],
 }
diff --git a/chrome/browser/chromeos/network/network_portal_signin_window.h b/chrome/browser/chromeos/network/network_portal_signin_window.h
index f2fde81..e2ccd74 100644
--- a/chrome/browser/chromeos/network/network_portal_signin_window.h
+++ b/chrome/browser/chromeos/network/network_portal_signin_window.h
@@ -12,8 +12,6 @@
 #include "url/gurl.h"
 
 class Browser;
-class NetworkPortalSigninWindowLacrosBrowserTest;
-class NetworkPortalSigninWindowAshBrowserTest;
 
 namespace content {
 class WebContents;
@@ -38,16 +36,15 @@
   Browser* GetBrowserForTesting();
   content::WebContents* GetWebContentsForTesting();
 
- protected:
-  friend class base::NoDestructor<NetworkPortalSigninWindow>;
-  friend class NetworkPortalSigninWindowLacrosBrowserTest;
-  friend class NetworkPortalSigninWindowAshBrowserTest;
-  NetworkPortalSigninWindow();
-
   int portal_detection_requested_for_testing() const {
     return portal_detection_requested_for_testing_;
   }
 
+ protected:
+  friend class base::NoDestructor<NetworkPortalSigninWindow>;
+
+  NetworkPortalSigninWindow();
+
  private:
   class WindowObserver;
 
diff --git a/chrome/browser/chromeos/network/network_portal_signin_window_ash_browsertest.cc b/chrome/browser/chromeos/network/network_portal_signin_window_ash_browsertest.cc
index da151d9..765aeed 100644
--- a/chrome/browser/chromeos/network/network_portal_signin_window_ash_browsertest.cc
+++ b/chrome/browser/chromeos/network/network_portal_signin_window_ash_browsertest.cc
@@ -2,14 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/ash/net/network_portal_detector_test_impl.h"
 #include "chrome/browser/chromeos/network/network_portal_signin_window.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_navigator.h"
 #include "chrome/browser/ui/browser_navigator_params.h"
 #include "chrome/test/base/in_process_browser_test.h"
-#include "chromeos/ash/components/network/portal_detector/network_portal_detector.h"
 #include "components/captive_portal/content/captive_portal_tab_helper.h"
 #include "components/captive_portal/core/captive_portal_detector.h"
 #include "content/public/test/browser_test.h"
@@ -20,30 +18,14 @@
 
 namespace chromeos {
 
-class NetworkPortalSigninWindowAshBrowserTest : public InProcessBrowserTest {
- public:
-  NetworkPortalSigninWindowAshBrowserTest() {
-    ash::network_portal_detector::InitializeForTesting(
-        new ash::NetworkPortalDetectorTestImpl());
-  }
-  ~NetworkPortalSigninWindowAshBrowserTest() override = default;
-
-  ash::NetworkPortalDetectorTestImpl* network_portal_detector() {
-    return static_cast<ash::NetworkPortalDetectorTestImpl*>(
-        ash::network_portal_detector::GetInstance());
-  }
-
-  int PortalDetectionRequestedForTesting() {
-    return NetworkPortalSigninWindow::Get()
-        ->portal_detection_requested_for_testing();
-  }
-};
+using NetworkPortalSigninWindowAshBrowserTest = InProcessBrowserTest;
 
 IN_PROC_BROWSER_TEST_F(NetworkPortalSigninWindowAshBrowserTest,
                        IsCaptivePortalWindow) {
   content::CreateAndLoadWebContentsObserver web_contents_observer;
 
-  NetworkPortalSigninWindow::Get()->Show(
+  auto* portal_signin_window = NetworkPortalSigninWindow::Get();
+  portal_signin_window->Show(
       GURL(captive_portal::CaptivePortalDetector::GetDefaultUrl()));
   ASSERT_TRUE(NetworkPortalSigninWindow::Get()->GetBrowserForTesting());
 
@@ -51,12 +33,12 @@
 
   // Showing the window should generate a DidFinishNavigation event which should
   // trigger a corresponding captive portal detection request.
-  EXPECT_EQ(PortalDetectionRequestedForTesting(), 1);
+  EXPECT_EQ(portal_signin_window->portal_detection_requested_for_testing(), 1);
 
   // The popup window sets the |is_captive_portal_popup| param which should
   // set the |CaptivePortalTabHelper::is_captive_portal_window| property.
   content::WebContents* web_contents =
-      NetworkPortalSigninWindow::Get()->GetWebContentsForTesting();
+      portal_signin_window->GetWebContentsForTesting();
   ASSERT_TRUE(web_contents);
   captive_portal::CaptivePortalTabHelper* helper =
       captive_portal::CaptivePortalTabHelper::FromWebContents(web_contents);
@@ -68,15 +50,16 @@
                        NavigateFromCaptivePortalSigninWindow) {
   content::CreateAndLoadWebContentsObserver web_contents_observer;
 
-  NetworkPortalSigninWindow::Get()->Show(
+  auto* portal_signin_window = NetworkPortalSigninWindow::Get();
+  portal_signin_window->Show(
       GURL(captive_portal::CaptivePortalDetector::GetDefaultUrl()));
-  ASSERT_TRUE(NetworkPortalSigninWindow::Get()->GetBrowserForTesting());
+  ASSERT_TRUE(portal_signin_window->GetBrowserForTesting());
 
   web_contents_observer.Wait();
 
   // Navigate within the captive portal signin window. The contents should be
   // opened in the same browser.
-  Browser* browser = NetworkPortalSigninWindow::Get()->GetBrowserForTesting();
+  Browser* browser = portal_signin_window->GetBrowserForTesting();
   NavigateParams params(browser, GURL("http://www.google.com"),
                         ui::PageTransition::PAGE_TRANSITION_LINK);
   Navigate(&params);
diff --git a/chrome/browser/cpu_performance_internal b/chrome/browser/cpu_performance_internal
index 5357414..dfe1ccf3 160000
--- a/chrome/browser/cpu_performance_internal
+++ b/chrome/browser/cpu_performance_internal
@@ -1 +1 @@
-Subproject commit 535741498d440ae5518159e23b523553e3279974
+Subproject commit dfe1ccf3c2a93128082bb1d955517b4a6489ba62
diff --git a/chrome/browser/download/notification/download_notification_browsertest.cc b/chrome/browser/download/notification/download_notification_browsertest.cc
index 15ce452..6f221e3 100644
--- a/chrome/browser/download/notification/download_notification_browsertest.cc
+++ b/chrome/browser/download/notification/download_notification_browsertest.cc
@@ -2,17 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include <stddef.h>
 
 #include <memory>
 #include <utility>
 
 #include "base/command_line.h"
+#include "base/compiler_specific.h"
 #include "base/feature_list.h"
 #include "base/files/file_util.h"
 #include "base/functional/bind.h"
@@ -1069,14 +1065,14 @@
 
     // Add all users, except the first one, which is already logged in.
     for (size_t i = 1; i < std::size(kTestAccounts); ++i) {
-      AddUser(kTestAccounts[i]);
+      AddUser(UNSAFE_TODO(kTestAccounts[i]));
     }
   }
 
   Profile* GetProfileByIndex(int index) {
     return g_browser_process->profile_manager()->GetProfileByPath(
         ash::ProfileHelper::GetProfilePathByUserIdHash(
-            kTestAccounts[index].hash));
+            UNSAFE_TODO(kTestAccounts[index]).hash));
   }
 
   // Adds a new user for testing to the current session.
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/win_key_rotation_command.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/win_key_rotation_command.cc
index 0f83dd3..03342e01 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/win_key_rotation_command.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/win_key_rotation_command.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/win_key_rotation_command.h"
 
 #include <comutil.h>
@@ -20,6 +15,7 @@
 
 #include "base/base64.h"
 #include "base/check.h"
+#include "base/compiler_specific.h"
 #include "base/functional/bind.h"
 #include "base/syslog_logging.h"
 #include "base/task/single_thread_task_runner.h"
@@ -62,7 +58,7 @@
       get_command_result.value();
   _variant_t vargs[kMaxCommandArgs];
   for (size_t i = 0; i < args.size(); ++i) {
-    vargs[i] = args[i].c_str();
+    UNSAFE_TODO(vargs[i]) = args[i].c_str();
   }
 
   HRESULT hr =
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/core/ec_signing_key.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/core/ec_signing_key.cc
index 9c4e447..a8d84a0 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/core/ec_signing_key.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/core/ec_signing_key.cc
@@ -113,10 +113,10 @@
              : nullptr;
 }
 
-bool ECSigningKeyProvider::DeleteSigningKeySlowly(
-    base::span<const uint8_t> wrapped_key) {
+crypto::StatefulUnexportableKeyProvider*
+ECSigningKeyProvider::AsStatefulUnexportableKeyProvider() {
   // Software keys are stateless.
-  return true;
+  return nullptr;
 }
 
 }  // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/core/ec_signing_key.h b/chrome/browser/enterprise/connectors/device_trust/key_management/core/ec_signing_key.h
index 30bf6fe..94bfd09 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/core/ec_signing_key.h
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/core/ec_signing_key.h
@@ -30,7 +30,8 @@
           acceptable_algorithms) override;
   std::unique_ptr<crypto::UnexportableSigningKey> FromWrappedSigningKeySlowly(
       base::span<const uint8_t> wrapped_key) override;
-  bool DeleteSigningKeySlowly(base::span<const uint8_t> wrapped_key) override;
+  crypto::StatefulUnexportableKeyProvider* AsStatefulUnexportableKeyProvider()
+      override;
 };
 
 }  // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/platform_auth/cloud_ap_provider_win.cc b/chrome/browser/enterprise/platform_auth/cloud_ap_provider_win.cc
index 64a92f3d..d45fddd6 100644
--- a/chrome/browser/enterprise/platform_auth/cloud_ap_provider_win.cc
+++ b/chrome/browser/enterprise/platform_auth/cloud_ap_provider_win.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/browser/enterprise/platform_auth/cloud_ap_provider_win.h"
 
 #include <objbase.h>
@@ -27,6 +22,7 @@
 
 #include "base/callback_list.h"
 #include "base/check.h"
+#include "base/compiler_specific.h"
 #include "base/feature_list.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback.h"
@@ -197,7 +193,7 @@
   // new header. Otherwise, append it to the existing list of cookies.
   static constexpr std::string_view kHeaderPrefix("x-ms-");
   for (DWORD i = 0; i < cookie_info_count; ++i) {
-    const ProofOfPossessionCookieInfo& cookie = cookie_info[i];
+    const ProofOfPossessionCookieInfo& cookie = UNSAFE_TODO(cookie_info[i]);
     auto ascii_cookie_name = base::WideToASCII(cookie.name);
     // TODO(b/425887809): Remove after debugging.
     VLOG_POLICY(1, EXTENSIBLE_SSO)
diff --git a/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc b/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc
index e875c3ee..7aaf1d4 100644
--- a/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc
+++ b/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc
@@ -39,7 +39,6 @@
 #include "chrome/browser/extensions/extension_util.h"
 #include "chrome/browser/extensions/external_provider_manager.h"
 #include "chrome/browser/extensions/manifest_v2_experiment_manager.h"
-#include "chrome/browser/extensions/permissions/permissions_test_util.h"
 #include "chrome/browser/extensions/signin_test_util.h"
 #include "chrome/browser/extensions/sync/account_extension_tracker.h"
 #include "chrome/browser/extensions/sync/extension_sync_data.h"
@@ -73,6 +72,7 @@
 #include "extensions/browser/extension_registry_observer.h"
 #include "extensions/browser/extension_util.h"
 #include "extensions/browser/mock_external_provider.h"
+#include "extensions/browser/permissions/permissions_test_util.h"
 #include "extensions/browser/permissions/permissions_updater.h"
 #include "extensions/browser/permissions/scripting_permissions_modifier.h"
 #include "extensions/browser/permissions/site_permissions_helper.h"
diff --git a/chrome/browser/extensions/api/developer_private/extension_info_generator_unittest.cc b/chrome/browser/extensions/api/developer_private/extension_info_generator_unittest.cc
index ee18ddc1..95cbea8 100644
--- a/chrome/browser/extensions/api/developer_private/extension_info_generator_unittest.cc
+++ b/chrome/browser/extensions/api/developer_private/extension_info_generator_unittest.cc
@@ -31,7 +31,6 @@
 #include "chrome/browser/extensions/extension_util.h"
 #include "chrome/browser/extensions/manifest_v2_experiment_manager.h"
 #include "chrome/browser/extensions/mv2_experiment_stage.h"
-#include "chrome/browser/extensions/permissions/permissions_test_util.h"
 #include "chrome/browser/extensions/signin_test_util.h"
 #include "chrome/browser/extensions/sync/account_extension_tracker.h"
 #include "chrome/browser/extensions/sync/extension_sync_util.h"
@@ -52,6 +51,7 @@
 #include "extensions/browser/extension_prefs.h"
 #include "extensions/browser/extension_registrar.h"
 #include "extensions/browser/extension_registry.h"
+#include "extensions/browser/permissions/permissions_test_util.h"
 #include "extensions/browser/permissions/permissions_updater.h"
 #include "extensions/browser/permissions/scripting_permissions_modifier.h"
 #include "extensions/browser/supervised_user_extensions_delegate.h"
diff --git a/chrome/browser/extensions/api/omnibox/omnibox_api_interactive_test.cc b/chrome/browser/extensions/api/omnibox/omnibox_api_interactive_test.cc
index fb9ec6a..0e87882f 100644
--- a/chrome/browser/extensions/api/omnibox/omnibox_api_interactive_test.cc
+++ b/chrome/browser/extensions/api/omnibox/omnibox_api_interactive_test.cc
@@ -11,7 +11,6 @@
 #include "build/build_config.h"
 #include "chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.h"
 #include "chrome/browser/extensions/extension_apitest.h"
-#include "chrome/browser/extensions/permissions/permissions_test_util.h"
 #include "chrome/browser/omnibox/autocomplete_controller_emitter_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/search_engines/template_url_service_factory.h"
@@ -29,6 +28,7 @@
 #include "components/search_engines/template_url_service.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/test_utils.h"
+#include "extensions/browser/permissions/permissions_test_util.h"
 #include "extensions/common/extension_features.h"
 #include "extensions/common/extension_id.h"
 #include "extensions/common/permissions/permission_set.h"
diff --git a/chrome/browser/extensions/api/permissions/permissions_api_helpers_unittest.cc b/chrome/browser/extensions/api/permissions/permissions_api_helpers_unittest.cc
index 9f523961..5d272b2 100644
--- a/chrome/browser/extensions/api/permissions/permissions_api_helpers_unittest.cc
+++ b/chrome/browser/extensions/api/permissions/permissions_api_helpers_unittest.cc
@@ -11,8 +11,8 @@
 
 #include "base/json/json_reader.h"
 #include "base/values.h"
-#include "chrome/browser/extensions/permissions/permissions_test_util.h"
 #include "chrome/common/extensions/api/permissions.h"
+#include "extensions/browser/permissions/permissions_test_util.h"
 #include "extensions/buildflags/buildflags.h"
 #include "extensions/common/extension.h"
 #include "extensions/common/permissions/permission_set.h"
diff --git a/chrome/browser/extensions/api/permissions/permissions_api_unittest.cc b/chrome/browser/extensions/api/permissions/permissions_api_unittest.cc
index 307fb6550..e5612f3 100644
--- a/chrome/browser/extensions/api/permissions/permissions_api_unittest.cc
+++ b/chrome/browser/extensions/api/permissions/permissions_api_unittest.cc
@@ -17,7 +17,6 @@
 #include "chrome/browser/extensions/extension_service_test_with_install.h"
 #include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/extensions/extension_util.h"
-#include "chrome/browser/extensions/permissions/permissions_test_util.h"
 #include "chrome/test/base/testing_profile.h"
 #include "components/crx_file/id_util.h"
 #include "content/public/browser/web_contents.h"
@@ -27,6 +26,7 @@
 #include "extensions/browser/extension_registrar.h"
 #include "extensions/browser/extension_util.h"
 #include "extensions/browser/permissions/active_tab_permission_granter.h"
+#include "extensions/browser/permissions/permissions_test_util.h"
 #include "extensions/browser/permissions/permissions_updater.h"
 #include "extensions/browser/permissions/scripting_permissions_modifier.h"
 #include "extensions/browser/permissions_manager.h"
diff --git a/chrome/browser/extensions/extension_context_menu_model_browsertest.cc b/chrome/browser/extensions/extension_context_menu_model_browsertest.cc
index 655f8e7..9267bf9 100644
--- a/chrome/browser/extensions/extension_context_menu_model_browsertest.cc
+++ b/chrome/browser/extensions/extension_context_menu_model_browsertest.cc
@@ -21,7 +21,6 @@
 #include "chrome/browser/extensions/extension_browsertest.h"
 #include "chrome/browser/extensions/menu_manager.h"
 #include "chrome/browser/extensions/menu_manager_factory.h"
-#include "chrome/browser/extensions/permissions/permissions_test_util.h"
 #include "chrome/browser/extensions/permissions_url_constants.h"
 #include "chrome/browser/ui/browser_window/public/browser_window_interface.h"
 #include "chrome/browser/ui/toolbar/toolbar_actions_model.h"
@@ -39,6 +38,7 @@
 #include "extensions/browser/extension_registrar.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/browser/extension_system.h"
+#include "extensions/browser/permissions/permissions_test_util.h"
 #include "extensions/browser/permissions/permissions_updater.h"
 #include "extensions/browser/permissions/scripting_permissions_modifier.h"
 #include "extensions/browser/permissions/site_permissions_helper.h"
diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc
index 90b8080..350d119 100644
--- a/chrome/browser/extensions/extension_service_unittest.cc
+++ b/chrome/browser/extensions/extension_service_unittest.cc
@@ -69,7 +69,6 @@
 #include "chrome/browser/extensions/load_error_reporter.h"
 #include "chrome/browser/extensions/managed_installation_mode.h"
 #include "chrome/browser/extensions/pack_extension_job.h"
-#include "chrome/browser/extensions/permissions/permissions_test_util.h"
 #include "chrome/browser/extensions/plugin_manager.h"
 #include "chrome/browser/extensions/preinstalled_apps.h"
 #include "chrome/browser/extensions/test_extension_system.h"
@@ -128,6 +127,7 @@
 #include "extensions/browser/mock_external_provider.h"
 #include "extensions/browser/pending_extension_info.h"
 #include "extensions/browser/pending_extension_manager.h"
+#include "extensions/browser/permissions/permissions_test_util.h"
 #include "extensions/browser/permissions/permissions_updater.h"
 #include "extensions/browser/pref_names.h"
 #include "extensions/browser/scoped_database_manager_for_test.h"
diff --git a/chrome/browser/extensions/permission_messages_unittest.cc b/chrome/browser/extensions/permission_messages_unittest.cc
index 6f49e14..ae19823c 100644
--- a/chrome/browser/extensions/permission_messages_unittest.cc
+++ b/chrome/browser/extensions/permission_messages_unittest.cc
@@ -10,7 +10,6 @@
 
 #include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
-#include "chrome/browser/extensions/permissions/permissions_test_util.h"
 #include "chrome/browser/extensions/test_extension_environment.h"
 #include "chrome/common/extensions/permissions/chrome_permission_message_provider.h"
 #include "chrome/grit/generated_resources.h"
@@ -18,6 +17,7 @@
 #include "components/crx_file/id_util.h"
 #include "extensions/browser/extension_prefs.h"
 #include "extensions/browser/extension_registrar.h"
+#include "extensions/browser/permissions/permissions_test_util.h"
 #include "extensions/browser/permissions/permissions_updater.h"
 #include "extensions/common/extension.h"
 #include "extensions/common/extension_builder.h"
diff --git a/chrome/browser/extensions/permissions/permissions_updater_browsertest.cc b/chrome/browser/extensions/permissions/permissions_updater_browsertest.cc
index e258e22..9df32fc 100644
--- a/chrome/browser/extensions/permissions/permissions_updater_browsertest.cc
+++ b/chrome/browser/extensions/permissions/permissions_updater_browsertest.cc
@@ -5,11 +5,11 @@
 #include "extensions/browser/permissions/permissions_updater.h"
 
 #include "chrome/browser/extensions/extension_browsertest.h"
-#include "chrome/browser/extensions/permissions/permissions_test_util.h"
 #include "chrome/browser/profiles/profile.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/browser_test_utils.h"
+#include "extensions/browser/permissions/permissions_test_util.h"
 #include "extensions/browser/script_injection_tracker.h"
 #include "extensions/buildflags/buildflags.h"
 #include "extensions/common/extension.h"
diff --git a/chrome/browser/extensions/permissions/permissions_updater_unittest.cc b/chrome/browser/extensions/permissions/permissions_updater_unittest.cc
index cd4c12fe..a3ef972f 100644
--- a/chrome/browser/extensions/permissions/permissions_updater_unittest.cc
+++ b/chrome/browser/extensions/permissions/permissions_updater_unittest.cc
@@ -19,7 +19,6 @@
 #include "chrome/browser/extensions/chrome_test_extension_loader.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/extensions/extension_service_test_base.h"
-#include "chrome/browser/extensions/permissions/permissions_test_util.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/common/extensions/extension_test_util.h"
 #include "chrome/test/base/testing_profile.h"
@@ -28,6 +27,7 @@
 #include "extensions/browser/extension_registrar.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/browser/extension_util.h"
+#include "extensions/browser/permissions/permissions_test_util.h"
 #include "extensions/browser/permissions/scripting_permissions_modifier.h"
 #include "extensions/browser/permissions_manager.h"
 #include "extensions/buildflags/buildflags.h"
diff --git a/chrome/browser/extensions/permissions/scripting_permissions_modifier_unittest.cc b/chrome/browser/extensions/permissions/scripting_permissions_modifier_unittest.cc
index 054235d..e9dadb1c 100644
--- a/chrome/browser/extensions/permissions/scripting_permissions_modifier_unittest.cc
+++ b/chrome/browser/extensions/permissions/scripting_permissions_modifier_unittest.cc
@@ -13,12 +13,12 @@
 #include "chrome/browser/extensions/chrome_test_extension_loader.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/extensions/extension_service_test_with_install.h"
-#include "chrome/browser/extensions/permissions/permissions_test_util.h"
 #include "chrome/test/base/testing_profile.h"
 #include "components/crx_file/id_util.h"
 #include "extensions/browser/extension_prefs.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/browser/extension_util.h"
+#include "extensions/browser/permissions/permissions_test_util.h"
 #include "extensions/browser/permissions/permissions_updater.h"
 #include "extensions/browser/permissions_manager.h"
 #include "extensions/browser/test_extension_registry_observer.h"
diff --git a/chrome/browser/extensions/permissions/site_permissions_helper_browsertest.cc b/chrome/browser/extensions/permissions/site_permissions_helper_browsertest.cc
index 83f4cfcd..9a2123df 100644
--- a/chrome/browser/extensions/permissions/site_permissions_helper_browsertest.cc
+++ b/chrome/browser/extensions/permissions/site_permissions_helper_browsertest.cc
@@ -10,13 +10,13 @@
 #include "chrome/browser/extensions/blocked_action_waiter.h"
 #include "chrome/browser/extensions/extension_action_runner.h"
 #include "chrome/browser/extensions/extension_browsertest.h"
-#include "chrome/browser/extensions/permissions/permissions_test_util.h"
 #include "chrome/browser/extensions/tab_helper.h"
 #include "chrome/browser/profiles/profile.h"
 #include "content/public/browser/navigation_entry.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/browser_test_utils.h"
 #include "extensions/browser/browsertest_util.h"
+#include "extensions/browser/permissions/permissions_test_util.h"
 #include "extensions/browser/permissions/scripting_permissions_modifier.h"
 #include "extensions/browser/permissions_manager.h"
 #include "extensions/buildflags/buildflags.h"
diff --git a/chrome/browser/extensions/script_injection_tracker_browsertest.cc b/chrome/browser/extensions/script_injection_tracker_browsertest.cc
index 8eb1fff..c18456a 100644
--- a/chrome/browser/extensions/script_injection_tracker_browsertest.cc
+++ b/chrome/browser/extensions/script_injection_tracker_browsertest.cc
@@ -18,7 +18,6 @@
 #include "chrome/browser/extensions/extension_browsertest.h"
 #include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/extensions/extension_util.h"
-#include "chrome/browser/extensions/permissions/permissions_test_util.h"
 #include "chrome/browser/extensions/user_scripts_test_util.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
@@ -42,6 +41,7 @@
 #include "extensions/browser/extension_host.h"
 #include "extensions/browser/extension_system.h"
 #include "extensions/browser/permissions/active_tab_permission_granter.h"
+#include "extensions/browser/permissions/permissions_test_util.h"
 #include "extensions/browser/process_manager.h"
 #include "extensions/browser/script_executor.h"
 #include "extensions/browser/user_script_manager.h"
diff --git a/chrome/browser/file_select_helper_unittest.cc b/chrome/browser/file_select_helper_unittest.cc
index b0d8db2b..173c1ee 100644
--- a/chrome/browser/file_select_helper_unittest.cc
+++ b/chrome/browser/file_select_helper_unittest.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/browser/file_select_helper.h"
 
 #include <stddef.h>
@@ -16,6 +11,7 @@
 #include <vector>
 
 #include "base/command_line.h"
+#include "base/compiler_specific.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
@@ -170,7 +166,7 @@
                                    "Contents/_CodeSignature/CodeResources"};
   size_t file_count = std::size(files_to_verify);
   for (size_t i = 0; i < file_count; i++) {
-    const char* relative_path = files_to_verify[i];
+    const char* relative_path = UNSAFE_TODO(files_to_verify[i]);
     base::FilePath orig_file = src.Append(relative_path);
     base::FilePath final_file =
         temp_dir.GetPath().Append(app_name).Append(relative_path);
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 5a454b4..66908e4 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -9778,6 +9778,11 @@
     "expiry_milestone": 150
   },
   {
+    "name": "tab-group-color-on-surface",
+    "owners": [ "bling-meridian@google.com", "bling-flags@google.com" ],
+    "expiry_milestone": 147
+  },
+  {
     "name": "tab-group-entry-points-android",
     "owners": [ "mfiaz@google.com", "clank-tab-dev@google.com" ],
     "expiry_milestone": 143
diff --git a/chrome/browser/glic/host/glic_api_browsertest.cc b/chrome/browser/glic/host/glic_api_browsertest.cc
index 749287fc..090c70c 100644
--- a/chrome/browser/glic/host/glic_api_browsertest.cc
+++ b/chrome/browser/glic/host/glic_api_browsertest.cc
@@ -1401,9 +1401,8 @@
 }
 
 // TODO(crbug.com/435271214): Re-enable this test
-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) ||          \
-    (BUILDFLAG(IS_WIN) && defined(ADDRESS_SANITIZER)) || \
-    (BUILDFLAG(IS_CHROMEOS) && defined(ADDRESS_SANITIZER))
+#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_CHROMEOS) || \
+    (BUILDFLAG(IS_WIN) && defined(ADDRESS_SANITIZER))
 #define MAYBE_testDeferredFocusedTabStateAtCreation \
   DISABLED_testDeferredFocusedTabStateAtCreation
 #else
@@ -2417,8 +2416,9 @@
                             1)))));
 }
 
+// TODO(crbug.com/457020736): Flaky on multiple platforms.
 IN_PROC_BROWSER_TEST_P(GlicApiTestWithOneTab,
-                       testGetContextFromTabFailsIfDoesNotExist) {
+                       DISABLED_testGetContextFromTabFailsIfDoesNotExist) {
   ExecuteJsTest();
 
   // TODO(b/450026474): Multi-instance fails the metrics check because the
diff --git a/chrome/browser/importer/ie_importer_browsertest_win.cc b/chrome/browser/importer/ie_importer_browsertest_win.cc
index 32a2564..0280e6ee 100644
--- a/chrome/browser/importer/ie_importer_browsertest_win.cc
+++ b/chrome/browser/importer/ie_importer_browsertest_win.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include <objbase.h>
 
 #include <unknwn.h>
@@ -144,11 +139,12 @@
 
     blob.resize(blob.size() + 8);
     uint32_t total_size = id_list_size + 8;
-    memcpy(&blob[blob.size() - 8], &total_size, 4);
+    UNSAFE_TODO(memcpy(&blob[blob.size() - 8], &total_size, 4));
     uint32_t sort_index = i;
-    memcpy(&blob[blob.size() - 4], &sort_index, 4);
+    UNSAFE_TODO(memcpy(&blob[blob.size() - 4], &sort_index, 4));
     blob.resize(blob.size() + id_list_size);
-    memcpy(&blob[blob.size() - id_list_size], id_list, id_list_size);
+    UNSAFE_TODO(
+        memcpy(&blob[blob.size() - id_list_size], id_list, id_list_size));
     ILFree(id_list_full);
   }
 
@@ -292,9 +288,9 @@
     // Importer should import the IE Favorites folder the same as the list,
     // in the same order.
     for (size_t i = 0; i < bookmarks.size(); ++i) {
-      EXPECT_NO_FATAL_FAILURE(
-          TestEqualBookmarkEntry(bookmarks[i],
-                                 kIEBookmarks[bookmark_count_])) << i;
+      EXPECT_NO_FATAL_FAILURE(TestEqualBookmarkEntry(
+          bookmarks[i], UNSAFE_TODO(kIEBookmarks[bookmark_count_])))
+          << i;
       ++bookmark_count_;
     }
   }
@@ -302,10 +298,12 @@
   void AddFavicons(const favicon_base::FaviconUsageDataList& usage) override {
     // Importer should group the favicon information for each favicon URL.
     for (size_t i = 0; i < std::size(kIEFaviconGroup); ++i) {
-      GURL favicon_url(kIEFaviconGroup[i].favicon_url);
+      GURL favicon_url(UNSAFE_TODO(kIEFaviconGroup[i]).favicon_url);
       std::set<GURL> urls;
-      for (size_t j = 0; j < std::size(kIEFaviconGroup[i].site_url); ++j)
-        urls.insert(GURL(kIEFaviconGroup[i].site_url[j]));
+      for (size_t j = 0;
+           j < std::size(UNSAFE_TODO(kIEFaviconGroup[i]).site_url); ++j) {
+        urls.insert(GURL(UNSAFE_TODO(kIEFaviconGroup[i].site_url[j])));
+      }
 
       SCOPED_TRACE(testing::Message() << "Expected Favicon: " << favicon_url);
 
@@ -372,9 +370,9 @@
     ASSERT_LE(bookmark_count_ + bookmarks.size(),
               std::size(kIESortedBookmarks));
     for (size_t i = 0; i < bookmarks.size(); ++i) {
-      EXPECT_NO_FATAL_FAILURE(
-          TestEqualBookmarkEntry(bookmarks[i],
-                                 kIESortedBookmarks[bookmark_count_])) << i;
+      EXPECT_NO_FATAL_FAILURE(TestEqualBookmarkEntry(
+          bookmarks[i], UNSAFE_TODO(kIESortedBookmarks[bookmark_count_])))
+          << i;
       ++bookmark_count_;
     }
   }
@@ -543,8 +541,8 @@
     ASSERT_EQ(ERROR_SUCCESS,
               key.Create(HKEY_CURRENT_USER, key_path.c_str(), KEY_WRITE));
     ASSERT_EQ(ERROR_SUCCESS,
-              key.WriteValue(L"Order", kBadBinary[i].data, kBadBinary[i].length,
-                             REG_BINARY));
+              key.WriteValue(L"Order", UNSAFE_TODO(kBadBinary[i]).data,
+                             UNSAFE_TODO(kBadBinary[i]).length, REG_BINARY));
 
     // Starts to import the above settings.
     // Deletes itself.
diff --git a/chrome/browser/keyboard_accessory/android/internal/java/strings/translations/android_keyboard_accessory_strings_ar.xtb b/chrome/browser/keyboard_accessory/android/internal/java/strings/translations/android_keyboard_accessory_strings_ar.xtb
index c68a82e8..7e3aa0f 100644
--- a/chrome/browser/keyboard_accessory/android/internal/java/strings/translations/android_keyboard_accessory_strings_ar.xtb
+++ b/chrome/browser/keyboard_accessory/android/internal/java/strings/translations/android_keyboard_accessory_strings_ar.xtb
@@ -17,7 +17,7 @@
 <translation id="4660011489602794167">عرض لوحة المفاتيح</translation>
 <translation id="4953563283121525742">لا يقبل التاجر هذه البطاقة الافتراضية</translation>
 <translation id="5016175294846053194">اقتراحات الملء التلقائي متاحة أعلى لوحة المفاتيح</translation>
-<translation id="5234764350956374838">تجاهل</translation>
+<translation id="5234764350956374838">إغلاق</translation>
 <translation id="5441504010984421144">تم فتح قائمة بيانات الاعتماد التي يجب ملؤها باللمس على طول الشاشة.</translation>
 <translation id="5447973833955560753">كلمة مرور الاسترداد</translation>
 <translation id="5880385758720707152">‏يمكنك ملء عنوانَي المنزل والعمل تلقائيًا من حسابك على Google</translation>
diff --git a/chrome/browser/media/encrypted_media_browsertest.cc b/chrome/browser/media/encrypted_media_browsertest.cc
index d6f5e521..315f5f1 100644
--- a/chrome/browser/media/encrypted_media_browsertest.cc
+++ b/chrome/browser/media/encrypted_media_browsertest.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/command_line.h"
+#include "base/compiler_specific.h"
 #include "base/path_service.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
@@ -94,10 +95,6 @@
 
 #if BUILDFLAG(IS_WIN) && BUILDFLAG(USE_PROPRIETARY_CODECS) && \
     BUILDFLAG(ENABLE_PLATFORM_ENCRYPTED_DOLBY_VISION)
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
 static constexpr wchar_t kDolbyVisionProfile5[] = L"dvhe.05";
 static constexpr wchar_t kDolbyVisionProfile8[] = L"dvhe.08";
 #endif
@@ -1577,7 +1574,7 @@
 
     // Clean up the activates
     for (unsigned int i = 0; i < numActivates; ++i) {
-      activates[i]->Release();
+      UNSAFE_TODO(activates[i]->Release());
     }
 
     return true;
@@ -1598,11 +1595,11 @@
     for (unsigned int i = 0; i < numActivates && !supported; i++) {
       PROPVARIANT var;
       PropVariantInit(&var);
-      auto hr = activates[i]->GetItem(MFT_ENUM_VIDEO_RENDERER_EXTENSION_PROFILE,
-                                      &var);
+      auto hr = UNSAFE_TODO(activates[i]->GetItem(
+          MFT_ENUM_VIDEO_RENDERER_EXTENSION_PROFILE, &var));
       if (hr == S_OK && var.vt == VARTYPE(VT_VECTOR | VT_LPWSTR)) {
         for (unsigned long j = 0; j < var.calpwstr.cElems; j++) {
-          auto elem = *(var.calpwstr.pElems + j);
+          auto elem = *(UNSAFE_TODO(var.calpwstr.pElems + j));
           if (_wcsicmp(elem, profile) == 0) {
             supported = true;
             break;
@@ -1615,7 +1612,7 @@
 
     // Clean up the activates
     for (unsigned int i = 0; i < numActivates; ++i) {
-      activates[i]->Release();
+      UNSAFE_TODO(activates[i]->Release());
     }
 
     return supported;
diff --git a/chrome/browser/media/router/discovery/discovery_network_list_posix.cc b/chrome/browser/media/router/discovery/discovery_network_list_posix.cc
index 3bab9a6d..75bae8de 100644
--- a/chrome/browser/media/router/discovery/discovery_network_list_posix.cc
+++ b/chrome/browser/media/router/discovery/discovery_network_list_posix.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/browser/media/router/discovery/discovery_network_list.h"
 
 #include <ifaddrs.h>
@@ -18,6 +13,7 @@
 
 #include <algorithm>
 
+#include "base/compiler_specific.h"
 #include "base/strings/string_number_conversions.h"
 #include "build/build_config.h"
 #include "chrome/browser/media/router/discovery/discovery_network_list_wifi.h"
@@ -89,7 +85,7 @@
 
     network_info_list->push_back(
         {name, base::HexEncode(reinterpret_cast<const unsigned char*>(
-                                   SOCKET_ADDRESS(ll_addr)),
+                                   UNSAFE_TODO(SOCKET_ADDRESS(ll_addr))),
                                SOCKET_ADDRESS_LEN(ll_addr))});
   }
 }
diff --git a/chrome/browser/media/router/discovery/discovery_network_list_win.cc b/chrome/browser/media/router/discovery/discovery_network_list_win.cc
index 7884958..64e60d65 100644
--- a/chrome/browser/media/router/discovery/discovery_network_list_win.cc
+++ b/chrome/browser/media/router/discovery/discovery_network_list_win.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/browser/media/router/discovery/discovery_network_list_win.h"
 
 #include <windows.h>
@@ -22,6 +17,7 @@
 #include <vector>
 
 #include "base/check.h"
+#include "base/compiler_specific.h"
 #include "base/containers/heap_array.h"
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
@@ -59,7 +55,7 @@
 }  // namespace
 
 bool GuidOperatorLess::operator()(const GUID& guid1, const GUID& guid2) const {
-  return memcmp(&guid1, &guid2, sizeof(GUID)) < 0;
+  return UNSAFE_TODO(memcmp(&guid1, &guid2, sizeof(GUID))) < 0;
 }
 
 typedef DWORD(WINAPI* WlanOpenHandleFunction)(DWORD dwClientVersion,
@@ -172,7 +168,7 @@
 
   base::small_map<std::map<GUID, std::string, GuidOperatorLess>> guid_mac_map;
   for (ULONG i = 0; i < interface_table->NumEntries; ++i) {
-    const auto* interface_row = &interface_table->Table[i];
+    const auto* interface_row = &UNSAFE_TODO(interface_table->Table[i]);
     guid_mac_map.emplace(interface_row->InterfaceGuid,
                          std::string{reinterpret_cast<const char*>(
                                          interface_row->PhysicalAddress),
@@ -248,7 +244,8 @@
   // GUID which we can use to get its MAC address via |guid_mac_map| and its
   // associated SSID via WlanQueryInterface.
   for (DWORD i = 0; i < wlan_interface_list->dwNumberOfItems; ++i) {
-    const auto* interface_info = &wlan_interface_list->InterfaceInfo[i];
+    const auto* interface_info =
+        &UNSAFE_TODO(wlan_interface_list->InterfaceInfo[i]);
     const auto mac_entry = guid_mac_map.find(interface_info->InterfaceGuid);
     if (mac_entry == guid_mac_map.end()) {
       continue;
diff --git a/chrome/browser/media/router/discovery/test_support/win/fake_mib_table.cc b/chrome/browser/media/router/discovery/test_support/win/fake_mib_table.cc
index 43ca568a..8159c54 100644
--- a/chrome/browser/media/router/discovery/test_support/win/fake_mib_table.cc
+++ b/chrome/browser/media/router/discovery/test_support/win/fake_mib_table.cc
@@ -2,13 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/browser/media/router/discovery/test_support/win/fake_mib_table.h"
 
+#include "base/compiler_specific.h"
+
 namespace media_router {
 
 FakeMibTable::FakeMibTable(
@@ -25,7 +22,7 @@
   MIB_IF_TABLE2* mib_table = Get();
   mib_table->NumEntries = source_network_interfaces.size();
   for (size_t i = 0; i < source_network_interfaces.size(); ++i) {
-    mib_table->Table[i] = source_network_interfaces[i];
+    UNSAFE_TODO(mib_table->Table[i]) = source_network_interfaces[i];
   }
 }
 
diff --git a/chrome/browser/media_galleries/mtp_device_object_enumerator_unittest.cc b/chrome/browser/media_galleries/mtp_device_object_enumerator_unittest.cc
index 544fb90..489ebc1 100644
--- a/chrome/browser/media_galleries/mtp_device_object_enumerator_unittest.cc
+++ b/chrome/browser/media_galleries/mtp_device_object_enumerator_unittest.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/browser/media_galleries/mtp_device_object_enumerator.h"
 
 #include <stddef.h>
@@ -14,6 +9,7 @@
 
 #include <utility>
 
+#include "base/compiler_specific.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace {
@@ -56,24 +52,25 @@
   std::vector<device::mojom::MtpFileEntryPtr> entries;
   for (size_t i = 0; i < std::size(kTestCases); ++i) {
     auto entry = device::mojom::MtpFileEntry::New();
-    entry->file_name = kTestCases[i].name;
-    entry->file_size = kTestCases[i].size;
+    entry->file_name = UNSAFE_TODO(kTestCases[i]).name;
+    entry->file_size = UNSAFE_TODO(kTestCases[i]).size;
     entry->file_type =
-        kTestCases[i].is_directory
+        UNSAFE_TODO(kTestCases[i]).is_directory
             ? device::mojom::MtpFileEntry::FileType::FILE_TYPE_FOLDER
             : device::mojom::MtpFileEntry::FileType::FILE_TYPE_OTHER;
-    entry->modification_time = kTestCases[i].modification_time;
+    entry->modification_time = UNSAFE_TODO(kTestCases[i]).modification_time;
     entries.push_back(std::move(entry));
   }
   MTPDeviceObjectEnumerator enumerator(std::move(entries));
   TestEnumeratorIsEmpty(&enumerator);
   TestEnumeratorIsEmpty(&enumerator);
   for (size_t i = 0; i < std::size(kTestCases); ++i) {
-    EXPECT_EQ(kTestCases[i].name, enumerator.Next().value());
-    EXPECT_EQ(kTestCases[i].size, enumerator.Size());
-    EXPECT_EQ(kTestCases[i].is_directory, enumerator.IsDirectory());
-    EXPECT_EQ(kTestCases[i].modification_time,
-              enumerator.LastModifiedTime().ToTimeT());
+    UNSAFE_TODO(EXPECT_EQ(kTestCases[i].name, enumerator.Next().value()));
+    UNSAFE_TODO(EXPECT_EQ(kTestCases[i].size, enumerator.Size()));
+    UNSAFE_TODO(
+        EXPECT_EQ(kTestCases[i].is_directory, enumerator.IsDirectory()));
+    UNSAFE_TODO(EXPECT_EQ(kTestCases[i].modification_time,
+                          enumerator.LastModifiedTime().ToTimeT()));
   }
   TestNextEntryIsEmpty(&enumerator);
   TestNextEntryIsEmpty(&enumerator);
diff --git a/chrome/browser/net/service_providers_win.cc b/chrome/browser/net/service_providers_win.cc
index b9e7343b..b4c408f3 100644
--- a/chrome/browser/net/service_providers_win.cc
+++ b/chrome/browser/net/service_providers_win.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/browser/net/service_providers_win.h"
 
 #include <winsock2.h>
@@ -15,6 +10,7 @@
 
 #include <memory>
 
+#include "base/compiler_specific.h"
 #include "base/containers/heap_array.h"
 #include "base/notreached.h"
 #include "base/values.h"
@@ -50,10 +46,10 @@
   for (int i = 0; i < num_namespace_providers; ++i) {
     WinsockNamespaceProvider provider;
 
-    provider.name = namespace_providers[i].lpszIdentifier;
-    provider.active = TRUE == namespace_providers[i].fActive;
-    provider.version = namespace_providers[i].dwVersion;
-    provider.type = namespace_providers[i].dwNameSpace;
+    provider.name = UNSAFE_TODO(namespace_providers[i]).lpszIdentifier;
+    provider.active = TRUE == UNSAFE_TODO(namespace_providers[i]).fActive;
+    provider.version = UNSAFE_TODO(namespace_providers[i]).dwVersion;
+    provider.type = UNSAFE_TODO(namespace_providers[i]).dwNameSpace;
 
     namespace_list->push_back(provider);
   }
@@ -83,19 +79,22 @@
   for (int i = 0; i < num_service_providers; ++i) {
     WinsockLayeredServiceProvider service_provider;
 
-    service_provider.name = service_providers[i].szProtocol;
-    service_provider.version = service_providers[i].iVersion;
-    service_provider.socket_type = service_providers[i].iSocketType;
-    service_provider.socket_protocol = service_providers[i].iProtocol;
-    service_provider.chain_length = service_providers[i].ProtocolChain.ChainLen;
+    service_provider.name = UNSAFE_TODO(service_providers[i]).szProtocol;
+    service_provider.version = UNSAFE_TODO(service_providers[i]).iVersion;
+    service_provider.socket_type =
+        UNSAFE_TODO(service_providers[i]).iSocketType;
+    service_provider.socket_protocol =
+        UNSAFE_TODO(service_providers[i]).iProtocol;
+    service_provider.chain_length =
+        UNSAFE_TODO(service_providers[i]).ProtocolChain.ChainLen;
 
     // TODO(mmenke): Add categories under Vista and later.
     // http://msdn.microsoft.com/en-us/library/ms742239%28v=VS.85%29.aspx
 
     wchar_t path[MAX_PATH];
     int path_length = std::size(path);
-    if (0 == WSCGetProviderPath(&service_providers[i].ProviderId, path,
-                                &path_length, &error)) {
+    if (0 == WSCGetProviderPath(&UNSAFE_TODO(service_providers[i]).ProviderId,
+                                path, &path_length, &error)) {
       service_provider.path = path;
     }
 
diff --git a/chrome/browser/ntp_customization/BUILD.gn b/chrome/browser/ntp_customization/BUILD.gn
index 4983a81..7a26915 100644
--- a/chrome/browser/ntp_customization/BUILD.gn
+++ b/chrome/browser/ntp_customization/BUILD.gn
@@ -36,6 +36,7 @@
     "java/src/org/chromium/chrome/browser/ntp_customization/theme/NtpThemeBottomSheetView.java",
     "java/src/org/chromium/chrome/browser/ntp_customization/theme/NtpThemeBridge.java",
     "java/src/org/chromium/chrome/browser/ntp_customization/theme/NtpThemeCoordinator.java",
+    "java/src/org/chromium/chrome/browser/ntp_customization/theme/NtpThemeDelegate.java",
     "java/src/org/chromium/chrome/browser/ntp_customization/theme/NtpThemeListItemView.java",
     "java/src/org/chromium/chrome/browser/ntp_customization/theme/NtpThemeListThemeCollectionItemIconView.java",
     "java/src/org/chromium/chrome/browser/ntp_customization/theme/NtpThemeMediator.java",
diff --git a/chrome/browser/ntp_customization/java/src/org/chromium/chrome/browser/ntp_customization/theme/NtpThemeCoordinator.java b/chrome/browser/ntp_customization/java/src/org/chromium/chrome/browser/ntp_customization/theme/NtpThemeCoordinator.java
index 8459672..1abcd61 100644
--- a/chrome/browser/ntp_customization/java/src/org/chromium/chrome/browser/ntp_customization/theme/NtpThemeCoordinator.java
+++ b/chrome/browser/ntp_customization/java/src/org/chromium/chrome/browser/ntp_customization/theme/NtpThemeCoordinator.java
@@ -4,7 +4,11 @@
 
 package org.chromium.chrome.browser.ntp_customization.theme;
 
+import static org.chromium.chrome.browser.ntp_customization.NtpCustomizationCoordinator.BottomSheetType.CHROME_COLORS;
 import static org.chromium.chrome.browser.ntp_customization.NtpCustomizationCoordinator.BottomSheetType.THEME;
+import static org.chromium.chrome.browser.ntp_customization.NtpCustomizationCoordinator.BottomSheetType.THEME_COLLECTIONS;
+import static org.chromium.chrome.browser.ntp_customization.NtpCustomizationUtils.NtpBackgroundImageType.CHROME_COLOR;
+import static org.chromium.chrome.browser.ntp_customization.NtpCustomizationUtils.NtpBackgroundImageType.THEME_COLLECTION;
 import static org.chromium.chrome.browser.ntp_customization.theme.NtpThemeProperty.THEME_KEYS;
 
 import android.app.Activity;
@@ -15,6 +19,7 @@
 import androidx.activity.ComponentActivity;
 import androidx.annotation.VisibleForTesting;
 
+import org.chromium.base.CallbackController;
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.ntp_customization.BottomSheetDelegate;
@@ -22,6 +27,8 @@
 import org.chromium.chrome.browser.ntp_customization.NtpCustomizationConfigManager;
 import org.chromium.chrome.browser.ntp_customization.NtpCustomizationViewProperties;
 import org.chromium.chrome.browser.ntp_customization.R;
+import org.chromium.chrome.browser.ntp_customization.theme.chrome_colors.NtpChromeColorsCoordinator;
+import org.chromium.chrome.browser.ntp_customization.theme.theme_collections.NtpThemeCollectionsCoordinator;
 import org.chromium.chrome.browser.ntp_customization.theme.upload_image.UploadImagePreviewCoordinator;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.ui.modelutil.PropertyModel;
@@ -32,10 +39,16 @@
 public class NtpThemeCoordinator {
     private final Context mContext;
     private final BottomSheetDelegate mBottomSheetDelegate;
+    private final Profile mProfile;
+    private final NtpThemeDelegate mNtpThemeDelegate;
     private final Runnable mDismissBottomSheetRunnable;
+    private final NtpThemeBridge mNtpThemeBridge;
+    private final CallbackController mCallbackController = new CallbackController();
     private NtpThemeMediator mMediator;
     private NtpThemeBottomSheetView mNtpThemeBottomSheetView;
     private @Nullable UploadImagePreviewCoordinator mUploadPreviewCoordinator;
+    private @Nullable NtpThemeCollectionsCoordinator mNtpThemeCollectionsCoordinator;
+    private @Nullable NtpChromeColorsCoordinator mNtpChromeColorsCoordinator;
 
     public NtpThemeCoordinator(
             Context context,
@@ -44,6 +57,7 @@
             Runnable dismissBottomSheet) {
         mContext = context;
         mBottomSheetDelegate = delegate;
+        mProfile = profile;
         mDismissBottomSheetRunnable = dismissBottomSheet;
         mNtpThemeBottomSheetView =
                 (NtpThemeBottomSheetView)
@@ -75,16 +89,30 @@
                         ? ((ComponentActivity) context).getActivityResultRegistry()
                         : null;
 
+        mNtpThemeBridge =
+                new NtpThemeBridge(
+                        profile,
+                        mCallbackController.makeCancelable(
+                                () -> {
+                                    mMediator.updateTrailingIconVisibilityForSectionType(
+                                            THEME_COLLECTION);
+                                    // TODO: This might not be the right place for update theme
+                                    // color, especially for daily update function.
+                                    mBottomSheetDelegate.onNewColorSelected(
+                                            /* isDifferentColor= */ true);
+                                }));
+        mNtpThemeDelegate = createNtpThemeDelegate();
         mMediator =
                 new NtpThemeMediator(
                         context,
                         bottomSheetPropertyModel,
                         themePropertyModel,
                         delegate,
-                        profile,
                         NtpCustomizationConfigManager.getInstance(),
                         activityResultRegistry,
-                        this::onImageSelectedForPreview);
+                        this::onImageSelectedForPreview,
+                        mNtpThemeDelegate,
+                        mNtpThemeBridge);
     }
 
     /**
@@ -99,18 +127,66 @@
                         (Activity) mContext, bitmap, this::onPreviewClosed);
     }
 
+    /**
+     * Creates and returns a {@link NtpThemeDelegate} that handles interactions with the theme
+     * customization options. This delegate is responsible for creating and showing the appropriate
+     * sub-coordinators when the user selects different theme options like "Chrome Colors" or "Theme
+     * Collections."
+     *
+     * @return A new {@link NtpThemeDelegate} instance.
+     */
+    private NtpThemeDelegate createNtpThemeDelegate() {
+        return new NtpThemeDelegate() {
+            @Override
+            public void onChromeColorsClicked() {
+                if (mNtpChromeColorsCoordinator == null) {
+                    Runnable onChromeColorSelectedCallback =
+                            () -> {
+                                mMediator.updateForChoosingDefaultOrChromeColorOption(CHROME_COLOR);
+                            };
+
+                    mNtpChromeColorsCoordinator =
+                            new NtpChromeColorsCoordinator(
+                                    mContext,
+                                    mBottomSheetDelegate,
+                                    mCallbackController.makeCancelable(
+                                            onChromeColorSelectedCallback));
+                }
+                mBottomSheetDelegate.showBottomSheet(CHROME_COLORS);
+            }
+
+            @Override
+            public void onThemeCollectionsClicked() {
+                if (mNtpThemeCollectionsCoordinator == null) {
+                    mNtpThemeCollectionsCoordinator =
+                            new NtpThemeCollectionsCoordinator(
+                                    mContext, mBottomSheetDelegate, mProfile, mNtpThemeBridge);
+                }
+                mBottomSheetDelegate.showBottomSheet(THEME_COLLECTIONS);
+            }
+        };
+    }
+
     public void destroy() {
         mMediator.destroy();
         mNtpThemeBottomSheetView.destroy();
         if (mUploadPreviewCoordinator != null) {
             mUploadPreviewCoordinator.destroy();
         }
+        if (mNtpThemeCollectionsCoordinator != null) {
+            mNtpThemeCollectionsCoordinator.destroy();
+        }
+        if (mNtpChromeColorsCoordinator != null) {
+            mNtpChromeColorsCoordinator.destroy();
+        }
+        mNtpThemeBridge.destroy();
+        mCallbackController.destroy();
     }
 
     @VisibleForTesting
     void onPreviewClosed(boolean isImageSelected) {
         if (isImageSelected) {
-            mBottomSheetDelegate.onNewColorSelected(/* isDifferentColor */ true);
+            mBottomSheetDelegate.onNewColorSelected(/* isDifferentColor= */ true);
         }
         mDismissBottomSheetRunnable.run();
     }
@@ -126,4 +202,8 @@
     void setNtpThemeBottomSheetViewForTesting(NtpThemeBottomSheetView ntpThemeBottomSheetView) {
         mNtpThemeBottomSheetView = ntpThemeBottomSheetView;
     }
+
+    NtpThemeDelegate getNtpThemeDelegateForTesting() {
+        return mNtpThemeDelegate;
+    }
 }
diff --git a/chrome/browser/ntp_customization/java/src/org/chromium/chrome/browser/ntp_customization/theme/NtpThemeDelegate.java b/chrome/browser/ntp_customization/java/src/org/chromium/chrome/browser/ntp_customization/theme/NtpThemeDelegate.java
new file mode 100644
index 0000000..0526e2a8
--- /dev/null
+++ b/chrome/browser/ntp_customization/java/src/org/chromium/chrome/browser/ntp_customization/theme/NtpThemeDelegate.java
@@ -0,0 +1,17 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.ntp_customization.theme;
+
+import org.chromium.build.annotations.NullMarked;
+
+/** Delegate for {@link NtpThemeMediator} to communicate with {@link NtpThemeCoordinator}. */
+@NullMarked
+public interface NtpThemeDelegate {
+    /** Called when the chrome colors section is clicked. */
+    void onChromeColorsClicked();
+
+    /** Called when the theme collections section is clicked. */
+    void onThemeCollectionsClicked();
+}
diff --git a/chrome/browser/ntp_customization/java/src/org/chromium/chrome/browser/ntp_customization/theme/NtpThemeMediator.java b/chrome/browser/ntp_customization/java/src/org/chromium/chrome/browser/ntp_customization/theme/NtpThemeMediator.java
index 8fdd3ce8..b564506 100644
--- a/chrome/browser/ntp_customization/java/src/org/chromium/chrome/browser/ntp_customization/theme/NtpThemeMediator.java
+++ b/chrome/browser/ntp_customization/java/src/org/chromium/chrome/browser/ntp_customization/theme/NtpThemeMediator.java
@@ -27,20 +27,15 @@
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.base.Callback;
-import org.chromium.base.CallbackController;
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.ntp_customization.BottomSheetDelegate;
 import org.chromium.chrome.browser.ntp_customization.NtpCustomizationConfigManager;
-import org.chromium.chrome.browser.ntp_customization.NtpCustomizationCoordinator;
 import org.chromium.chrome.browser.ntp_customization.NtpCustomizationCoordinator.BottomSheetType;
 import org.chromium.chrome.browser.ntp_customization.NtpCustomizationMetricsUtils;
 import org.chromium.chrome.browser.ntp_customization.NtpCustomizationUtils;
 import org.chromium.chrome.browser.ntp_customization.NtpCustomizationUtils.NtpBackgroundImageType;
 import org.chromium.chrome.browser.ntp_customization.R;
-import org.chromium.chrome.browser.ntp_customization.theme.chrome_colors.NtpChromeColorsCoordinator;
-import org.chromium.chrome.browser.ntp_customization.theme.theme_collections.NtpThemeCollectionsCoordinator;
-import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.components.browser_ui.share.ShareImageFileUtils;
 import org.chromium.ui.modelutil.PropertyModel;
 
@@ -52,50 +47,36 @@
     // TODO(crbug.com/423579377): Update the url for learn more button.
     private static final String LEARN_MORE_CLICK_URL =
             "https://support.google.com/chrome/?p=new_tab";
-    private final Profile mProfile;
     private final PropertyModel mBottomSheetPropertyModel;
     private final PropertyModel mThemePropertyModel;
     private final BottomSheetDelegate mBottomSheetDelegate;
     private final Context mContext;
     private final NtpCustomizationConfigManager mNtpCustomizationConfigManager;
     private final Callback<@Nullable Bitmap> mOnImageSelectedCallback;
-    private final CallbackController mCallbackController = new CallbackController();
+    private final NtpThemeDelegate mNtpThemeDelegate;
     private final NtpThemeBridge mNtpThemeBridge;
     private @Nullable ActivityResultRegistry mActivityResultRegistry;
     private @Nullable ActivityResultLauncher<String> mActivityResultLauncher;
-    private @Nullable NtpThemeCollectionsCoordinator mNtpThemeCollectionsCoordinator;
-    private @Nullable NtpChromeColorsCoordinator mNtpChromeColorsCoordinator;
 
     public NtpThemeMediator(
             Context context,
             PropertyModel bottomSheetPropertyModel,
             PropertyModel themePropertyModel,
             BottomSheetDelegate delegate,
-            Profile profile,
             NtpCustomizationConfigManager ntpCustomizationConfigManager,
             @Nullable ActivityResultRegistry activityResultRegistry,
-            Callback<@Nullable Bitmap> onImageSelectedCallback) {
+            Callback<@Nullable Bitmap> onImageSelectedCallback,
+            NtpThemeDelegate ntpThemeDelegate,
+            NtpThemeBridge ntpThemeBridge) {
         mContext = context;
-        mProfile = profile;
         mBottomSheetPropertyModel = bottomSheetPropertyModel;
         mThemePropertyModel = themePropertyModel;
         mBottomSheetDelegate = delegate;
         mNtpCustomizationConfigManager = ntpCustomizationConfigManager;
         mActivityResultRegistry = activityResultRegistry;
         mOnImageSelectedCallback = onImageSelectedCallback;
-
-        mNtpThemeBridge =
-                new NtpThemeBridge(
-                        profile,
-                        mCallbackController.makeCancelable(
-                                () -> {
-                                    updateTrailingIconVisibilityForSectionType(THEME_COLLECTION);
-
-                                    // TODO: This might not be the right place for update theme
-                                    // color, especially for daily update function.
-                                    mBottomSheetDelegate.onNewColorSelected(
-                                            /* isDifferentColor= */ true);
-                                }));
+        mNtpThemeDelegate = ntpThemeDelegate;
+        mNtpThemeBridge = ntpThemeBridge;
 
         // Hides the back button when the theme settings bottom sheet is displayed standalone.
         mBottomSheetPropertyModel.set(
@@ -111,18 +92,10 @@
     }
 
     void destroy() {
-        mCallbackController.destroy();
         mBottomSheetPropertyModel.set(BACK_PRESS_HANDLER, null);
         mThemePropertyModel.set(LEARN_MORE_BUTTON_CLICK_LISTENER, null);
         mActivityResultLauncher = null;
         mActivityResultRegistry = null;
-        if (mNtpThemeCollectionsCoordinator != null) {
-            mNtpThemeCollectionsCoordinator.destroy();
-        }
-        if (mNtpChromeColorsCoordinator != null) {
-            mNtpChromeColorsCoordinator.destroy();
-        }
-        mNtpThemeBridge.destroy();
     }
 
     /** Sets the on click listener for each theme bottom sheet section. */
@@ -156,12 +129,13 @@
      *
      * @param sectionType The {@link NtpBackgroundImageType} to show the trailing icon for.
      */
-    private void updateTrailingIconVisibilityForSectionType(
-            @NtpBackgroundImageType int sectionType) {
+    @VisibleForTesting
+    void updateTrailingIconVisibilityForSectionType(@NtpBackgroundImageType int sectionType) {
         for (int i = 0; i < NtpBackgroundImageType.NUM_ENTRIES; i++) {
             if (i == THEME_COLLECTION) {
-                if (sectionType != THEME_COLLECTION && mNtpThemeCollectionsCoordinator != null) {
-                    mNtpThemeCollectionsCoordinator.clearThemeCollectionSelection();
+                if (sectionType != THEME_COLLECTION) {
+                    mNtpThemeBridge.setSelectedTheme(
+                            /* themeCollectionId= */ null, /* themeCollectionImageUrl= */ null);
                 }
                 continue;
             }
@@ -191,8 +165,7 @@
             mNtpThemeBridge.selectLocalBackgroundImage();
         }
 
-        NtpCustomizationMetricsUtils.recordBottomSheetShown(
-                NtpCustomizationCoordinator.BottomSheetType.UPLOAD_IMAGE);
+        NtpCustomizationMetricsUtils.recordBottomSheetShown(BottomSheetType.UPLOAD_IMAGE);
     }
 
     /**
@@ -221,8 +194,7 @@
         mNtpCustomizationConfigManager.onBackgroundColorChanged(
                 mContext, /* colorInfo= */ null, DEFAULT);
 
-        NtpCustomizationMetricsUtils.recordBottomSheetShown(
-                NtpCustomizationCoordinator.BottomSheetType.CHROME_DEFAULT);
+        NtpCustomizationMetricsUtils.recordBottomSheetShown(BottomSheetType.CHROME_DEFAULT);
     }
 
     @VisibleForTesting
@@ -234,27 +206,12 @@
 
     @VisibleForTesting
     void handleChromeColorsSectionClick(View view) {
-        if (mNtpChromeColorsCoordinator == null) {
-            mNtpChromeColorsCoordinator =
-                    new NtpChromeColorsCoordinator(
-                            mContext,
-                            mBottomSheetDelegate,
-                            mCallbackController.makeCancelable(
-                                    () -> {
-                                        updateForChoosingDefaultOrChromeColorOption(CHROME_COLOR);
-                                    }));
-        }
-        mBottomSheetDelegate.showBottomSheet(BottomSheetType.CHROME_COLORS);
+        mNtpThemeDelegate.onChromeColorsClicked();
     }
 
     @VisibleForTesting
     void handleThemeCollectionsSectionClick(View view) {
-        if (mNtpThemeCollectionsCoordinator == null) {
-            mNtpThemeCollectionsCoordinator =
-                    new NtpThemeCollectionsCoordinator(
-                            mContext, mBottomSheetDelegate, mProfile, mNtpThemeBridge);
-        }
-        mBottomSheetDelegate.showBottomSheet(BottomSheetType.THEME_COLLECTIONS);
+        mNtpThemeDelegate.onThemeCollectionsClicked();
     }
 
     @VisibleForTesting
@@ -278,14 +235,4 @@
         updateTrailingIconVisibilityForSectionType(sectionType);
         mNtpThemeBridge.resetCustomBackground();
     }
-
-    void setNtpThemeCollectionsCoordinatorForTesting(
-            NtpThemeCollectionsCoordinator ntpThemeCollectionsCoordinator) {
-        mNtpThemeCollectionsCoordinator = ntpThemeCollectionsCoordinator;
-    }
-
-    public void setNtpChromeColorsCoordinatorForTesting(
-            NtpChromeColorsCoordinator ntpChromeColorsCoordinator) {
-        mNtpChromeColorsCoordinator = ntpChromeColorsCoordinator;
-    }
 }
diff --git a/chrome/browser/ntp_customization/java/src/org/chromium/chrome/browser/ntp_customization/theme/theme_collections/NtpThemeCollectionsCoordinator.java b/chrome/browser/ntp_customization/java/src/org/chromium/chrome/browser/ntp_customization/theme/theme_collections/NtpThemeCollectionsCoordinator.java
index bcb8cade..7848aad9 100644
--- a/chrome/browser/ntp_customization/java/src/org/chromium/chrome/browser/ntp_customization/theme/theme_collections/NtpThemeCollectionsCoordinator.java
+++ b/chrome/browser/ntp_customization/java/src/org/chromium/chrome/browser/ntp_customization/theme/theme_collections/NtpThemeCollectionsCoordinator.java
@@ -243,12 +243,6 @@
         launchUriActivity(view.getContext(), LEARN_MORE_CLICK_URL);
     }
 
-    /** Clears the theme collection selection. */
-    public void clearThemeCollectionSelection() {
-        mNtpThemeBridge.setSelectedTheme(
-                /* themeCollectionId= */ null, /* themeCollectionImageUrl= */ null);
-    }
-
     void setNtpThemeCollectionsAdapterForTesting(NtpThemeCollectionsAdapter adapter) {
         mNtpThemeCollectionsAdapter = adapter;
         mThemeCollectionsBottomSheetRecyclerView.setAdapter(adapter);
diff --git a/chrome/browser/ntp_customization/junit/src/org/chromium/chrome/browser/ntp_customization/theme/NtpThemeCoordinatorUnitTest.java b/chrome/browser/ntp_customization/junit/src/org/chromium/chrome/browser/ntp_customization/theme/NtpThemeCoordinatorUnitTest.java
index 6efbb3b..13ff436 100644
--- a/chrome/browser/ntp_customization/junit/src/org/chromium/chrome/browser/ntp_customization/theme/NtpThemeCoordinatorUnitTest.java
+++ b/chrome/browser/ntp_customization/junit/src/org/chromium/chrome/browser/ntp_customization/theme/NtpThemeCoordinatorUnitTest.java
@@ -8,12 +8,14 @@
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import static org.chromium.chrome.browser.ntp_customization.NtpCustomizationCoordinator.BottomSheetType.THEME;
+
 import android.content.Context;
 import android.view.ContextThemeWrapper;
 
@@ -23,15 +25,20 @@
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnit;
 import org.mockito.junit.MockitoRule;
 
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.chrome.browser.ntp_customization.BottomSheetDelegate;
+import org.chromium.chrome.browser.ntp_customization.NtpCustomizationConfigManager;
+import org.chromium.chrome.browser.ntp_customization.NtpCustomizationCoordinator.BottomSheetType;
 import org.chromium.chrome.browser.ntp_customization.NtpCustomizationUtils.NtpBackgroundImageType;
 import org.chromium.chrome.browser.ntp_customization.R;
+import org.chromium.chrome.browser.ntp_customization.theme.theme_collections.CustomBackgroundInfo;
 import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.url.GURL;
 
 /** Unit tests for {@link NtpThemeCoordinator}. */
 @RunWith(BaseRobolectricTestRunner.class)
@@ -42,9 +49,12 @@
     @Mock private Profile mProfile;
     @Mock private Runnable mDismissBottomSheet;
     @Mock private NtpThemeBridge.Natives mNtpThemeBridgeJniMock;
+    @Mock private NtpCustomizationConfigManager mNtpCustomizationConfigManager;
+    @Mock private NtpThemeBottomSheetView mNtpThemeBottomSheetView;
 
     private Context mContext;
     private NtpThemeCoordinator mCoordinator;
+    private NtpThemeMediator mMediator;
 
     @Before
     public void setUp() {
@@ -54,9 +64,15 @@
                         R.style.Theme_BrowserUI_DayNight);
         NtpThemeBridgeJni.setInstanceForTesting(mNtpThemeBridgeJniMock);
         when(mNtpThemeBridgeJniMock.init(any(), any())).thenReturn(1L);
+        NtpCustomizationConfigManager.setInstanceForTesting(mNtpCustomizationConfigManager);
+
         mCoordinator =
                 new NtpThemeCoordinator(
                         mContext, mBottomSheetDelegate, mProfile, mDismissBottomSheet);
+
+        mMediator = mCoordinator.getMediatorForTesting();
+        mCoordinator.setMediatorForTesting(mMediator);
+        mCoordinator.setNtpThemeBottomSheetViewForTesting(mNtpThemeBottomSheetView);
     }
 
     @Test
@@ -66,21 +82,14 @@
 
     @Test
     public void testRegisterBottomSheetLayout() {
-        verify(mBottomSheetDelegate)
-                .registerBottomSheetLayout(eq(NtpBackgroundImageType.THEME_COLLECTION), any());
+        verify(mBottomSheetDelegate).registerBottomSheetLayout(eq(THEME), any());
     }
 
     @Test
     public void testDestroy() {
-        NtpThemeMediator mediator = mock(NtpThemeMediator.class);
-        mCoordinator.setMediatorForTesting(mediator);
         mCoordinator.destroy();
-        verify(mediator).destroy();
 
-        NtpThemeBottomSheetView ntpThemeBottomSheetView = mock(NtpThemeBottomSheetView.class);
-        mCoordinator.setNtpThemeBottomSheetViewForTesting(ntpThemeBottomSheetView);
-        mCoordinator.destroy();
-        verify(ntpThemeBottomSheetView).destroy();
+        verify(mNtpThemeBottomSheetView).destroy();
     }
 
     @Test
@@ -97,4 +106,38 @@
         verify(mBottomSheetDelegate).onNewColorSelected(eq(true));
         verify(mDismissBottomSheet, times(2)).run();
     }
+
+    @Test
+    public void testOnChromeColorsClicked() {
+        mCoordinator.getNtpThemeDelegateForTesting().onChromeColorsClicked();
+        verify(mBottomSheetDelegate).showBottomSheet(eq(BottomSheetType.CHROME_COLORS));
+    }
+
+    @Test
+    public void onThemeCollectionsClicked() {
+        mCoordinator.getNtpThemeDelegateForTesting().onThemeCollectionsClicked();
+        verify(mBottomSheetDelegate).showBottomSheet(eq(BottomSheetType.THEME_COLLECTIONS));
+    }
+
+    @Test
+    public void testOnThemeImageSelectedCallback() {
+        ArgumentCaptor<NtpThemeBridge> ntpThemeBridgeCaptor =
+                ArgumentCaptor.forClass(NtpThemeBridge.class);
+        verify(mNtpThemeBridgeJniMock).init(any(), ntpThemeBridgeCaptor.capture());
+        NtpThemeBridge ntpThemeBridge = ntpThemeBridgeCaptor.getValue();
+        mMediator = spy(mCoordinator.getMediatorForTesting());
+        mCoordinator.setMediatorForTesting(mMediator);
+
+        when(mNtpThemeBridgeJniMock.getCustomBackgroundInfo(1L))
+                .thenReturn(
+                        new CustomBackgroundInfo(
+                                new GURL("http://test.com"), "collection", false, false));
+
+        ntpThemeBridge.onCustomBackgroundImageUpdated();
+
+        verify(mBottomSheetDelegate).onNewColorSelected(eq(true));
+        verify(mMediator)
+                .updateTrailingIconVisibilityForSectionType(
+                        NtpBackgroundImageType.THEME_COLLECTION);
+    }
 }
diff --git a/chrome/browser/ntp_customization/junit/src/org/chromium/chrome/browser/ntp_customization/theme/NtpThemeMediatorUnitTest.java b/chrome/browser/ntp_customization/junit/src/org/chromium/chrome/browser/ntp_customization/theme/NtpThemeMediatorUnitTest.java
index 89f8f05..913f6e01 100644
--- a/chrome/browser/ntp_customization/junit/src/org/chromium/chrome/browser/ntp_customization/theme/NtpThemeMediatorUnitTest.java
+++ b/chrome/browser/ntp_customization/junit/src/org/chromium/chrome/browser/ntp_customization/theme/NtpThemeMediatorUnitTest.java
@@ -20,7 +20,6 @@
 import static org.chromium.chrome.browser.ntp_customization.NtpCustomizationUtils.NtpBackgroundImageType.CHROME_COLOR;
 import static org.chromium.chrome.browser.ntp_customization.NtpCustomizationUtils.NtpBackgroundImageType.DEFAULT;
 import static org.chromium.chrome.browser.ntp_customization.NtpCustomizationUtils.NtpBackgroundImageType.IMAGE_FROM_DISK;
-import static org.chromium.chrome.browser.ntp_customization.NtpCustomizationUtils.NtpBackgroundImageType.THEME_COLLECTION;
 import static org.chromium.chrome.browser.ntp_customization.NtpCustomizationViewProperties.BACK_PRESS_HANDLER;
 import static org.chromium.chrome.browser.ntp_customization.theme.NtpThemeProperty.IS_SECTION_TRAILING_ICON_VISIBLE;
 import static org.chromium.chrome.browser.ntp_customization.theme.NtpThemeProperty.LEADING_ICON_FOR_THEME_COLLECTIONS;
@@ -40,7 +39,6 @@
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnit;
 import org.mockito.junit.MockitoRule;
@@ -55,12 +53,7 @@
 import org.chromium.chrome.browser.ntp_customization.NtpCustomizationUtils.NtpBackgroundImageType;
 import org.chromium.chrome.browser.ntp_customization.NtpCustomizationViewProperties;
 import org.chromium.chrome.browser.ntp_customization.R;
-import org.chromium.chrome.browser.ntp_customization.theme.chrome_colors.NtpChromeColorsCoordinator;
-import org.chromium.chrome.browser.ntp_customization.theme.theme_collections.CustomBackgroundInfo;
-import org.chromium.chrome.browser.ntp_customization.theme.theme_collections.NtpThemeCollectionsCoordinator;
-import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.ui.modelutil.PropertyModel;
-import org.chromium.url.GURL;
 
 /** Tests for {@link NtpThemeMediator}. */
 @RunWith(BaseRobolectricTestRunner.class)
@@ -70,18 +63,16 @@
 
     @Mock private Callback<Bitmap> mOnImageSelectedCallback;
     @Mock private BottomSheetDelegate mBottomSheetDelegate;
-    @Mock private Profile mProfile;
     @Mock private View mView;
     @Mock private NtpCustomizationConfigManager mNtpCustomizationConfigManager;
-    @Mock private NtpThemeCollectionsCoordinator mNtpThemeCollectionsCoordinator;
-    @Mock private NtpChromeColorsCoordinator mNtpChromeColorsCoordinator;
     @Mock private Uri mUri;
+    @Mock private NtpThemeDelegate mNtpThemeDelegate;
+    @Mock private NtpThemeBridge mNtpThemeBridge;
 
     private PropertyModel mBottomSheetPropertyModel;
     private PropertyModel mThemePropertyModel;
     private NtpThemeMediator mMediator;
     private Context mContext;
-    @Mock private NtpThemeBridge.Natives mNtpThemeBridgeJniMock;
 
     @Before
     public void setUp() {
@@ -94,9 +85,6 @@
         mBottomSheetPropertyModel =
                 new PropertyModel(NtpCustomizationViewProperties.BOTTOM_SHEET_KEYS);
         mThemePropertyModel = spy(new PropertyModel(NtpThemeProperty.THEME_KEYS));
-
-        NtpThemeBridgeJni.setInstanceForTesting(mNtpThemeBridgeJniMock);
-        when(mNtpThemeBridgeJniMock.init(any(), any())).thenReturn(1L);
     }
 
     @Test
@@ -120,8 +108,6 @@
     @Test
     public void testDestroy() {
         createMediator(/* shouldShowAlone= */ false);
-        mMediator.setNtpThemeCollectionsCoordinatorForTesting(mNtpThemeCollectionsCoordinator);
-        mMediator.setNtpChromeColorsCoordinatorForTesting(mNtpChromeColorsCoordinator);
 
         assertNotNull(mBottomSheetPropertyModel.get(BACK_PRESS_HANDLER));
         assertNotNull(mThemePropertyModel.get(LEARN_MORE_BUTTON_CLICK_LISTENER));
@@ -130,10 +116,6 @@
 
         assertNull(mBottomSheetPropertyModel.get(BACK_PRESS_HANDLER));
         assertNull(mThemePropertyModel.get(LEARN_MORE_BUTTON_CLICK_LISTENER));
-
-        verify(mNtpThemeCollectionsCoordinator).destroy();
-        verify(mNtpChromeColorsCoordinator).destroy();
-        verify(mNtpThemeBridgeJniMock).destroy(1L);
     }
 
     @Test
@@ -148,7 +130,7 @@
         mMediator.handleChromeDefaultSectionClick(mView);
         verify(mNtpCustomizationConfigManager)
                 .onBackgroundColorChanged(eq(mContext), eq(null), eq(DEFAULT));
-        verify(mNtpThemeBridgeJniMock).resetCustomBackground(1L);
+        verify(mNtpThemeBridge).resetCustomBackground();
         histogramWatcher.assertExpected();
     }
 
@@ -158,8 +140,7 @@
 
         mMediator.handleThemeCollectionsSectionClick(mView);
 
-        // Verify it tries to show the theme collections bottom sheet.
-        verify(mBottomSheetDelegate).showBottomSheet(eq(BottomSheetType.THEME_COLLECTIONS));
+        verify(mNtpThemeDelegate).onThemeCollectionsClicked();
     }
 
     @Test
@@ -168,8 +149,7 @@
 
         mMediator.handleChromeColorsSectionClick(mView);
 
-        // Verify it tries to show the chrome colors bottom sheet.
-        verify(mBottomSheetDelegate).showBottomSheet(eq(BottomSheetType.CHROME_COLORS));
+        verify(mNtpThemeDelegate).onChromeColorsClicked();
     }
 
     @Test
@@ -213,24 +193,23 @@
     @Test
     public void testClearThemeCollectionSelection() {
         createMediator(true);
-        mMediator.setNtpThemeCollectionsCoordinatorForTesting(mNtpThemeCollectionsCoordinator);
-        reset(mNtpThemeCollectionsCoordinator);
+        clearInvocations(mNtpThemeBridge);
 
         // Action: Click default theme. This should clear the selection.
         mMediator.handleChromeDefaultSectionClick(mView);
         // Verification: Selection should be cleared.
-        verify(mNtpThemeCollectionsCoordinator).clearThemeCollectionSelection();
-        clearInvocations(mNtpThemeCollectionsCoordinator);
+        verify(mNtpThemeBridge).setSelectedTheme(eq(null), eq(null));
+        clearInvocations(mNtpThemeBridge);
 
         // Action: Click theme collections. This should NOT clear the selection.
         mMediator.handleThemeCollectionsSectionClick(mView);
         // Verification: clearThemeCollectionSelection should NOT be called again.
-        verify(mNtpThemeCollectionsCoordinator, never()).clearThemeCollectionSelection();
+        verify(mNtpThemeBridge, never()).setSelectedTheme(any(), any());
 
-        // Action: Click chrome colors. This should also NOT clear the selection directly.
-        mMediator.handleChromeColorsSectionClick(mView);
-        // Verification: still should only have been called once.
-        verify(mNtpThemeCollectionsCoordinator, never()).clearThemeCollectionSelection();
+        // Action: Click upload image. This should clear the selection.
+        mMediator.onUploadImageResult(mUri);
+        verify(mNtpThemeBridge).setSelectedTheme(eq(null), eq(null));
+        clearInvocations(mNtpThemeBridge);
     }
 
     @Test
@@ -297,37 +276,11 @@
                         mBottomSheetPropertyModel,
                         mThemePropertyModel,
                         mBottomSheetDelegate,
-                        mProfile,
                         mNtpCustomizationConfigManager,
                         /* activityResultRegistry= */ null,
-                        mOnImageSelectedCallback);
-    }
-
-    @Test
-    public void testOnThemeImageSelectedCallback() {
-        ArgumentCaptor<NtpThemeBridge> ntpThemeBridgeCaptor =
-                ArgumentCaptor.forClass(NtpThemeBridge.class);
-        createMediator(true);
-        verify(mNtpThemeBridgeJniMock).init(any(), ntpThemeBridgeCaptor.capture());
-        NtpThemeBridge ntpThemeBridge = ntpThemeBridgeCaptor.getValue();
-        reset(mThemePropertyModel);
-
-        // Mock the JNI call inside onCustomBackgroundImageUpdated
-        when(mNtpThemeBridgeJniMock.getCustomBackgroundInfo(1L))
-                .thenReturn(
-                        new CustomBackgroundInfo(
-                                new GURL("http://test.com"), "collection", false, false));
-        ntpThemeBridge.onCustomBackgroundImageUpdated();
-
-        verify(mBottomSheetDelegate).onNewColorSelected(eq(true));
-        verify(mThemePropertyModel, never())
-                .set(eq(IS_SECTION_TRAILING_ICON_VISIBLE), eq(new Pair<>(THEME_COLLECTION, true)));
-        verify(mThemePropertyModel)
-                .set(eq(IS_SECTION_TRAILING_ICON_VISIBLE), eq(new Pair<>(DEFAULT, false)));
-        verify(mThemePropertyModel)
-                .set(eq(IS_SECTION_TRAILING_ICON_VISIBLE), eq(new Pair<>(IMAGE_FROM_DISK, false)));
-        verify(mThemePropertyModel)
-                .set(eq(IS_SECTION_TRAILING_ICON_VISIBLE), eq(new Pair<>(CHROME_COLOR, false)));
+                        mOnImageSelectedCallback,
+                        mNtpThemeDelegate,
+                        mNtpThemeBridge);
     }
 
     @Test
@@ -344,6 +297,6 @@
         verify(mThemePropertyModel)
                 .set(eq(IS_SECTION_TRAILING_ICON_VISIBLE), eq(new Pair<>(IMAGE_FROM_DISK, false)));
 
-        verify(mNtpThemeBridgeJniMock).resetCustomBackground(1L);
+        verify(mNtpThemeBridge).resetCustomBackground();
     }
 }
diff --git a/chrome/browser/ntp_customization/junit/src/org/chromium/chrome/browser/ntp_customization/theme/theme_collections/NtpThemeCollectionsCoordinatorUnitTest.java b/chrome/browser/ntp_customization/junit/src/org/chromium/chrome/browser/ntp_customization/theme/theme_collections/NtpThemeCollectionsCoordinatorUnitTest.java
index f10c291..a67fce1 100644
--- a/chrome/browser/ntp_customization/junit/src/org/chromium/chrome/browser/ntp_customization/theme/theme_collections/NtpThemeCollectionsCoordinatorUnitTest.java
+++ b/chrome/browser/ntp_customization/junit/src/org/chromium/chrome/browser/ntp_customization/theme/theme_collections/NtpThemeCollectionsCoordinatorUnitTest.java
@@ -242,13 +242,6 @@
     }
 
     @Test
-    public void testClearThemeSelection() {
-        mCoordinator.clearThemeCollectionSelection();
-
-        verify(mNtpThemeBridge).setSelectedTheme(eq(null), eq(null));
-    }
-
-    @Test
     public void testConfigurationChanged() {
         verify(mContextSpy).registerComponentCallbacks(mComponentCallbacksCaptor.capture());
         ComponentCallbacks componentCallbacks = mComponentCallbacksCaptor.getValue();
diff --git a/chrome/browser/offline_pages/background_loader_offliner.cc b/chrome/browser/offline_pages/background_loader_offliner.cc
index 780d336..ff98e6e 100644
--- a/chrome/browser/offline_pages/background_loader_offliner.cc
+++ b/chrome/browser/offline_pages/background_loader_offliner.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/browser/offline_pages/background_loader_offliner.h"
 
 #include <memory>
@@ -14,6 +9,7 @@
 #include <utility>
 #include <vector>
 
+#include "base/compiler_specific.h"
 #include "base/functional/bind.h"
 #include "base/json/json_writer.h"
 #include "base/metrics/histogram_functions.h"
@@ -83,8 +79,8 @@
     load_termination_listener_->set_offliner(this);
 
   for (int i = 0; i < ResourceDataType::RESOURCE_DATA_TYPE_COUNT; ++i) {
-    stats_[i].requested = 0;
-    stats_[i].completed = 0;
+    UNSAFE_TODO(stats_[i]).requested = 0;
+    UNSAFE_TODO(stats_[i]).completed = 0;
   }
 }
 
@@ -312,7 +308,7 @@
     bool started) {
   // Add the signal to extra data, and use for tracking.
 
-  RequestStats& found_stats = stats_[type];
+  RequestStats& found_stats = UNSAFE_TODO(stats_[type]);
   if (started)
     ++found_stats.requested;
   else
@@ -458,8 +454,8 @@
   loader_.reset();
 
   for (int i = 0; i < ResourceDataType::RESOURCE_DATA_TYPE_COUNT; ++i) {
-    stats_[i].requested = 0;
-    stats_[i].completed = 0;
+    UNSAFE_TODO(stats_[i]).requested = 0;
+    UNSAFE_TODO(stats_[i]).completed = 0;
   }
 }
 
diff --git a/chrome/browser/password_manager/password_change/login_state_checker.cc b/chrome/browser/password_manager/password_change/login_state_checker.cc
index ce8560d..19fb3e6 100644
--- a/chrome/browser/password_manager/password_change/login_state_checker.cc
+++ b/chrome/browser/password_manager/password_change/login_state_checker.cc
@@ -83,7 +83,7 @@
       logs_uploader_(CHECK_DEREF(logs_uploader)),
       client_(client),
       result_check_callback_(std::move(callback)) {
-  CheckLoginState();
+  CheckLoginState(/*ignore_attempts_limit=*/false);
 }
 
 LoginStateChecker::~LoginStateChecker() {
@@ -95,32 +95,33 @@
   return state_checks_count_ >= kMaxLoginChecks;
 }
 
+void LoginStateChecker::RetryLoginCheck() {
+  capturer_.reset();
+  CheckLoginState(/*ignore_attempts_limit=*/true);
+}
+
 void LoginStateChecker::DidFinishNavigation(
     content::NavigationHandle* navigation_handle) {
   capturer_.reset();
-  CheckLoginState();
+  CheckLoginState(/*ignore_attempts_limit=*/false);
 }
 
 void LoginStateChecker::TerminateLoginChecks() {
-  std::unique_ptr<ModelQualityLogsUploader::LoggingData> logging_data =
-      std::make_unique<ModelQualityLogsUploader::LoggingData>();
-  logging_data->mutable_response()
-      ->mutable_is_logged_in_data()
-      ->set_is_logged_in(false);
-  logs_uploader_->SetLoggedInCheckQuality(state_checks_count_,
-                                          std::move(logging_data));
-  state_checks_count_ = kMaxLoginChecks;
-  result_check_callback_.Run(false);
+  // Reset content::WebContentsObserver.
+  Observe(nullptr);
+  capturer_.reset();
+  cached_page_content_ = std::nullopt;
+
+  result_check_callback_.Run(LoginCheckResult::kError);
 }
 
-void LoginStateChecker::CheckLoginState() {
+void LoginStateChecker::CheckLoginState(bool ignore_attempts_limit) {
   LogMessage(client_,
              SavePasswordProgressLogger::STRING_LOGIN_STATE_CHECK_STARTED);
-  // Checks if the maximum number of attempts has been reached.
-  if (ReachedAttemptsLimit()) {
+  // Avoid checking further if maximum number of attempts has been reached.
+  if (!ignore_attempts_limit && ReachedAttemptsLimit()) {
     LogMessage(client_, SavePasswordProgressLogger::
                             STRING_LOGIN_STATE_CHECK_MAX_ATTEMPTS_REACHED);
-    TerminateLoginChecks();
     return;
   }
 
@@ -222,5 +223,6 @@
     cached_page_content_ = std::nullopt;
   }
 
-  result_check_callback_.Run(is_logged_in);
+  result_check_callback_.Run(is_logged_in ? LoginCheckResult::kLoggedIn
+                                          : LoginCheckResult::kLoggedOut);
 }
diff --git a/chrome/browser/password_manager/password_change/login_state_checker.h b/chrome/browser/password_manager/password_change/login_state_checker.h
index e8c939e..1a997a38 100644
--- a/chrome/browser/password_manager/password_change/login_state_checker.h
+++ b/chrome/browser/password_manager/password_change/login_state_checker.h
@@ -26,6 +26,12 @@
 class PasswordManagerClient;
 }  // namespace password_manager
 
+enum class LoginCheckResult {
+  kLoggedIn = 0,
+  kLoggedOut = 1,
+  kError = 2,
+};
+
 // Helper class which checks if the user is fully signed in on the main tab
 // before starting a password change flow in a background tab.
 // If the initial check fails, it waits for a navigation to occur before
@@ -34,10 +40,8 @@
  public:
   // Maximum amount of login state checks.
   static constexpr int kMaxLoginChecks = 5;
-  using LoginStateResultCallback = base::RepeatingCallback<void(bool)>;
-  using QualityStatus = optimization_guide::proto::
-      PasswordChangeQuality_StepQuality_SubmissionStatus;
-  using IsLoggedIn = base::StrongAlias<class IsLoggedInTag, bool>;
+  using LoginStateResultCallback =
+      base::RepeatingCallback<void(LoginCheckResult)>;
 
   LoginStateChecker(content::WebContents* web_contents,
                     ModelQualityLogsUploader* logs_uploader,
@@ -48,20 +52,22 @@
 
   bool ReachedAttemptsLimit() const;
 
+  void RetryLoginCheck();
+
 #if defined(UNIT_TEST)
   AnnotatedPageContentCapturer* capturer() { return capturer_.get(); }
-  void RespondWithLoginStatus(IsLoggedIn is_logged_in) {
+  void RespondWithLoginStatus(LoginCheckResult result) {
     std::unique_ptr<
         optimization_guide::proto::PasswordChangeSubmissionLoggingData>
         logging_data = std::make_unique<
             optimization_guide::proto::PasswordChangeSubmissionLoggingData>();
     logging_data->mutable_response()
         ->mutable_is_logged_in_data()
-        ->set_is_logged_in(is_logged_in.value());
+        ->set_is_logged_in(result == LoginCheckResult::kLoggedIn);
     logs_uploader_->SetLoggedInCheckQuality(state_checks_count_,
                                             std::move(logging_data));
     state_checks_count_++;
-    result_check_callback_.Run(is_logged_in.value());
+    result_check_callback_.Run(result);
   }
 #endif
 
@@ -81,7 +87,7 @@
   // Checks if the user is fully signed in on the site.
   // The result will be passed to the callback on success, otherwise it will
   // set up a retry on the next navigation.
-  void CheckLoginState();
+  void CheckLoginState(bool ignore_attempts_limit);
 
   // content::WebContentsObserver:
   void DidFinishNavigation(
diff --git a/chrome/browser/password_manager/password_change/login_state_checker_unittest.cc b/chrome/browser/password_manager/password_change/login_state_checker_unittest.cc
index db90be8..e3186dd 100644
--- a/chrome/browser/password_manager/password_change/login_state_checker_unittest.cc
+++ b/chrome/browser/password_manager/password_change/login_state_checker_unittest.cc
@@ -137,7 +137,7 @@
 };
 
 TEST_F(LoginStateCheckerTest, UserIsLoggedInOnFirstAttempt) {
-  base::test::TestFuture<bool> future;
+  base::test::TestFuture<LoginCheckResult> future;
   EXPECT_CALL(*optimization_service(), ExecuteModel)
       .WillOnce(WithArg<3>(&PostResponse<ResponseType::kSuccess>));
 
@@ -146,7 +146,7 @@
   ASSERT_TRUE(checker->capturer());
   checker->capturer()->ReplyWithContent(
       optimization_guide::AIPageContentResult());
-  EXPECT_TRUE(future.Take());
+  EXPECT_EQ(future.Take(), LoginCheckResult::kLoggedIn);
   VerifyQualityFields(
       logs_uploader()->GetFinalLog(),
       QualityStatus::
@@ -155,7 +155,7 @@
 }
 
 TEST_F(LoginStateCheckerTest, UserIsLoggedInOnSecondAttempt) {
-  base::test::TestFuture<bool> future;
+  base::test::TestFuture<LoginCheckResult> future;
   {
     InSequence s;
     EXPECT_CALL(*optimization_service(), ExecuteModel)
@@ -169,7 +169,7 @@
   // First model call should be negative, the user is not logged in.
   checker->capturer()->ReplyWithContent(
       optimization_guide::AIPageContentResult());
-  EXPECT_FALSE(future.Take());
+  EXPECT_EQ(future.Take(), LoginCheckResult::kLoggedOut);
 
   // Simulate finishing a navigation in the main frame.
   static_cast<content::WebContentsObserver*>(checker.get())
@@ -177,7 +177,7 @@
   // Second model call should be positive, the user is logged in.
   checker->capturer()->ReplyWithContent(
       optimization_guide::AIPageContentResult());
-  EXPECT_TRUE(future.Take());
+  EXPECT_EQ(future.Take(), LoginCheckResult::kLoggedIn);
   VerifyQualityFields(
       logs_uploader()->GetFinalLog(),
       QualityStatus::
@@ -186,7 +186,7 @@
 }
 
 TEST_F(LoginStateCheckerTest, FailsAfterUnexpectedResponse) {
-  base::test::TestFuture<bool> future;
+  base::test::TestFuture<LoginCheckResult> future;
   EXPECT_CALL(*optimization_service(), ExecuteModel)
       .WillOnce(WithArg<3>(&PostResponse<ResponseType::kUnexpected>));
 
@@ -195,7 +195,7 @@
   ASSERT_TRUE(checker->capturer());
   checker->capturer()->ReplyWithContent(
       optimization_guide::AIPageContentResult());
-  EXPECT_FALSE(future.Take());
+  EXPECT_EQ(future.Take(), LoginCheckResult::kError);
   VerifyQualityFields(
       logs_uploader()->GetFinalLog(),
       QualityStatus::
@@ -204,7 +204,7 @@
 }
 
 TEST_F(LoginStateCheckerTest, UnexpectedResponseOnSecondAttempt) {
-  base::test::TestFuture<bool> future;
+  base::test::TestFuture<LoginCheckResult> future;
   {
     InSequence s;
     EXPECT_CALL(*optimization_service(), ExecuteModel)
@@ -217,14 +217,14 @@
       CreateChecker(future.GetRepeatingCallback());
   checker->capturer()->ReplyWithContent(
       optimization_guide::AIPageContentResult());
-  EXPECT_FALSE(future.Take());
+  EXPECT_EQ(future.Take(), LoginCheckResult::kLoggedOut);
   // Simulate finishing a navigation in the main frame to trigger the next
   // check.
   static_cast<content::WebContentsObserver*>(checker.get())
       ->DidFinishNavigation(nullptr);
   checker->capturer()->ReplyWithContent(
       optimization_guide::AIPageContentResult());
-  EXPECT_FALSE(future.Take());
+  EXPECT_EQ(future.Take(), LoginCheckResult::kError);
   VerifyQualityFields(
       logs_uploader()->GetFinalLog(),
       QualityStatus::
@@ -233,7 +233,7 @@
 }
 
 TEST_F(LoginStateCheckerTest, ExceedsMaxLoginChecksAndFails) {
-  base::test::TestFuture<bool> future;
+  base::test::TestFuture<LoginCheckResult> future;
   EXPECT_CALL(*optimization_service(), ExecuteModel)
       .Times(LoginStateChecker::kMaxLoginChecks)
       .WillRepeatedly(WithArg<3>(&PostResponse<ResponseType::kFailure>));
@@ -241,9 +241,10 @@
   std::unique_ptr<LoginStateChecker> checker =
       CreateChecker(future.GetRepeatingCallback());
   for (int i = 0; i < LoginStateChecker::kMaxLoginChecks; ++i) {
+    ASSERT_TRUE(checker->capturer());
     checker->capturer()->ReplyWithContent(
         optimization_guide::AIPageContentResult());
-    EXPECT_FALSE(future.Take());
+    EXPECT_EQ(future.Take(), LoginCheckResult::kLoggedOut);
 
     if (i < LoginStateChecker::kMaxLoginChecks - 1) {
       EXPECT_FALSE(checker->ReachedAttemptsLimit());
@@ -251,12 +252,13 @@
           ->DidFinishNavigation(nullptr);
     }
   }
-  // The next check should fail immediately without calling the model.
+  // Subsequent navigation doesn't trigger a re-check.
   EXPECT_CALL(*optimization_service(), ExecuteModel).Times(0);
   EXPECT_TRUE(checker->ReachedAttemptsLimit());
   static_cast<content::WebContentsObserver*>(checker.get())
       ->DidFinishNavigation(nullptr);
-  EXPECT_FALSE(future.Take());
+  EXPECT_FALSE(checker->capturer());
+
   VerifyQualityFields(
       logs_uploader()->GetFinalLog(),
       QualityStatus::
@@ -265,7 +267,7 @@
 }
 
 TEST_F(LoginStateCheckerTest, CachesPageContentIfRequestInFlight) {
-  base::test::TestFuture<bool> future;
+  base::test::TestFuture<LoginCheckResult> future;
 
   std::unique_ptr<LoginStateChecker> checker =
       CreateChecker(future.GetRepeatingCallback());
@@ -295,17 +297,17 @@
       .WillOnce(MoveArg<3>(&second_optimization_guide_callback));
   PostResponse<ResponseType::kFailure>(
       std::move(first_optimization_guide_callback));
-  EXPECT_FALSE(future.Take());
+  EXPECT_EQ(future.Take(), LoginCheckResult::kLoggedOut);
   ASSERT_TRUE(second_optimization_guide_callback);
 
   // Second request should be processed now and succeed.
   PostResponse<ResponseType::kSuccess>(
       std::move(second_optimization_guide_callback));
-  EXPECT_TRUE(future.Take());
+  EXPECT_EQ(future.Take(), LoginCheckResult::kLoggedIn);
 }
 
 TEST_F(LoginStateCheckerTest, CachesOnlyLastPageContent) {
-  base::test::TestFuture<bool> future;
+  base::test::TestFuture<LoginCheckResult> future;
   optimization_guide::OptimizationGuideModelExecutionResultCallback
       initial_optimization_guide_callback;
 
@@ -337,17 +339,17 @@
       .WillOnce(MoveArg<3>(&cached_optimization_guide_callback));
   PostResponse<ResponseType::kFailure>(
       std::move(initial_optimization_guide_callback));
-  EXPECT_FALSE(future.Take());
+  EXPECT_EQ(future.Take(), LoginCheckResult::kLoggedOut);
   ASSERT_TRUE(cached_optimization_guide_callback);
 
   // The cached request is processed and succeeds.
   PostResponse<ResponseType::kSuccess>(
       std::move(cached_optimization_guide_callback));
-  EXPECT_TRUE(future.Take());
+  EXPECT_EQ(future.Take(), LoginCheckResult::kLoggedIn);
 }
 
 TEST_F(LoginStateCheckerTest, NoRequestWithEmptyCachedPageContent) {
-  base::test::TestFuture<bool> future;
+  base::test::TestFuture<LoginCheckResult> future;
   optimization_guide::OptimizationGuideModelExecutionResultCallback
       optimization_guide_callback_1;
   optimization_guide::OptimizationGuideModelExecutionResultCallback
@@ -374,13 +376,13 @@
       .WillOnce(MoveArg<3>(&optimization_guide_callback_2));
   PostResponse<ResponseType::kFailure>(
       std::move(optimization_guide_callback_1));
-  EXPECT_FALSE(future.Take());
+  EXPECT_EQ(future.Take(), LoginCheckResult::kLoggedOut);
   ASSERT_TRUE(optimization_guide_callback_2);
 
   // The cached request also fails with user not being logged in.
   PostResponse<ResponseType::kFailure>(
       std::move(optimization_guide_callback_2));
-  EXPECT_FALSE(future.Take());
+  EXPECT_EQ(future.Take(), LoginCheckResult::kLoggedOut);
 
   // Simulate a new navigation which triggers a new login check.
   testing::Mock::VerifyAndClearExpectations(optimization_service());
@@ -394,7 +396,7 @@
   ASSERT_TRUE(optimization_guide_callback_1);
   PostResponse<ResponseType::kSuccess>(
       std::move(optimization_guide_callback_1));
-  EXPECT_TRUE(future.Take());
+  EXPECT_EQ(future.Take(), LoginCheckResult::kLoggedIn);
 
   VerifyQualityFields(
       logs_uploader()->GetFinalLog(),
@@ -406,7 +408,7 @@
 TEST_F(LoginStateCheckerTest, FailsAfterErrorInTheResponse) {
   base::test::ScopedFeatureList feature_list(
       password_manager::features::kStopLoginCheckOnFailedLogin);
-  base::test::TestFuture<bool> future;
+  base::test::TestFuture<LoginCheckResult> future;
   EXPECT_CALL(*optimization_service(), ExecuteModel)
       .WillOnce(WithArg<3>(&PostResponse<ResponseType::kUnexpected>));
 
@@ -415,10 +417,40 @@
   ASSERT_TRUE(checker->capturer());
   checker->capturer()->ReplyWithContent(
       optimization_guide::AIPageContentResult());
-  EXPECT_FALSE(future.Take());
+  EXPECT_EQ(future.Take(), LoginCheckResult::kError);
   VerifyQualityFields(
       logs_uploader()->GetFinalLog(),
       QualityStatus::
           PasswordChangeQuality_StepQuality_SubmissionStatus_UNEXPECTED_STATE,
       /* expected_retry_count=*/0);
 }
+
+TEST_F(LoginStateCheckerTest, RetryLoginCheck) {
+  base::test::TestFuture<LoginCheckResult> future;
+  {
+    InSequence s;
+    EXPECT_CALL(*optimization_service(), ExecuteModel)
+        .WillOnce(WithArg<3>(&PostResponse<ResponseType::kFailure>));
+    EXPECT_CALL(*optimization_service(), ExecuteModel)
+        .WillOnce(WithArg<3>(&PostResponse<ResponseType::kSuccess>));
+  }
+
+  std::unique_ptr<LoginStateChecker> checker =
+      CreateChecker(future.GetRepeatingCallback());
+  // First model call should be negative, the user is not logged in.
+  checker->capturer()->ReplyWithContent(
+      optimization_guide::AIPageContentResult());
+  EXPECT_EQ(future.Take(), LoginCheckResult::kLoggedOut);
+
+  // Trigger a retry.
+  checker->RetryLoginCheck();
+  // Second model call should be positive, the user is logged in.
+  checker->capturer()->ReplyWithContent(
+      optimization_guide::AIPageContentResult());
+  EXPECT_EQ(future.Take(), LoginCheckResult::kLoggedIn);
+  VerifyQualityFields(
+      logs_uploader()->GetFinalLog(),
+      QualityStatus::
+          PasswordChangeQuality_StepQuality_SubmissionStatus_ACTION_SUCCESS,
+      /* expected_retry_count=*/1);
+}
diff --git a/chrome/browser/password_manager/password_change/model_quality_logs_uploader.cc b/chrome/browser/password_manager/password_change/model_quality_logs_uploader.cc
index 0e1eeffb..9114e69 100644
--- a/chrome/browser/password_manager/password_change/model_quality_logs_uploader.cc
+++ b/chrome/browser/password_manager/password_change/model_quality_logs_uploader.cc
@@ -429,13 +429,6 @@
   GetStepQuality(step, final_log_data_)->set_status(GetStepStatus(failure));
 }
 
-void ModelQualityLogsUploader::LoginCheckSkipped() {
-  final_log_data_.mutable_password_change_submission()
-      ->mutable_quality()
-      ->mutable_logged_in_check()
-      ->set_classification_overridden_by_user(true);
-}
-
 void ModelQualityLogsUploader::SetLoginPasswordFormInfo(
     const password_manager::PasswordForm& password_form) {
   optimization_guide::proto::PasswordChangeQuality* quality =
diff --git a/chrome/browser/password_manager/password_change/model_quality_logs_uploader.h b/chrome/browser/password_manager/password_change/model_quality_logs_uploader.h
index 3a1ce5c..5266d56 100644
--- a/chrome/browser/password_manager/password_change/model_quality_logs_uploader.h
+++ b/chrome/browser/password_manager/password_change/model_quality_logs_uploader.h
@@ -84,11 +84,6 @@
   void RecordButtonClickFailure(FlowStep step,
                                 actor::mojom::ActionResultCode failure);
 
-  // Called when the user clicks 'continue' during the login check step
-  // to begin the password change flow, which may indicate an incorrect
-  // classification of the user's login state by the model.
-  void LoginCheckSkipped();
-
   // Called when the leak check is shown to the user. Sets information about the
   // password form which triggered the leak check.
   void SetLoginPasswordFormInfo(
diff --git a/chrome/browser/password_manager/password_change/model_quality_logs_uploader_unittest.cc b/chrome/browser/password_manager/password_change/model_quality_logs_uploader_unittest.cc
index 06686a6c..0162d8f 100644
--- a/chrome/browser/password_manager/password_change/model_quality_logs_uploader_unittest.cc
+++ b/chrome/browser/password_manager/password_change/model_quality_logs_uploader_unittest.cc
@@ -457,17 +457,6 @@
       FinalModelStatus::FINAL_MODEL_STATUS_SUCCESS);
 }
 
-TEST_F(ModelQualityLogsUploaderTest, LoginCheckSkipped) {
-  ModelQualityLogsUploader logs_uploader(web_contents(), GURL());
-  logs_uploader.LoginCheckSkipped();
-  VerifyLoginCheckStep(
-      logs_uploader.GetFinalLog(),
-      QualityStatus::
-          PasswordChangeQuality_StepQuality_SubmissionStatus_UNKNOWN_STATUS,
-      /*expected_retry_count=*/0,
-      /*was_skipped=*/true);
-}
-
 TEST_F(ModelQualityLogsUploaderTest, LoginCheckRetryCountSet) {
   const int login_state_checks = 3;
   ModelQualityLogsUploader logs_uploader(web_contents(), GURL());
diff --git a/chrome/browser/password_manager/password_change_browsertest.cc b/chrome/browser/password_manager/password_change_browsertest.cc
index aa5df88..4c6228d 100644
--- a/chrome/browser/password_manager/password_change_browsertest.cc
+++ b/chrome/browser/password_manager/password_change_browsertest.cc
@@ -104,7 +104,6 @@
 using SubmissionOutcome = PasswordChangeSubmissionVerifier::SubmissionOutcome;
 using SubmitFormResponseData =
     ::optimization_guide::proto::SubmitFormResponseData;
-using IsLoggedIn = LoginStateChecker::IsLoggedIn;
 
 constexpr char kPasswordChangeSubmissionOutcomeHistogram[] =
     "PasswordManager.PasswordChangeSubmissionOutcome";
@@ -1706,18 +1705,19 @@
   EXPECT_EQ(delegate->GetCurrentState(),
             PasswordChangeDelegate::State::kWaitingForChangePasswordForm);
 
-  delegate_impl->login_checker()->RespondWithLoginStatus(IsLoggedIn(false));
+  delegate_impl->login_checker()->RespondWithLoginStatus(
+      LoginCheckResult::kLoggedOut);
   EXPECT_EQ(delegate->GetCurrentState(),
             PasswordChangeDelegate::State::kLoginFormDetected);
-  // Verify that password change fails if the user is not logged in after
-  // maximum amount of attempts.
+  // Verify that the state remains unchanged after reaching retry limit.
   for (auto i = 1; i < LoginStateChecker::kMaxLoginChecks; i++) {
-    delegate_impl->login_checker()->RespondWithLoginStatus(IsLoggedIn(false));
+    delegate_impl->login_checker()->RespondWithLoginStatus(
+        LoginCheckResult::kLoggedOut);
   }
-  EXPECT_FALSE(delegate_impl->login_checker());
+  EXPECT_TRUE(delegate_impl->login_checker());
   EXPECT_FALSE(delegate_impl->executor());
   EXPECT_EQ(delegate->GetCurrentState(),
-            PasswordChangeDelegate::State::kChangePasswordFormNotFound);
+            PasswordChangeDelegate::State::kLoginFormDetected);
 
   // When a user is not logged in, we still open a new tab with the
   // change password URL, so there should be two tabs after.
@@ -1752,7 +1752,7 @@
   // Verify that password change continues if the user is logged in.
   static_cast<PasswordChangeDelegateImpl*>(delegate)
       ->login_checker()
-      ->RespondWithLoginStatus(IsLoggedIn(true));
+      ->RespondWithLoginStatus(LoginCheckResult::kLoggedIn);
   EXPECT_FALSE(
       static_cast<PasswordChangeDelegateImpl*>(delegate)->login_checker());
   EXPECT_TRUE(static_cast<PasswordChangeDelegateImpl*>(delegate)->executor());
@@ -1783,6 +1783,58 @@
 }
 
 IN_PROC_BROWSER_TEST_F(PasswordChangeBrowserTestWithLoginCheck,
+                       LoginCheckRespondedWithError) {
+  const GURL main_url = WebContents()->GetLastCommittedURL();
+  EXPECT_CALL(*affiliation_service(), GetChangePasswordURL(main_url))
+      .WillOnce(Return(GURL(kChangePasswordURL)));
+  password_change_service()->OfferPasswordChangeUi(
+      CreatePasswordForm(main_url, u"test", u"pa$$word"), WebContents());
+  SetModelQualityLogsUploader();
+  auto* delegate =
+      password_change_service()->GetPasswordChangeDelegate(WebContents());
+  auto* delegate_impl = static_cast<PasswordChangeDelegateImpl*>(delegate);
+
+  delegate->StartPasswordChangeFlow();
+
+  // Verify that the background tab was not created yet.
+  EXPECT_FALSE(delegate_impl->executor());
+  EXPECT_TRUE(delegate_impl->login_checker());
+  EXPECT_EQ(delegate->GetCurrentState(),
+            PasswordChangeDelegate::State::kWaitingForChangePasswordForm);
+
+  // Verify that password change fails if login check ends with an error.
+  delegate_impl->login_checker()->RespondWithLoginStatus(
+      LoginCheckResult::kError);
+  EXPECT_FALSE(delegate_impl->login_checker());
+  EXPECT_FALSE(delegate_impl->executor());
+  EXPECT_EQ(delegate->GetCurrentState(),
+            PasswordChangeDelegate::State::kChangePasswordFormNotFound);
+  // Stop the flow to check the correct state of the quality log.
+  delegate->Stop();
+
+  base::WeakPtr<PasswordChangeDelegate> delegate_weak_ptr =
+      delegate->AsWeakPtr();
+  // The quality log is uploaded in the destructor.
+  EXPECT_TRUE(base::test::RunUntil(
+      [&delegate_weak_ptr]() { return !delegate_weak_ptr; }));
+  VerifyUniqueQualityLog(
+      /*login_check_status=*/QualityStatus::
+          PasswordChangeQuality_StepQuality_SubmissionStatus_UNEXPECTED_STATE,
+      /*open_form_status=*/
+      QualityStatus::
+          PasswordChangeQuality_StepQuality_SubmissionStatus_UNKNOWN_STATUS,
+      /*submit_form_status=*/
+      QualityStatus::
+          PasswordChangeQuality_StepQuality_SubmissionStatus_UNKNOWN_STATUS,
+      /*verify_submission_status=*/
+      QualityStatus::
+          PasswordChangeQuality_StepQuality_SubmissionStatus_UNKNOWN_STATUS,
+      /*final_status=*/
+      FinalModelStatus::FINAL_MODEL_STATUS_UNSPECIFIED,
+      /*login_check_was_skipped=*/false);
+}
+
+IN_PROC_BROWSER_TEST_F(PasswordChangeBrowserTestWithLoginCheck,
                        FlowInterruptedBeforeLoginCheck) {
   SetPrivacyNoticeAcceptedPref();
 
diff --git a/chrome/browser/password_manager/password_change_delegate.h b/chrome/browser/password_manager/password_change_delegate.h
index 320cd47..eb7efd6c 100644
--- a/chrome/browser/password_manager/password_change_delegate.h
+++ b/chrome/browser/password_manager/password_change_delegate.h
@@ -58,11 +58,9 @@
     // The flow is not stopped, but the user action is required.
     kLoginFormDetected = 10,
 
-    // Same as above, but provides user with an option to override login check
-    // result and continue password change.
-    kLoginFormDetectedUserCanContinue = 11,
+    // Deprecated: kLoginFormDetectedUserCanContinue = 11,
 
-    kMaxValue = kLoginFormDetectedUserCanContinue,
+    kMaxValue = kLoginFormDetected,
   };
   // LINT.ThenChange(/tools/metrics/histograms/metadata/password/enums.xml:PasswordChangeFlowState)
 
@@ -145,10 +143,9 @@
   // Called when the user declines the initial dialog offering password change.
   virtual void OnPasswordChangeDeclined() = 0;
 
-  // Called when the user chooses to skip the login check (by clicking
-  // 'continue' on the toast) and intends to proceed with changing their
-  // password.
-  virtual void OnUserSkippedLoginCheck() = 0;
+  // Called when the user chooses to retry the login check (by clicking
+  // 'Retry' on the toast).
+  virtual void RetryLoginCheck() = 0;
 
   // Adds/removes an observer.
   virtual void AddObserver(Observer* observer) = 0;
diff --git a/chrome/browser/password_manager/password_change_delegate_impl.cc b/chrome/browser/password_manager/password_change_delegate_impl.cc
index 00447d0..b347bb4 100644
--- a/chrome/browser/password_manager/password_change_delegate_impl.cc
+++ b/chrome/browser/password_manager/password_change_delegate_impl.cc
@@ -212,7 +212,6 @@
     case PasswordChangeDelegate::State::kWaitingForChangePasswordForm:
     case PasswordChangeDelegate::State::kChangingPassword:
     case PasswordChangeDelegate::State::kLoginFormDetected:
-    case PasswordChangeDelegate::State::kLoginFormDetectedUserCanContinue:
       return PasswordChangeDelegate::CoarseFinalPasswordChangeState::kCanceled;
 
     case PasswordChangeDelegate::State::kPasswordSuccessfullyChanged:
@@ -359,7 +358,6 @@
     case State::kOtpDetected:
     case State::kCanceled:
     case State::kLoginFormDetected:
-    case State::kLoginFormDetectedUserCanContinue:
       // Set time to throttle APC offering, as we don't want to overprompt in
       // case of a negative experience.
       profile_->GetPrefs()->SetTime(
@@ -404,23 +402,22 @@
   }
 }
 
-void PasswordChangeDelegateImpl::OnLoginStateCheckResult(bool is_logged_in) {
-  if (is_logged_in) {
-    // User is logged in, start password change process.
-    ProceedToChangePassword();
-    return;
+void PasswordChangeDelegateImpl::OnLoginStateCheckResult(
+    LoginCheckResult login_status) {
+  switch (login_status) {
+    case LoginCheckResult::kLoggedIn:
+      // User is logged in, start password change process.
+      ProceedToChangePassword();
+      return;
+    case LoginCheckResult::kLoggedOut:
+      blocking_challenge_detected_ = true;
+      UpdateState(State::kLoginFormDetected);
+      return;
+    case LoginCheckResult::kError:
+      UpdateState(State::kChangePasswordFormNotFound);
+      login_state_checker_.reset();
+      return;
   }
-
-  blocking_challenge_detected_ = true;
-  if (!login_state_checker_->ReachedAttemptsLimit()) {
-    // Update the UI to encourage user to complete sign in.
-    UpdateState(State::kLoginFormDetected);
-    return;
-  }
-
-  // Maximum number of retries reached, convert to terminal state.
-  UpdateState(State::kChangePasswordFormNotFound);
-  login_state_checker_.reset();
 }
 
 void PasswordChangeDelegateImpl::CancelPasswordChangeFlow() {
@@ -616,9 +613,10 @@
                          ->GetModelDelegateProxy()));
 }
 
-void PasswordChangeDelegateImpl::OnUserSkippedLoginCheck() {
-  logs_uploader_->LoginCheckSkipped();
-  ProceedToChangePassword();
+void PasswordChangeDelegateImpl::RetryLoginCheck() {
+  CHECK(login_state_checker_);
+  login_state_checker_->RetryLoginCheck();
+  UpdateState(State::kWaitingForChangePasswordForm);
 }
 
 void PasswordChangeDelegateImpl::AddObserver(
diff --git a/chrome/browser/password_manager/password_change_delegate_impl.h b/chrome/browser/password_manager/password_change_delegate_impl.h
index 1dc0bc0..63d17a7 100644
--- a/chrome/browser/password_manager/password_change_delegate_impl.h
+++ b/chrome/browser/password_manager/password_change_delegate_impl.h
@@ -34,6 +34,7 @@
 class ChangePasswordFormFillingSubmissionHelper;
 class ChangePasswordFormFinder;
 class CrossOriginNavigationObserver;
+enum class LoginCheckResult;
 class LoginStateChecker;
 class PasswordChangeHats;
 class Profile;
@@ -96,7 +97,7 @@
   void OnPasswordFormSubmission(content::WebContents* web_contents) override;
   void OnPrivacyNoticeAccepted() override;
   void OnPasswordChangeDeclined() override;
-  void OnUserSkippedLoginCheck() override;
+  void RetryLoginCheck() override;
   void AddObserver(PasswordChangeDelegate::Observer* observer) override;
   void RemoveObserver(PasswordChangeDelegate::Observer* observer) override;
 
@@ -107,7 +108,7 @@
   void OnTabWillDetach(tabs::TabInterface* tab_interface,
                        tabs::TabInterface::DetachReason reason);
 
-  void OnLoginStateCheckResult(bool is_logged_in);
+  void OnLoginStateCheckResult(LoginCheckResult login_status);
   // Updates `current_state_` and notifies `observers_`.
   void UpdateState(State new_state);
 
diff --git a/chrome/browser/password_manager/password_change_delegate_impl_unittest.cc b/chrome/browser/password_manager/password_change_delegate_impl_unittest.cc
index d4be092..dcff5e8 100644
--- a/chrome/browser/password_manager/password_change_delegate_impl_unittest.cc
+++ b/chrome/browser/password_manager/password_change_delegate_impl_unittest.cc
@@ -9,6 +9,7 @@
 #include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h"
 #include "chrome/browser/password_manager/chrome_password_manager_client.h"
 #include "chrome/browser/password_manager/password_change/change_password_form_finder.h"
+#include "chrome/browser/password_manager/password_change/login_state_checker.h"
 #include "chrome/browser/ui/passwords/manage_passwords_ui_controller.h"
 #include "chrome/browser/ui/passwords/password_change_ui_controller.h"
 #include "chrome/browser/ui/passwords/passwords_leak_dialog_delegate_mock.h"
@@ -206,7 +207,9 @@
   ukm::TestAutoSetUkmRecorder test_ukm_recorder;
 
   delegate()->StartPasswordChangeFlow();
-  delegate()->OnUserSkippedLoginCheck();
+  static_cast<PasswordChangeDelegateImpl*>(delegate())
+      ->login_checker()
+      ->RespondWithLoginStatus(LoginCheckResult::kLoggedIn);
 
   EXPECT_EQ(delegate()->GetCurrentState(),
             PasswordChangeDelegate::State::kWaitingForChangePasswordForm);
diff --git a/chrome/browser/password_manager/password_change_delegate_mock.h b/chrome/browser/password_manager/password_change_delegate_mock.h
index 67a9c57..e9b7e8f 100644
--- a/chrome/browser/password_manager/password_change_delegate_mock.h
+++ b/chrome/browser/password_manager/password_change_delegate_mock.h
@@ -39,7 +39,7 @@
               (override));
   MOCK_METHOD(void, OnPrivacyNoticeAccepted, (), (override));
   MOCK_METHOD(void, OnPasswordChangeDeclined, (), (override));
-  MOCK_METHOD(void, OnUserSkippedLoginCheck, (), (override));
+  MOCK_METHOD(void, RetryLoginCheck, (), (override));
   MOCK_METHOD(void, AddObserver, (Observer*), (override));
   MOCK_METHOD(void, RemoveObserver, (Observer*), (override));
 
diff --git a/chrome/browser/password_manager/password_manager_util_win.cc b/chrome/browser/password_manager/password_manager_util_win.cc
index 4d3dd9de..a4626ef2 100644
--- a/chrome/browser/password_manager/password_manager_util_win.cc
+++ b/chrome/browser/password_manager/password_manager_util_win.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include <objbase.h>
 
 #include <windows.h>
@@ -15,6 +10,8 @@
 #include <stddef.h>
 #include <stdint.h>
 
+#include "base/compiler_specific.h"
+
 // SECURITY_WIN32 must be defined in order to get
 // EXTENDED_NAME_FORMAT enumeration.
 #define SECURITY_WIN32 1
@@ -135,7 +132,8 @@
   LUID luid;
   HANDLE token = INVALID_HANDLE_VALUE;
 
-  strcpy_s(source.SourceName, std::size(source.SourceName), "Chrome");
+  UNSAFE_TODO(
+      strcpy_s(source.SourceName, std::size(source.SourceName), "Chrome"));
   if (!AllocateLocallyUniqueId(&source.SourceIdentifier)) {
     return GetLastError();
   }
@@ -222,9 +220,9 @@
   // If the user name has a backslash, then it is of the form DOMAIN\username.
   // NetUserGetInfo() (called from GetPasswordLastChanged()) as well as
   // LogonUser() below only wants the username portion.
-  LPCWSTR backslash = wcschr(username, L'\\');
+  LPCWSTR backslash = UNSAFE_TODO(wcschr(username, L'\\'));
   if (backslash) {
-    username = backslash + 1;
+    username = UNSAFE_TODO(backslash + 1);
   }
 
   int64_t last_changed = GetPasswordLastChanged(username);
diff --git a/chrome/browser/platform_experience/win b/chrome/browser/platform_experience/win
index b3f7083..54c7a57 160000
--- a/chrome/browser/platform_experience/win
+++ b/chrome/browser/platform_experience/win
@@ -1 +1 @@
-Subproject commit b3f70835c7141cb7310203882c719b9e24ed6101
+Subproject commit 54c7a572a3d3ec6ced4ca7485131a7c8d6c32540
diff --git a/chrome/browser/policy/messaging_layer/upload/file_upload_impl.cc b/chrome/browser/policy/messaging_layer/upload/file_upload_impl.cc
index 7964f61..5ba8c3a 100644
--- a/chrome/browser/policy/messaging_layer/upload/file_upload_impl.cc
+++ b/chrome/browser/policy/messaging_layer/upload/file_upload_impl.cc
@@ -2,17 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/browser/policy/messaging_layer/upload/file_upload_impl.h"
 
 #include <string>
 #include <string_view>
 #include <vector>
 
+#include "base/compiler_specific.h"
 #include "base/files/file.h"
 #include "base/files/file_util.h"
 #include "base/memory/ptr_util.h"
@@ -695,7 +691,8 @@
     // Load into buffer.
     buffer.resize(
         size);  // Initialization is redundant, but std::string mandates it.
-    const int read_size = handle->Read(offset, buffer.data(), size);
+    const int read_size =
+        UNSAFE_TODO(handle->Read(offset, buffer.data(), size));
     if (read_size < 0) {
       base::UmaHistogramEnumeration(reporting::kUmaDataLossErrorReason,
                                     DataLossErrorReason::CANNOT_READ_FILE,
diff --git a/chrome/browser/policy/messaging_layer/upload/file_upload_impl_unittest.cc b/chrome/browser/policy/messaging_layer/upload/file_upload_impl_unittest.cc
index 64c494c..130a55ab 100644
--- a/chrome/browser/policy/messaging_layer/upload/file_upload_impl_unittest.cc
+++ b/chrome/browser/policy/messaging_layer/upload/file_upload_impl_unittest.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/browser/policy/messaging_layer/upload/file_upload_impl.h"
 
 #include <cstddef>
@@ -16,6 +11,7 @@
 #include <string_view>
 #include <utility>
 
+#include "base/compiler_specific.h"
 #include "base/containers/contains.h"
 #include "base/containers/queue.h"
 #include "base/files/file.h"
@@ -274,7 +270,8 @@
     ASSERT_TRUE(file.IsValid());
     ASSERT_THAT(file.error_details(), Eq(base::File::FILE_OK));
 
-    const int bytes_written = file.Write(0, kTestData, kTestDataSize);
+    const int bytes_written =
+        UNSAFE_TODO(file.Write(0, kTestData, kTestDataSize));
     EXPECT_THAT(bytes_written, Eq(static_cast<int>(kTestDataSize)));
   }
 
diff --git a/chrome/browser/privacy_budget/privacy_budget_browsertest.cc b/chrome/browser/privacy_budget/privacy_budget_browsertest.cc
index 08e12aeb..66d0c00 100644
--- a/chrome/browser/privacy_budget/privacy_budget_browsertest.cc
+++ b/chrome/browser/privacy_budget/privacy_budget_browsertest.cc
@@ -104,73 +104,6 @@
   EXPECT_TRUE(settings->IsActive());
 }
 
-IN_PROC_BROWSER_TEST_F(PrivacyBudgetBrowserTestWithTestRecorder, SamplingAPIs) {
-  ASSERT_TRUE(embedded_test_server()->Start());
-
-  content::DOMMessageQueue messages(web_contents());
-  base::RunLoop run_loop;
-
-  // We expect 3 entries here generated by the two navigations from the test.
-  // The first navigation adds a document created entry and a web feature entry,
-  // while the second one generates only a document created entry.
-  recorder().SetOnAddEntryCallback(ukm::builders::Identifiability::kEntryName,
-                                   BarrierClosure(3u, run_loop.QuitClosure()));
-
-  ASSERT_TRUE(content::NavigateToURL(
-      web_contents(), embedded_test_server()->GetURL(
-                          "/privacy_budget/samples_some_surfaces.html")));
-
-  // The document calls a bunch of instrumented functions and sends a message
-  // back to the test. Receipt of the message indicates that the script
-  // successfully completed.
-  std::string scraped_apis;
-  ASSERT_TRUE(messages.WaitForMessage(&scraped_apis));
-
-  // The contents of the received message isn't used for anything other than
-  // diagnostics.
-  SCOPED_TRACE(scraped_apis);
-
-  // Navigating away from the test page causes the document to be unloaded. That
-  // will cause any buffered metrics to be flushed.
-  content::NavigateToURLBlockUntilNavigationsComplete(web_contents(),
-                                                      GURL("about:blank"), 1);
-
-  // Wait for the metrics to come down the pipe.
-  run_loop.Run();
-
-  auto merged_entries = recorder().GetMergedEntriesByName(
-      ukm::builders::Identifiability::kEntryName);
-
-  // We expect two merged entries, corresponding to the two navigations.
-  ASSERT_EQ(merged_entries.size(), 2u);
-
-  // We collect all metrics together and check that there is one that contains
-  // the web feature metrics.
-  auto metrics = merged_entries.begin()->second->metrics;
-
-  for (auto& it : merged_entries) {
-    metrics.insert(it.second->metrics.begin(), it.second->metrics.end());
-  }
-
-  // All of the following features should be included in the list of returned
-  // metrics here. The exact values depend on the test host.
-  EXPECT_THAT(
-      metrics,
-      IsSupersetOf({
-          Key(HashFeature(
-              blink::mojom::WebFeature::kV8Screen_Height_AttributeGetter)),
-          Key(HashFeature(
-              blink::mojom::WebFeature::kV8Screen_Width_AttributeGetter)),
-          Key(HashFeature(
-              blink::mojom::WebFeature::kV8Screen_AvailLeft_AttributeGetter)),
-          Key(HashFeature(
-              blink::mojom::WebFeature::kV8Screen_AvailTop_AttributeGetter)),
-          Key(HashFeature(
-              blink::mojom::WebFeature::kV8Screen_AvailWidth_AttributeGetter)),
-          Key(HashFeature(blink::mojom::WebFeature::kNavigatorDoNotTrack)),
-      }));
-}
-
 IN_PROC_BROWSER_TEST_P(PrivacyBudgetBrowserTestWithTestRecorder,
                        RecordingFeaturesCalledInWorker) {
   ASSERT_TRUE(embedded_test_server()->Start());
@@ -359,108 +292,6 @@
 #endif
         "/privacy_budget/calls_service_worker"));
 
-IN_PROC_BROWSER_TEST_F(PrivacyBudgetBrowserTestWithTestRecorder,
-                       EveryNavigationRecordsDocumentCreatedMetrics) {
-  ASSERT_TRUE(embedded_test_server()->Start());
-
-  content::DOMMessageQueue messages(web_contents());
-  base::RunLoop run_loop;
-
-  // We expect 5 entries here generated by the two navigations from the test.
-  // The first navigation adds 2 document created entries and 2 web feature
-  // entries, while the second one generates only a document created entry.
-  recorder().SetOnAddEntryCallback(ukm::builders::Identifiability::kEntryName,
-                                   BarrierClosure(5u, run_loop.QuitClosure()));
-
-  ASSERT_TRUE(content::NavigateToURL(
-      web_contents(), embedded_test_server()->GetURL(
-                          "/privacy_budget/samples_some_surfaces.html")));
-
-  // The document calls a bunch of instrumented functions and sends a message
-  // back to the test. Receipt of the message indicates that the script
-  // successfully completed.
-  std::string screen_scrape;
-  ASSERT_TRUE(messages.WaitForMessage(&screen_scrape));
-
-  // The contents of the received message isn't used for anything other than
-  // diagnostics.
-  SCOPED_TRACE(screen_scrape);
-
-  // Create an empty iframe in the page.
-  EXPECT_TRUE(content::ExecJs(web_contents(),
-                              "let f = document.createElement('iframe');"
-                              "document.body.appendChild(f);"
-                              "f.contentWindow.navigator.userAgent;"));
-
-  // Navigating away from the test page causes the document to be unloaded. That
-  // will cause any buffered metrics to be flushed.
-  content::NavigateToURLBlockUntilNavigationsComplete(web_contents(),
-                                                      GURL("about:blank"), 1);
-
-  // Wait for the metrics to come down the pipe.
-  run_loop.Run();
-
-  auto merged_entries = recorder().GetMergedEntriesByName(
-      ukm::builders::Identifiability::kEntryName);
-
-  // We expect 3 merged entries, corresponding to the 3 documents.
-  ASSERT_EQ(merged_entries.size(), 3u);
-
-  constexpr uint64_t is_main_frame_hash =
-      blink::IdentifiableSurface::FromTypeAndToken(
-          blink::IdentifiableSurface::Type::kReservedInternal,
-          blink::IdentifiableSurface::ReservedSurfaceMetrics::
-              kDocumentCreated_IsMainFrame)
-          .ToUkmMetricHash();
-  constexpr uint64_t is_cross_origin_hash =
-      blink::IdentifiableSurface::FromTypeAndToken(
-          blink::IdentifiableSurface::Type::kReservedInternal,
-          blink::IdentifiableSurface::ReservedSurfaceMetrics::
-              kDocumentCreated_IsCrossOriginFrame)
-          .ToUkmMetricHash();
-  constexpr uint64_t is_cross_site_hash =
-      blink::IdentifiableSurface::FromTypeAndToken(
-          blink::IdentifiableSurface::Type::kReservedInternal,
-          blink::IdentifiableSurface::ReservedSurfaceMetrics::
-              kDocumentCreated_IsCrossSiteFrame)
-          .ToUkmMetricHash();
-  constexpr uint64_t navigation_source_id_hash =
-      blink::IdentifiableSurface::FromTypeAndToken(
-          blink::IdentifiableSurface::Type::kReservedInternal,
-          blink::IdentifiableSurface::ReservedSurfaceMetrics::
-              kDocumentCreated_NavigationSourceId)
-          .ToUkmMetricHash();
-  constexpr uint64_t user_agent_hash =
-      HashFeature(blink::mojom::WebFeature::kNavigatorUserAgent);
-
-  // Each entry in merged_entries corresponds to a committed document and they
-  // all should contain the document created metrics.
-  EXPECT_THAT(
-      merged_entries,
-      UnorderedElementsAre(
-          Pair(_, Pointee(Field(&ukm::mojom::UkmEntry::metrics,
-                                IsSupersetOf({Pair(is_main_frame_hash, 1),
-                                              Pair(is_cross_origin_hash, 0),
-                                              Pair(is_cross_site_hash, 0)})))),
-          Pair(_,
-               Pointee(Field(&ukm::mojom::UkmEntry::metrics,
-                             AllOf(IsSupersetOf({Pair(is_main_frame_hash, 0),
-                                                 Pair(is_cross_origin_hash, 0),
-                                                 Pair(is_cross_site_hash, 0)}),
-                                   // The child iframe should also report that
-                                   // it queried the user agent.
-                                   Contains(Key(user_agent_hash)))))),
-          Pair(_,
-               Pointee(Field(&ukm::mojom::UkmEntry::metrics,
-                             IsSupersetOf({Pair(is_main_frame_hash, 1),
-                                           Pair(is_cross_origin_hash, 0),
-                                           Pair(is_cross_site_hash, 0)}))))));
-  EXPECT_THAT(
-      merged_entries,
-      Each(Pair(_, Pointee(Field(&ukm::mojom::UkmEntry::metrics,
-                                 Contains(Key(navigation_source_id_hash)))))));
-}
-
 namespace {
 
 // Test class that allows to enable UKM recording.
@@ -673,98 +504,3 @@
 };
 
 }  // namespace
-
-IN_PROC_BROWSER_TEST_F(PrivacyBudgetMetaExperimentBrowserTestWithUkmRecording,
-                       ReportsEncounteredSurfacesAndDocumentCreatedMetrics) {
-  ASSERT_TRUE(embedded_test_server()->Start());
-  EXPECT_TRUE(blink::IdentifiabilityStudySettings::Get()->IsActive());
-  ASSERT_TRUE(EnableUkmRecording());
-
-  content::DOMMessageQueue messages(web_contents());
-  base::RunLoop run_loop;
-
-  constexpr uint64_t document_created_metric =
-      blink::IdentifiableSurface::FromTypeAndToken(
-          blink::IdentifiableSurface::Type::kReservedInternal,
-          blink::IdentifiableSurface::ReservedSurfaceMetrics::
-              kDocumentCreated_NavigationSourceId)
-          .ToUkmMetricHash();
-
-  const std::array<uint64_t, 6> expected_webfeature_metrics = {
-      HashFeature(blink::mojom::WebFeature::kV8Screen_Height_AttributeGetter),
-      HashFeature(blink::mojom::WebFeature::kV8Screen_Width_AttributeGetter),
-      HashFeature(
-          blink::mojom::WebFeature::kV8Screen_AvailLeft_AttributeGetter),
-      HashFeature(blink::mojom::WebFeature::kV8Screen_AvailTop_AttributeGetter),
-      HashFeature(
-          blink::mojom::WebFeature::kV8Screen_AvailWidth_AttributeGetter),
-      HashFeature(blink::mojom::WebFeature::kNavigatorDoNotTrack)};
-
-  // Add a callback checking when the metrics are reported.
-  base::flat_set<uint64_t> expected_metrics_set(
-      expected_webfeature_metrics.begin(), expected_webfeature_metrics.end());
-  expected_metrics_set.insert(document_created_metric);
-  UkmRecorderAddEntryObserver ukm_observer(base::BindLambdaForTesting(
-      [&run_loop, &expected_metrics_set](ukm::mojom::UkmEntryPtr entry) {
-        for (const auto& [key, value] : entry->metrics) {
-          expected_metrics_set.erase(key);
-        }
-        if (expected_metrics_set.empty()) {
-          run_loop.Quit();
-        }
-      }));
-  ukm_service()->AddUkmRecorderObserver(
-      {ukm::builders::Identifiability::kEntryNameHash}, &ukm_observer);
-
-  ASSERT_TRUE(content::NavigateToURL(
-      web_contents(), embedded_test_server()->GetURL(
-                          "/privacy_budget/samples_some_surfaces.html")));
-
-  // The document calls a bunch of instrumented functions and sends a message
-  // back to the test. Receipt of the message indicates that the script
-  // successfully completed.
-  std::string scraped_apis;
-  ASSERT_TRUE(messages.WaitForMessage(&scraped_apis));
-
-  // The contents of the received message isn't used for anything other than
-  // diagnostics.
-  SCOPED_TRACE(scraped_apis);
-
-  // Navigating away from the test page causes the document to be unloaded. That
-  // will cause any buffered metrics to be flushed.
-  content::NavigateToURLBlockUntilNavigationsComplete(web_contents(),
-                                                      GURL("about:blank"), 1);
-
-  // Wait for the metrics to come down the pipe.
-  run_loop.Run();
-
-  ukm::UkmTestHelper ukm_test_helper(ukm_service());
-  ukm_test_helper.BuildAndStoreLog();
-  std::unique_ptr<ukm::Report> ukm_report = ukm_test_helper.GetUkmReport();
-  ASSERT_TRUE(ukm_test_helper.HasUnsentLogs());
-  ASSERT_TRUE(ukm_report);
-  ASSERT_NE(ukm_report->entries_size(), 0);
-
-  std::map<uint64_t, int64_t> seen_metrics;
-  for (const auto& entry : ukm_report->entries()) {
-    ASSERT_TRUE(entry.has_event_hash());
-    if (entry.event_hash() != ukm::builders::Identifiability::kEntryNameHash) {
-      continue;
-    }
-    for (const auto& metric : entry.metrics()) {
-      ASSERT_TRUE(metric.has_metric_hash());
-      ASSERT_TRUE(metric.has_value());
-      seen_metrics.insert({metric.metric_hash(), metric.value()});
-    }
-  }
-
-  for (uint64_t expected_metric : expected_webfeature_metrics) {
-    EXPECT_THAT(
-        seen_metrics,
-        Contains(Pair(Type(blink::IdentifiableSurface::Type::kMeasuredSurface),
-                      expected_metric)));
-  }
-  EXPECT_THAT(seen_metrics, Contains(Key(document_created_metric)));
-
-  ukm_service()->RemoveUkmRecorderObserver(&ukm_observer);
-}
diff --git a/chrome/browser/process_singleton_posix.cc b/chrome/browser/process_singleton_posix.cc
index 6b2b609f..0ad5dd75 100644
--- a/chrome/browser/process_singleton_posix.cc
+++ b/chrome/browser/process_singleton_posix.cc
@@ -205,6 +205,7 @@
   // will always be valid.
   // See https://linux.die.net/man/3/fd_zero
   UNSAFE_BUFFERS(FD_ZERO(&read_fds));
+
   // SAFETY: FD_SET adds fd to the set read_fds, which was just cleared before.
   // See https://linux.die.net/man/3/fd_set
   UNSAFE_BUFFERS(FD_SET(fd, &read_fds));
diff --git a/chrome/browser/resources/bluetooth_internals/BUILD.gn b/chrome/browser/resources/bluetooth_internals/BUILD.gn
index 72c9f64..3c5a5a9 100644
--- a/chrome/browser/resources/bluetooth_internals/BUILD.gn
+++ b/chrome/browser/resources/bluetooth_internals/BUILD.gn
@@ -13,7 +13,6 @@
     "menu.svg",
   ]
 
-  # TODO(crbug.com/40848285): Migrate to TypeScript.
   web_component_files = [
     "characteristic_list_item.ts",
     "descriptor_list_item.ts",
diff --git a/chrome/browser/resources/bluetooth_internals/adapter_page.ts b/chrome/browser/resources/bluetooth_internals/adapter_page.ts
index 7469793..3ff2bc45 100644
--- a/chrome/browser/resources/bluetooth_internals/adapter_page.ts
+++ b/chrome/browser/resources/bluetooth_internals/adapter_page.ts
@@ -36,8 +36,7 @@
   constructor() {
     super('adapter', 'Adapter', 'adapter');
 
-    this.adapterFieldSet =
-        document.createElement('object-fieldset') as ObjectFieldsetElement;
+    this.adapterFieldSet = document.createElement('object-fieldset');
     this.adapterFieldSet.toggleAttribute('show-all', true);
     this.adapterFieldSet.dataset['nameMap'] = JSON.stringify(PROPERTY_NAMES);
     this.pageDiv.appendChild(this.adapterFieldSet);
diff --git a/chrome/browser/resources/bluetooth_internals/bluetooth_internals.ts b/chrome/browser/resources/bluetooth_internals/bluetooth_internals.ts
index 7767ea3f..a49c48be 100644
--- a/chrome/browser/resources/bluetooth_internals/bluetooth_internals.ts
+++ b/chrome/browser/resources/bluetooth_internals/bluetooth_internals.ts
@@ -86,7 +86,7 @@
   // Inform the devices page that the user is inspecting this device.
   // This will update the links in the device table.
   devicesPage!.setInspecting(
-      deviceDetailsPage.deviceInfo, false /* isInspecting */);
+      deviceDetailsPage.deviceInfo, /*isInspecting=*/ false);
 
   pageManager.unregister(deviceDetailsPage);
 }
@@ -125,7 +125,7 @@
 
   // Inform the devices page that the user is inspecting this device.
   // This will update the links in the device table.
-  devicesPage!.setInspecting(deviceInfo, true /* isInspecting */);
+  devicesPage!.setInspecting(deviceInfo, /*isInspecting=*/ true);
   pageManager.register(deviceDetailsPage);
 
   sidebarObj!.addItem({
@@ -429,8 +429,8 @@
  * Check if the system has all the needed system permissions for using
  * bluetooth.
  * @param bluetoothInternalsHandler Mojo remote handler.
- * @param successCallback The callback to be called when the system
- *     has the permissions for using bluetooth.
+ * @param successCallback The callback to be called when the system has the
+ *     permissions for using bluetooth.
  */
 export async function checkSystemPermissions(
     bluetoothInternalsHandler: BluetoothInternalsHandlerRemote,
diff --git a/chrome/browser/resources/bluetooth_internals/characteristic_list.ts b/chrome/browser/resources/bluetooth_internals/characteristic_list.ts
index 41415a1..7d2a16e 100644
--- a/chrome/browser/resources/bluetooth_internals/characteristic_list.ts
+++ b/chrome/browser/resources/bluetooth_internals/characteristic_list.ts
@@ -25,8 +25,7 @@
   }
 
   createItem(data: CharacteristicInfo): CharacteristicListItemElement {
-    const item = document.createElement('characteristic-list-item') as
-        CharacteristicListItemElement;
+    const item = document.createElement('characteristic-list-item');
     assert(this.deviceAddress_);
     assert(this.serviceId_);
     item.initialize(data, this.deviceAddress_, this.serviceId_);
@@ -69,3 +68,9 @@
 }
 
 customElements.define('characteristic-list', CharacteristicListElement);
+
+declare global {
+  interface HTMLElementTagNameMap {
+    'characteristic-list': CharacteristicListElement;
+  }
+}
diff --git a/chrome/browser/resources/bluetooth_internals/characteristic_list_item.ts b/chrome/browser/resources/bluetooth_internals/characteristic_list_item.ts
index 28db9c7..f95911b 100644
--- a/chrome/browser/resources/bluetooth_internals/characteristic_list_item.ts
+++ b/chrome/browser/resources/bluetooth_internals/characteristic_list_item.ts
@@ -145,3 +145,9 @@
 
 customElements.define(
     'characteristic-list-item', CharacteristicListItemElement);
+
+declare global {
+  interface HTMLElementTagNameMap {
+    'characteristic-list-item': CharacteristicListItemElement;
+  }
+}
diff --git a/chrome/browser/resources/bluetooth_internals/debug_log_page.ts b/chrome/browser/resources/bluetooth_internals/debug_log_page.ts
index 7c43548..7cd2e8d5 100644
--- a/chrome/browser/resources/bluetooth_internals/debug_log_page.ts
+++ b/chrome/browser/resources/bluetooth_internals/debug_log_page.ts
@@ -7,7 +7,6 @@
 import type {BluetoothBtsnoopRemote, BluetoothInternalsHandlerRemote, DebugLogsChangeHandlerRemote} from './bluetooth_internals.mojom-webui.js';
 import {Page} from './page.js';
 
-/** @const {string} */
 const LOGS_NOT_SUPPORTED_STRING = 'Debug logs not supported';
 
 /**
@@ -118,7 +117,7 @@
 
     this.pageDiv.appendChild(document.importNode(
         getRequiredElement<HTMLTemplateElement>('btsnoop-template').content,
-        true /* deep */));
+        /*deep=*/ true));
     this.setUpBtmonButton();
   }
 }
diff --git a/chrome/browser/resources/bluetooth_internals/descriptor_list.ts b/chrome/browser/resources/bluetooth_internals/descriptor_list.ts
index 1f5f8f8..31b64b80 100644
--- a/chrome/browser/resources/bluetooth_internals/descriptor_list.ts
+++ b/chrome/browser/resources/bluetooth_internals/descriptor_list.ts
@@ -34,8 +34,7 @@
   }
 
   createItem(data: DescriptorInfo): DescriptorListItemElement {
-    const item = document.createElement('descriptor-list-item') as
-        DescriptorListItemElement;
+    const item = document.createElement('descriptor-list-item');
     assert(this.deviceAddress_);
     assert(this.serviceId_);
     assert(this.characteristicId_);
@@ -82,3 +81,9 @@
 }
 
 customElements.define('descriptor-list', DescriptorListElement);
+
+declare global {
+  interface HTMLElementTagNameMap {
+    'descriptor-list': DescriptorListElement;
+  }
+}
diff --git a/chrome/browser/resources/bluetooth_internals/descriptor_list_item.ts b/chrome/browser/resources/bluetooth_internals/descriptor_list_item.ts
index b1395df..4c82cfd 100644
--- a/chrome/browser/resources/bluetooth_internals/descriptor_list_item.ts
+++ b/chrome/browser/resources/bluetooth_internals/descriptor_list_item.ts
@@ -69,3 +69,9 @@
 }
 
 customElements.define('descriptor-list-item', DescriptorListItemElement);
+
+declare global {
+  interface HTMLElementTagNameMap {
+    'descriptor-list-item': DescriptorListItemElement;
+  }
+}
diff --git a/chrome/browser/resources/bluetooth_internals/device_collection.ts b/chrome/browser/resources/bluetooth_internals/device_collection.ts
index 37814f04..17d7bb0 100644
--- a/chrome/browser/resources/bluetooth_internals/device_collection.ts
+++ b/chrome/browser/resources/bluetooth_internals/device_collection.ts
@@ -26,8 +26,10 @@
  */
 export class DeviceCollection extends EventTarget {
   private array_: DeviceInfo[];
-  // Keep track of MAC addresses which were previously found via scan, but
-  // are no longer being advertised or nearby. Used to inform isRemoved().
+  /**
+   * Keep track of MAC addresses which were previously found via scan, but are
+   * no longer being advertised or nearby. Used to inform isRemoved().
+   */
   private removedDevices_: Record<string, boolean> = {};
 
   /**
diff --git a/chrome/browser/resources/bluetooth_internals/device_details_page.ts b/chrome/browser/resources/bluetooth_internals/device_details_page.ts
index 5359133..51d5ca18 100644
--- a/chrome/browser/resources/bluetooth_internals/device_details_page.ts
+++ b/chrome/browser/resources/bluetooth_internals/device_details_page.ts
@@ -57,18 +57,16 @@
 
     this.deviceInfo = deviceInfo;
 
-    this.deviceFieldSet_ =
-        document.createElement('object-fieldset') as ObjectFieldsetElement;
+    this.deviceFieldSet_ = document.createElement('object-fieldset');
     this.deviceFieldSet_.toggleAttribute('show-all', true);
     this.deviceFieldSet_.dataset['nameMap'] = JSON.stringify(PROPERTY_NAMES);
 
-    this.serviceList_ =
-        document.createElement('service-list') as ServiceListElement;
+    this.serviceList_ = document.createElement('service-list');
 
     this.pageDiv.appendChild(document.importNode(
         getRequiredElement<HTMLTemplateElement>('device-details-template')
             .content,
-        true /* deep */));
+        /*deep=*/ true));
 
     this.pageDiv.querySelector('.device-details')!.appendChild(
         this.deviceFieldSet_);
diff --git a/chrome/browser/resources/bluetooth_internals/device_table.ts b/chrome/browser/resources/bluetooth_internals/device_table.ts
index 625d22aa..9228a79 100644
--- a/chrome/browser/resources/bluetooth_internals/device_table.ts
+++ b/chrome/browser/resources/bluetooth_internals/device_table.ts
@@ -224,3 +224,9 @@
 }
 
 customElements.define('device-table', DeviceTableElement);
+
+declare global {
+  interface HTMLElementTagNameMap {
+    'device-table': DeviceTableElement;
+  }
+}
diff --git a/chrome/browser/resources/bluetooth_internals/devices_page.ts b/chrome/browser/resources/bluetooth_internals/devices_page.ts
index 009eaa0..d538da6 100644
--- a/chrome/browser/resources/bluetooth_internals/devices_page.ts
+++ b/chrome/browser/resources/bluetooth_internals/devices_page.ts
@@ -34,8 +34,7 @@
   constructor() {
     super('devices', 'Devices', 'devices');
 
-    this.deviceTable =
-        document.createElement('device-table') as DeviceTableElement;
+    this.deviceTable = document.createElement('device-table');
     this.pageDiv.appendChild(this.deviceTable);
     this.scanBtn_ = this.pageDiv.querySelector<HTMLButtonElement>('#scan-btn')!;
     this.scanBtn_.addEventListener('click', _event => {
diff --git a/chrome/browser/resources/bluetooth_internals/expandable_list_item.ts b/chrome/browser/resources/bluetooth_internals/expandable_list_item.ts
index acf0a0d5..6b412d0 100644
--- a/chrome/browser/resources/bluetooth_internals/expandable_list_item.ts
+++ b/chrome/browser/resources/bluetooth_internals/expandable_list_item.ts
@@ -31,3 +31,9 @@
 }
 
 customElements.define('expandable-list-item', ExpandableListItemElement);
+
+declare global {
+  interface HTMLElementTagNameMap {
+    'expandable-list-item': ExpandableListItemElement;
+  }
+}
diff --git a/chrome/browser/resources/bluetooth_internals/object_fieldset.ts b/chrome/browser/resources/bluetooth_internals/object_fieldset.ts
index b6e27d6..b28d25d 100644
--- a/chrome/browser/resources/bluetooth_internals/object_fieldset.ts
+++ b/chrome/browser/resources/bluetooth_internals/object_fieldset.ts
@@ -91,3 +91,9 @@
 }
 
 customElements.define('object-fieldset', ObjectFieldsetElement);
+
+declare global {
+  interface HTMLElementTagNameMap {
+    'object-fieldset': ObjectFieldsetElement;
+  }
+}
diff --git a/chrome/browser/resources/bluetooth_internals/page.ts b/chrome/browser/resources/bluetooth_internals/page.ts
index f4dc4deb..7c4f425 100644
--- a/chrome/browser/resources/bluetooth_internals/page.ts
+++ b/chrome/browser/resources/bluetooth_internals/page.ts
@@ -50,13 +50,17 @@
   tab: HTMLElement|null = null;
   lastFocusedElement: HTMLElement|null = null;
   hash: string = '';
-  // The parent page of this page; or null for root pages.
+  /** The parent page of this page; or null for root pages. */
   parentPage: Page|null = null;
-  // The section on the parent page that is associated with this page. Can be
-  // null.
+  /**
+   * The section on the parent page that is associated with this page. Can be
+   * null.
+   */
   associatedSection: Element|null = null;
-  // An array of controls that are associated with this page. The first control
-  // should be located on a root page.
+  /**
+   * An array of controls that are associated with this page. The first control
+   * should be located on a root page.
+   */
   associatedControls: Element[]|null = null;
 
   /**
@@ -100,8 +104,8 @@
   /**
    * Updates the hash of the current page. If the page is topmost, the history
    * state is updated.
-   * @param hash The new hash value. Like location.hash, this
-   *     should include the leading '#' if not empty.
+   * @param hash The new hash value. Like location.hash, this should include the
+   *     leading '#' if not empty.
    */
   setHash(hash: string) {
     if (this.hash === hash) {
diff --git a/chrome/browser/resources/bluetooth_internals/page_manager.ts b/chrome/browser/resources/bluetooth_internals/page_manager.ts
index 4612a43e..1ae9775 100644
--- a/chrome/browser/resources/bluetooth_internals/page_manager.ts
+++ b/chrome/browser/resources/bluetooth_internals/page_manager.ts
@@ -64,8 +64,8 @@
 
   /**
    * Shows the default page.
-   * @param updateHistory If we should update the history after
-   *     showing the page (defaults to true).
+   * @param updateHistory If we should update the history after showing the page
+   *     (defaults to true).
    */
   showDefaultPage(updateHistory?: boolean) {
     assert(
@@ -77,11 +77,11 @@
   /**
    * Shows a registered page.
    * @param pageName Page name.
-   * @param updateHistory If we should update the history after
-   *     showing the page (defaults to true).
-   * @param propertyBag An optional bag of properties including
-   *     replaceState (if history state should be replaced instead of pushed).
-   *     hash (a hash state to attach to the page).
+   * @param updateHistory If we should update the history after showing the page
+   *     (defaults to true).
+   * @param propertyBag An optional bag of properties including replaceState (if
+   *     history state should be replaced instead of pushed). hash (a hash state
+   *     to attach to the page).
    */
   showPageByName(pageName: string, updateHistory: boolean = true, propertyBag: {
     replaceState?: boolean,
@@ -184,8 +184,7 @@
    * subpage nesting.
    * @param potentialAncestor Potential ancestor.
    * @param potentialDescendent Potential descendent.
-   * @return True if |potentialDescendent| is nested under
-   *     |potentialAncestor|.
+   * @return True if |potentialDescendent| is nested under |potentialAncestor|.
    */
   isAncestorOfPage(potentialAncestor: Page, potentialDescendent: Page):
       boolean {
@@ -219,7 +218,6 @@
 
   /**
    * Returns the topmost visible page.
-   * @private
    */
   private getTopmostVisiblePage(): Page|null {
     for (const page of this.registeredPages.values()) {
@@ -234,7 +232,6 @@
   /**
    * Updates the title to the title of the current page, or of the topmost
    * visible page with a non-empty title.
-   * @private
    */
   private updateTitle_() {
     let page = this.getTopmostVisiblePage();
@@ -252,9 +249,8 @@
   /**
    * Constructs a new path to push onto the history stack, using observers
    * to update the history.
-   * @param replace If true, handlers should replace the current
-   *     history event rather than create new ones.
-   * @private
+   * @param replace If true, handlers should replace the current history event
+   *     rather than create new ones.
    */
   private updateHistoryState_(replace: boolean) {
     if (this.isDialog) {
diff --git a/chrome/browser/resources/bluetooth_internals/service_list.ts b/chrome/browser/resources/bluetooth_internals/service_list.ts
index 3cb0430..bdefcac70 100644
--- a/chrome/browser/resources/bluetooth_internals/service_list.ts
+++ b/chrome/browser/resources/bluetooth_internals/service_list.ts
@@ -35,8 +35,7 @@
   }
 
   override createItem(data: ServiceInfo): ServiceListItemElement {
-    const item =
-        document.createElement('service-list-item') as ServiceListItemElement;
+    const item = document.createElement('service-list-item');
     assert(this.deviceAddress_);
     item.initialize(data, this.deviceAddress_);
     return item;
@@ -78,3 +77,9 @@
 }
 
 customElements.define('service-list', ServiceListElement);
+
+declare global {
+  interface HTMLElementTagNameMap {
+    'service-list': ServiceListElement;
+  }
+}
diff --git a/chrome/browser/resources/bluetooth_internals/service_list_item.ts b/chrome/browser/resources/bluetooth_internals/service_list_item.ts
index 2913a28..b1978dd 100644
--- a/chrome/browser/resources/bluetooth_internals/service_list_item.ts
+++ b/chrome/browser/resources/bluetooth_internals/service_list_item.ts
@@ -78,3 +78,9 @@
 }
 
 customElements.define('service-list-item', ServiceListItemElement);
+
+declare global {
+  interface HTMLElementTagNameMap {
+    'service-list-item': ServiceListItemElement;
+  }
+}
diff --git a/chrome/browser/resources/bluetooth_internals/snackbar.ts b/chrome/browser/resources/bluetooth_internals/snackbar.ts
index 670b261c..106a1a92 100644
--- a/chrome/browser/resources/bluetooth_internals/snackbar.ts
+++ b/chrome/browser/resources/bluetooth_internals/snackbar.ts
@@ -20,8 +20,8 @@
   action?: () => void;
 }
 
-/** @type {number} */ const SHOW_DURATION = 5000;
-/** @type {number} */ const TRANSITION_DURATION = 225;
+const SHOW_DURATION = 5000;
+const TRANSITION_DURATION = 225;
 
 /**
  * Enum of Snackbar types. Used by Snackbar to determine the styling for the
@@ -169,6 +169,12 @@
 
 customElements.define('bluetooth-snackbar', BluetoothSnackbarElement);
 
+declare global {
+  interface HTMLElementTagNameMap {
+    'bluetooth-snackbar': BluetoothSnackbarElement;
+  }
+}
+
 let current: BluetoothSnackbarElement|null = null;
 
 const queue: BluetoothSnackbarElement[] = [];
@@ -197,11 +203,10 @@
  * Creates a Snackbar and shows it if one is not showing already. If a
  * Snackbar is already active, the next Snackbar is queued.
  * @param message The message to display in the Snackbar.
- * @param type A string determining the Snackbar type: info,
- *     success, warning, error. If not provided, info type is used.
+ * @param type A string determining the Snackbar type: info, success, warning,
+ *     error. If not provided, info type is used.
  * @param actionText The text to display for the action link.
- * @param action A function to be called when the user
- *     presses the action link.
+ * @param action A function to be called when the user presses the action link.
  */
 export function showSnackbar(
     message: string, type?: SnackbarType, actionText?: string,
@@ -212,8 +217,7 @@
     actionText: actionText,
     action: action,
   };
-  const newSnackbar =
-      document.createElement('bluetooth-snackbar') as BluetoothSnackbarElement;
+  const newSnackbar = document.createElement('bluetooth-snackbar');
   newSnackbar.initialize(options);
 
   if (current) {
diff --git a/chrome/browser/resources/bluetooth_internals/value_control.ts b/chrome/browser/resources/bluetooth_internals/value_control.ts
index 836ac90..281fa9a 100644
--- a/chrome/browser/resources/bluetooth_internals/value_control.ts
+++ b/chrome/browser/resources/bluetooth_internals/value_control.ts
@@ -179,8 +179,6 @@
  * as defined by the |ValueDataType| array. Values must be written
  * in these formats. Read and write capability is controlled by a
  * 'properties' bitfield provided by the characteristic.
- * @constructor
- * @extends {HTMLDivElement}
  */
 export class ValueControlElement extends CustomElement {
   static get is() {
@@ -396,3 +394,9 @@
 }
 
 customElements.define('value-control', ValueControlElement);
+
+declare global {
+  interface HTMLElementTagNameMap {
+    'value-control': ValueControlElement;
+  }
+}
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_is.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_is.xtb
index 8f97861..4c58c60 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_is.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_is.xtb
@@ -912,7 +912,7 @@
 <translation id="6994042831499278539">Tilvísun í orðalista</translation>
 <translation id="6996566555547746822">Næsta fellivalmynd</translation>
 <translation id="6997224546856374593">Þegar hástafir eru lesnir:</translation>
-<translation id="6999752561504308105">Velkomin(n) í ChromeVox leiðsögnina. Hægt er að loka leiðsögninni hvenær sem er með því að strjúka frá hægri til vinstri með tveimur fingrum. Til að kveikja eða slökkva á ChromeVox hvenær sem er skaltu halda báðum hljóðstyrkshnöppunum inni í fimm sekúndur. Þegar þú ert til skaltu ýta tvisvar á skjáinn með einum fingri til að halda leiðsögninni áfram.</translation>
+<translation id="6999752561504308105">Velkomin(n) í ChromeVox-leiðsögnina. Hægt er að loka leiðsögninni hvenær sem er með því að strjúka frá hægri til vinstri með tveimur fingrum. Til að kveikja eða slökkva á ChromeVox hvenær sem er skaltu halda báðum hljóðstyrkshnöppunum inni í fimm sekúndur. Þegar þú ert til skaltu ýta tvisvar á skjáinn með einum fingri til að halda leiðsögninni áfram.</translation>
 <translation id="700202842116345659">Færsla í heimildaskrá</translation>
 <translation id="7005146664810010831">Engin vefslóð fannst</translation>
 <translation id="7026338066939101231">Minnka</translation>
diff --git a/chrome/browser/resources/settings/people_page/sync_account_control.ts b/chrome/browser/resources/settings/people_page/sync_account_control.ts
index 8ebaf4c21..11319df 100644
--- a/chrome/browser/resources/settings/people_page/sync_account_control.ts
+++ b/chrome/browser/resources/settings/people_page/sync_account_control.ts
@@ -606,6 +606,10 @@
       case StatusAction.ENTER_PASSPHRASE:
         this.syncBrowserProxy_.showSyncPassphraseDialog();
         break;
+      case StatusAction.SHOW_BOOKMARKS_LIMIT_HELP_ARTICLE:
+        // TODO(crbug.com/452968646): Adjust this with providing the concrete
+        // help center article link.
+        break;
       case StatusAction.CONFIRM_SYNC_SETTINGS:
       default:
         router.navigateTo(routes.SYNC);
diff --git a/chrome/browser/resources/settings_shared/people_page/sync_browser_proxy.ts b/chrome/browser/resources/settings_shared/people_page/sync_browser_proxy.ts
index c0ea6f1..02f5914a 100644
--- a/chrome/browser/resources/settings_shared/people_page/sync_browser_proxy.ts
+++ b/chrome/browser/resources/settings_shared/people_page/sync_browser_proxy.ts
@@ -65,6 +65,9 @@
   RETRIEVE_TRUSTED_VAULT_KEYS = 'retrieveTrustedVaultKeys',
   CONFIRM_SYNC_SETTINGS =
       'confirmSyncSettings',  // User needs to confirm sync settings.
+  SHOW_BOOKMARKS_LIMIT_HELP_ARTICLE =
+      'showBookmarksLimitHelpArticle',  // User needs to see bookmarks limit
+                                        // help article.
 }
 
 /**
diff --git a/chrome/browser/resources/signin/profile_customization/profile_customization_app.ts b/chrome/browser/resources/signin/profile_customization/profile_customization_app.ts
index 2bf56f00..a5eb5c34 100644
--- a/chrome/browser/resources/signin/profile_customization/profile_customization_app.ts
+++ b/chrome/browser/resources/signin/profile_customization/profile_customization_app.ts
@@ -81,6 +81,8 @@
       selectedAvatar_: {type: Object},
 
       isLocalProfileCreation_: {type: Boolean},
+
+      shouldShowDefaultProfileName_: {type: Boolean},
     };
   }
 
@@ -94,13 +96,16 @@
   private confirmedAvatar_: AvatarIcon|null = null;
   protected accessor isLocalProfileCreation_: boolean =
       loadTimeData.getBoolean('isLocalProfileCreation');
+  protected accessor shouldShowDefaultProfileName_: boolean =
+      loadTimeData.getBoolean('shouldShowDefaultProfileName');
   private profileCustomizationBrowserProxy_: ProfileCustomizationBrowserProxy =
       ProfileCustomizationBrowserProxyImpl.getInstance();
 
   override firstUpdated() {
     // profileName_ is only set now, because it triggers a validation of the
     // input which crashes if it's done too early.
-    if (!this.isLocalProfileCreation_) {
+    // set profileName_ for local profiles in friction reduction experiment.
+    if (!this.isLocalProfileCreation_ || this.shouldShowDefaultProfileName_) {
       this.profileName_ = loadTimeData.getString('profileName');
     }
     this.addWebUiListener(
diff --git a/chrome/browser/speech/extension_api/tts_engine_extension_api.cc b/chrome/browser/speech/extension_api/tts_engine_extension_api.cc
index 6f1d580..0b0300e 100644
--- a/chrome/browser/speech/extension_api/tts_engine_extension_api.cc
+++ b/chrome/browser/speech/extension_api/tts_engine_extension_api.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/browser/speech/extension_api/tts_engine_extension_api.h"
 
 #include <stddef.h>
@@ -15,6 +10,7 @@
 #include <utility>
 #include <vector>
 
+#include "base/compiler_specific.h"
 #include "base/no_destructor.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
@@ -681,8 +677,9 @@
   size_t sample_count = audio_buffer_blob->size() / 4;
   std::vector<float> audio_buffer(sample_count);
   const float* view = reinterpret_cast<const float*>(&(*audio_buffer_blob)[0]);
-  for (size_t i = 0; i < sample_count; i++, view++)
+  for (size_t i = 0; i < sample_count; i++, UNSAFE_TODO(view++)) {
     audio_buffer[i] = *view;
+  }
 
   int char_index = 0;
   const base::Value* char_index_value =
diff --git a/chrome/browser/sync/glue/synced_tab_delegate_android_unittest.cc b/chrome/browser/sync/glue/synced_tab_delegate_android_unittest.cc
index 264e6fc3..7062a77 100644
--- a/chrome/browser/sync/glue/synced_tab_delegate_android_unittest.cc
+++ b/chrome/browser/sync/glue/synced_tab_delegate_android_unittest.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/browser/sync/glue/synced_tab_delegate_android.h"
 
 #include <cstddef>
@@ -15,6 +10,7 @@
 
 #include "base/android/jni_android.h"
 #include "base/android/jni_string.h"
+#include "base/compiler_specific.h"
 #include "base/test/scoped_feature_list.h"
 #include "chrome/browser/android/tab_android_data_provider.h"
 #include "chrome/browser/flags/android/chrome_feature_list.h"
@@ -77,7 +73,8 @@
   }
 
   void MockBufferFromPickle(const base::Pickle& pickle) {
-    base::raw_span<const uint8_t> nav_span{pickle.data(), pickle.size()};
+    base::raw_span<const uint8_t> UNSAFE_TODO(
+        nav_span{pickle.data(), pickle.size()});
     std::unique_ptr<WebContentsStateByteBuffer> buffer =
         std::make_unique<WebContentsStateByteBuffer>(nav_span, kVersion);
     EXPECT_CALL(mock_tab_android_data_provider_, GetWebContentsByteBuffer())
diff --git a/chrome/browser/sync/sync_ui_util.cc b/chrome/browser/sync/sync_ui_util.cc
index 6978f2e..d569ee9 100644
--- a/chrome/browser/sync/sync_ui_util.cc
+++ b/chrome/browser/sync/sync_ui_util.cc
@@ -146,6 +146,10 @@
       // Only shown for "Sync-the-feature".
       return support_title_case ? IDS_SYNC_RELOGIN_BUTTON_MAYBE_TITLE_CASE
                                 : IDS_SYNC_RELOGIN_BUTTON;
+    case syncer::SyncService::UserActionableError::kBookmarksLimitExceeded:
+      // TODO(crbug.com/452968646): Consider title casing the "Learn more"
+      // button label.
+      return IDS_LEARN_MORE;
   }
 }
 
@@ -221,6 +225,11 @@
               IDS_SYNC_STATUS_UNRECOVERABLE_ERROR, button_string_id,
               IDS_PROFILES_ACCOUNT_REMOVAL_TITLE,
               SyncStatusActionType::kReauthenticate};
+    case syncer::SyncService::UserActionableError::kBookmarksLimitExceeded:
+      return {SyncStatusMessageType::kSyncError,
+              IDS_SYNC_ERROR_BOOKMARKS_LIMIT_EXCEEDED_DESCRIPTION,
+              button_string_id, IDS_SETTINGS_PEOPLE_SIGN_OUT,
+              SyncStatusActionType::kShowBookmarksLimitHelpArticle};
   }
 }
 
@@ -263,6 +272,9 @@
     case syncer::SyncService::UserActionableError::kNeedsSettingsConfirmation:
     case syncer::SyncService::UserActionableError::kUnrecoverableError:
       return l10n_util::GetStringUTF16(IDS_SYNC_ERROR_USER_MENU_TITLE);
+    case syncer::SyncService::UserActionableError::kBookmarksLimitExceeded:
+      return l10n_util::GetStringUTF16(
+          IDS_SYNC_ERROR_BOOKMARKS_LIMIT_EXCEEDED_DESCRIPTION);
   }
 }
 #endif  // !BUILDFLAG(IS_ANDROID)
diff --git a/chrome/browser/sync/sync_ui_util.h b/chrome/browser/sync/sync_ui_util.h
index d12f300..9bda12a 100644
--- a/chrome/browser/sync/sync_ui_util.h
+++ b/chrome/browser/sync/sync_ui_util.h
@@ -49,6 +49,8 @@
   kRetrieveTrustedVaultKeys,
   // User needs to confirm sync settings.
   kConfirmSyncSettings,
+  // User needs to see the help article for bookmarks limit.
+  kShowBookmarksLimitHelpArticle,
 };
 
 struct SyncStatusLabels {
diff --git a/chrome/browser/sync/test/integration/bookmarks_helper.cc b/chrome/browser/sync/test/integration/bookmarks_helper.cc
index f4546535..0a9f24b 100644
--- a/chrome/browser/sync/test/integration/bookmarks_helper.cc
+++ b/chrome/browser/sync/test/integration/bookmarks_helper.cc
@@ -474,13 +474,13 @@
 
 std::unique_ptr<sync_bookmarks::BookmarkModelView> CreateBookmarkModelView(
     bookmarks::BookmarkModel* model,
-    bool is_transport_mode) {
-  if (is_transport_mode) {
-    return std::make_unique<sync_bookmarks::BookmarkModelViewUsingAccountNodes>(
-        model);
+    syncer::SyncServiceImpl* service) {
+  if (service->HasSyncConsent()) {
+    return std::make_unique<
+        sync_bookmarks::BookmarkModelViewUsingLocalOrSyncableNodes>(model);
   }
-  return std::make_unique<
-      sync_bookmarks::BookmarkModelViewUsingLocalOrSyncableNodes>(model);
+  return std::make_unique<sync_bookmarks::BookmarkModelViewUsingAccountNodes>(
+      model);
 }
 
 }  // namespace
@@ -1109,11 +1109,10 @@
 BookmarkModelMatchesFakeServerChecker::BookmarkModelMatchesFakeServerChecker(
     bookmarks::BookmarkModel* model,
     syncer::SyncServiceImpl* service,
-    fake_server::FakeServer* fake_server,
-    bool is_transport_mode)
+    fake_server::FakeServer* fake_server)
     : SingleClientStatusChangeChecker(service),
       fake_server_(fake_server),
-      model_view_(CreateBookmarkModelView(model, is_transport_mode)) {}
+      model_view_(CreateBookmarkModelView(model, service)) {}
 
 BookmarkModelMatchesFakeServerChecker::
     ~BookmarkModelMatchesFakeServerChecker() = default;
diff --git a/chrome/browser/sync/test/integration/bookmarks_helper.h b/chrome/browser/sync/test/integration/bookmarks_helper.h
index 778b92c..9bef5e9 100644
--- a/chrome/browser/sync/test/integration/bookmarks_helper.h
+++ b/chrome/browser/sync/test/integration/bookmarks_helper.h
@@ -442,8 +442,7 @@
  public:
   BookmarkModelMatchesFakeServerChecker(bookmarks::BookmarkModel* model,
                                         syncer::SyncServiceImpl* service,
-                                        fake_server::FakeServer* fake_server,
-                                        bool is_transport_mode = false);
+                                        fake_server::FakeServer* fake_server);
   ~BookmarkModelMatchesFakeServerChecker() override;
 
   bool IsExitConditionSatisfied(std::ostream* os) override;
diff --git a/chrome/browser/sync/test/integration/single_client_common_sync_test.cc b/chrome/browser/sync/test/integration/single_client_common_sync_test.cc
index 0c9a27ee..f57626e2 100644
--- a/chrome/browser/sync/test/integration/single_client_common_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_common_sync_test.cc
@@ -299,8 +299,7 @@
   // Clear the error and wait for the local changes to be committed.
   GetFakeServer()->ClearHttpError();
   ASSERT_TRUE(bookmarks_helper::BookmarkModelMatchesFakeServerChecker(
-                  GetBookmarkModel(0), GetSyncService(0), GetFakeServer(),
-                  /*is_transport_mode=*/true)
+                  GetBookmarkModel(0), GetSyncService(0), GetFakeServer())
                   .Wait());
 
   // BOOKMARKS has no unsynced data.
diff --git a/chrome/browser/tab/BUILD.gn b/chrome/browser/tab/BUILD.gn
index 41c77e41..46f2611 100644
--- a/chrome/browser/tab/BUILD.gn
+++ b/chrome/browser/tab/BUILD.gn
@@ -254,6 +254,7 @@
     "collection_storage_observer.cc",
     "collection_storage_package.cc",
     "storage_collection_synchronizer.cc",
+    "storage_id.cc",
     "storage_loaded_data.cc",
     "storage_restore_orchestrator.cc",
     "tab_group_collection_data.cc",
diff --git a/chrome/browser/tab/protocol/BUILD.gn b/chrome/browser/tab/protocol/BUILD.gn
index d8a7228..9dc4d942 100644
--- a/chrome/browser/tab/protocol/BUILD.gn
+++ b/chrome/browser/tab/protocol/BUILD.gn
@@ -13,6 +13,7 @@
     "tab_group_collection_state.proto",
     "tab_state.proto",
     "tab_strip_collection_state.proto",
+    "token.proto",
   ]
 }
 
@@ -24,5 +25,6 @@
     "tab_group_collection_state.proto",
     "tab_state.proto",
     "tab_strip_collection_state.proto",
+    "token.proto",
   ]
 }
diff --git a/chrome/browser/tab/protocol/children.proto b/chrome/browser/tab/protocol/children.proto
index 0222192..9800b249 100644
--- a/chrome/browser/tab/protocol/children.proto
+++ b/chrome/browser/tab/protocol/children.proto
@@ -8,11 +8,13 @@
 package tabs_pb;
 option java_package = "org.chromium.chrome.browser.tabs.proto";
 
+import "chrome/browser/tab/protocol/token.proto";
+
 message Children {
   // Used to serialize a list of ids into a single db blob cell. The storage id
   // is created by the storage system and used to map in memory objects to rows
   // in the database. Note that before this system is authoritative for reads,
   // this mapping cannot be recreated on start up, and will require rebuilding
   // (and deletion of the whole db) to fix.
-  repeated int32 storage_id = 1;
+  repeated Token storage_id = 1;
 }
diff --git a/chrome/browser/tab/protocol/tab_state.proto b/chrome/browser/tab/protocol/tab_state.proto
index bb46aa3..09cf9e20 100644
--- a/chrome/browser/tab/protocol/tab_state.proto
+++ b/chrome/browser/tab/protocol/tab_state.proto
@@ -8,6 +8,8 @@
 package tabs_pb;
 option java_package = "org.chromium.chrome.browser.tabs.proto";
 
+import "chrome/browser/tab/protocol/token.proto";
+
 // Next ID: 16
 message TabState {
   optional int32 tab_id = 15;
@@ -32,8 +34,7 @@
 
   optional int64 last_navigation_committed_timestamp_millis = 9;
 
-  optional fixed64 tab_group_id_high = 10;
-  optional fixed64 tab_group_id_low = 11;
+  optional Token tab_group_id = 10;
 
   optional bool tab_has_sensitive_content = 12;
 
diff --git a/chrome/browser/tab/protocol/tab_strip_collection_state.proto b/chrome/browser/tab/protocol/tab_strip_collection_state.proto
index c32b8b5f..91447c7 100644
--- a/chrome/browser/tab/protocol/tab_strip_collection_state.proto
+++ b/chrome/browser/tab/protocol/tab_strip_collection_state.proto
@@ -8,6 +8,8 @@
 package tabs_pb;
 option java_package = "org.chromium.chrome.browser.tabs.proto";
 
+import "chrome/browser/tab/protocol/token.proto";
+
 // Stores the state of a TabStripCollection.
 message TabStripCollectionState {
   // Contains information about the window associated with this collection.
@@ -19,5 +21,5 @@
   optional int32 tab_model_type = 2;
 
   // The storage id of the active tab in the tab strip.
-  optional int32 active_tab_storage_id = 3;
+  optional Token active_tab_storage_id = 3;
 }
diff --git a/chrome/browser/tab/protocol/token.proto b/chrome/browser/tab/protocol/token.proto
new file mode 100644
index 0000000..7645a62
--- /dev/null
+++ b/chrome/browser/tab/protocol/token.proto
@@ -0,0 +1,15 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+syntax = "proto2";
+option optimize_for = LITE_RUNTIME;
+
+package tabs_pb;
+option java_package = "org.chromium.chrome.browser.tabs.proto";
+
+// A 128-bit token.
+message Token {
+  optional fixed64 high = 1;
+  optional fixed64 low = 2;
+}
diff --git a/chrome/browser/tab/storage_id.cc b/chrome/browser/tab/storage_id.cc
new file mode 100644
index 0000000..94900e7
--- /dev/null
+++ b/chrome/browser/tab/storage_id.cc
@@ -0,0 +1,52 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/tab/storage_id.h"
+
+#include <array>
+#include <cstdint>
+#include <optional>
+
+#include "base/check.h"
+#include "base/check_op.h"
+#include "base/containers/span.h"
+#include "base/containers/span_reader.h"
+#include "base/containers/span_writer.h"
+#include "base/numerics/byte_conversions.h"
+#include "base/unguessable_token.h"
+#include "chrome/browser/tab/protocol/token.pb.h"
+
+namespace tabs {
+
+std::array<uint8_t, kStorageIdBlobSizeBytes> StorageIdToBlob(StorageId id) {
+  std::array<uint8_t, kStorageIdBlobSizeBytes> blob;
+  base::SpanWriter writer(base::as_writable_byte_span(blob));
+  writer.WriteU64LittleEndian(id.GetHighForSerialization());
+  writer.WriteU64LittleEndian(id.GetLowForSerialization());
+  return blob;
+}
+
+StorageId StorageIdFromBlob(base::span<const uint8_t> id) {
+  DCHECK_EQ(id.size(), kStorageIdBlobSizeBytes);
+  uint64_t high = base::U64FromLittleEndian(id.take_first<8u>());
+  uint64_t low = base::U64FromLittleEndian(id.take_first<8u>());
+  std::optional<base::UnguessableToken> maybe_token =
+      base::UnguessableToken::Deserialize(high, low);
+  DCHECK(maybe_token.has_value());
+  return *maybe_token;
+}
+
+void StorageIdToTokenProto(StorageId id, tabs_pb::Token* token) {
+  token->set_high(id.GetHighForSerialization());
+  token->set_low(id.GetLowForSerialization());
+}
+
+StorageId StorageIdFromTokenProto(const tabs_pb::Token& token) {
+  std::optional<base::UnguessableToken> maybe_token =
+      base::UnguessableToken::Deserialize(token.high(), token.low());
+  DCHECK(maybe_token.has_value());
+  return *maybe_token;
+}
+
+}  // namespace tabs
diff --git a/chrome/browser/tab/storage_id.h b/chrome/browser/tab/storage_id.h
index 3f7a944a..0268197 100644
--- a/chrome/browser/tab/storage_id.h
+++ b/chrome/browser/tab/storage_id.h
@@ -5,11 +5,31 @@
 #ifndef CHROME_BROWSER_TAB_STORAGE_ID_H_
 #define CHROME_BROWSER_TAB_STORAGE_ID_H_
 
+#include "base/unguessable_token.h"
+
+namespace tabs_pb {
+class Token;
+}  // namespace tabs_pb
+
 namespace tabs {
 
 // Define a type alias for storage IDs. The underlying type may change before
 // launch. Using a type alias allows for easier migration.
-using StorageId = int;
+using StorageId = base::UnguessableToken;
+
+inline constexpr size_t kStorageIdBlobSizeBytes = sizeof(uint64_t) * 2;
+
+// Converts a StorageId to a blob of bytes.
+std::array<uint8_t, kStorageIdBlobSizeBytes> StorageIdToBlob(StorageId id);
+
+// Converts a blob of bytes to a StorageId.
+StorageId StorageIdFromBlob(base::span<const uint8_t> id);
+
+// Converts a StorageId to a Token proto.
+void StorageIdToTokenProto(StorageId id, tabs_pb::Token* token);
+
+// Converts a Token proto to a StorageId.
+StorageId StorageIdFromTokenProto(const tabs_pb::Token& token);
 
 }  // namespace tabs
 
diff --git a/chrome/browser/tab/tab_state_storage_database.cc b/chrome/browser/tab/tab_state_storage_database.cc
index 08ddfd1a..e2235749 100644
--- a/chrome/browser/tab/tab_state_storage_database.cc
+++ b/chrome/browser/tab/tab_state_storage_database.cc
@@ -22,10 +22,10 @@
 using OpenTransaction = TabStateStorageDatabase::OpenTransaction;
 
 // Update log:
-// ??-08-2025, Version 1 (pre-launch): Initial version of the database schema.
-// 11-11-2025, Version 2 (pre-launch): Add window_tag and is_off_the_record
-// columns to the nodes table.
-const int kCurrentVersionNumber = 2;
+// ??-08-2025, Version 1: Initial version of the database schema.
+// 11-11-2025, Version 2: Add window_tag and is_off_the_record columns.
+// 19-11-2025, Version 3: Change storage id type from int to blob and use token.
+const int kCurrentVersionNumber = 3;
 
 // The last version of the database schema that is compatible with the current
 // version. Any changes made to the database schema that would break
@@ -37,7 +37,7 @@
 // significant enough time (O(years)) have passed that there is no longer a
 // reasonable expectation that out-of-date users would be able to restore their
 // session.
-const int kCompatibleVersionNumber = 2;
+const int kCompatibleVersionNumber = 3;
 
 static_assert(
     kCurrentVersionNumber >= kCompatibleVersionNumber,
@@ -55,7 +55,7 @@
 
   static constexpr char kCreateTabSchemaSql[] =
       "CREATE TABLE IF NOT EXISTS nodes("
-      "id INTEGER PRIMARY KEY NOT NULL,"
+      "id BLOB PRIMARY KEY NOT NULL,"
       "window_tag TEXT NOT NULL,"
       "is_off_the_record INTEGER NOT NULL,"
       "type INTEGER NOT NULL,"
@@ -225,7 +225,7 @@
   sql::Statement write_statement(
       db_->GetCachedStatement(SQL_FROM_HERE, kInsertNodeSql));
 
-  write_statement.BindInt(0, id);
+  write_statement.BindBlob(0, StorageIdToBlob(id));
   write_statement.BindString(1, window_tag);
   write_statement.BindInt(2, static_cast<int>(is_off_the_record));
   write_statement.BindInt(3, static_cast<int>(type));
@@ -252,7 +252,7 @@
       db_->GetCachedStatement(SQL_FROM_HERE, kUpdatePayloadSql));
 
   write_statement.BindBlob(0, std::move(payload));
-  write_statement.BindInt(1, id);
+  write_statement.BindBlob(1, StorageIdToBlob(id));
 
   return write_statement.Run();
 }
@@ -274,7 +274,7 @@
       db_->GetCachedStatement(SQL_FROM_HERE, kUpdateChildrenSql));
 
   write_statement.BindBlob(0, std::move(children));
-  write_statement.BindInt(1, id);
+  write_statement.BindBlob(1, StorageIdToBlob(id));
 
   return write_statement.Run();
 }
@@ -293,7 +293,7 @@
   sql::Statement write_statement(
       db_->GetCachedStatement(SQL_FROM_HERE, kDeleteNodeSql));
 
-  write_statement.BindInt(0, id);
+  write_statement.BindBlob(0, StorageIdToBlob(id));
   return write_statement.Run();
 }
 
@@ -350,7 +350,7 @@
   select_statement.BindInt(1, static_cast<int>(is_off_the_record));
   while (select_statement.Step()) {
     entries.emplace_back(
-        select_statement.ColumnInt(0),
+        StorageIdFromBlob(select_statement.ColumnBlob(0)),
         static_cast<TabStorageType>(select_statement.ColumnInt(1)),
         select_statement.ColumnBlobAsVector(2),
         select_statement.ColumnBlobAsVector(3));
diff --git a/chrome/browser/tab/tab_state_storage_service.cc b/chrome/browser/tab/tab_state_storage_service.cc
index c33dd08..2cf24a0 100644
--- a/chrome/browser/tab/tab_state_storage_service.cc
+++ b/chrome/browser/tab/tab_state_storage_service.cc
@@ -9,10 +9,13 @@
 
 #include "base/token.h"
 #include "chrome/browser/tab/payload.h"
+#include "chrome/browser/tab/protocol/children.pb.h"
 #include "chrome/browser/tab/protocol/tab_state.pb.h"
 #include "chrome/browser/tab/protocol/tab_strip_collection_state.pb.h"
+#include "chrome/browser/tab/protocol/token.pb.h"
 #include "chrome/browser/tab/restore_id_associator.h"
 #include "chrome/browser/tab/restore_id_associator_builder.h"
+#include "chrome/browser/tab/storage_id.h"
 #include "chrome/browser/tab/storage_package.h"
 #include "chrome/browser/tab/tab_group_collection_data.h"
 #include "chrome/browser/tab/tab_state_storage_updater_builder.h"
@@ -30,14 +33,15 @@
 template <typename T>
 StorageId GetOrCreateStorageId(
     T* object,
-    absl::flat_hash_map<int32_t, StorageId>& handle_map,
-    StorageId& next_storage_id) {
+    absl::flat_hash_map<int32_t, StorageId>& handle_map) {
   int32_t handle_id = object->GetHandle().raw_value();
-  auto [it, inserted] = handle_map.try_emplace(handle_id, next_storage_id);
-  if (inserted) {
-    next_storage_id++;
+  auto it = handle_map.find(handle_id);
+  if (it != handle_map.end()) {
+    return it->second;
   }
-  return it->second;
+  StorageId storage_id = StorageId::Create();
+  handle_map[handle_id] = storage_id;
+  return storage_id;
 }
 
 // Adds a save children operation to the builder.
@@ -134,13 +138,13 @@
 
 StorageId TabStateStorageService::GetStorageId(
     const TabCollection* collection) {
-  return ::tabs::GetOrCreateStorageId(
-      collection, collection_handle_to_storage_id_, next_storage_id_);
+  return ::tabs::GetOrCreateStorageId(collection,
+                                      collection_handle_to_storage_id_);
 }
 
 StorageId TabStateStorageService::GetStorageId(const TabInterface* tab) {
-  return ::tabs::GetOrCreateStorageId(
-      tab_canonicalizer_.Run(tab), tab_handle_to_storage_id_, next_storage_id_);
+  return ::tabs::GetOrCreateStorageId(tab_canonicalizer_.Run(tab),
+                                      tab_handle_to_storage_id_);
 }
 
 void TabStateStorageService::Save(const TabInterface* tab) {
@@ -256,9 +260,7 @@
   absl::flat_hash_map<StorageId, std::vector<StorageId>> children_map;
   std::vector<std::unique_ptr<TabGroupCollectionData>> loaded_groups;
 
-  StorageId max_storage_id = 0;
   for (auto& entry : entries) {
-    max_storage_id = std::max(max_storage_id, entry.id);
     if (entry.type == TabStorageType::kTab) {
       tabs_pb::TabState tab_state;
       if (tab_state.ParseFromArray(entry.payload.data(),
@@ -280,7 +282,8 @@
         if (tab_strip_state.ParseFromArray(entry.payload.data(),
                                            entry.payload.size())) {
           if (tab_strip_state.has_active_tab_storage_id()) {
-            active_tab_storage_id = tab_strip_state.active_tab_storage_id();
+            active_tab_storage_id = StorageIdFromTokenProto(
+                tab_strip_state.active_tab_storage_id());
           }
         }
       }
@@ -288,10 +291,12 @@
       if (children.ParseFromArray(entry.children.data(),
                                   entry.children.size())) {
         builder->RegisterCollection(entry.id, entry.type, children);
-        const auto& storage_ids = children.storage_id();
-        children_map.emplace(
-            entry.id,
-            std::vector<StorageId>(storage_ids.begin(), storage_ids.end()));
+        std::vector<StorageId> storage_ids_vector;
+        storage_ids_vector.reserve(children.storage_id_size());
+        for (const auto& storage_id : children.storage_id()) {
+          storage_ids_vector.push_back(StorageIdFromTokenProto(storage_id));
+        }
+        children_map.emplace(entry.id, std::move(storage_ids_vector));
       }
 
       if (entry.type == TabStorageType::kGroup) {
@@ -304,7 +309,6 @@
       }
     }
   }
-  next_storage_id_ = max_storage_id + 1;
 
   std::vector<LoadedTabState> loaded_tabs;
   loaded_tabs.reserve(loaded_tabs_map.size());
diff --git a/chrome/browser/tab/tab_state_storage_service.h b/chrome/browser/tab/tab_state_storage_service.h
index baa41ac1..393d442 100644
--- a/chrome/browser/tab/tab_state_storage_service.h
+++ b/chrome/browser/tab/tab_state_storage_service.h
@@ -98,7 +98,6 @@
 
   // Storage ids need to be unique across tabs and collections, but the handles
   // do not have this guarantee. Track them separately.
-  StorageId next_storage_id_ = 1;
   absl::flat_hash_map<int32_t, StorageId> tab_handle_to_storage_id_;
   absl::flat_hash_map<int32_t, StorageId> collection_handle_to_storage_id_;
 
diff --git a/chrome/browser/tab/tab_storage_package.cc b/chrome/browser/tab/tab_storage_package.cc
index 9acd77e..3cebdf7 100644
--- a/chrome/browser/tab/tab_storage_package.cc
+++ b/chrome/browser/tab/tab_storage_package.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/tab/tab_storage_package.h"
 
 #include "chrome/browser/tab/protocol/tab_state.pb.h"
+#include "chrome/browser/tab/protocol/token.pb.h"
 
 namespace tabs {
 
@@ -46,8 +47,9 @@
         android_package->tab_has_sensitive_content_);
   }
   tab_state.set_user_agent(user_agent_);
-  tab_state.set_tab_group_id_high(tab_group_id_.high());
-  tab_state.set_tab_group_id_low(tab_group_id_.low());
+  tabs_pb::Token* tab_group_id = tab_state.mutable_tab_group_id();
+  tab_group_id->set_high(tab_group_id_.high());
+  tab_group_id->set_low(tab_group_id_.low());
   tab_state.set_is_pinned(is_pinned_);
 
   std::vector<uint8_t> payload_vec(tab_state.ByteSizeLong());
diff --git a/chrome/browser/tab/tab_storage_packager.cc b/chrome/browser/tab/tab_storage_packager.cc
index 79d8a96..e8a4843 100644
--- a/chrome/browser/tab/tab_storage_packager.cc
+++ b/chrome/browser/tab/tab_storage_packager.cc
@@ -17,6 +17,8 @@
 #include "chrome/browser/tab/protocol/children.pb.h"
 #include "chrome/browser/tab/protocol/split_collection_state.pb.h"
 #include "chrome/browser/tab/protocol/tab_group_collection_state.pb.h"
+#include "chrome/browser/tab/protocol/token.pb.h"
+#include "chrome/browser/tab/storage_id.h"
 #include "chrome/browser/tab/storage_id_mapping.h"
 #include "chrome/browser/tab/storage_package.h"
 #include "chrome/browser/tab/tab_group_collection_data.h"
@@ -37,11 +39,13 @@
       : children_proto_(children_proto), mapping_(mapping) {}
 
   void ProcessTab(const TabInterface* tab) override {
-    children_proto_->add_storage_id(mapping_->GetStorageId(tab));
+    tabs_pb::Token* token = children_proto_->add_storage_id();
+    StorageIdToTokenProto(mapping_->GetStorageId(tab), token);
   }
 
   void ProcessCollection(const TabCollection* collection) override {
-    children_proto_->add_storage_id(mapping_->GetStorageId(collection));
+    tabs_pb::Token* token = children_proto_->add_storage_id();
+    StorageIdToTokenProto(mapping_->GetStorageId(collection), token);
   }
 
  private:
diff --git a/chrome/browser/thumbnail/cc/jpeg_thumbnail_helper_unittest.cc b/chrome/browser/thumbnail/cc/jpeg_thumbnail_helper_unittest.cc
index 02865c0..701401d8 100644
--- a/chrome/browser/thumbnail/cc/jpeg_thumbnail_helper_unittest.cc
+++ b/chrome/browser/thumbnail/cc/jpeg_thumbnail_helper_unittest.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/browser/thumbnail/cc/jpeg_thumbnail_helper.h"
 
 #include <cstring>
@@ -15,6 +10,7 @@
 #include <utility>
 #include <vector>
 
+#include "base/compiler_specific.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/functional/bind.h"
@@ -153,8 +149,8 @@
   base::FilePath file_path = GetFile(tab_id);
   base::File file(file_path,
                   base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE);
-  file.Write(0, reinterpret_cast<const char*>(data.value().data()),
-             data.value().size());
+  UNSAFE_TODO(file.Write(0, reinterpret_cast<const char*>(data.value().data()),
+                         data.value().size()));
 
   // Read the image
   base::RunLoop loop1;
@@ -191,7 +187,8 @@
   base::FilePath file_path = GetFile(tab_id);
   base::File file(file_path,
                   base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE);
-  file.Write(0, reinterpret_cast<const char*>(data->data()), data->size());
+  UNSAFE_TODO(
+      file.Write(0, reinterpret_cast<const char*>(data->data()), data->size()));
 
   // Delete the image
   GetInterface().Delete(tab_id);
diff --git a/chrome/browser/ui/android/appmenu/internal/BUILD.gn b/chrome/browser/ui/android/appmenu/internal/BUILD.gn
index f88e8b23b..1ad886b 100644
--- a/chrome/browser/ui/android/appmenu/internal/BUILD.gn
+++ b/chrome/browser/ui/android/appmenu/internal/BUILD.gn
@@ -97,6 +97,7 @@
     "//third_party/android_deps:material_design_java",
     "//third_party/androidx:androidx_annotation_annotation_java",
     "//third_party/androidx:androidx_appcompat_appcompat_resources_java",
+    "//third_party/androidx:androidx_test_monitor_java",
     "//third_party/androidx:androidx_test_rules_java",
     "//third_party/androidx:androidx_test_runner_java",
     "//third_party/hamcrest:hamcrest_java",
diff --git a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuTest.java b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuTest.java
index ae896ec..13ec8f6c 100644
--- a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuTest.java
+++ b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuTest.java
@@ -23,6 +23,7 @@
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
+import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.MediumTest;
 import androidx.test.filters.SmallTest;
 
@@ -611,6 +612,7 @@
 
         ThreadUtils.runOnUiThreadBlocking(
                 () -> mAppMenuHandler.getModelListForTesting().removeAt(1));
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
 
         itemView = getViewAtPosition(1);
         Assert.assertEquals(
@@ -646,6 +648,7 @@
 
         ThreadUtils.runOnUiThreadBlocking(
                 () -> mAppMenuHandler.getModelListForTesting().removeRange(0, 2));
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
 
         Assert.assertEquals(1, mAppMenuHandler.getModelListForTesting().size());
         itemView = getViewAtPosition(0);
@@ -1295,6 +1298,7 @@
     private void showMenuAndAssert(AppMenuHandlerImpl handler) throws TimeoutException {
         int currentCallCount = mMenuObserver.menuShownCallback.getCallCount();
         ThreadUtils.runOnUiThreadBlocking(() -> mAppMenuCoordinator.showAppMenuForKeyboardEvent());
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
         waitForMenuToShow(currentCallCount, handler);
     }
 
diff --git a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/signin_promo/SigninPromoMediatorTest.java b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/signin_promo/SigninPromoMediatorTest.java
index 6043b4a..f629bfeb 100644
--- a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/signin_promo/SigninPromoMediatorTest.java
+++ b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/signin_promo/SigninPromoMediatorTest.java
@@ -10,13 +10,16 @@
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.atLeastOnce;
 import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.lenient;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import android.content.Context;
 
 import androidx.test.core.app.ApplicationProvider;
 
+import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -26,7 +29,13 @@
 import org.mockito.quality.Strictness;
 
 import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.test.util.Features.EnableFeatures;
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.signin.services.IdentityServicesProvider;
 import org.chromium.chrome.browser.signin.services.ProfileDataCache;
+import org.chromium.chrome.browser.signin.services.SigninManager;
+import org.chromium.chrome.browser.ui.signin.SigninAndHistorySyncActivityLauncher;
 import org.chromium.chrome.test.util.browser.signin.AccountManagerTestRule;
 import org.chromium.components.signin.AccountManagerFacadeProvider;
 import org.chromium.components.signin.identitymanager.ConsentLevel;
@@ -47,10 +56,20 @@
     private @Mock IdentityManager mIdentityManager;
     private @Mock SyncService mSyncService;
     private @Mock SigninPromoDelegate mDelegate;
+    private @Mock Profile mProfile;
+    private @Mock SigninManager mSigninManager;
+    private @Mock IdentityServicesProvider mIdentityServicesProvider;
+    private @Mock SigninAndHistorySyncActivityLauncher mLauncher;
     private ProfileDataCache mProfileDataCache;
+    private final Context mContext = ApplicationProvider.getApplicationContext();
 
     private SigninPromoMediator mMediator;
 
+    @Before
+    public void setUp() {
+        lenient().doReturn(true).when(mDelegate).canShowPromo();
+    }
+
     @Test
     public void testSecondaryButtonHiddenByDelegate() {
         mAccountManagerTestRule.addAccount(TestAccounts.ACCOUNT1);
@@ -58,7 +77,7 @@
         doReturn(TestAccounts.ACCOUNT1)
                 .when(mIdentityManager)
                 .getPrimaryAccountInfo(ConsentLevel.SIGNIN);
-        createSigninPromoMediator();
+        createSigninPromoMediator(mDelegate);
 
         boolean isSecondaryButtonHidden =
                 mMediator.getModel().get(SigninPromoProperties.SHOULD_HIDE_SECONDARY_BUTTON);
@@ -67,7 +86,7 @@
 
     @Test
     public void testSecondaryButtonHiddenByNullProfileData() {
-        createSigninPromoMediator();
+        createSigninPromoMediator(mDelegate);
 
         boolean isSecondaryButtonHidden =
                 mMediator.getModel().get(SigninPromoProperties.SHOULD_HIDE_SECONDARY_BUTTON);
@@ -81,7 +100,7 @@
         doReturn(TestAccounts.ACCOUNT1)
                 .when(mIdentityManager)
                 .getPrimaryAccountInfo(ConsentLevel.SIGNIN);
-        createSigninPromoMediator();
+        createSigninPromoMediator(mDelegate);
 
         boolean isSecondaryButtonHidden =
                 mMediator.getModel().get(SigninPromoProperties.SHOULD_HIDE_SECONDARY_BUTTON);
@@ -92,7 +111,7 @@
     public void testSecondaryButtonShown_visibleAccountFromAccountManager() {
         doReturn(false).when(mDelegate).shouldHideSecondaryButton();
         mAccountManagerTestRule.addAccount(TestAccounts.TEST_ACCOUNT_NO_NAME);
-        createSigninPromoMediator();
+        createSigninPromoMediator(mDelegate);
 
         boolean isSecondaryButtonHidden =
                 mMediator.getModel().get(SigninPromoProperties.SHOULD_HIDE_SECONDARY_BUTTON);
@@ -103,7 +122,7 @@
     public void testDefaultAccountRemoved() {
         mAccountManagerTestRule.addAccount(TestAccounts.ACCOUNT1);
         mAccountManagerTestRule.addAccount(TestAccounts.ACCOUNT2);
-        createSigninPromoMediator();
+        createSigninPromoMediator(mDelegate);
         verify(mProfileDataCache, atLeastOnce())
                 .getProfileDataOrDefault(TestAccounts.ACCOUNT1.getEmail());
 
@@ -115,7 +134,7 @@
     @Test
     public void testDelegateUpdated_defaultAccountRemoved() {
         mAccountManagerTestRule.addAccount(TestAccounts.ACCOUNT1);
-        createSigninPromoMediator();
+        createSigninPromoMediator(mDelegate);
 
         // Set the mock delegate to return non-default values.
         String newTitle = "newTitle";
@@ -147,29 +166,86 @@
         assertEquals(newSecondaryButtonText, secondaryButtonText);
     }
 
-    // TODO(crbug.com/457486594): Remove this test as it tests implementation details.
     @Test
-    public void testStringsSetByDelegate_noAccountsOnDevice() {
-        createSigninPromoMediator();
+    @EnableFeatures({
+        "EnableSeamlessSignin"
+                + ":seamless-signin-promo-type/compact"
+                + "/seamless-signin-string-type/signinButton"
+    })
+    public void testModelValuesNtp_noAccountsOnDevice() {
+        when(mSigninManager.isSigninAllowed()).thenReturn(true);
+        IdentityServicesProvider.setInstanceForTests(mIdentityServicesProvider);
+        when(mIdentityServicesProvider.getIdentityManager(mProfile)).thenReturn(mIdentityManager);
+        when(mIdentityServicesProvider.getSigninManager(mProfile)).thenReturn(mSigninManager);
 
-        verify(mDelegate).getTitle();
-        verify(mDelegate).getDescription(/* accountEmail= */ null);
-        verify(mDelegate).getTextForPrimaryButton(/* profileData= */ null);
+        NtpSigninPromoDelegate delegate =
+                new NtpSigninPromoDelegate(
+                        ApplicationProvider.getApplicationContext(), mProfile, mLauncher, () -> {});
+
+        createSigninPromoMediator(delegate);
+
+        assertFalse(mMediator.getModel().get(SigninPromoProperties.SHOULD_HIDE_DISMISS_BUTTON));
+        assertEquals(
+                mContext.getString(R.string.signin_promo_title_ntp_sign_in_as_button),
+                mMediator.getModel().get(SigninPromoProperties.TITLE_TEXT));
+        assertEquals(
+                mContext.getString(R.string.custom_tabs_signed_out_message_subtitle),
+                mMediator.getModel().get(SigninPromoProperties.DESCRIPTION_TEXT));
+        assertEquals(
+                mContext.getString(R.string.sign_in_to_chrome),
+                mMediator.getModel().get(SigninPromoProperties.PRIMARY_BUTTON_TEXT));
+        assertTrue(mMediator.getModel().get(SigninPromoProperties.SHOULD_HIDE_SECONDARY_BUTTON));
     }
 
-    private void createSigninPromoMediator() {
-        Context context = ApplicationProvider.getApplicationContext();
+    @Test
+    @EnableFeatures({
+        "EnableSeamlessSignin"
+                + ":seamless-signin-promo-type/compact"
+                + "/seamless-signin-string-type/signinButton"
+    })
+    public void testModelValuesNtp_accountAvailableOnDevice() {
+        mAccountManagerTestRule.addAccount(TestAccounts.ACCOUNT1);
+        when(mSigninManager.isSigninAllowed()).thenReturn(true);
+        when(mIdentityManager.findExtendedAccountInfoByEmailAddress(
+                        TestAccounts.ACCOUNT1.getEmail()))
+                .thenReturn(TestAccounts.ACCOUNT1);
+        IdentityServicesProvider.setInstanceForTests(mIdentityServicesProvider);
+        when(mIdentityServicesProvider.getIdentityManager(mProfile)).thenReturn(mIdentityManager);
+        when(mIdentityServicesProvider.getSigninManager(mProfile)).thenReturn(mSigninManager);
+
+        NtpSigninPromoDelegate delegate =
+                new NtpSigninPromoDelegate(
+                        ApplicationProvider.getApplicationContext(), mProfile, mLauncher, () -> {});
+        createSigninPromoMediator(delegate);
+
+        assertFalse(mMediator.getModel().get(SigninPromoProperties.SHOULD_HIDE_DISMISS_BUTTON));
+        assertEquals(
+                mContext.getString(R.string.signin_promo_title_ntp_sign_in_as_button),
+                mMediator.getModel().get(SigninPromoProperties.TITLE_TEXT));
+        assertEquals(
+                mContext.getString(R.string.signin_promo_description_ntp_group4),
+                mMediator.getModel().get(SigninPromoProperties.DESCRIPTION_TEXT));
+        assertEquals(
+                mContext.getString(
+                        R.string.signin_promo_sign_in_as, TestAccounts.ACCOUNT1.getGivenName()),
+                mMediator.getModel().get(SigninPromoProperties.PRIMARY_BUTTON_TEXT));
+        assertEquals(
+                mContext.getString(R.string.signin_promo_choose_another_account),
+                mMediator.getModel().get(SigninPromoProperties.SECONDARY_BUTTON_TEXT));
+        assertFalse(mMediator.getModel().get(SigninPromoProperties.SHOULD_HIDE_SECONDARY_BUTTON));
+    }
+
+    private void createSigninPromoMediator(SigninPromoDelegate delegate) {
         mProfileDataCache =
                 spy(
                         ProfileDataCache.createWithDefaultImageSizeAndNoBadge(
-                                context, mIdentityManager));
-        doReturn(true).when(mDelegate).canShowPromo();
+                                mContext, mIdentityManager));
         mMediator =
                 new SigninPromoMediator(
                         mIdentityManager,
                         mSyncService,
                         AccountManagerFacadeProvider.getInstance(),
                         mProfileDataCache,
-                        mDelegate);
+                        delegate);
     }
 }
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb
index 06119e9b..e6a7aa2 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb
@@ -623,6 +623,7 @@
 <translation id="3710560693796335511">التعاون</translation>
 <translation id="3718765429352682176">‏قد يظهر لك السجلّ من خلال التطبيقات الأخرى التي تفتح الروابط في Chrome.</translation>
 <translation id="3721119614952978349">‏أنت وGoogle</translation>
+<translation id="3727000368239390918">يمكنك تسجيل الدخول للوصول إلى علامات التبويب وغير ذلك على جميع أجهزتك</translation>
 <translation id="3737319253362202215">إعدادات الترجمة</translation>
 <translation id="3738139272394829648">المس للبحث</translation>
 <translation id="3739455665973395693">‏ما مِن كلمات مرور معرّضة للاختراق في حسابك على Google</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb
index 9f6d767..5909725 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb
@@ -622,6 +622,7 @@
 <translation id="3710560693796335511">Съвместна работа</translation>
 <translation id="3718765429352682176">Възможно е да виждате историята от други приложения, които отварят връзки в Chrome.</translation>
 <translation id="3721119614952978349">Вие и Google</translation>
+<translation id="3727000368239390918">Влезте в профила си, за да имате достъп до своите раздели и др. на всичките си устройства</translation>
 <translation id="3737319253362202215">Настройки за превод</translation>
 <translation id="3738139272394829648">Търсене чрез докосване</translation>
 <translation id="3739455665973395693">В профила ви в Google няма компрометирани пароли</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb
index 8c772b91..a2ffb73 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb
@@ -622,6 +622,7 @@
 <translation id="3710560693796335511">কোলাবরেশন</translation>
 <translation id="3718765429352682176">Chrome-এ লিঙ্ক খোলে এমন অন্যান্য অ্যাপের ইতিহাস হয়ত দেখতে পারেন।</translation>
 <translation id="3721119614952978349">আপনি এবং Google</translation>
+<translation id="3727000368239390918">ব্যবহার করছেন এমন সব ট্যাব ও আরও অনেক কিছু আপনার সব ডিভাইসে পেতে সাইন-ইন করুন</translation>
 <translation id="3737319253362202215">অনুবাদ সেটিংস</translation>
 <translation id="3738139272394829648">স্পর্শের মাধ্যমে সার্চ</translation>
 <translation id="3739455665973395693">আপনার Google অ্যাকাউন্ট চুরি হয়ে যাওয়া কোনও পাসওয়ার্ড নেই</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb
index 5066c08..8e76ef60 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb
@@ -622,6 +622,7 @@
 <translation id="3710560693796335511">Collaboration</translation>
 <translation id="3718765429352682176">You may see the history from other apps that open links in Chrome.</translation>
 <translation id="3721119614952978349">You and Google</translation>
+<translation id="3727000368239390918">Sign in to get your tabs and more on all your devices</translation>
 <translation id="3737319253362202215">Translation settings</translation>
 <translation id="3738139272394829648">Touch to Search</translation>
 <translation id="3739455665973395693">No compromised passwords in your Google Account</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb
index 278c708..aed396d 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb
@@ -873,7 +873,7 @@
 <translation id="4769095993849849966">Nuevo nombre de archivo</translation>
 <translation id="4769632191812288342">Recibes protección estándar</translation>
 <translation id="4773122030389014189">Compartir el grupo de pestañas “<ph name="GROUP_NAME" />”</translation>
-<translation id="4775646243557794597">Se borró <ph name="TIME_PERIOD" /></translation>
+<translation id="4775646243557794597">Período borrado: <ph name="TIME_PERIOD" /></translation>
 <translation id="4777866634702576038">¿Quieres borrar el grupo de pestañas?</translation>
 <translation id="4778653490315793244">Aún no hay nada que mostrar</translation>
 <translation id="4782929588435725897"><ph name="SEARCH_ENGINE" /> es tu motor de búsqueda predeterminado</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb
index bcbb4b07..ad9b6f5 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb
@@ -622,6 +622,7 @@
 <translation id="3710560693796335511">Colaboración</translation>
 <translation id="3718765429352682176">Es posible que veas el historial de otras aplicaciones que abren enlaces en Chrome.</translation>
 <translation id="3721119614952978349">Tú y Google</translation>
+<translation id="3727000368239390918">Inicia sesión para acceder a tus pestañas y otro contenido en todos tus dispositivos</translation>
 <translation id="3737319253362202215">Configuración de traducción</translation>
 <translation id="3738139272394829648">Tocar para buscar</translation>
 <translation id="3739455665973395693">No hay contraseñas vulneradas en tu cuenta de Google</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
index 198486f..e9e1d929 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
@@ -54,7 +54,7 @@
 <translation id="11947597112837849">نشانی ایمیل</translation>
 <translation id="1197267115302279827">انتقال نشانک‌ها</translation>
 <translation id="1197761954713363183">برگ تأیید گذرکلید بسته شد</translation>
-<translation id="1197933394627598677">نشان دادن «حالت مطالعه»</translation>
+<translation id="1197933394627598677">نشان دادن «حالت خواندن»</translation>
 <translation id="1201402288615127009">بعدی</translation>
 <translation id="1202892408424955784">محصولات پیگیری‌شده</translation>
 <translation id="1204037785786432551">بارگیری پیوند</translation>
@@ -1485,7 +1485,7 @@
 <translation id="7227218174981371415">{FILE_COUNT,plural, =1{۱ بارگیری در انتظار}one{# بارگیری در انتظار}other{# بارگیری در انتظار}}</translation>
 <translation id="7230064152164845085">رفتن به حالت «ناشناس»</translation>
 <translation id="7237724030342645845">‏«مدیر گذرواژه Google» از کار افتاده است</translation>
-<translation id="7239496616545081903">پنهان کردن «حالت مطالعه»</translation>
+<translation id="7239496616545081903">پنهان کردن «حالت خواندن»</translation>
 <translation id="72415438529550637">پیشنهاد گذرواژه بسته شد.</translation>
 <translation id="7248671827512403053">برنامه کاربردی</translation>
 <translation id="7253951228444156601">درحال بررسی گذرواژه‌ها…</translation>
@@ -1845,7 +1845,7 @@
 <translation id="8725066075913043281">تلاش دوباره</translation>
 <translation id="8727043961453758442">‏بیشترین بهره را از Chrome ببرید</translation>
 <translation id="8731268612289859741">کد امنیتی</translation>
-<translation id="8738163682604285902">می‌خواهید «حالت مطالعه» را مشاهده کنید؟</translation>
+<translation id="8738163682604285902">می‌خواهید «حالت خواندن» را مشاهده کنید؟</translation>
 <translation id="8746155870861185046">هم‌رسانی مورد برجسته</translation>
 <translation id="8748850008226585750">محتوا پنهان است</translation>
 <translation id="8754448020583829686">کپی کردن بدون پیوند</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb
index dcb144e1..aabcaf4 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb
@@ -622,6 +622,7 @@
 <translation id="3710560693796335511">Pakikipag-collaborate</translation>
 <translation id="3718765429352682176">Puwede mong makita ang history mula sa iba pang app na nagbubukas ng mga link sa Chrome.</translation>
 <translation id="3721119614952978349">Ikaw at ang Google</translation>
+<translation id="3727000368239390918">Mag-sign in para makuha ang iyong mga tab at higit pa sa lahat ng device mo</translation>
 <translation id="3737319253362202215">Mga setting ng pagsasalin</translation>
 <translation id="3738139272394829648">Pindutin upang Hanapin</translation>
 <translation id="3739455665973395693">Walang nakompromisong password sa iyong Google Account</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb
index b8e8177..24a26c5 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb
@@ -622,6 +622,7 @@
 <translation id="3710560693796335511">Collaboration</translation>
 <translation id="3718765429352682176">Vous pourriez voir l'historique d'autres applis qui ouvrent des liens dans Chrome.</translation>
 <translation id="3721119614952978349">Vous et Google</translation>
+<translation id="3727000368239390918">Connectez-vous pour accéder à vos onglets et plus encore sur tous vos appareils</translation>
 <translation id="3737319253362202215">Paramètres de traduction</translation>
 <translation id="3738139272394829648">Appuyez pour rechercher</translation>
 <translation id="3739455665973395693">Aucun mot de passe compromis dans votre compte Google</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb
index 751055b..03ae5c4 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb
@@ -28,7 +28,7 @@
 <translation id="1100066534610197918">Nouvel onglet dans un groupe</translation>
 <translation id="1103142993930332957">Aider à améliorer Chrome ?</translation>
 <translation id="1105960400813249514">Capture d'écran</translation>
-<translation id="1108214977745280468">Voir insights de la page</translation>
+<translation id="1108214977745280468">Voir les informations sur la page</translation>
 <translation id="1108938384783527433">Synchronisation de l'historique</translation>
 <translation id="1111673857033749125">Les favoris enregistrés sur vos autres appareils s'affichent ici.</translation>
 <translation id="1126696498560056882">Gérer les comptes sur cet appareil</translation>
@@ -1310,7 +1310,7 @@
 <translation id="6583199322650523874">Marquer la page actuelle en tant que favori</translation>
 <translation id="6588043302623806746">Utiliser un DNS sécurisé</translation>
 <translation id="6590471736817333463">Économisez jusqu'à 60 % de données mobiles</translation>
-<translation id="6593061639179217415">Version pour ordinateur</translation>
+<translation id="6593061639179217415">Version ordinateur</translation>
 <translation id="6594347733515723558">Options tri et affichage</translation>
 <translation id="6595046016124923392">Les images sont envoyées à Google afin de vous proposer de meilleures descriptions.</translation>
 <translation id="661266467055912436">Renforce votre sécurité et celle de tous les utilisateurs sur le Web.</translation>
@@ -1971,7 +1971,7 @@
 <translation id="939598580284253335">Saisir la phrase secrète</translation>
 <translation id="945522503751344254">Envoyer un commentaire</translation>
 <translation id="95817756606698420">Chrome peut utiliser <ph name="BEGIN_BOLD" />Sogou<ph name="END_BOLD" /> pour les recherches effectuées en Chine. Vous pouvez modifier cette option dans les <ph name="BEGIN_LINK" />paramètres<ph name="END_LINK" />.</translation>
-<translation id="961856697154696964">Supprimer les données de navigation</translation>
+<translation id="961856697154696964">Suppr. données navigation</translation>
 <translation id="963246339335003378">Ouvrir le gestionnaire de tâches</translation>
 <translation id="966131775676567255">Suppression des données du compte…</translation>
 <translation id="970715775301869095"><ph name="MINUTES" /> minutes restantes</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
index b446d83..595e172 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
@@ -622,6 +622,7 @@
 <translation id="3710560693796335511">સહયોગ</translation>
 <translation id="3718765429352682176">તમે Chromeમાં લિંક ખોલતી અન્ય ઍપનો ઇતિહાસ જોઈ શકો છો.</translation>
 <translation id="3721119614952978349">તમે અને Google</translation>
+<translation id="3727000368239390918">તમારા બધા ડિવાઇસ પર ટૅબ અને બીજું ઘણું મેળવવા માટે, સાઇન ઇન કરો</translation>
 <translation id="3737319253362202215">અનુવાદ માટેના સેટિંગ</translation>
 <translation id="3738139272394829648">શોધવા માટે ટચ કરો</translation>
 <translation id="3739455665973395693">તમારા Google એકાઉન્ટમાં કોઈ ચેડાં કરાયેલા પાસવર્ડ નથી</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb
index 7caf1c3..af45f46 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb
@@ -622,6 +622,7 @@
 <translation id="3710560693796335511">कोलैबोरेशन</translation>
 <translation id="3718765429352682176">उन अन्य ऐप्लिकेशन का इतिहास देखा जा सकता है जो अपने लिंक Chrome में खोलते हैं.</translation>
 <translation id="3721119614952978349">आप और Google</translation>
+<translation id="3727000368239390918">अपने सभी डिवाइसों पर टैब वगैरह का ऐक्सेस पाने के लिए साइन इन करें</translation>
 <translation id="3737319253362202215">अनुवाद की सेटिंग</translation>
 <translation id="3738139272394829648">खोजने के लिए छुएं</translation>
 <translation id="3739455665973395693">आपके Google खाते में ऐसा कोई भी पासवर्ड मौजूद नहीं है जो हैक हुआ है या चोरी हुआ है</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb
index 455adc3..a2536de 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb
@@ -622,6 +622,7 @@
 <translation id="3710560693796335511">שיתוף פעולה</translation>
 <translation id="3718765429352682176">‏יכול להיות שתוצג היסטוריה מאפליקציות אחרות שפותחות קישורים ב-Chrome.</translation>
 <translation id="3721119614952978349">‏ההגדרות שלך ב-Google</translation>
+<translation id="3727000368239390918">לאחר הכניסה לחשבון, הכרטיסיות ונתונים נוספים יופיעו בכל המכשירים שלך</translation>
 <translation id="3737319253362202215">הגדרות התרגום</translation>
 <translation id="3738139272394829648">חיפוש בנגיעה</translation>
 <translation id="3739455665973395693">‏אין סיסמאות שנחשפו בחשבון שלך ב-Google</translation>
@@ -1054,9 +1055,9 @@
 <translation id="5596627076506792578">אפשרויות נוספות</translation>
 <translation id="5599455543593328020">מצב אנונימי</translation>
 <translation id="5601180634394228718">‏כדי לראות אילו הגדרות נוספות מתבססות על נתונים לצורך שיפור חוויית השימוש ב-Chrome, אפשר לעבור אל <ph name="BEGIN_LINK" />שירותי Google<ph name="END_LINK" />.</translation>
-<translation id="5601924940067278327">אפשר לקבל גישה לכרטיסיות ולנתונים נוספים בכל המכשירים שלך</translation>
+<translation id="5601924940067278327">אפשר לקבל גישה לכרטיסיות ולפריטים נוספים בכל המכשירים</translation>
 <translation id="5611398002774823980">שמירה בחשבון</translation>
-<translation id="5613381935190035031">‏כדי לקבל גישה לכרטיסיות ולנתונים נוספים בכל המכשירים שלך, כדאי להיכנס ל-Chrome עם <ph name="EMAIL" /></translation>
+<translation id="5613381935190035031">‏כדי לקבל גישה לכרטיסיות ולפריטים נוספים בכל המכשירים שלך, כדאי להיכנס ל-Chrome עם <ph name="EMAIL" /></translation>
 <translation id="5614625640221885312">לאחר הכניסה לחשבון, הסימניות, הסיסמאות ונתונים נוספים יופיעו בכל המכשירים שלך</translation>
 <translation id="5619633276517849615">הארגון שלך הפעיל את הגלישה הבטוחה</translation>
 <translation id="5620163320393916465">אין סיסמאות שמורות</translation>
@@ -1702,7 +1703,7 @@
 <translation id="8110024788458304985">‏עזרה בשיפור התכונות והביצועים של Chrome</translation>
 <translation id="8110087112193408731">‏להציג את הפעילות שלך ב-Chrome ב'שימוש חכם בדיגיטל'?</translation>
 <translation id="8118117428362942925">אם צריך עזרה, אפשר לבקש עזרה מהורה (<ph name="PARENT_NAME" />)</translation>
-<translation id="8118151008374483324">‏כדי לקבל גישה לכרטיסיות ולנתונים נוספים בכל המכשירים שלך, כדאי להיכנס ל-Chrome</translation>
+<translation id="8118151008374483324">‏כדי לקבל גישה לכרטיסיות ולפריטים נוספים בכל המכשירים שלך, כדאי להיכנס ל-Chrome</translation>
 <translation id="8120286190326371840">אין במכשיר הזה סיסמאות שנחשפו</translation>
 <translation id="8122623268651408616">בתהליך מיון לפי הפריט החדש ביותר</translation>
 <translation id="8127542551745560481">עריכת דף הבית</translation>
@@ -1960,7 +1961,7 @@
 <translation id="9212845824145208577">אי אפשר לזוז למטה יותר. יש לנסות להתחיל מחלק נמוך יותר בדף.</translation>
 <translation id="9218430445555521422">הגדרה כברירת מחדל</translation>
 <translation id="9219103736887031265">תמונות</translation>
-<translation id="9222198206152536936">כדי לקבל גישה לכרטיסיות ולנתונים נוספים בכל המכשירים שלך, כדאי להיכנס לחשבון <ph name="EMAIL" /></translation>
+<translation id="9222198206152536936">כדי לקבל גישה לכרטיסיות ולפריטים נוספים בכל המכשירים שלך, כדאי להיכנס לחשבון <ph name="EMAIL" /></translation>
 <translation id="924447568950697217">‏הגדר את Chrome בתור דפדפן ברירת המחדל</translation>
 <translation id="926205370408745186">‏הסרת הפעילות שלך ב-Chrome מ'שימוש חכם בדיגיטל'.</translation>
 <translation id="927968626442779827">‏כדאי להשתמש במצב הטעינה המהירה ב-Google Chrome</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
index e5299ef..52e3c33 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
@@ -622,6 +622,7 @@
 <translation id="3710560693796335511">コラボレーション</translation>
 <translation id="3718765429352682176">Chrome でリンクを開く他のアプリの履歴が表示されることがあります。</translation>
 <translation id="3721119614952978349">Google の設定</translation>
+<translation id="3727000368239390918">ログインすると、すべてのデバイスで同じタブやその他の設定を使用できます</translation>
 <translation id="3737319253362202215">翻訳設定</translation>
 <translation id="3738139272394829648">タップして検索</translation>
 <translation id="3739455665973395693">Google アカウントに不正使用されたパスワードはありません</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb
index da4a41b..2fb52d7c 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb
@@ -622,6 +622,7 @@
 <translation id="3710560693796335511">ಕೊಲಬೊರೇಶನ್</translation>
 <translation id="3718765429352682176">Chrome ನಲ್ಲಿ ಇತರ ಆ್ಯಪ್‌ಗಳಿಂದ ತೆರೆಯಲಾದ ಲಿಂಕ್‌ಗಳ ಇತಿಹಾಸವನ್ನು ನೀವು ನೋಡಲು ಸಾಧ್ಯವಾಗಬಹುದು.</translation>
 <translation id="3721119614952978349">ನೀವು ಮತ್ತು Google</translation>
+<translation id="3727000368239390918">ನಿಮ್ಮ ಎಲ್ಲಾ ಸಾಧನಗಳಲ್ಲಿ ನಿಮ್ಮ ಟ್ಯಾಬ್‌ಗಳು ಮತ್ತು ಇತ್ಯಾದಿಗಳನ್ನು ಪಡೆಯಲು ಸೈನ್ ಇನ್ ಮಾಡಿ</translation>
 <translation id="3737319253362202215">ಅನುವಾದ ಸೆಟ್ಟಿಂಗ್‌ಗಳು</translation>
 <translation id="3738139272394829648">ಹುಡುಕಲು ಸ್ಪರ್ಶಿಸಿ</translation>
 <translation id="3739455665973395693">ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಯಾವುದೇ ಅಪಾಯಕ್ಕೀಡಾದ ಪಾಸ್‌ವರ್ಡ್‌ಗಳಿಲ್ಲ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb
index 12bc9fc..3dec1e6 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb
@@ -1926,6 +1926,7 @@
 <translation id="9081543426177426948">ເວັບໄຊທີ່ທ່ານເຂົ້າແມ່ນບໍ່ໄດ້ບັນທຶກໄວ້ໃນໂໝດບໍ່ເປີດເຜີຍຕົວຕົນ</translation>
 <translation id="9086302186042011942">ກໍາລັງຊິງຄ໌</translation>
 <translation id="9086455579313502267">ບໍ່​ສາ​ມາດ​ເຂົ້າ​ຫາເຄືອ​ຂ່າຍໄດ້</translation>
+<translation id="9093915805850895575">ເປີດໃນໜ້າຈໍ Chrome</translation>
 <translation id="909756639352028172">ເພື່ອຮັບປະສົບການໃນການໃຊ້ທີ່ປັບແຕ່ງສ່ວນຕົວຫຼາຍທີ່ສຸດ, ໃຫ້ຮວມ Chrome ໄວ້ໃນການເຄື່ອນໄຫວເວັບ ແລະ ແອັບ ພ້ອມທັງບໍລິການ Google ທີ່ລິ້ງໄວ້</translation>
 <translation id="9099220545925418560">ອີງຕາມປະຫວັດການທ່ອງເວັບຂອງທ່ານ. ການຕັ້ງຄ່ານີ້ປິດຢູ່.</translation>
 <translation id="9100610230175265781">ຕ້ອງມີລະຫັດຜ່ານ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb
index 07f86f47..76aad8ff 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb
@@ -622,6 +622,7 @@
 <translation id="3710560693796335511">Соработка</translation>
 <translation id="3718765429352682176">Можеби ќе ја гледате историјата од други апликации што отвораат линкови во Chrome.</translation>
 <translation id="3721119614952978349">Вие и Google</translation>
+<translation id="3727000368239390918">Најавете се за да ги добиете картичките и друго на сите ваши уреди</translation>
 <translation id="3737319253362202215">Поставки за превод</translation>
 <translation id="3738139272394829648">Допри за пребарување</translation>
 <translation id="3739455665973395693">Нема компромитирани лозинки во вашата сметка на Google</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb
index f013334..ae64a6bb 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb
@@ -622,6 +622,7 @@
 <translation id="3710560693796335511">കൊളാബറേഷൻ</translation>
 <translation id="3718765429352682176">Chrome-ൽ ലിങ്കുകൾ തുറക്കുന്ന മറ്റ് ആപ്പുകളിൽ നിന്നുള്ള ചരിത്രവും നിങ്ങൾ കണ്ടേക്കാം.</translation>
 <translation id="3721119614952978349">നിങ്ങളും Google-ഉം</translation>
+<translation id="3727000368239390918">ടാബുകളും മറ്റും നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും നേടുന്നതിന് സൈൻ ഇൻ ചെയ്യുക</translation>
 <translation id="3737319253362202215">വിവർത്തന ക്രമീകരണം</translation>
 <translation id="3738139272394829648">തിരയാൻ സ്‌പർശിക്കുക</translation>
 <translation id="3739455665973395693">നിങ്ങളുടെ Google Account-ൽ അപഹരിക്കപ്പെട്ട പാസ്‌വേഡുകളൊന്നുമില്ല</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb
index d59ef08..19a503ba 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb
@@ -622,6 +622,7 @@
 <translation id="3710560693796335511">Хамтын ажиллагаа</translation>
 <translation id="3718765429352682176">Chrome-д холбоос нээдэг бусад аппын хөтчийн түүх танд харагдаж болно.</translation>
 <translation id="3721119614952978349">Та болон Google</translation>
+<translation id="3727000368239390918">Таб болон бусад зүйлээ бүх төхөөрөмж дээрээ авахын тулд нэвтэрнэ үү</translation>
 <translation id="3737319253362202215">Орчуулгын тохиргоо</translation>
 <translation id="3738139272394829648">Хайлт хийхийн тулд хүрнэ үү</translation>
 <translation id="3739455665973395693">Таны Google Бүртгэлээс алдагдсан ямар ч нууц үг байхгүй</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb
index 5d7ccca..fb5ca97 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb
@@ -622,6 +622,7 @@
 <translation id="3710560693796335511">Samarbeid</translation>
 <translation id="3718765429352682176">Du kan se loggen fra andre apper som åpner linker i Chrome.</translation>
 <translation id="3721119614952978349">Deg og Google</translation>
+<translation id="3727000368239390918">Logg på for å få blant annet fanene dine på alle enhetene dine</translation>
 <translation id="3737319253362202215">Innstillinger for oversettelse</translation>
 <translation id="3738139272394829648">Trykk for å søke</translation>
 <translation id="3739455665973395693">Ingen kompromitterte passord i Google-kontoen din</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb
index aec71b0..7a9f6c3 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb
@@ -622,6 +622,7 @@
 <translation id="3710560693796335511">ਸਹਿਯੋਗ</translation>
 <translation id="3718765429352682176">ਤੁਸੀਂ ਉਨ੍ਹਾਂ ਹੋਰ ਐਪਾਂ ਦਾ ਇਤਿਹਾਸ ਦੇਖ ਸਕਦੇ ਹੋ, ਜਿਨ੍ਹਾਂ ਦੇ ਲਿੰਕ Chrome ਵਿੱਚ ਖੁੱਲ੍ਹਦੇ ਹਨ।</translation>
 <translation id="3721119614952978349">ਤੁਸੀਂ ਅਤੇ Google</translation>
+<translation id="3727000368239390918">ਆਪਣੇ ਸਾਰੇ ਡੀਵਾਈਸਾਂ 'ਤੇ ਆਪਣੀਆਂ ਟੈਬਾਂ ਅਤੇ ਹੋਰ ਬਹੁਤ ਕੁਝ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਸਾਈਨ-ਇਨ ਕਰੋ</translation>
 <translation id="3737319253362202215">ਅਨੁਵਾਦ ਸੈਟਿੰਗਾਂ</translation>
 <translation id="3738139272394829648">ਖੋਜਣ ਲਈ ਸਪਰਸ਼ ਕਰੋ</translation>
 <translation id="3739455665973395693">ਤੁਹਾਡੇ Google ਖਾਤੇ ਵਿੱਚ ਕੋਈ ਛੇੜਛਾੜ ਵਾਲਾ ਪਾਸਵਰਡ ਨਹੀਂ ਹੈ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb
index 4bc0da3..aeeeddd 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb
@@ -622,6 +622,7 @@
 <translation id="3710560693796335511">Spolupráca</translation>
 <translation id="3718765429352682176">Môžete si zobraziť históriu z iných aplikácií, ktoré otvárajú odkazy v Chrome.</translation>
 <translation id="3721119614952978349">Vy a Google</translation>
+<translation id="3727000368239390918">Prihláste sa, aby ste mali záložky a ďalší obsah k dispozícii vo všetkých svojich zariadeniach</translation>
 <translation id="3737319253362202215">Nastavenia prekladu</translation>
 <translation id="3738139272394829648">Vyhľadávanie klepnutím</translation>
 <translation id="3739455665973395693">Vo svojom účte Google nemáte žiadne odhalené heslá</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb
index cf977ba..746968c 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb
@@ -622,6 +622,7 @@
 <translation id="3710560693796335511">సహకారం</translation>
 <translation id="3718765429352682176">మీరు Chromeలో లింక్‌లను తెరిచే ఇతర యాప్‌ల నుండి హిస్టరీని చూడవచ్చు.</translation>
 <translation id="3721119614952978349">మీరు మరియు Google</translation>
+<translation id="3727000368239390918">మీ డివైజ్‌లన్నింటిలో మీ ఇటీవలి ట్యాబ్‌లతో పాటు, మరిన్ని వివరాలను పొందడానికి సైన్-ఇన్ చేయండి</translation>
 <translation id="3737319253362202215">అనువాద సెట్టింగ్‌లు</translation>
 <translation id="3738139272394829648">వెతకడానికి తాకండి</translation>
 <translation id="3739455665973395693">మీ Google ఖాతాలో చోరీకి గురైన పాస్‌వర్డ్‌లు ఏవీ లేవు</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
index 6cc5b566..4ed61da 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
@@ -622,6 +622,7 @@
 <translation id="3710560693796335511">การทำงานร่วมกัน</translation>
 <translation id="3718765429352682176">คุณอาจเห็นประวัติการเข้าชมจากแอปอื่นๆ ที่เปิดลิงก์ใน Chrome</translation>
 <translation id="3721119614952978349">คุณและ Google</translation>
+<translation id="3727000368239390918">ลงชื่อเข้าใช้เพื่อรับแท็บและอื่นๆ ในอุปกรณ์ทุกเครื่อง</translation>
 <translation id="3737319253362202215">การตั้งค่าการแปล</translation>
 <translation id="3738139272394829648">แตะเพื่อค้นหา</translation>
 <translation id="3739455665973395693">ไม่มีรหัสผ่านที่ถูกละเมิดในบัญชี Google</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
index e89cba5fb..d88e4e49 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
@@ -622,6 +622,7 @@
 <translation id="3710560693796335511">協作</translation>
 <translation id="3718765429352682176">你可查看透過其他應用程式在 Chrome 中開啟連結的記錄。</translation>
 <translation id="3721119614952978349">您和 Google</translation>
+<translation id="3727000368239390918">登入帳戶即可在任何裝置上存取自己的分頁及其他內容</translation>
 <translation id="3737319253362202215">翻譯設定</translation>
 <translation id="3738139272394829648">輕觸搜尋</translation>
 <translation id="3739455665973395693">Google 帳戶中沒有被盜用的密碼</translation>
diff --git a/chrome/browser/ui/ash/app_icon_color_cache/app_icon_color_cache.cc b/chrome/browser/ui/ash/app_icon_color_cache/app_icon_color_cache.cc
index 240e6fb9..5a7ae7a 100644
--- a/chrome/browser/ui/ash/app_icon_color_cache/app_icon_color_cache.cc
+++ b/chrome/browser/ui/ash/app_icon_color_cache/app_icon_color_cache.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/browser/ui/ash/app_icon_color_cache/app_icon_color_cache.h"
 
 #include <array>
@@ -16,6 +11,7 @@
 
 #include "ash/constants/ash_pref_names.h"
 #include "ash/public/cpp/app_list/app_list_types.h"
+#include "base/compiler_specific.h"
 #include "base/feature_list.h"
 #include "base/no_destructor.h"
 #include "base/trace_event/trace_event.h"
@@ -245,7 +241,7 @@
   // icon.
   const SkColor* current =
       reinterpret_cast<SkColor*>(source.getAddr32(0, height / 2));
-  for (int x = 0; x < width; ++x, ++current) {
+  for (int x = 0; x < width; ++x, UNSAFE_TODO(++current)) {
     if (SkColorGetA(*current) < SK_AlphaOPAQUE) {
       continue;
     }
@@ -256,7 +252,7 @@
   // Find the color group for the first opaque pixel on the right edge of the
   // icon.
   current = reinterpret_cast<SkColor*>(source.getAddr32(width - 1, height / 2));
-  for (int x = width - 1; x >= 0; --x, --current) {
+  for (int x = width - 1; x >= 0; --x, UNSAFE_TODO(--current)) {
     if (SkColorGetA(*current) < SK_AlphaOPAQUE) {
       continue;
     }
@@ -275,7 +271,7 @@
   sync_pb::AppListSpecifics::ColorGroup top_group = sync_pb::AppListSpecifics::
       ColorGroup::AppListSpecifics_ColorGroup_COLOR_BLACK;
   current = reinterpret_cast<SkColor*>(source.getAddr32(width / 2, 0));
-  for (int y = 0; y < height; ++y, current += width) {
+  for (int y = 0; y < height; ++y, UNSAFE_TODO(current += width)) {
     if (SkColorGetA(*current) < SK_AlphaOPAQUE) {
       continue;
     }
diff --git a/chrome/browser/ui/ash/clipboard/clipboard_history_browsertest.cc b/chrome/browser/ui/ash/clipboard/clipboard_history_browsertest.cc
index 3993261..9a997a3 100644
--- a/chrome/browser/ui/ash/clipboard/clipboard_history_browsertest.cc
+++ b/chrome/browser/ui/ash/clipboard/clipboard_history_browsertest.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "ash/clipboard/clipboard_history.h"
 
 #include <iterator>
@@ -26,6 +21,7 @@
 #include "ash/shell.h"
 #include "ash/test/ash_test_util.h"
 #include "ash/test/view_drawn_waiter.h"
+#include "base/compiler_specific.h"
 #include "base/containers/adapters.h"
 #include "base/memory/raw_ptr.h"
 #include "base/scoped_observation.h"
@@ -185,7 +181,7 @@
       return false;
     }
     ++items_iter;
-    ++texts_iter;
+    UNSAFE_TODO(++texts_iter);
   }
 
   return true;
diff --git a/chrome/browser/ui/ash/input_method/candidate_view_unittest.cc b/chrome/browser/ui/ash/input_method/candidate_view_unittest.cc
index 60b622f..df2c4d2 100644
--- a/chrome/browser/ui/ash/input_method/candidate_view_unittest.cc
+++ b/chrome/browser/ui/ash/input_method/candidate_view_unittest.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/browser/ui/ash/input_method/candidate_view.h"
 
 #include <stddef.h>
@@ -14,6 +9,7 @@
 #include <algorithm>
 
 #include "base/check.h"
+#include "base/compiler_specific.h"
 #include "base/memory/raw_ptr.h"
 #include "base/strings/utf_string_conversions.h"
 #include "ui/accessibility/ax_enums.mojom.h"
@@ -67,7 +63,7 @@
       CandidateView* candidate = new CandidateView(
           views::Button::PressedCallback(), ui::CandidateWindow::VERTICAL);
       ui::CandidateWindow::Entry entry;
-      entry.value = base::UTF8ToUTF16(kDummyCandidates[i]);
+      entry.value = base::UTF8ToUTF16(UNSAFE_TODO(kDummyCandidates[i]));
       candidate->SetEntry(entry);
       container_->AddChildViewRaw(candidate);
     }
diff --git a/chrome/browser/ui/ash/input_method/candidate_window_view_unittest.cc b/chrome/browser/ui/ash/input_method/candidate_window_view_unittest.cc
index dcc6fe99..59842a4 100644
--- a/chrome/browser/ui/ash/input_method/candidate_window_view_unittest.cc
+++ b/chrome/browser/ui/ash/input_method/candidate_window_view_unittest.cc
@@ -2,17 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/browser/ui/ash/input_method/candidate_window_view.h"
 
 #include <stddef.h>
 
 #include <string>
 
+#include "base/compiler_specific.h"
 #include "base/memory/raw_ptr.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
@@ -224,10 +220,10 @@
     candidate_window.set_orientation(ui::CandidateWindow::VERTICAL);
     for (size_t i = 0; i < kPageSize; ++i) {
       ui::CandidateWindow::Entry entry;
-      entry.value = kSampleCandidate[i];
-      entry.annotation = kSampleAnnotation[i];
-      entry.description_title = kSampleDescriptionTitle[i];
-      entry.description_body = kSampleDescriptionBody[i];
+      entry.value = UNSAFE_TODO(kSampleCandidate[i]);
+      entry.annotation = UNSAFE_TODO(kSampleAnnotation[i]);
+      entry.description_title = UNSAFE_TODO(kSampleDescriptionTitle[i]);
+      entry.description_body = UNSAFE_TODO(kSampleDescriptionBody[i]);
       entry.label = kEmptyLabel;
       candidate_window.mutable_candidates()->push_back(entry);
     }
@@ -236,8 +232,8 @@
 
     ASSERT_EQ(kPageSize, GetCandidatesSize());
     for (size_t i = 0; i < kPageSize; ++i) {
-      ExpectLabels(kEmptyLabel, kSampleCandidate[i], kSampleAnnotation[i],
-                   GetCandidateAt(i));
+      ExpectLabels(kEmptyLabel, UNSAFE_TODO(kSampleCandidate[i]),
+                   UNSAFE_TODO(kSampleAnnotation[i]), GetCandidateAt(i));
     }
   }
   {
@@ -250,10 +246,10 @@
     candidate_window.set_orientation(ui::CandidateWindow::HORIZONTAL);
     for (size_t i = 0; i < kPageSize; ++i) {
       ui::CandidateWindow::Entry entry;
-      entry.value = kSampleCandidate[i];
-      entry.annotation = kSampleAnnotation[i];
-      entry.description_title = kSampleDescriptionTitle[i];
-      entry.description_body = kSampleDescriptionBody[i];
+      entry.value = UNSAFE_TODO(kSampleCandidate[i]);
+      entry.annotation = UNSAFE_TODO(kSampleAnnotation[i]);
+      entry.description_title = UNSAFE_TODO(kSampleDescriptionTitle[i]);
+      entry.description_body = UNSAFE_TODO(kSampleDescriptionBody[i]);
       entry.label = kEmptyLabel;
       candidate_window.mutable_candidates()->push_back(entry);
     }
@@ -263,8 +259,8 @@
     ASSERT_EQ(kPageSize, GetCandidatesSize());
     // Confirm actual labels not containing ".".
     for (size_t i = 0; i < kPageSize; ++i) {
-      ExpectLabels(kEmptyLabel, kSampleCandidate[i], kSampleAnnotation[i],
-                   GetCandidateAt(i));
+      ExpectLabels(kEmptyLabel, UNSAFE_TODO(kSampleCandidate[i]),
+                   UNSAFE_TODO(kSampleAnnotation[i]), GetCandidateAt(i));
     }
   }
   {
@@ -276,11 +272,11 @@
     candidate_window.set_orientation(ui::CandidateWindow::VERTICAL);
     for (size_t i = 0; i < kPageSize; ++i) {
       ui::CandidateWindow::Entry entry;
-      entry.value = kSampleCandidate[i];
-      entry.annotation = kSampleAnnotation[i];
-      entry.description_title = kSampleDescriptionTitle[i];
-      entry.description_body = kSampleDescriptionBody[i];
-      entry.label = kCustomizedLabel[i];
+      entry.value = UNSAFE_TODO(kSampleCandidate[i]);
+      entry.annotation = UNSAFE_TODO(kSampleAnnotation[i]);
+      entry.description_title = UNSAFE_TODO(kSampleDescriptionTitle[i]);
+      entry.description_body = UNSAFE_TODO(kSampleDescriptionBody[i]);
+      entry.label = UNSAFE_TODO(kCustomizedLabel[i]);
       candidate_window.mutable_candidates()->push_back(entry);
     }
 
@@ -289,8 +285,9 @@
     ASSERT_EQ(kPageSize, GetCandidatesSize());
     // Confirm actual labels not containing ".".
     for (size_t i = 0; i < kPageSize; ++i) {
-      ExpectLabels(kCustomizedLabel[i], kSampleCandidate[i],
-                   kSampleAnnotation[i], GetCandidateAt(i));
+      ExpectLabels(UNSAFE_TODO(kCustomizedLabel[i]),
+                   UNSAFE_TODO(kSampleCandidate[i]),
+                   UNSAFE_TODO(kSampleAnnotation[i]), GetCandidateAt(i));
     }
   }
   {
@@ -302,11 +299,11 @@
     candidate_window.set_orientation(ui::CandidateWindow::HORIZONTAL);
     for (size_t i = 0; i < kPageSize; ++i) {
       ui::CandidateWindow::Entry entry;
-      entry.value = kSampleCandidate[i];
-      entry.annotation = kSampleAnnotation[i];
-      entry.description_title = kSampleDescriptionTitle[i];
-      entry.description_body = kSampleDescriptionBody[i];
-      entry.label = kCustomizedLabel[i];
+      entry.value = UNSAFE_TODO(kSampleCandidate[i]);
+      entry.annotation = UNSAFE_TODO(kSampleAnnotation[i]);
+      entry.description_title = UNSAFE_TODO(kSampleDescriptionTitle[i]);
+      entry.description_body = UNSAFE_TODO(kSampleDescriptionBody[i]);
+      entry.label = UNSAFE_TODO(kCustomizedLabel[i]);
       candidate_window.mutable_candidates()->push_back(entry);
     }
 
@@ -315,8 +312,9 @@
     ASSERT_EQ(kPageSize, GetCandidatesSize());
     // Confirm actual labels not containing ".".
     for (size_t i = 0; i < kPageSize; ++i) {
-      ExpectLabels(kExpectedHorizontalCustomizedLabel[i], kSampleCandidate[i],
-                   kSampleAnnotation[i], GetCandidateAt(i));
+      ExpectLabels(UNSAFE_TODO(kExpectedHorizontalCustomizedLabel[i]),
+                   UNSAFE_TODO(kSampleCandidate[i]),
+                   UNSAFE_TODO(kSampleAnnotation[i]), GetCandidateAt(i));
     }
   }
 }
diff --git a/chrome/browser/ui/ash/projector/pending_screencast_manager_browsertest.cc b/chrome/browser/ui/ash/projector/pending_screencast_manager_browsertest.cc
index e5ce9e5f5..bbfd1f1 100644
--- a/chrome/browser/ui/ash/projector/pending_screencast_manager_browsertest.cc
+++ b/chrome/browser/ui/ash/projector/pending_screencast_manager_browsertest.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/browser/ui/ash/projector/pending_screencast_manager.h"
 
 #include <memory>
@@ -16,6 +11,7 @@
 #include "ash/webui/projector_app/projector_app_client.h"
 #include "ash/webui/projector_app/public/cpp/projector_app_constants.h"
 #include "ash/webui/projector_app/test/mock_xhr_sender.h"
+#include "base/compiler_specific.h"
 #include "base/files/file.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
@@ -180,9 +176,9 @@
 
     base::File file(folder_path.Append(relative_file_path.BaseName()),
                     base::File::FLAG_CREATE | base::File::FLAG_WRITE);
-    EXPECT_EQ(static_cast<int>(file_content.size()),
-              file.Write(/*offset=*/0, file_content.data(),
-                         /*size=*/file_content.size()));
+    UNSAFE_TODO(EXPECT_EQ(static_cast<int>(file_content.size()),
+                          file.Write(/*offset=*/0, file_content.data(),
+                                     /*size=*/file_content.size())));
     EXPECT_TRUE(file.IsValid());
     file.Close();
   }
diff --git a/chrome/browser/ui/ash/shelf/arc_app_shelf_browsertest.cc b/chrome/browser/ui/ash/shelf/arc_app_shelf_browsertest.cc
index c5ec880..4942e60 100644
--- a/chrome/browser/ui/ash/shelf/arc_app_shelf_browsertest.cc
+++ b/chrome/browser/ui/ash/shelf/arc_app_shelf_browsertest.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include <memory>
 #include <string>
 #include <tuple>
@@ -19,6 +14,7 @@
 #include "ash/shelf/shelf_view_test_api.h"
 #include "ash/shell.h"
 #include "ash/system/status_area_widget_test_helper.h"
+#include "base/compiler_specific.h"
 #include "base/functional/callback_helpers.h"
 #include "base/run_loop.h"
 #include "base/strings/stringprintf.h"
@@ -765,13 +761,14 @@
 
   // Second logical window
   for (int task_id = 3; task_id <= 5; task_id++) {
-    app_host()->OnTaskCreated(
-        task_id, info->package_name, info->activity, info->name,
-        CreateIntentUriWithShelfGroupAndLogicalWindow(
-            kTestShelfGroups[task_id], kTestLogicalWindows[task_id]),
-        0 /* session_id */);
+    app_host()->OnTaskCreated(task_id, info->package_name, info->activity,
+                              info->name,
+                              CreateIntentUriWithShelfGroupAndLogicalWindow(
+                                  UNSAFE_TODO(kTestShelfGroups[task_id]),
+                                  UNSAFE_TODO(kTestLogicalWindows[task_id])),
+                              0 /* session_id */);
     app_host()->OnTaskDescriptionChanged(
-        task_id, kTestWindowTitles[task_id],
+        task_id, UNSAFE_TODO(kTestWindowTitles[task_id]),
         arc_instance()->GenerateIconResponse(kGeneratedIconSize,
                                              false /* app_icon */),
         0, 0);
diff --git a/chrome/browser/ui/ash/shelf/chrome_shelf_controller_unittest.cc b/chrome/browser/ui/ash/shelf/chrome_shelf_controller_unittest.cc
index f154ac3..72e53a7 100644
--- a/chrome/browser/ui/ash/shelf/chrome_shelf_controller_unittest.cc
+++ b/chrome/browser/ui/ash/shelf/chrome_shelf_controller_unittest.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/browser/ui/ash/shelf/chrome_shelf_controller.h"
 
 #include <stddef.h>
@@ -40,6 +35,7 @@
 #include "base/check_deref.h"
 #include "base/check_op.h"
 #include "base/command_line.h"
+#include "base/compiler_specific.h"
 #include "base/containers/contains.h"
 #include "base/containers/flat_map.h"
 #include "base/feature_list.h"
@@ -3659,7 +3655,7 @@
   auto items = controller->GetAppMenuItemsForTesting(item);
   ASSERT_EQ(expected_item_count, items.size());
   for (size_t i = 0; i < expected_item_count; i++) {
-    EXPECT_EQ(expected_item_titles[i], items[i].title);
+    UNSAFE_TODO(EXPECT_EQ(expected_item_titles[i], items[i].title));
   }
 }
 
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client_interactive_uitest.cc b/chrome/browser/ui/autofill/chrome_autofill_client_interactive_uitest.cc
index 3fcad2f3..3f616fe 100644
--- a/chrome/browser/ui/autofill/chrome_autofill_client_interactive_uitest.cc
+++ b/chrome/browser/ui/autofill/chrome_autofill_client_interactive_uitest.cc
@@ -11,6 +11,7 @@
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/browser_window/public/browser_window_features.h"
 #include "chrome/browser/ui/user_education/browser_user_education_interface.h"
+#include "chrome/common/webui_url_constants.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/autofill/content/browser/content_autofill_driver.h"
@@ -27,6 +28,7 @@
 #include "components/autofill/core/browser/ui/autofill_external_delegate.h"
 #include "components/autofill/core/browser/ui/popup_open_enums.h"
 #include "components/autofill/core/common/aliases.h"
+#include "components/autofill/core/common/autofill_features.h"
 #include "components/autofill/core/common/autofill_test_utils.h"
 #include "components/autofill/core/common/form_data.h"
 #include "components/autofill/core/common/form_data_test_api.h"
@@ -252,5 +254,33 @@
       autofill_metrics::AutofillSettingsReferrer::kFillingFlowDropdown, 2);
 }
 
+class ChromeAutofillClientYourSavedInfoTest
+    : public ChromeAutofillClientBrowserTest {
+ public:
+  void SetUpInProcessBrowserTestFixture() override {
+    ChromeAutofillClientBrowserTest::SetUpInProcessBrowserTestFixture();
+    feature_list_.InitAndEnableFeature(
+        autofill::features::kYourSavedInfoSettingsPage);
+  }
+
+ private:
+  base::test::ScopedFeatureList feature_list_;
+};
+
+IN_PROC_BROWSER_TEST_F(ChromeAutofillClientYourSavedInfoTest,
+                       ShowAutofillSettings_NavigatesToYourSavedInfo) {
+  base::HistogramTester histogram_tester;
+  client()->ShowAutofillSettings(SuggestionType::kManageAutofillAi);
+
+  histogram_tester.ExpectUniqueSample(
+      "Autofill.YourSavedInfoSettingsPage.VisitReferrer",
+      autofill_metrics::AutofillSettingsReferrer::kFillingFlowDropdown, 1);
+  content::WebContents* active_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  EXPECT_EQ(
+      active_contents->GetVisibleURL(),
+      GURL(std::string("chrome://settings/") + chrome::kYourSavedInfoSubPage));
+}
+
 }  // namespace
 }  // namespace autofill
diff --git a/chrome/browser/ui/browser_command_controller_browsertest.cc b/chrome/browser/ui/browser_command_controller_browsertest.cc
index f80316c..724b148e 100644
--- a/chrome/browser/ui/browser_command_controller_browsertest.cc
+++ b/chrome/browser/ui/browser_command_controller_browsertest.cc
@@ -41,6 +41,7 @@
 #include "chrome/test/base/test_browser_window.h"
 #include "chrome/test/base/testing_profile_manager.h"
 #include "chrome/test/base/ui_test_utils.h"
+#include "components/autofill/core/common/autofill_features.h"
 #include "components/commerce/core/commerce_feature_list.h"
 #include "components/search_engines/template_url_service.h"
 #include "components/sessions/core/tab_restore_service.h"
@@ -653,6 +654,34 @@
       IDC_ADD_TO_COMPARISON_TABLE_MENU));
 }
 
+// Tests for Your saved info submenu.
+class BrowserCommandControllerBrowserTestYourSavedInfo
+    : public BrowserCommandControllerBrowserTest {
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_{
+      autofill::features::kYourSavedInfoSettingsPage};
+};
+
+IN_PROC_BROWSER_TEST_F(BrowserCommandControllerBrowserTestYourSavedInfo,
+                       ExecuteShowIdentityDocs) {
+  EXPECT_TRUE(chrome::ExecuteCommand(browser(), IDC_SHOW_IDENTITY_DOCS));
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  content::WaitForLoadStop(web_contents);
+  EXPECT_EQ(web_contents->GetURL().possibly_invalid_spec(),
+            "chrome://settings/identityDocs");
+}
+
+IN_PROC_BROWSER_TEST_F(BrowserCommandControllerBrowserTestYourSavedInfo,
+                       ExecuteShowTravel) {
+  EXPECT_TRUE(chrome::ExecuteCommand(browser(), IDC_SHOW_TRAVEL));
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  content::WaitForLoadStop(web_contents);
+  EXPECT_EQ(web_contents->GetURL().possibly_invalid_spec(),
+            "chrome://settings/travel");
+}
+
 #if BUILDFLAG(ENABLE_GLIC)
 class BrowserCommandControllerBrowserTestGlic
     : public BrowserCommandControllerBrowserTest {
diff --git a/chrome/browser/ui/passwords/password_change_ui_controller.cc b/chrome/browser/ui/passwords/password_change_ui_controller.cc
index 4bf01a90..92f54e5 100644
--- a/chrome/browser/ui/passwords/password_change_ui_controller.cc
+++ b/chrome/browser/ui/passwords/password_change_ui_controller.cc
@@ -81,7 +81,6 @@
     case PasswordChangeDelegate::State::kCanceled:
     case PasswordChangeDelegate::State::kNoState:
     case PasswordChangeDelegate::State::kLoginFormDetected:
-    case PasswordChangeDelegate::State::kLoginFormDetectedUserCanContinue:
       NOTREACHED();
   }
 }
@@ -102,12 +101,6 @@
       base::UmaHistogramEnumeration(
           "PasswordManager.PasswordChange.WaitingForUserSignInToast", event);
       return;
-    case PasswordChangeDelegate::State::kLoginFormDetectedUserCanContinue:
-      base::UmaHistogramEnumeration(
-          "PasswordManager.PasswordChange."
-          "WaitingForUserSignInToastWithContinue",
-          event);
-      return;
     case PasswordChangeDelegate::State::kCanceled:
       base::UmaHistogramEnumeration(
           "PasswordManager.PasswordChange.CanceledToast", event);
@@ -369,14 +362,10 @@
       return ToastOptions(
           l10n_util::GetStringUTF16(
               IDS_PASSWORD_MANAGER_UI_PASSWORD_CHANGE_TOAST_SIGN_IN_TO_CONTINUE),
-          views::kInfoChromeRefreshIcon, std::move(cancel_toast_callback));
-    case PasswordChangeDelegate::State::kLoginFormDetectedUserCanContinue:
-      return ToastOptions(
-          l10n_util::GetStringUTF16(
-              IDS_PASSWORD_MANAGER_UI_PASSWORD_CHANGE_TOAST_SIGN_IN_TO_CONTINUE),
           views::kInfoChromeRefreshIcon, std::move(cancel_toast_callback),
-          l10n_util::GetStringUTF16(IDS_CONTINUE),
-          base::BindOnce(&PasswordChangeUIController::SkipLoginCheck,
+          l10n_util::GetStringUTF16(
+              IDS_PASSWORD_MANAGER_UI_PASSWORD_CHANGE_TOAST_RETRY_BUTTON),
+          base::BindOnce(&PasswordChangeUIController::RetryLoginCheck,
                          weak_ptr_factory_.GetWeakPtr()));
     case PasswordChangeDelegate::State::kNoState:
       NOTREACHED();
@@ -528,12 +517,11 @@
       NavigateParams::IGNORE_AND_NAVIGATE);
 }
 
-void PasswordChangeUIController::SkipLoginCheck() {
+void PasswordChangeUIController::RetryLoginCheck() {
   CHECK(password_change_delegate_);
-  LogToastEvent(
-      PasswordChangeDelegate::State::kLoginFormDetectedUserCanContinue,
-      PasswordChangeToastEvent::kContinue);
-  password_change_delegate_->OnUserSkippedLoginCheck();
+  LogToastEvent(PasswordChangeDelegate::State::kLoginFormDetected,
+                PasswordChangeToastEvent::kRetry);
+  password_change_delegate_->RetryLoginCheck();
 }
 
 void PasswordChangeUIController::CloseDialogWidget(
diff --git a/chrome/browser/ui/passwords/password_change_ui_controller.h b/chrome/browser/ui/passwords/password_change_ui_controller.h
index 986b3ac..38b2334 100644
--- a/chrome/browser/ui/passwords/password_change_ui_controller.h
+++ b/chrome/browser/ui/passwords/password_change_ui_controller.h
@@ -40,7 +40,8 @@
   kCanceled = 1,
   kContinue = 2,
   kOpenPasswordChangeTab = 3,
-  kMaxValue = kOpenPasswordChangeTab,
+  kRetry = 4,
+  kMaxValue = kRetry,
 };
 // LINT.ThenChange(/tools/metrics/histograms/metadata/password/enums.xml:PasswordChangeToastEvent)
 
@@ -78,7 +79,7 @@
   void OnPrivacyNoticeAccepted();
   void ShowPasswordDetails();
   void NavigateToPasswordChangeSettings();
-  void SkipLoginCheck();
+  void RetryLoginCheck();
 
   // Closes the dialog or widget and logs the `reason`.
   // TODO(crbug.com/407504591): Actually log the reason.
diff --git a/chrome/browser/ui/passwords/password_change_ui_controller_browsertest.cc b/chrome/browser/ui/passwords/password_change_ui_controller_browsertest.cc
index f7100de..05dd442 100644
--- a/chrome/browser/ui/passwords/password_change_ui_controller_browsertest.cc
+++ b/chrome/browser/ui/passwords/password_change_ui_controller_browsertest.cc
@@ -271,17 +271,16 @@
 
 IN_PROC_BROWSER_TEST_F(PasswordChangeUIControllerBrowserTest,
                        WaitingForSignInToastClickedContinue) {
-  UpdateState(PasswordChangeDelegate::State::kLoginFormDetectedUserCanContinue);
+  UpdateState(PasswordChangeDelegate::State::kLoginFormDetected);
 
-  EXPECT_CALL(delegate_, OnUserSkippedLoginCheck);
+  EXPECT_CALL(delegate_, RetryLoginCheck);
   views::test::ButtonTestApi clicker(GetToastActionButton());
   clicker.NotifyClick(ui::test::TestEvent());
 
-  EXPECT_THAT(
-      histogram_tester_.GetAllSamples("PasswordManager.PasswordChange."
-                                      "WaitingForUserSignInToastWithContinue"),
-      ElementsAre(Bucket(PasswordChangeToastEvent::kShown, 1),
-                  Bucket(PasswordChangeToastEvent::kContinue, 1)));
+  EXPECT_THAT(histogram_tester_.GetAllSamples(
+                  "PasswordManager.PasswordChange.WaitingForUserSignInToast"),
+              ElementsAre(Bucket(PasswordChangeToastEvent::kShown, 1),
+                          Bucket(PasswordChangeToastEvent::kRetry, 1)));
 }
 
 IN_PROC_BROWSER_TEST_F(PasswordChangeUIControllerBrowserTest,
diff --git a/chrome/browser/ui/toolbar/app_menu_model.cc b/chrome/browser/ui/toolbar/app_menu_model.cc
index 51026331..77121f4 100644
--- a/chrome/browser/ui/toolbar/app_menu_model.cc
+++ b/chrome/browser/ui/toolbar/app_menu_model.cc
@@ -676,6 +676,10 @@
           command_id = IDC_SHOW_SYNC_SETTINGS;
           icon = &vector_icons::kErrorOutlineIcon;
           break;
+        case syncer::SyncService::UserActionableError::kBookmarksLimitExceeded:
+          // TODO(crbug.com/452968646): Adjust this with providing the concrete
+          // help center article link.
+          break;
       }
       AddItemWithStringIdAndVectorIcon(this, command_id, button_string_id,
                                        *icon);
diff --git a/chrome/browser/ui/views/location_bar/location_bar_view.h b/chrome/browser/ui/views/location_bar/location_bar_view.h
index 0298dd6..507ca627 100644
--- a/chrome/browser/ui/views/location_bar/location_bar_view.h
+++ b/chrome/browser/ui/views/location_bar/location_bar_view.h
@@ -137,6 +137,8 @@
   // Initializes the LocationBarView.
   void Init();
 
+  bool in_popup_state_transition() const { return in_popup_state_transition_; }
+
   // True if this instance has been initialized by calling Init, which can only
   // be called when the receiving instance is attached to a view container.
   bool IsInitialized() const;
diff --git a/chrome/browser/ui/views/omnibox/omnibox_popup_aim_presenter.cc b/chrome/browser/ui/views/omnibox/omnibox_popup_aim_presenter.cc
index 95a99a3..b5bd313 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_popup_aim_presenter.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_popup_aim_presenter.cc
@@ -42,7 +42,8 @@
   // menu is an child widget so this popup widget is still considered active. We
   // will not hide the popup.
   if (!active && controller_->popup_state_manager()->popup_state() ==
-                     OmniboxPopupState::kAim) {
+                     OmniboxPopupState::kAim &&
+                    !location_bar_view()->in_popup_state_transition()) {
     controller_->popup_state_manager()->SetPopupState(OmniboxPopupState::kNone);
   }
 }
diff --git a/chrome/browser/ui/views/omnibox/omnibox_popup_presenter_base.cc b/chrome/browser/ui/views/omnibox/omnibox_popup_presenter_base.cc
index e2dde6b..40f2db4 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_popup_presenter_base.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_popup_presenter_base.cc
@@ -42,7 +42,7 @@
   widget_->ShowInactive();
 
   if (auto* content = GetWebUIContent()) {
-    SetWidgetContentHeight(content->GetPreferredSize().height());
+    SetWidgetBounds(content->GetPreferredSize().height());
     content->GetWebContents()->WasShown();
     if (ShouldReceiveFocus()) {
       widget_->Activate();
@@ -67,7 +67,7 @@
   return widget_ && widget_->IsVisible();
 }
 
-void OmniboxPopupPresenterBase::SetWidgetContentHeight(int content_height) {
+void OmniboxPopupPresenterBase::SetWidgetBounds(int content_height) {
   if (widget_) {
     // The width is known, and is the basis for consistent web content rendering
     // so width is specified exactly; then only height adjusts dynamically.
diff --git a/chrome/browser/ui/views/omnibox/omnibox_popup_presenter_base.h b/chrome/browser/ui/views/omnibox/omnibox_popup_presenter_base.h
index e65de5d..d2626bf 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_popup_presenter_base.h
+++ b/chrome/browser/ui/views/omnibox/omnibox_popup_presenter_base.h
@@ -46,7 +46,10 @@
   // Tells whether the popup widget exists.
   bool IsShown() const;
 
-  void SetWidgetContentHeight(int content_height);
+  // Updates the widget's bounds to anchor it to the LocationBarView. The width
+  // is determined by the location bar's width, while the height is
+  // provided by the WebUI content.
+  void SetWidgetBounds(int content_height);
 
   // Returns the currently "active" Popup content, whichever one is visible or
   // going to be visible within the popup.
diff --git a/chrome/browser/ui/views/omnibox/omnibox_popup_webui_base_content.cc b/chrome/browser/ui/views/omnibox/omnibox_popup_webui_base_content.cc
index 11d3ae2..c7843205 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_popup_webui_base_content.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_popup_webui_base_content.cc
@@ -113,7 +113,7 @@
     const gfx::Size& new_size) {
   WebView::ResizeDueToAutoResize(source, new_size);
   if (GetVisible()) {
-    popup_presenter_->SetWidgetContentHeight(new_size.height());
+    popup_presenter_->SetWidgetBounds(new_size.height());
   }
 }
 
diff --git a/chrome/browser/ui/views/omnibox/omnibox_view_views_browsertest.cc b/chrome/browser/ui/views/omnibox/omnibox_view_views_browsertest.cc
index f827d054..0cb4496 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_view_views_browsertest.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_view_views_browsertest.cc
@@ -2,15 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/browser/ui/views/omnibox/omnibox_view_views.h"
 
 #include <stddef.h>
 
+#include "base/compiler_specific.h"
 #include "base/feature_list.h"
 #include "base/memory/raw_ptr.h"
 #include "base/strings/utf_string_conversions.h"
@@ -988,7 +984,7 @@
     size_t count = array_upper_bound - array_lower_bound + 1;
     ASSERT_EQ(expected_property_values.size(), count);
     for (size_t i = 0; i < count; ++i) {
-      EXPECT_EQ(array_data[i], expected_property_values[i]);
+      EXPECT_EQ(UNSAFE_TODO(array_data[i]), expected_property_values[i]);
     }
     ASSERT_HRESULT_SUCCEEDED(::SafeArrayUnaccessData(safearray));
   }
diff --git a/chrome/browser/ui/views/profiles/avatar_toolbar_button_state_manager.cc b/chrome/browser/ui/views/profiles/avatar_toolbar_button_state_manager.cc
index e2c9218c..11da6274 100644
--- a/chrome/browser/ui/views/profiles/avatar_toolbar_button_state_manager.cc
+++ b/chrome/browser/ui/views/profiles/avatar_toolbar_button_state_manager.cc
@@ -877,6 +877,7 @@
         return;
       case ButtonState::kUpgradeClientError:
       case ButtonState::kPassphraseError:
+      case ButtonState::kBookmarksLimitExceeded:
       case ButtonState::kSyncError:
       case ButtonState::kSigninPending:
       case ButtonState::kSyncPaused:
@@ -916,6 +917,7 @@
       case ButtonState::kUpgradeClientError:
       case ButtonState::kPasskeysLockedError:
       case ButtonState::kPassphraseError:
+      case ButtonState::kBookmarksLimitExceeded:
         break;
     }
   }
@@ -1424,6 +1426,25 @@
   ~PassphraseErrorStateProvider() override = default;
 };
 
+class BookmarksLimitExceededStateProvider : public SyncErrorBaseStateProvider {
+ public:
+  explicit BookmarksLimitExceededStateProvider(Profile* profile,
+                                               StateObserver* state_observer)
+      : SyncErrorBaseStateProvider(
+            profile,
+            state_observer,
+            syncer::SyncService::UserActionableError::kBookmarksLimitExceeded) {
+  }
+
+  ~BookmarksLimitExceededStateProvider() override = default;
+
+  // StateProvider:
+  std::u16string GetText() const override {
+    return l10n_util::GetStringUTF16(
+        IDS_AVATAR_BUTTON_SYNC_ERROR_BOOKMARKS_LIMIT_EXCEEDED);
+  }
+};
+
 class GenericSyncErrorStateProvider : public SyncErrorBaseStateProvider {
  public:
   explicit GenericSyncErrorStateProvider(Profile* profile,
@@ -1931,6 +1952,10 @@
         std::make_unique<PassphraseErrorStateProvider>(profile,
                                                        /*state_observer=*/this);
 
+    states_[ButtonState::kBookmarksLimitExceeded] =
+        std::make_unique<BookmarksLimitExceededStateProvider>(
+            profile, /*state_observer=*/this);
+
     if (AccountConsistencyModeManager::IsDiceEnabledForProfile(profile)) {
       states_[ButtonState::kSyncPaused] =
           std::make_unique<SyncPausedStateProvider>(profile,
diff --git a/chrome/browser/ui/views/profiles/avatar_toolbar_button_state_manager.h b/chrome/browser/ui/views/profiles/avatar_toolbar_button_state_manager.h
index bde10fc..aae6df0 100644
--- a/chrome/browser/ui/views/profiles/avatar_toolbar_button_state_manager.h
+++ b/chrome/browser/ui/views/profiles/avatar_toolbar_button_state_manager.h
@@ -155,6 +155,7 @@
     kSyncPaused,
     kUpgradeClientError,
     kPassphraseError,
+    kBookmarksLimitExceeded,
     // Catch-all for remaining errors in sync-the-feature or sync-the-transport.
     kSyncError,
 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view.cc b/chrome/browser/ui/views/profiles/profile_menu_view.cc
index 16b1d8c9..5c9e51ac 100644
--- a/chrome/browser/ui/views/profiles/profile_menu_view.cc
+++ b/chrome/browser/ui/views/profiles/profile_menu_view.cc
@@ -386,6 +386,10 @@
     case syncer::SyncService::UserActionableError::kNeedsSettingsConfirmation:
       chrome::ShowSettingsSubPage(&browser(), chrome::kSyncSetupSubPage);
       break;
+    case syncer::SyncService::UserActionableError::kBookmarksLimitExceeded:
+      // TODO(crbug.com/452968646): Adjust this with providing the concrete
+      // help center article link.
+      break;
     case syncer::SyncService::UserActionableError::kNone:
       NOTREACHED();
   }
diff --git a/chrome/browser/ui/views/tabs/tab_strip_action_container_browsertest.cc b/chrome/browser/ui/views/tabs/tab_strip_action_container_browsertest.cc
index cdba5283..82c8a761 100644
--- a/chrome/browser/ui/views/tabs/tab_strip_action_container_browsertest.cc
+++ b/chrome/browser/ui/views/tabs/tab_strip_action_container_browsertest.cc
@@ -12,6 +12,7 @@
 #include "base/test/metrics/user_action_tester.h"
 #include "base/test/run_until.h"
 #include "base/test/scoped_feature_list.h"
+#include "base/test/test_future.h"
 #include "chrome/browser/actor/actor_keyed_service.h"
 #include "chrome/browser/actor/actor_policy_checker.h"
 #include "chrome/browser/actor/ui/actor_ui_state_manager_interface.h"
@@ -35,11 +36,13 @@
 #include "chrome/browser/ui/views/tabs/glic_actor_task_icon.h"
 #include "chrome/browser/ui/views/tabs/glic_button.h"
 #include "chrome/browser/ui/views/tabs/tab_search_button.h"
+#include "chrome/common/actor.mojom.h"
 #include "chrome/common/actor/action_result.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/webui_url_constants.h"
 #include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/ui_test_utils.h"
 #include "chrome/test/views/chrome_views_test_base.h"
 #include "components/optimization_guide/core/model_execution/model_execution_features.h"
 #include "components/optimization_guide/core/optimization_guide_features.h"
@@ -557,53 +560,37 @@
                    ->width_factor_for_testing());
 }
 
-// TODO(crbug.com/458775033): Fix and enable browser/interactive UI tests.
 IN_PROC_BROWSER_TEST_F(
     TabStripActionContainerBrowserTest,
-    DISABLED_ActivatesTabAndRemoveRowOnGlicActorTaskListBubbleRowClick) {
+    ActivatesTabAndRemoveRowOnGlicActorTaskListBubbleRowClick) {
+  ASSERT_TRUE(embedded_https_test_server().Start());
   auto* actor_service = actor::ActorKeyedService::Get(browser()->GetProfile());
   actor_service->GetPolicyChecker().SetActOnWebForTesting(true);
   actor::TaskId task_id = actor_service->CreateTask();
   actor::ActorTask* task = actor_service->GetTask(task_id);
   actor::ui::StartTask start_task_event(task_id);
   actor_service->GetActorUiStateManager()->OnUiEvent(start_task_event);
-  // Need to wait for the AUSM to notify the GlicActorTaskIconManager.
-  base::PlatformThread::Sleep(actor::ui::kProfileScopedUiUpdateDebounceDelay);
 
-  ASSERT_TRUE(AddTabAtIndexToBrowser(browser(), 0,
-                                     GURL(chrome::kChromeUINewTabURL),
-                                     ui::PAGE_TRANSITION_LINK));
-  auto* tab_one = browser()->GetTabStripModel()->GetTabAtIndex(0);
-  base::RunLoop loop;
-  task->AddTab(
-      tab_one->GetHandle(),
-      base::BindLambdaForTesting([&](actor::mojom::ActionResultPtr result) {
-        EXPECT_TRUE(actor::IsOk(*result));
-        loop.Quit();
-      }));
-  loop.Run();
+  // Navigate the active tab to a new page.
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(
+      browser(), embedded_https_test_server().GetURL("/actor/blank.html")));
+
+  // Add tab to task.
+  base::test::TestFuture<actor::mojom::ActionResultPtr> add_tab_future;
+  task->AddTab(browser()->GetActiveTabInterface()->GetHandle(),
+               add_tab_future.GetCallback());
+  auto add_tab_result = add_tab_future.Take();
+  ASSERT_TRUE(add_tab_result);
 
   // Add and activate the non-actuation tab.
   ASSERT_TRUE(AddTabAtIndexToBrowser(browser(), 1,
                                      GURL(chrome::kChromeUINewTabURL),
                                      ui::PAGE_TRANSITION_LINK));
-  auto* tab_two = browser()->GetTabStripModel()->GetTabAtIndex(1);
   browser()->GetTabStripModel()->ActivateTabAt(1);
 
-  EXPECT_TRUE(task->IsActingOnTab(tab_one->GetHandle()));
-  EXPECT_FALSE(task->IsActingOnTab(tab_two->GetHandle()));
-  EXPECT_FALSE(tab_one->IsActivated());
-  EXPECT_TRUE(tab_two->IsActivated());
-
-  actor_service->GetTask(task_id)->Pause(true);
-  auto* actor_nudge_controller =
-      tabs::GlicActorNudgeController::From(browser());
-  auto actor_task_nudge_state = tabs::ActorTaskNudgeState();
-  actor_task_nudge_state.text =
-      tabs::ActorTaskNudgeState::Text::kNeedsAttention;
-  actor_nudge_controller->OnStateUpdate(actor_task_nudge_state);
-
-  EXPECT_TRUE(GlicActorTaskIcon()->GetIsShowingNudge());
+  actor_service->GetTask(task_id)->Pause(/*from_actor=*/true);
+  ASSERT_TRUE(base::test::RunUntil(
+      [&] { return GlicActorTaskIcon()->GetIsShowingNudge(); }));
 
   ResetAnimation(1);
 
@@ -617,14 +604,9 @@
       content_view->children().front()->children().front());
   Click(button);
 
-  EXPECT_TRUE(tab_one->IsActivated());
-  EXPECT_FALSE(tab_two->IsActivated());
-
-  actor_task_nudge_state.text = tabs::ActorTaskNudgeState::Text::kDefault;
-  actor_nudge_controller->OnStateUpdate(actor_task_nudge_state);
-
   // Nudge should hide and row list should be emptied.
-  EXPECT_FALSE(GlicActorTaskIcon()->GetIsShowingNudge());
+  ASSERT_TRUE(base::test::RunUntil(
+      [&] { return !GlicActorTaskIcon()->GetIsShowingNudge(); }));
   auto* manager = tabs::GlicActorTaskIconManagerFactory::GetForProfile(
       browser()->GetProfile());
   EXPECT_EQ(0u, manager->GetActorTaskListBubbleRows().size());
diff --git a/chrome/browser/ui/webui/settings/people_handler.cc b/chrome/browser/ui/webui/settings/people_handler.cc
index 037f6a6..244abf1 100644
--- a/chrome/browser/ui/webui/settings/people_handler.cc
+++ b/chrome/browser/ui/webui/settings/people_handler.cc
@@ -207,6 +207,8 @@
       return "retrieveTrustedVaultKeys";
     case SyncStatusActionType::kConfirmSyncSettings:
       return "confirmSyncSettings";
+    case SyncStatusActionType::kShowBookmarksLimitHelpArticle:
+      return "showBookmarksLimitHelpArticle";
     case SyncStatusActionType::kNoAction:
       return "noAction";
   }
diff --git a/chrome/browser/ui/webui/signin/profile_customization_ui.cc b/chrome/browser/ui/webui/signin/profile_customization_ui.cc
index 7d080901..21fa3d0 100644
--- a/chrome/browser/ui/webui/signin/profile_customization_ui.cc
+++ b/chrome/browser/ui/webui/signin/profile_customization_ui.cc
@@ -108,6 +108,13 @@
   source->AddBoolean("isLocalProfileCreation",
                      GetProfileCustomizationStyle(url) ==
                          ProfileCustomizationStyle::kLocalProfileCreation);
+  source->AddBoolean(
+      "shouldShowDefaultProfileName",
+      base::FeatureList::IsEnabled(
+          switches::kProfileCreationFrictionReductionExperiment) &&
+          switches::kProfileCreationFrictionReductionVariation.Get() ==
+              switches::ProfileCreationFrictionReductionVariation::
+                  kPrefillNameRequirement);
 
   if (url.GetQuery() == "debug") {
     // Not intended to be hooked to anything. The bubble will not initialize it
diff --git a/chrome/browser/webauthn/android/cable_module_android.cc b/chrome/browser/webauthn/android/cable_module_android.cc
index b051819e..6509c7fa 100644
--- a/chrome/browser/webauthn/android/cable_module_android.cc
+++ b/chrome/browser/webauthn/android/cable_module_android.cc
@@ -2,17 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/browser/webauthn/android/cable_module_android.h"
 
 #include <variant>
 
 #include "base/android/jni_array.h"
 #include "base/base64.h"
+#include "base/compiler_specific.h"
 #include "base/feature_list.h"
 #include "base/functional/bind.h"
 #include "base/logging.h"
@@ -304,11 +300,12 @@
       info.peer_public_key_x962->size() != peer_public_key_x962.size()) {
     return std::nullopt;
   }
-  memcpy(&pairing_id, info.pairing_id->data(), sizeof(pairing_id));
+  UNSAFE_TODO(memcpy(&pairing_id, info.pairing_id->data(), sizeof(pairing_id)));
 
-  memcpy(secret.data(), info.secret->data(), secret.size());
-  memcpy(peer_public_key_x962.data(), info.peer_public_key_x962->data(),
-         peer_public_key_x962.size());
+  UNSAFE_TODO(memcpy(secret.data(), info.secret->data(), secret.size()));
+  UNSAFE_TODO(memcpy(peer_public_key_x962.data(),
+                     info.peer_public_key_x962->data(),
+                     peer_public_key_x962.size()));
 
   syncer::DeviceInfo::PhoneAsASecurityKeyInfo paask_info;
   paask_info.tunnel_server_domain = device::cablev2::kTunnelServer.value();
@@ -330,7 +327,7 @@
 
   const uint64_t pairing_id = paask_info.id;
   uint8_t pairing_id_bytes[sizeof(pairing_id)];
-  memcpy(pairing_id_bytes, &pairing_id, sizeof(pairing_id));
+  UNSAFE_TODO(memcpy(pairing_id_bytes, &pairing_id, sizeof(pairing_id)));
   map.emplace(2, std::vector<uint8_t>(std::begin(pairing_id_bytes),
                                       std::end(pairing_id_bytes)));
 
@@ -367,9 +364,9 @@
     }
 
     std::optional<syncer::DeviceInfo::PhoneAsASecurityKeyInfo> paask_info =
-        internal::PaaskInfoFromCBOR(base::as_bytes(
+        internal::PaaskInfoFromCBOR(base::as_bytes(UNSAFE_TODO(
             base::span<const char>(previous_result_serialized.begin(),
-                                   previous_result_serialized.end())));
+                                   previous_result_serialized.end()))));
     if (!paask_info) {
       return result;
     }
diff --git a/chrome/browser/webauthn/enclave_authenticator_browsertest.cc b/chrome/browser/webauthn/enclave_authenticator_browsertest.cc
index 835c262..b33ed20 100644
--- a/chrome/browser/webauthn/enclave_authenticator_browsertest.cc
+++ b/chrome/browser/webauthn/enclave_authenticator_browsertest.cc
@@ -3558,7 +3558,8 @@
     NOTREACHED();
   }
 
-  bool DeleteSigningKeySlowly(base::span<const uint8_t> wrapped_key) override {
+  crypto::StatefulUnexportableKeyProvider* AsStatefulUnexportableKeyProvider()
+      override {
     NOTREACHED();
   }
 };
diff --git a/chrome/browser/webauthn/enclave_manager.cc b/chrome/browser/webauthn/enclave_manager.cc
index c2cc1a3..44be1fa 100644
--- a/chrome/browser/webauthn/enclave_manager.cc
+++ b/chrome/browser/webauthn/enclave_manager.cc
@@ -4296,8 +4296,13 @@
       FROM_HERE, {base::TaskPriority::BEST_EFFORT, base::MayBlock()},
       base::BindOnce(
           [](std::vector<uint8_t> wrapped_identity_private_key) {
-            if (auto provider = GetWebAuthnUnexportableKeyProvider()) {
-              provider->DeleteSigningKeySlowly(wrapped_identity_private_key);
+            std::unique_ptr<crypto::UnexportableKeyProvider> provider =
+                GetWebAuthnUnexportableKeyProvider();
+            if (crypto::StatefulUnexportableKeyProvider* stateful_provider =
+                    provider ? provider->AsStatefulUnexportableKeyProvider()
+                             : nullptr) {
+              stateful_provider->DeleteSigningKeySlowly(
+                  wrapped_identity_private_key);
             }
           },
           ToVector(user_->wrapped_identity_private_key())));
diff --git a/chrome/browser/webshare/store_file_task.cc b/chrome/browser/webshare/store_file_task.cc
index e5a7b90d..73229803 100644
--- a/chrome/browser/webshare/store_file_task.cc
+++ b/chrome/browser/webshare/store_file_task.cc
@@ -2,13 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/browser/webshare/store_file_task.h"
 
+#include "base/compiler_specific.h"
 #include "base/containers/span.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/string_util.h"
@@ -113,8 +109,8 @@
     std::string_view chars = base::as_string_view(buffer);
     int chars_size_int = base::saturated_cast<int>(chars.size());
     if (buffer.size() > total_bytes_ - bytes_received_ ||
-        output_file_.WriteAtCurrentPos(chars.data(), chars_size_int) !=
-            chars_size_int) {
+        UNSAFE_TODO(output_file_.WriteAtCurrentPos(
+            chars.data(), chars_size_int)) != chars_size_int) {
       std::move(callback_).Run(blink::mojom::ShareError::INTERNAL_ERROR);
       return;
     }
diff --git a/chrome/browser/webshare/win/fake_buffer_unittest.cc b/chrome/browser/webshare/win/fake_buffer_unittest.cc
index 7abf23d..4733cd72 100644
--- a/chrome/browser/webshare/win/fake_buffer_unittest.cc
+++ b/chrome/browser/webshare/win/fake_buffer_unittest.cc
@@ -2,15 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/browser/webshare/win/fake_buffer.h"
 
 #include <wrl/implements.h>
 
+#include "base/compiler_specific.h"
 #include "testing/gtest/include/gtest/gtest-spi.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -48,7 +44,7 @@
   ASSERT_HRESULT_SUCCEEDED(buffer->Buffer(&raw_buffer));
 
   raw_buffer[0] = 'a';
-  raw_buffer[1] = 'b';
+  UNSAFE_TODO(raw_buffer[1]) = 'b';
 
   auto buffer2 = buffer;
   byte* raw_buffer_2;
@@ -56,7 +52,7 @@
 
   ASSERT_EQ(raw_buffer, raw_buffer_2);
   ASSERT_EQ(raw_buffer_2[0], 'a');
-  ASSERT_EQ(raw_buffer_2[1], 'b');
+  ASSERT_EQ(UNSAFE_TODO(raw_buffer_2[1]), 'b');
 }
 
 }  // namespace webshare
diff --git a/chrome/browser/webshare/win/fake_data_writer_factory.cc b/chrome/browser/webshare/win/fake_data_writer_factory.cc
index 91741d8..d72ea08d 100644
--- a/chrome/browser/webshare/win/fake_data_writer_factory.cc
+++ b/chrome/browser/webshare/win/fake_data_writer_factory.cc
@@ -2,17 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/browser/webshare/win/fake_data_writer_factory.h"
 
 #include <robuffer.h>
 #include <windows.foundation.h>
 #include <wrl/async.h>
 
+#include "base/compiler_specific.h"
 #include "base/memory/weak_ptr.h"
 #include "base/test/fake_iasync_operation_win.h"
 #include "chrome/browser/webshare/win/fake_buffer.h"
@@ -113,7 +109,7 @@
     }
 
     for (UINT32 i = 0; i < value_length; i++) {
-      raw_buffer[i] = value[i];
+      UNSAFE_TODO(raw_buffer[i]) = UNSAFE_TODO(value[i]);
     }
     return S_OK;
   }
diff --git a/chrome/browser/webshare/win/fake_data_writer_factory_unittest.cc b/chrome/browser/webshare/win/fake_data_writer_factory_unittest.cc
index c45f2c31..b3e4158 100644
--- a/chrome/browser/webshare/win/fake_data_writer_factory_unittest.cc
+++ b/chrome/browser/webshare/win/fake_data_writer_factory_unittest.cc
@@ -2,16 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/browser/webshare/win/fake_data_writer_factory.h"
 
 #include <wrl/event.h>
 #include <wrl/implements.h>
 
+#include "base/compiler_specific.h"
 #include "base/run_loop.h"
 #include "base/test/task_environment.h"
 #include "chrome/browser/webshare/win/fake_buffer.h"
@@ -220,13 +216,13 @@
   byte* raw_buffer;
   ASSERT_HRESULT_SUCCEEDED(buffer->Buffer(&raw_buffer));
   ASSERT_EQ(raw_buffer[0], 'h');
-  ASSERT_EQ(raw_buffer[1], 'i');
-  ASSERT_EQ(raw_buffer[2], ' ');
-  ASSERT_EQ(raw_buffer[3], 't');
-  ASSERT_EQ(raw_buffer[4], 'h');
-  ASSERT_EQ(raw_buffer[5], 'e');
-  ASSERT_EQ(raw_buffer[6], 'r');
-  ASSERT_EQ(raw_buffer[7], 'e');
+  ASSERT_EQ(UNSAFE_TODO(raw_buffer[1]), 'i');
+  ASSERT_EQ(UNSAFE_TODO(raw_buffer[2]), ' ');
+  ASSERT_EQ(UNSAFE_TODO(raw_buffer[3]), 't');
+  ASSERT_EQ(UNSAFE_TODO(raw_buffer[4]), 'h');
+  ASSERT_EQ(UNSAFE_TODO(raw_buffer[5]), 'e');
+  ASSERT_EQ(UNSAFE_TODO(raw_buffer[6]), 'r');
+  ASSERT_EQ(UNSAFE_TODO(raw_buffer[7]), 'e');
 
   // Cleanup
   ASSERT_HRESULT_SUCCEEDED(stream->Close());
diff --git a/chrome/browser/webshare/win/fake_random_access_stream.cc b/chrome/browser/webshare/win/fake_random_access_stream.cc
index 2d8426d..e7ea0ba 100644
--- a/chrome/browser/webshare/win/fake_random_access_stream.cc
+++ b/chrome/browser/webshare/win/fake_random_access_stream.cc
@@ -2,16 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/browser/webshare/win/fake_random_access_stream.h"
 
 #include <robuffer.h>
+
 #include <vector>
 
+#include "base/compiler_specific.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback_helpers.h"
 #include "base/memory/weak_ptr.h"
@@ -254,7 +251,7 @@
     // length
     EXPECT_HRESULT_SUCCEEDED(buffer->put_Length(count));
     for (UINT32 i = 0; i < count; i++) {
-      raw_buffer[i] = data_[position->data + i];
+      UNSAFE_TODO(raw_buffer[i]) = data_[position->data + i];
     }
     position->data += count;
 
@@ -284,7 +281,7 @@
 
     // Write the buffer to our inner |data_| and update the position.
     for (UINT32 i = 0; i < length; i++) {
-      data_[position->data + i] = raw_buffer[i];
+      data_[position->data + i] = UNSAFE_TODO(raw_buffer[i]);
     }
     position->data += length;
 
diff --git a/chrome/browser/webshare/win/fake_random_access_stream_unittest.cc b/chrome/browser/webshare/win/fake_random_access_stream_unittest.cc
index 2855db5..506060b 100644
--- a/chrome/browser/webshare/win/fake_random_access_stream_unittest.cc
+++ b/chrome/browser/webshare/win/fake_random_access_stream_unittest.cc
@@ -2,16 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/browser/webshare/win/fake_random_access_stream.h"
 
 #include <wrl/event.h>
 #include <wrl/implements.h>
 
+#include "base/compiler_specific.h"
 #include "base/functional/callback_helpers.h"
 #include "base/run_loop.h"
 #include "base/test/task_environment.h"
@@ -216,9 +212,9 @@
   byte* raw_buffer;
   ASSERT_HRESULT_SUCCEEDED(buffer->Buffer(&raw_buffer));
   raw_buffer[0] = 'a';
-  raw_buffer[1] = 'b';
-  raw_buffer[2] = 'c';
-  raw_buffer[3] = 'd';
+  UNSAFE_TODO(raw_buffer[1]) = 'b';
+  UNSAFE_TODO(raw_buffer[2]) = 'c';
+  UNSAFE_TODO(raw_buffer[3]) = 'd';
 
   // Write the buffer to the output stream
   {
@@ -244,7 +240,7 @@
 
   // Update the same buffer to now read "ef"
   raw_buffer[0] = 'e';
-  raw_buffer[1] = 'f';
+  UNSAFE_TODO(raw_buffer[1]) = 'f';
   ASSERT_HRESULT_SUCCEEDED(buffer->put_Length(2));
 
   // Write the buffer to the output stream
@@ -319,9 +315,9 @@
   ASSERT_HRESULT_SUCCEEDED(buffer->get_Length(&length));
   ASSERT_EQ(length, 4u);
   ASSERT_EQ(raw_buffer[0], 'a');
-  ASSERT_EQ(raw_buffer[1], 'b');
-  ASSERT_EQ(raw_buffer[2], 'c');
-  ASSERT_EQ(raw_buffer[3], 'd');
+  ASSERT_EQ(UNSAFE_TODO(raw_buffer[1]), 'b');
+  ASSERT_EQ(UNSAFE_TODO(raw_buffer[2]), 'c');
+  ASSERT_EQ(UNSAFE_TODO(raw_buffer[3]), 'd');
 
   // Read the remaining input stream to the buffer
   {
@@ -352,7 +348,7 @@
   ASSERT_HRESULT_SUCCEEDED(buffer->get_Length(&length));
   ASSERT_EQ(length, 2u);
   ASSERT_EQ(raw_buffer[0], 'e');
-  ASSERT_EQ(raw_buffer[1], 'f');
+  ASSERT_EQ(UNSAFE_TODO(raw_buffer[1]), 'f');
 }
 
 }  // namespace webshare
diff --git a/chrome/browser/webshare/win/fake_storage_file_statics_unittest.cc b/chrome/browser/webshare/win/fake_storage_file_statics_unittest.cc
index 4575971..787efa56 100644
--- a/chrome/browser/webshare/win/fake_storage_file_statics_unittest.cc
+++ b/chrome/browser/webshare/win/fake_storage_file_statics_unittest.cc
@@ -2,16 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/browser/webshare/win/fake_storage_file_statics.h"
 
 #include <wrl/event.h>
 #include <wrl/implements.h>
 
+#include "base/compiler_specific.h"
 #include "base/run_loop.h"
 #include "base/test/task_environment.h"
 #include "base/win/scoped_hstring.h"
@@ -58,9 +54,9 @@
           byte* raw_buffer;
           EXPECT_HRESULT_SUCCEEDED(buffer->Buffer(&raw_buffer));
           raw_buffer[0] = 'f';
-          raw_buffer[1] = 'i';
-          raw_buffer[2] = 's';
-          raw_buffer[3] = 'h';
+          UNSAFE_TODO(raw_buffer[1]) = 'i';
+          UNSAFE_TODO(raw_buffer[2]) = 's';
+          UNSAFE_TODO(raw_buffer[3]) = 'h';
 
           // Write the bytes to the stream
           ComPtr<IAsyncOperationWithProgress<UINT32, UINT32>> write_operation;
@@ -196,9 +192,9 @@
   byte* raw_buffer;
   ASSERT_HRESULT_SUCCEEDED(buffer->Buffer(&raw_buffer));
   ASSERT_EQ(raw_buffer[0], 'f');
-  ASSERT_EQ(raw_buffer[1], 'i');
-  ASSERT_EQ(raw_buffer[2], 's');
-  ASSERT_EQ(raw_buffer[3], 'h');
+  ASSERT_EQ(UNSAFE_TODO(raw_buffer[1]), 'i');
+  ASSERT_EQ(UNSAFE_TODO(raw_buffer[2]), 's');
+  ASSERT_EQ(UNSAFE_TODO(raw_buffer[3]), 'h');
 
   // Cleanup
   ComPtr<IClosable> closable_input_stream;
diff --git a/chrome/browser/webshare/win/share_operation_unittest.cc b/chrome/browser/webshare/win/share_operation_unittest.cc
index 5a1af42..a95acf3 100644
--- a/chrome/browser/webshare/win/share_operation_unittest.cc
+++ b/chrome/browser/webshare/win/share_operation_unittest.cc
@@ -2,13 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/browser/webshare/win/share_operation.h"
 
+#include <wrl/event.h>
+
+#include "base/compiler_specific.h"
 #include "base/files/file_path.h"
 #include "base/memory/raw_ptr.h"
 #include "base/run_loop.h"
@@ -31,8 +29,6 @@
 #include "ui/views/win/hwnd_util.h"
 #include "url/gurl.h"
 
-#include <wrl/event.h>
-
 using ABI::Windows::ApplicationModel::DataTransfer::IDataPackage;
 using ABI::Windows::ApplicationModel::DataTransfer::IDataPackagePropertySet;
 using ABI::Windows::ApplicationModel::DataTransfer::IDataRequest;
@@ -136,7 +132,7 @@
 
     std::vector<unsigned char> bytes(bytes_loaded);
     for (UINT32 i = 0; i < bytes_loaded; i++) {
-      bytes[i] = raw_buffer[i];
+      bytes[i] = UNSAFE_TODO(raw_buffer[i]);
     }
     result = std::string(bytes.begin(), bytes.end());
 
diff --git a/chrome/build/android-arm32.pgo.txt b/chrome/build/android-arm32.pgo.txt
index e1ce6dbd..7eaaec5 100644
--- a/chrome/build/android-arm32.pgo.txt
+++ b/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@
-chrome-android32-main-1763596785-fbf404154bfb6df569c2958c1d0fc5b01348012a-a96996f70dac1ebea05ed91162ebb10a5f384ac1.profdata
+chrome-android32-main-1763639974-b824f3bdfeb45ff58ce7770a00d3ad073d8121c9-cd1de077ea50ab549a64d73b9149ff575ecc22de.profdata
diff --git a/chrome/build/android-desktop-x64.pgo.txt b/chrome/build/android-desktop-x64.pgo.txt
index a23f91f..4285110 100644
--- a/chrome/build/android-desktop-x64.pgo.txt
+++ b/chrome/build/android-desktop-x64.pgo.txt
@@ -1 +1 @@
-chrome-android-desktop-x64-main-1763618372-604efac98edbbbda1604f81a903a18777cba4964-9c771d9196e3d4c106d922a6023288646fdb9b12.profdata
+chrome-android-desktop-x64-main-1763639974-754ce7c13053889c70869559238a9e79d9cbca20-cd1de077ea50ab549a64d73b9149ff575ecc22de.profdata
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index d05ff4e1..8d6a4c22 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1763596785-8264c67047d02c99ae8a29d42e2e96750de1d541-a96996f70dac1ebea05ed91162ebb10a5f384ac1.profdata
+chrome-linux-main-1763639974-efb6a818d65431b35e63e298485036dd34c5aca3-cd1de077ea50ab549a64d73b9149ff575ecc22de.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index 21990a92..1d6cb4af 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1763618372-0be0fb740b2a2c4316b623c6c6006b7ba5ad6ea8-9c771d9196e3d4c106d922a6023288646fdb9b12.profdata
+chrome-mac-arm-main-1763646931-be3eaaf23c21e133b3f4fc26249e6da764b314ce-af960c1df4785f69410a557a172bb43c51d4952d.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 6f3678e4..cad809e 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1763596785-260839cc3c7dba1acb6597f84e0654adecff0150-a96996f70dac1ebea05ed91162ebb10a5f384ac1.profdata
+chrome-mac-main-1763639974-08c6ce0577636bea02086b3c0ba5e0c8987c60ee-cd1de077ea50ab549a64d73b9149ff575ecc22de.profdata
diff --git a/chrome/build/win-arm64.pgo.txt b/chrome/build/win-arm64.pgo.txt
index a6259ed..01d3d4e 100644
--- a/chrome/build/win-arm64.pgo.txt
+++ b/chrome/build/win-arm64.pgo.txt
@@ -1 +1 @@
-chrome-win-arm64-main-1763596785-8907305a4ccdbe9ef05e1d5c53b8e66193ec5fa3-a96996f70dac1ebea05ed91162ebb10a5f384ac1.profdata
+chrome-win-arm64-main-1763639974-77ab459b7c40978ca425f4848d2b623b3684e4e0-cd1de077ea50ab549a64d73b9149ff575ecc22de.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 46cf84c..ce29e366 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1763596785-cdfb9cef5fde40e103376258a0a1a00c9ea57881-a96996f70dac1ebea05ed91162ebb10a5f384ac1.profdata
+chrome-win32-main-1763628880-a37dabe634d19c5827de7f1e459f541019fc32b2-088d91c352eb9e502c36d6ebe57c2776e1f343a2.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 3cd2ad9..347d739 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1763574994-e26a4c8df9b6591caa28a32ead0dd01f8bc0cf5c-f6b4954a583d1dc61c42e390789272d14a0c5779.profdata
+chrome-win64-main-1763628880-afc1c9a75664054283095e80d4075a592b014403-088d91c352eb9e502c36d6ebe57c2776e1f343a2.profdata
diff --git a/chrome/chrome_elf/pe_image_safe/pe_image_safe_unittest.cc b/chrome/chrome_elf/pe_image_safe/pe_image_safe_unittest.cc
index b79baa3..157caa0 100644
--- a/chrome/chrome_elf/pe_image_safe/pe_image_safe_unittest.cc
+++ b/chrome/chrome_elf/pe_image_safe/pe_image_safe_unittest.cc
@@ -2,13 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/chrome_elf/pe_image_safe/pe_image_safe.h"
 
+#include "base/compiler_specific.h"
 #include "base/files/file.h"
 #include "base/files/file_path.h"
 #include "base/path_service.h"
@@ -37,8 +33,8 @@
   if (data->dos_header->e_magic != IMAGE_DOS_SIGNATURE)
     return false;
 
-  data->nt_headers = reinterpret_cast<PIMAGE_NT_HEADERS>(
-      reinterpret_cast<char*>(data->dos_header) + data->dos_header->e_lfanew);
+  data->nt_headers = reinterpret_cast<PIMAGE_NT_HEADERS>(UNSAFE_TODO(
+      reinterpret_cast<char*>(data->dos_header) + data->dos_header->e_lfanew));
   if (data->nt_headers->Signature != IMAGE_NT_SIGNATURE)
     return false;
 
@@ -76,7 +72,8 @@
 
   std::vector<char> buffer;
   buffer.resize(kPageSize);
-  ASSERT_EQ(file.Read(0, &buffer[0], kPageSize), static_cast<int>(kPageSize));
+  ASSERT_EQ(UNSAFE_TODO(file.Read(0, &buffer[0], kPageSize)),
+            static_cast<int>(kPageSize));
   file.Close();
 
   // Grab some key data out of the pe headers first, NOT using pe_image_safe.
diff --git a/chrome/common/extensions/api/side_panel.idl b/chrome/common/extensions/api/side_panel.idl
index 7d41beb..0019879 100644
--- a/chrome/common/extensions/api/side_panel.idl
+++ b/chrome/common/extensions/api/side_panel.idl
@@ -183,6 +183,6 @@
     static void onOpened(PanelOpenedInfo info);
 
     // Fired when the extension's side panel is closed.
-    [nodoc] static void onClosed(PanelClosedInfo info);
+    static void onClosed(PanelClosedInfo info);
   };
 };
diff --git a/chrome/common/profiler/core_unwinders_android.cc b/chrome/common/profiler/core_unwinders_android.cc
index 06b47d51..c6d02d0c 100644
--- a/chrome/common/profiler/core_unwinders_android.cc
+++ b/chrome/common/profiler/core_unwinders_android.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/common/profiler/core_unwinders.h"
 
 #include <memory>
@@ -14,6 +9,7 @@
 #include <vector>
 
 #include "base/command_line.h"
+#include "base/compiler_specific.h"
 #include "base/feature_list.h"
 #include "base/functional/bind.h"
 #include "base/memory/raw_ptr.h"
@@ -100,7 +96,7 @@
   std::unique_ptr<base::Unwinder> Create() {
     return std::make_unique<base::ChromeUnwinderAndroid32>(
         base::CreateChromeUnwindInfoAndroid32(
-            {chrome_cfi_file_.data(), chrome_cfi_file_.length()}),
+            UNSAFE_TODO({chrome_cfi_file_.data(), chrome_cfi_file_.length()})),
         /* chrome_module_base_address= */
         reinterpret_cast<uintptr_t>(&__executable_start),
         /* text_section_start_address= */ base::android::kStartOfText);
diff --git a/chrome/credential_provider/gaiacp/auth_utils.cc b/chrome/credential_provider/gaiacp/auth_utils.cc
index de6701b..12179169 100644
--- a/chrome/credential_provider/gaiacp/auth_utils.cc
+++ b/chrome/credential_provider/gaiacp/auth_utils.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 // Implementation of Windows authentication package building functions need
 // to create the authentication packages used to sign the user into a Windows
 // system.
@@ -18,6 +13,7 @@
 
 #include <vector>
 
+#include "base/compiler_specific.h"
 #include "base/functional/callback.h"
 #include "base/strings/string_util.h"
 #include "base/win/ntsecapi_shim.h"
@@ -65,7 +61,8 @@
   if ((!::CredIsProtectedW(password, &protection_type) ||
        CredUnprotected != protection_type)) {
     protected_password->resize(password_length + 1);
-    wcscpy_s(&(*protected_password)[0], password_length + 1, password);
+    UNSAFE_TODO(
+        wcscpy_s(&(*protected_password)[0], password_length + 1, password));
     return S_OK;
   }
 
@@ -109,7 +106,7 @@
   pus->MaximumLength = rus.Length;
   pus->Buffer = buffer;
 
-  CopyMemory(pus->Buffer, rus.Buffer, pus->Length);
+  UNSAFE_TODO(CopyMemory(pus->Buffer, rus.Buffer, pus->Length));
 }
 
 // Initialize the members of a KERB_INTERACTIVE_UNLOCK_LOGON with weak
@@ -130,7 +127,7 @@
   DCHECK(password);
   DCHECK(pkiul);
 
-  ZeroMemory(pkiul, sizeof(KERB_INTERACTIVE_UNLOCK_LOGON));
+  UNSAFE_TODO(ZeroMemory(pkiul, sizeof(KERB_INTERACTIVE_UNLOCK_LOGON)));
 
   KERB_INTERACTIVE_LOGON* pkil = &pkiul->Logon;
 
@@ -207,8 +204,9 @@
                      sizeof(output_unlock_logon->LogonId));
 
   // Point output_buffer at the beginning of the extra space.
-  BYTE* output_buffer = reinterpret_cast<BYTE*>(output_unlock_logon) +
-                        sizeof(*output_unlock_logon);
+  BYTE* output_buffer =
+      UNSAFE_TODO(reinterpret_cast<BYTE*>(output_unlock_logon) +
+                  sizeof(*output_unlock_logon));
 
   // Set up the Logon structure within the KERB_INTERACTIVE_UNLOCK_LOGON.
   KERB_INTERACTIVE_LOGON* output_logon = &output_unlock_logon->Logon;
@@ -222,14 +220,14 @@
                                        &output_logon->LogonDomainName);
   output_logon->LogonDomainName.Buffer =
       reinterpret_cast<wchar_t*>(output_buffer - (BYTE*)output_unlock_logon);
-  output_buffer += output_logon->LogonDomainName.Length;
+  UNSAFE_TODO(output_buffer += output_logon->LogonDomainName.Length);
 
   UnicodeStringPackedUnicodeStringCopy(
       input_logon->UserName, reinterpret_cast<wchar_t*>(output_buffer),
       &output_logon->UserName);
   output_logon->UserName.Buffer =
       reinterpret_cast<wchar_t*>(output_buffer - (BYTE*)output_unlock_logon);
-  output_buffer += output_logon->UserName.Length;
+  UNSAFE_TODO(output_buffer += output_logon->UserName.Length);
 
   UnicodeStringPackedUnicodeStringCopy(
       input_logon->Password, reinterpret_cast<wchar_t*>(output_buffer),
@@ -398,8 +396,8 @@
   // Copy the password and pass the copied buffer into
   // ProtectIfNecessaryAndCopyPassword since it expects a non-const input
   // buffer.
-  std::vector<wchar_t> copy_password(OLE2W(password),
-                                     OLE2W(password) + wcslen(password) + 1);
+  std::vector<wchar_t> copy_password(
+      OLE2W(password), UNSAFE_TODO(OLE2W(password) + wcslen(password) + 1));
   hr = ProtectIfNecessaryAndCopyPassword(&copy_password[0], cpus,
                                          &protected_password);
 
diff --git a/chrome/credential_provider/gaiacp/event_logs_upload_manager.cc b/chrome/credential_provider/gaiacp/event_logs_upload_manager.cc
index cc904d5..a1f900f0 100644
--- a/chrome/credential_provider/gaiacp/event_logs_upload_manager.cc
+++ b/chrome/credential_provider/gaiacp/event_logs_upload_manager.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/credential_provider/gaiacp/event_logs_upload_manager.h"
 
 #include <windows.h>
@@ -16,6 +11,7 @@
 #include <memory>
 #include <unordered_map>
 
+#include "base/compiler_specific.h"
 #include "base/json/json_reader.h"
 #include "base/json/json_writer.h"
 #include "base/strings/string_number_conversions.h"
@@ -235,9 +231,10 @@
     PEVT_VARIANT query_statuses = &status_buffer[0];
 
     for (DWORD i = 0; i < query_names->Count; ++i) {
-      if (query_statuses->UInt32Arr[i] != ERROR_SUCCESS) {
+      if (UNSAFE_TODO(query_statuses->UInt32Arr[i]) != ERROR_SUCCESS) {
         LOGFN(ERROR) << "Query path " << query_names->StringArr[0]
-                     << " has error status " << query_statuses->UInt32Arr[i];
+                     << " has error status "
+                     << UNSAFE_TODO(query_statuses->UInt32Arr[i]);
         return false;
       }
     }
diff --git a/chrome/credential_provider/gaiacp/experiments_manager.cc b/chrome/credential_provider/gaiacp/experiments_manager.cc
index 0beda675..c6b2f2c 100644
--- a/chrome/credential_provider/gaiacp/experiments_manager.cc
+++ b/chrome/credential_provider/gaiacp/experiments_manager.cc
@@ -2,16 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/credential_provider/gaiacp/experiments_manager.h"
 
 #include <string_view>
 #include <vector>
 
+#include "base/compiler_specific.h"
 #include "base/files/file.h"
 #include "base/json/json_reader.h"
 #include "base/strings/string_util.h"
@@ -74,7 +70,7 @@
   }
 
   std::vector<char> buffer(experiments_file->GetLength());
-  experiments_file->Read(0, buffer.data(), buffer.size());
+  UNSAFE_TODO(experiments_file->Read(0, buffer.data(), buffer.size()));
   experiments_file.reset();
 
   std::optional<base::Value::Dict> experiments_data =
diff --git a/chrome/credential_provider/gaiacp/gaia_credential_provider.cc b/chrome/credential_provider/gaiacp/gaia_credential_provider.cc
index e29c1387..7e6d5e5 100644
--- a/chrome/credential_provider/gaiacp/gaia_credential_provider.cc
+++ b/chrome/credential_provider/gaiacp/gaia_credential_provider.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/credential_provider/gaiacp/gaia_credential_provider.h"
 
 #include <credentialprovider.h>
@@ -17,6 +12,7 @@
 #include <string>
 #include <utility>
 
+#include "base/compiler_specific.h"
 #include "base/containers/contains.h"
 #include "base/files/file_path.h"
 #include "base/json/json_reader.h"
@@ -806,7 +802,7 @@
     *ppcpfd = reinterpret_cast<CREDENTIAL_PROVIDER_FIELD_DESCRIPTOR*>(
         ::CoTaskMemAlloc(sizeof(**ppcpfd)));
     if (*ppcpfd) {
-      **ppcpfd = g_field_desc[index];
+      **ppcpfd = UNSAFE_TODO(g_field_desc[index]);
       // The password field has special greyed out text that is not set through
       // calls to ICredentialProviderCredential::GetStringValue so we need to
       // localize it manually here.
diff --git a/chrome/credential_provider/gaiacp/gcp_utils_unittest.cc b/chrome/credential_provider/gaiacp/gcp_utils_unittest.cc
index 9a68569..12f1ea5 100644
--- a/chrome/credential_provider/gaiacp/gcp_utils_unittest.cc
+++ b/chrome/credential_provider/gaiacp/gcp_utils_unittest.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/credential_provider/gaiacp/gcp_utils.h"
 
 #include <string_view>
@@ -92,7 +87,7 @@
     const base::win::ScopedHandle::Handle& writing) {
   char input_buffer[8];
   char output_buffer[8];
-  strcpy_s(input_buffer, std::size(input_buffer), "hello");
+  UNSAFE_TODO(strcpy_s(input_buffer, std::size(input_buffer), "hello"));
   const DWORD kExpectedDataLength = strlen(input_buffer) + 1;
 
   // Make sure what is written can be read.
@@ -105,11 +100,12 @@
   EXPECT_TRUE(ReadFile(reading, output_buffer, std::size(output_buffer), &read,
                        nullptr));
   EXPECT_EQ(kExpectedDataLength, read);
-  return strcmp(input_buffer, output_buffer) == 0;
+  return UNSAFE_TODO(strcmp(input_buffer, output_buffer)) == 0;
 }
 
 void GcpProcHelperTest::StripCrLf(char* buffer) {
-  for (char* p = buffer + strlen(buffer) - 1; p >= buffer; --p) {
+  for (char* p = UNSAFE_TODO(buffer + strlen(buffer) - 1); p >= buffer;
+       UNSAFE_TODO(--p)) {
     if (*p == '\n' || *p == '\r')
       *p = 0;
   }
@@ -412,7 +408,7 @@
   // Write to stdin of the child process.
   const int kBufferSize = 16;
   char input_buffer[kBufferSize];
-  strcpy_s(input_buffer, std::size(input_buffer), "hello");
+  UNSAFE_TODO(strcpy_s(input_buffer, std::size(input_buffer), "hello"));
   const DWORD kExpectedDataLength = strlen(input_buffer) + 1;
   DWORD written;
   ASSERT_TRUE(::WriteFile(parent_handles.hstdin_write.Get(), input_buffer,
diff --git a/chrome/credential_provider/gaiacp/user_policies_manager.cc b/chrome/credential_provider/gaiacp/user_policies_manager.cc
index d7b7dcd..566dead 100644
--- a/chrome/credential_provider/gaiacp/user_policies_manager.cc
+++ b/chrome/credential_provider/gaiacp/user_policies_manager.cc
@@ -2,16 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/credential_provider/gaiacp/user_policies_manager.h"
 
 #include <limits>
 #include <string_view>
 
+#include "base/compiler_specific.h"
 #include "base/files/file.h"
 #include "base/files/file_enumerator.h"
 #include "base/files/file_path.h"
@@ -254,8 +250,8 @@
     return (fetch_status_ = E_FAIL);
   }
 
-  int num_bytes_written =
-      policy_file->Write(0, policy_data.c_str(), policy_data.size());
+  int num_bytes_written = UNSAFE_TODO(
+      policy_file->Write(0, policy_data.c_str(), policy_data.size()));
 
   policy_file.reset();
 
@@ -288,7 +284,7 @@
   }
 
   std::vector<char> buffer(policy_file->GetLength());
-  policy_file->Read(0, buffer.data(), buffer.size());
+  UNSAFE_TODO(policy_file->Read(0, buffer.data(), buffer.size()));
   policy_file.reset();
 
   std::optional<base::Value::Dict> policy_data =
diff --git a/chrome/credential_provider/gaiacp/win_http_url_fetcher.cc b/chrome/credential_provider/gaiacp/win_http_url_fetcher.cc
index 00c3798..33f8a04 100644
--- a/chrome/credential_provider/gaiacp/win_http_url_fetcher.cc
+++ b/chrome/credential_provider/gaiacp/win_http_url_fetcher.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/credential_provider/gaiacp/win_http_url_fetcher.h"
 
 #include <Windows.h>
@@ -19,6 +14,7 @@
 #include <string_view>
 
 #include "base/base64.h"
+#include "base/compiler_specific.h"
 #include "base/containers/contains.h"
 #include "base/containers/span.h"
 #include "base/json/json_reader.h"
@@ -409,7 +405,7 @@
 
     size_t current_size = response->size();
     response->resize(response->size() + actual);
-    memcpy(response->data() + current_size, buffer.get(), actual);
+    UNSAFE_TODO(memcpy(response->data() + current_size, buffer.get(), actual));
     if (response->size() >= kMaxResponseSize) {
       LOGFN(ERROR) << "Response has exceeded max size=" << kMaxResponseSize;
       return E_OUTOFMEMORY;
diff --git a/chrome/credential_provider/setup/setup_lib.cc b/chrome/credential_provider/setup/setup_lib.cc
index 8cff1b6..b835fa2c 100644
--- a/chrome/credential_provider/setup/setup_lib.cc
+++ b/chrome/credential_provider/setup/setup_lib.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/credential_provider/setup/setup_lib.h"
 
 #include <shlobj.h>
@@ -15,6 +10,7 @@
 #include <string>
 
 #include "base/command_line.h"
+#include "base/compiler_specific.h"
 #include "base/file_version_info.h"
 #include "base/files/file.h"
 #include "base/files/file_enumerator.h"
@@ -68,23 +64,24 @@
                      const base::FilePath::StringType names[],
                      size_t length) {
   for (size_t i = 0; i < length; ++i) {
-    base::FilePath src = src_path.Append(names[i]);
-    base::FilePath dest = dest_path.Append(names[i]);
+    base::FilePath src = src_path.Append(UNSAFE_TODO(names[i]));
+    base::FilePath dest = dest_path.Append(UNSAFE_TODO(names[i]));
 
     // Make sure parent of destination file exists.
     if (!base::CreateDirectory(dest.DirName())) {
       HRESULT hr = HRESULT_FROM_WIN32(::GetLastError());
       LOGFN(ERROR) << "CreateDirectory hr=" << putHR(hr)
-                   << " name=" << names[i];
+                   << " name=" << UNSAFE_TODO(names[i]);
       return hr;
     }
 
     if (!base::CopyFile(src, dest)) {
       HRESULT hr = HRESULT_FROM_WIN32(::GetLastError());
-      LOGFN(ERROR) << "CopyFile hr=" << putHR(hr) << " name=" << names[i];
+      LOGFN(ERROR) << "CopyFile hr=" << putHR(hr)
+                   << " name=" << UNSAFE_TODO(names[i]);
       return hr;
     }
-    LOGFN(INFO) << "Installed name=" << names[i];
+    LOGFN(INFO) << "Installed name=" << UNSAFE_TODO(names[i]);
   }
 
   return S_OK;
@@ -101,7 +98,7 @@
   bool has_failures = false;
 
   for (size_t i = 0; i < length; ++i) {
-    base::ScopedNativeLibrary library(dest_path.Append(names[i]));
+    base::ScopedNativeLibrary library(dest_path.Append(UNSAFE_TODO(names[i])));
 
     if (fakes) {
       SetFakesForTestingFn set_fakes_for_testing_fn =
@@ -117,9 +114,10 @@
 
     if (register_server_fn) {
       hr = static_cast<HRESULT>((*register_server_fn)());
-      LOGFN(VERBOSE) << "Registered name=" << names[i] << " hr=" << putHR(hr);
+      LOGFN(VERBOSE) << "Registered name=" << UNSAFE_TODO(names[i])
+                     << " hr=" << putHR(hr);
     } else {
-      LOGFN(ERROR) << "Failed to register name=" << names[i];
+      LOGFN(ERROR) << "Failed to register name=" << UNSAFE_TODO(names[i]);
       hr = E_NOTIMPL;
     }
     has_failures |= FAILED(hr);
@@ -139,7 +137,7 @@
   bool has_failures = false;
 
   for (size_t i = 0; i < length; ++i) {
-    base::ScopedNativeLibrary library(dest_path.Append(names[i]));
+    base::ScopedNativeLibrary library(dest_path.Append(UNSAFE_TODO(names[i])));
 
     if (fakes) {
       SetFakesForTestingFn pmfn = reinterpret_cast<SetFakesForTestingFn>(
@@ -151,7 +149,8 @@
     FARPROC pfn = reinterpret_cast<FARPROC>(
         library.GetFunctionPointer("DllUnregisterServer"));
     HRESULT hr = pfn ? static_cast<HRESULT>((*pfn)()) : E_UNEXPECTED;
-    LOGFN(VERBOSE) << "Unregistered name=" << names[i] << " hr=" << putHR(hr);
+    LOGFN(VERBOSE) << "Unregistered name=" << UNSAFE_TODO(names[i])
+                   << " hr=" << putHR(hr);
     has_failures |= FAILED(hr);
   }
 
diff --git a/chrome/credential_provider/test/gcp_gls_output_unittest.cc b/chrome/credential_provider/test/gcp_gls_output_unittest.cc
index d8c359f..3e5434ee 100644
--- a/chrome/credential_provider/test/gcp_gls_output_unittest.cc
+++ b/chrome/credential_provider/test/gcp_gls_output_unittest.cc
@@ -2,12 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "base/command_line.h"
+#include "base/compiler_specific.h"
 #include "base/files/file_path.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/functional/bind.h"
@@ -186,7 +182,7 @@
         break;
       }
 
-      buffer[length] = 0;
+      UNSAFE_TODO(buffer[length]) = 0;
       output_from_process += buffer;
     } else if (ret != WAIT_IO_COMPLETION) {
       break;
diff --git a/chrome/elevation_service/caller_validation_unittest.cc b/chrome/elevation_service/caller_validation_unittest.cc
index 330ab98..ca795e4 100644
--- a/chrome/elevation_service/caller_validation_unittest.cc
+++ b/chrome/elevation_service/caller_validation_unittest.cc
@@ -2,13 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/elevation_service/caller_validation.h"
 
+#include "base/compiler_specific.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
@@ -313,9 +309,9 @@
   };
 
   for (size_t i = 0; i < std::size(cases); ++i) {
-    base::FilePath input(cases[i].input);
+    base::FilePath input(UNSAFE_TODO(cases[i]).input);
     auto output = MaybeTrimProcessPathForTesting(input);
-    EXPECT_EQ(output.value(), cases[i].expected);
+    EXPECT_EQ(output.value(), UNSAFE_TODO(cases[i]).expected);
   }
 }
 
diff --git a/chrome/elevation_service/elevated_recovery_impl.cc b/chrome/elevation_service/elevated_recovery_impl.cc
index 28e9713..e2f9d11d 100644
--- a/chrome/elevation_service/elevated_recovery_impl.cc
+++ b/chrome/elevation_service/elevated_recovery_impl.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/elevation_service/elevated_recovery_impl.h"
 
 #include <objbase.h>
@@ -16,6 +11,7 @@
 
 #include "base/base_paths.h"
 #include "base/command_line.h"
+#include "base/compiler_specific.h"
 #include "base/files/file_enumerator.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
@@ -136,7 +132,7 @@
 
   for (uint64_t total_bytes_read = 0;;) {
     const int bytes_read =
-        from_file.ReadAtCurrentPos(buffer.data(), buffer.size());
+        UNSAFE_TODO(from_file.ReadAtCurrentPos(buffer.data(), buffer.size()));
     if (bytes_read < 0)
       return HRESULTFromLastError();
     if (bytes_read == 0)
@@ -146,7 +142,8 @@
     if (total_bytes_read > kMaxFileSize)
       return E_INVALIDARG;
 
-    const int bytes_written = to_file.WriteAtCurrentPos(&buffer[0], bytes_read);
+    const int bytes_written =
+        UNSAFE_TODO(to_file.WriteAtCurrentPos(&buffer[0], bytes_read));
     if (bytes_written < 0)
       return HRESULTFromLastError();
     if (bytes_written != bytes_read)
diff --git a/chrome/install_static/install_modes_unittest.cc b/chrome/install_static/install_modes_unittest.cc
index d6d387f..5203864 100644
--- a/chrome/install_static/install_modes_unittest.cc
+++ b/chrome/install_static/install_modes_unittest.cc
@@ -2,17 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/install_static/install_modes.h"
 
 #include <windows.h>
 
 #include <cguid.h>
 
+#include "base/compiler_specific.h"
 #include "base/strings/string_util.h"
 #include "chrome/install_static/buildflags.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -36,7 +32,7 @@
 MATCHER(ContainsIllegalProgIdChar, "") {
   const wchar_t* scan = arg;
   wchar_t c;
-  while ((c = *scan++) != 0) {
+  while ((c = *UNSAFE_TODO(scan++)) != 0) {
     if (!base::IsAsciiAlphaNumeric(c) && c != L'.') {
       return true;
     }
diff --git a/chrome/install_static/install_util_unittest.cc b/chrome/install_static/install_util_unittest.cc
index 93599417..9956cbd 100644
--- a/chrome/install_static/install_util_unittest.cc
+++ b/chrome/install_static/install_util_unittest.cc
@@ -2,17 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/install_static/install_util.h"
 
 #include <objbase.h>
 
 #include <tuple>
 
+#include "base/compiler_specific.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/strings/string_util.h"
@@ -422,7 +418,7 @@
   static_assert(std::size(kInstallDirs) == NUM_INSTALL_MODES,
                 "kInstallDirs out of date.");
   EXPECT_THAT(GetChromeInstallSubDirectory(),
-              StrCaseEq(kInstallDirs[std::get<0>(GetParam())]));
+              StrCaseEq(UNSAFE_TODO(kInstallDirs[std::get<0>(GetParam())])));
 }
 
 TEST_P(InstallStaticUtilTest, GetRegistryPath) {
@@ -451,7 +447,7 @@
   static_assert(std::size(kRegistryPaths) == NUM_INSTALL_MODES,
                 "kRegistryPaths out of date.");
   EXPECT_THAT(GetRegistryPath(),
-              StrCaseEq(kRegistryPaths[std::get<0>(GetParam())]));
+              StrCaseEq(UNSAFE_TODO(kRegistryPaths[std::get<0>(GetParam())])));
 }
 
 TEST_P(InstallStaticUtilTest, GetUninstallRegistryPath) {
@@ -483,8 +479,9 @@
 #endif
   static_assert(std::size(kUninstallRegistryPaths) == NUM_INSTALL_MODES,
                 "kUninstallRegistryPaths out of date.");
-  EXPECT_THAT(GetUninstallRegistryPath(),
-              StrCaseEq(kUninstallRegistryPaths[std::get<0>(GetParam())]));
+  EXPECT_THAT(
+      GetUninstallRegistryPath(),
+      StrCaseEq(UNSAFE_TODO(kUninstallRegistryPaths[std::get<0>(GetParam())])));
 }
 
 TEST_P(InstallStaticUtilTest, GetAppGuid) {
@@ -530,7 +527,8 @@
 #endif
   static_assert(std::size(kBaseAppIds) == NUM_INSTALL_MODES,
                 "kBaseAppIds out of date.");
-  EXPECT_THAT(GetBaseAppId(), StrCaseEq(kBaseAppIds[std::get<0>(GetParam())]));
+  EXPECT_THAT(GetBaseAppId(),
+              StrCaseEq(UNSAFE_TODO(kBaseAppIds[std::get<0>(GetParam())])));
 }
 
 TEST_P(InstallStaticUtilTest, GetToastActivatorClsid) {
@@ -599,11 +597,12 @@
                 "kToastActivatorClsids out of date.");
 
   EXPECT_EQ(GetToastActivatorClsid(),
-            kToastActivatorClsids[std::get<0>(GetParam())]);
+            UNSAFE_TODO(kToastActivatorClsids[std::get<0>(GetParam())]));
 
   auto clsid_str = base::win::WStringFromGUID(GetToastActivatorClsid());
   EXPECT_THAT(clsid_str.c_str(),
-              StrCaseEq(kToastActivatorClsidsString[std::get<0>(GetParam())]));
+              StrCaseEq(UNSAFE_TODO(
+                  kToastActivatorClsidsString[std::get<0>(GetParam())])));
 }
 
 TEST_P(InstallStaticUtilTest, GetElevatorClsid) {
@@ -667,11 +666,13 @@
   static_assert(std::size(kElevatorClsids) == NUM_INSTALL_MODES,
                 "kElevatorClsids needs to be updated for any new modes.");
 
-  EXPECT_EQ(GetElevatorClsid(), kElevatorClsids[std::get<0>(GetParam())]);
+  EXPECT_EQ(GetElevatorClsid(),
+            UNSAFE_TODO(kElevatorClsids[std::get<0>(GetParam())]));
 
   auto clsid_str = base::win::WStringFromGUID(GetElevatorClsid());
-  EXPECT_THAT(clsid_str.c_str(),
-              StrCaseEq(kElevatorClsidsString[std::get<0>(GetParam())]));
+  EXPECT_THAT(
+      clsid_str.c_str(),
+      StrCaseEq(UNSAFE_TODO(kElevatorClsidsString[std::get<0>(GetParam())])));
 }
 
 TEST_P(InstallStaticUtilTest, GetElevatorIid) {
@@ -749,11 +750,13 @@
   static_assert(std::size(kElevatorIids) == NUM_INSTALL_MODES,
                 "kElevatorIids needs to be updated for any new modes.");
 
-  EXPECT_EQ(GetElevatorIid(), kElevatorIids[std::get<0>(GetParam())]);
+  EXPECT_EQ(GetElevatorIid(),
+            UNSAFE_TODO(kElevatorIids[std::get<0>(GetParam())]));
 
   auto iid_str = base::win::WStringFromGUID(GetElevatorIid());
-  EXPECT_THAT(iid_str.c_str(),
-              StrCaseEq(kElevatorIidsString[std::get<0>(GetParam())]));
+  EXPECT_THAT(
+      iid_str.c_str(),
+      StrCaseEq(UNSAFE_TODO(kElevatorIidsString[std::get<0>(GetParam())])));
 }
 
 TEST_P(InstallStaticUtilTest, UsageStatsAbsent) {
@@ -843,7 +846,8 @@
       L"924012148-",  // Chromium.
   };
 #endif
-  EXPECT_STREQ(GetSandboxSidPrefix(), kSandBoxSids[std::get<0>(GetParam())]);
+  EXPECT_STREQ(GetSandboxSidPrefix(),
+               UNSAFE_TODO(kSandBoxSids[std::get<0>(GetParam())]));
 }
 
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
diff --git a/chrome/install_static/policy_path_parser.cc b/chrome/install_static/policy_path_parser.cc
index 1e39557..a4c6a51 100644
--- a/chrome/install_static/policy_path_parser.cc
+++ b/chrome/install_static/policy_path_parser.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/install_static/policy_path_parser.h"
 
 #include <assert.h>
@@ -17,6 +12,7 @@
 
 #include <memory>
 
+#include "base/compiler_specific.h"
 #include "base/containers/heap_array.h"
 
 namespace {
@@ -56,9 +52,10 @@
     if (library_) {
       // Strip off any leading :: that may have come from stringifying the
       // function's name.
-      if (function_name[0] == ':' && function_name[1] == ':' &&
-          function_name[2] && function_name[2] != ':') {
-        function_name += 2;
+      if (function_name[0] == ':' && UNSAFE_TODO(function_name[1]) == ':' &&
+          UNSAFE_TODO(function_name[2]) &&
+          UNSAFE_TODO(function_name[2]) != ':') {
+        UNSAFE_TODO(function_name += 2);
       }
       function_ = reinterpret_cast<FunctionType*>(
           GetProcAddress(library_, function_name));
@@ -111,12 +108,12 @@
       SCOPED_LOAD_FUNCTION(L"shell32.dll", ::SHGetSpecialFolderPathW);
   // First translate all path variables we recognize.
   for (size_t i = 0; i < _countof(kWinFolderMapping); ++i) {
-    size_t position = result.find(kWinFolderMapping[i].name);
+    size_t position = result.find(UNSAFE_TODO(kWinFolderMapping[i]).name);
     if (position != std::wstring::npos) {
-      size_t variable_length = wcslen(kWinFolderMapping[i].name);
+      size_t variable_length = wcslen(UNSAFE_TODO(kWinFolderMapping[i]).name);
       WCHAR path[MAX_PATH];
-      if (!sh_get_special_folder_path(nullptr, path, kWinFolderMapping[i].id,
-                                      false)) {
+      if (!sh_get_special_folder_path(
+              nullptr, path, UNSAFE_TODO(kWinFolderMapping[i]).id, false)) {
         path[0] = 0;
       }
       std::wstring path_string(path);
diff --git a/chrome/install_static/product_install_details.cc b/chrome/install_static/product_install_details.cc
index b164606..c678c81f 100644
--- a/chrome/install_static/product_install_details.cc
+++ b/chrome/install_static/product_install_details.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/install_static/product_install_details.h"
 
 #include <windows.h>
@@ -14,6 +9,7 @@
 #include <algorithm>
 #include <iterator>
 
+#include "base/compiler_specific.h"
 #include "chrome/chrome_elf/nt_registry/nt_registry.h"
 #include "chrome/install_static/install_details.h"
 #include "chrome/install_static/install_modes.h"
@@ -53,8 +49,9 @@
                     size_t parent_len,
                     const std::wstring& path) {
   // Ignore all terminating path separators in |parent|.
-  while (parent_len && parent[parent_len - 1] == L'\\')
+  while (parent_len && UNSAFE_TODO(parent[parent_len - 1]) == L'\\') {
     --parent_len;
+  }
   // Pass if the parent was all separators.
   if (!parent_len)
     return false;
diff --git a/chrome/installer/gcapi/gcapi.cc b/chrome/installer/gcapi/gcapi.cc
index c276387..ab23025 100644
--- a/chrome/installer/gcapi/gcapi.cc
+++ b/chrome/installer/gcapi/gcapi.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 // NOTE: This code is a legacy utility API for partners to check whether
 //       Chrome can be installed and launched. Recent updates are being made
 //       to add new functionality. These updates use code from Chromium, the old
@@ -17,12 +12,13 @@
 
 #include <windows.h>
 
-#include <versionhelpers.h>
-
 #include <sddl.h>
 #include <stddef.h>
 #include <stdint.h>
 #include <string.h>
+#include <versionhelpers.h>
+
+#include "base/compiler_specific.h"
 #define STRSAFE_NO_DEPRECATE
 #include <objbase.h>
 
@@ -92,7 +88,7 @@
     return false;
 
   buffer_size = _countof(file_version_info);
-  memset(file_version_info, 0, buffer_size);
+  UNSAFE_TODO(memset(file_version_info, 0, buffer_size));
   if (!::GetFileVersionInfo(filename, handle, buffer_size, file_version_info))
     return false;
 
@@ -111,7 +107,7 @@
   DWORD lang = 0;
   // Formulate the string to retrieve the company name of the specific
   // language codepage.
-  memcpy(&lang, data, 4);
+  UNSAFE_TODO(memcpy(&lang, data, 4));
   ::StringCchPrintf(info_name, _countof(info_name),
                     L"\\StringFileInfo\\%02X%02X%02X%02X\\CompanyName",
                     (lang & 0xff00) >> 8, (lang & 0xff),
@@ -125,7 +121,7 @@
   if (data_len <= 0 || data_len >= (out_len / sizeof(wchar_t)))
     return false;
 
-  memset(buffer, 0, out_len);
+  UNSAFE_TODO(memset(buffer, 0, out_len));
   ::StringCchCopyN(buffer, (out_len / sizeof(wchar_t)),
                    reinterpret_cast<const wchar_t*>(data), data_len);
   return true;
@@ -693,7 +689,8 @@
   bool valid_brandcode = false;
   if (gcapi_internals::GetBrand(&installed_brandcode)) {
     for (int i = 0; i < partner_brandcode_list_length; ++i) {
-      if (!_wcsicmp(installed_brandcode.c_str(), partner_brandcode_list[i])) {
+      if (!_wcsicmp(installed_brandcode.c_str(),
+                    UNSAFE_TODO(partner_brandcode_list[i]))) {
         valid_brandcode = true;
         break;
       }
diff --git a/chrome/installer/mini_installer/configuration_test.cc b/chrome/installer/mini_installer/configuration_test.cc
index 5b5dc03..744340a 100644
--- a/chrome/installer/mini_installer/configuration_test.cc
+++ b/chrome/installer/mini_installer/configuration_test.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/installer/mini_installer/configuration.h"
 
 #include <stddef.h>
@@ -15,6 +10,7 @@
 #include <memory>
 #include <vector>
 
+#include "base/compiler_specific.h"
 #include "base/environment.h"
 #include "base/test/test_reg_util_win.h"
 #include "base/win/registry.h"
@@ -97,8 +93,9 @@
       L"spam.exe --foo",
   };
   for (size_t i = 0; i < _countof(kCommandLines); ++i) {
-    EXPECT_TRUE(std::wstring(kCommandLines[i]) ==
-                TestConfiguration(kCommandLines[i]).command_line());
+    EXPECT_TRUE(
+        std::wstring(UNSAFE_TODO(kCommandLines[i])) ==
+        TestConfiguration(UNSAFE_TODO(kCommandLines[i])).command_line());
   }
 }
 
diff --git a/chrome/installer/setup/install_unittest.cc b/chrome/installer/setup/install_unittest.cc
index df2e5ce..eeb0f64e 100644
--- a/chrome/installer/setup/install_unittest.cc
+++ b/chrome/installer/setup/install_unittest.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/installer/setup/install.h"
 
 #include <stddef.h>
@@ -16,6 +11,7 @@
 #include <tuple>
 
 #include "base/base_paths.h"
+#include "base/compiler_specific.h"
 #include "base/files/file.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
@@ -301,9 +297,9 @@
     std::string initial_prefs("{\"distribution\":{");
     for (size_t i = 0; i < std::size(desired_prefs); ++i) {
       initial_prefs += (i == 0 ? "\"" : ",\"");
-      initial_prefs += desired_prefs[i].pref_name;
+      initial_prefs += UNSAFE_TODO(desired_prefs[i]).pref_name;
       initial_prefs += "\":";
-      initial_prefs += base::ToString(desired_prefs[i].is_desired);
+      initial_prefs += base::ToString(UNSAFE_TODO(desired_prefs[i]).is_desired);
     }
     initial_prefs += "}}";
 
diff --git a/chrome/installer/setup/setup_util.cc b/chrome/installer/setup/setup_util.cc
index aab2768..1c41ce3c 100644
--- a/chrome/installer/setup/setup_util.cc
+++ b/chrome/installer/setup/setup_util.cc
@@ -4,11 +4,6 @@
 //
 // This file declares util functions for setup project.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/installer/setup/setup_util.h"
 
 #include <objbase.h>
@@ -30,6 +25,7 @@
 #include "base/base64.h"
 #include "base/check.h"
 #include "base/command_line.h"
+#include "base/compiler_specific.h"
 #include "base/cpu.h"
 #include "base/files/file.h"
 #include "base/files/file_enumerator.h"
@@ -267,8 +263,9 @@
       "app-launcher",
   };
   for (size_t i = 0; i < std::size(kLegacySwitches); ++i) {
-    if (cmd_line.HasSwitch(kLegacySwitches[i]))
+    if (cmd_line.HasSwitch(UNSAFE_TODO(kLegacySwitches[i]))) {
       return true;
+    }
   }
   return false;
 }
diff --git a/chrome/installer/setup/uninstall.cc b/chrome/installer/setup/uninstall.cc
index 6bdb037..0c29866 100644
--- a/chrome/installer/setup/uninstall.cc
+++ b/chrome/installer/setup/uninstall.cc
@@ -4,11 +4,6 @@
 //
 // This file defines the methods useful for uninstalling Chrome.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/installer/setup/uninstall.h"
 
 #include <windows.h>
@@ -24,6 +19,7 @@
 #include <vector>
 
 #include "base/base_paths.h"
+#include "base/compiler_specific.h"
 #include "base/files/file_enumerator.h"
 #include "base/files/file_util.h"
 #include "base/functional/bind.h"
@@ -422,7 +418,7 @@
     ValueEquals prog_id_pred(prog_id);
     for (const wchar_t* const* filetype =
              &ShellUtil::kPotentialFileAssociations[0];
-         *filetype != nullptr; ++filetype) {
+         *filetype != nullptr; UNSAFE_TODO(++filetype)) {
       if (DeleteRegistryValueIf(
               root, (classes_path + *filetype).c_str(), WorkItem::kWow64Default,
               nullptr, prog_id_pred) == ConditionalDeleteResult::DELETED) {
@@ -719,10 +715,12 @@
   std::wstring file_assoc_key;
   std::wstring open_with_list_key;
   std::wstring open_with_progids_key;
-  for (int i = 0; ShellUtil::kPotentialFileAssociations[i] != nullptr; ++i) {
+  for (int i = 0;
+       UNSAFE_TODO(ShellUtil::kPotentialFileAssociations[i]) != nullptr; ++i) {
     file_assoc_key.assign(ShellUtil::kRegClasses);
     file_assoc_key.push_back(base::FilePath::kSeparators[0]);
-    file_assoc_key.append(ShellUtil::kPotentialFileAssociations[i]);
+    file_assoc_key.append(
+        UNSAFE_TODO(ShellUtil::kPotentialFileAssociations[i]));
     file_assoc_key.push_back(base::FilePath::kSeparators[0]);
 
     open_with_list_key.assign(file_assoc_key);
@@ -756,7 +754,7 @@
   std::wstring child_key;
   for (const wchar_t* const* proto =
            &ShellUtil::kPotentialProtocolAssociations[0];
-       *proto != nullptr; ++proto) {
+       *proto != nullptr; UNSAFE_TODO(++proto)) {
     parent_key.resize(base_length);
     parent_key.append(*proto);
     child_key.assign(parent_key).append(ShellUtil::kRegShellOpen);
@@ -784,21 +782,24 @@
   HKEY roots[] = {HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER};
   for (size_t i = 0; i < std::size(roots); ++i) {
     std::wstring suffix;
-    if (roots[i] == HKEY_LOCAL_MACHINE)
+    if (UNSAFE_TODO(roots[i]) == HKEY_LOCAL_MACHINE) {
       suffix = ShellUtil::GetCurrentInstallationSuffix(chrome_exe);
+    }
 
     // Delete Software\Classes\ChromeExt,
     std::wstring ext_prog_id(ShellUtil::kRegClasses);
     ext_prog_id.push_back(base::FilePath::kSeparators[0]);
     ext_prog_id.append(kChromeExtProgId);
     ext_prog_id.append(suffix);
-    DeleteRegistryKey(roots[i], ext_prog_id, WorkItem::kWow64Default);
+    DeleteRegistryKey(UNSAFE_TODO(roots[i]), ext_prog_id,
+                      WorkItem::kWow64Default);
 
     // Delete Software\Classes\.crx,
     std::wstring ext_association(ShellUtil::kRegClasses);
     ext_association.append(L"\\");
     ext_association.append(L".crx");
-    DeleteRegistryKey(roots[i], ext_association, WorkItem::kWow64Default);
+    DeleteRegistryKey(UNSAFE_TODO(roots[i]), ext_association,
+                      WorkItem::kWow64Default);
   }
 }
 
diff --git a/chrome/installer/util/advanced_firewall_manager_win.cc b/chrome/installer/util/advanced_firewall_manager_win.cc
index b0c497d96..c1ec7eed 100644
--- a/chrome/installer/util/advanced_firewall_manager_win.cc
+++ b/chrome/installer/util/advanced_firewall_manager_win.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/installer/util/advanced_firewall_manager_win.h"
 
 #include <objbase.h>
@@ -14,6 +9,7 @@
 #include <stddef.h>
 
 #include "base/check_op.h"
+#include "base/compiler_specific.h"
 #include "base/logging.h"
 #include "base/strings/string_number_conversions_win.h"
 #include "base/strings/utf_string_conversions.h"
@@ -57,9 +53,10 @@
   const NET_FW_PROFILE_TYPE2 kProfileTypes[] = {
       NET_FW_PROFILE2_PUBLIC, NET_FW_PROFILE2_PRIVATE, NET_FW_PROFILE2_DOMAIN};
   for (size_t i = 0; i < std::size(kProfileTypes); ++i) {
-    if ((profile_types & kProfileTypes[i]) != 0) {
+    if ((profile_types & UNSAFE_TODO(kProfileTypes[i])) != 0) {
       VARIANT_BOOL enabled = VARIANT_TRUE;
-      hr = firewall_policy_->get_FirewallEnabled(kProfileTypes[i], &enabled);
+      hr = firewall_policy_->get_FirewallEnabled(UNSAFE_TODO(kProfileTypes[i]),
+                                                 &enabled);
       // Assume the firewall is enabled if we can't determine.
       if (FAILED(hr) || enabled != VARIANT_FALSE)
         return true;
diff --git a/chrome/installer/util/app_command.cc b/chrome/installer/util/app_command.cc
index b95fc87..559a7ad 100644
--- a/chrome/installer/util/app_command.cc
+++ b/chrome/installer/util/app_command.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/installer/util/app_command.h"
 
 #include <windows.h>
@@ -14,6 +9,7 @@
 #include <stddef.h>
 
 #include "base/check.h"
+#include "base/compiler_specific.h"
 #include "base/logging.h"
 #include "base/strings/strcat.h"
 #include "base/win/registry.h"
@@ -99,8 +95,8 @@
   for (size_t i = 0; i < std::size(kNameBoolVars); ++i) {
     DWORD value = 0;  // Set default to false.
     // Note: ReadValueDW only modifies out param on success.
-    key.ReadValueDW(kNameBoolVars[i].name, &value);
-    this->*(kNameBoolVars[i].data) = (value != 0);
+    key.ReadValueDW(UNSAFE_TODO(kNameBoolVars[i]).name, &value);
+    this->*(UNSAFE_TODO(kNameBoolVars[i]).data) = (value != 0);
   }
 
   return true;
@@ -121,8 +117,8 @@
       ->set_log_message("setting AppCommand CommandLine registry value");
 
   for (size_t i = 0; i < std::size(kNameBoolVars); ++i) {
-    const wchar_t* var_name = kNameBoolVars[i].name;
-    bool var_data = this->*(kNameBoolVars[i].data);
+    const wchar_t* var_name = UNSAFE_TODO(kNameBoolVars[i]).name;
+    bool var_data = this->*(UNSAFE_TODO(kNameBoolVars[i]).data);
 
     // Adds a work item to set |var_name| to DWORD 1 if |var_data| is true;
     // adds a work item to remove |var_name| otherwise.
diff --git a/chrome/installer/util/delete_after_reboot_helper_unittest.cc b/chrome/installer/util/delete_after_reboot_helper_unittest.cc
index f1cbe276..141afdb 100644
--- a/chrome/installer/util/delete_after_reboot_helper_unittest.cc
+++ b/chrome/installer/util/delete_after_reboot_helper_unittest.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/installer/util/delete_after_reboot_helper.h"
 
 #include <windows.h>
@@ -16,6 +11,7 @@
 
 #include <memory>
 
+#include "base/compiler_specific.h"
 #include "base/files/file_util.h"
 #include "base/logging.h"
 #include "base/strings/string_util.h"
@@ -78,8 +74,8 @@
     for (int i = 0; i < len; i++) {
       if (*comp1 != *comp2)
         return false;
-      comp1++;
-      comp2++;
+      UNSAFE_TODO(comp1++);
+      UNSAFE_TODO(comp2++);
     }
     return true;
   }
@@ -123,18 +119,20 @@
 
   for (size_t i = 0; i < std::size(tests); i++) {
     std::vector<PendingMove> string_list;
-    EXPECT_TRUE(SUCCEEDED(
-        MultiSZBytesToStringArray(reinterpret_cast<const char*>(tests[i].str),
-                                  tests[i].length, &string_list)))
-        << tests[i].test_name;
-    EXPECT_EQ(tests[i].count, string_list.size()) << tests[i].test_name;
+    EXPECT_TRUE(SUCCEEDED(MultiSZBytesToStringArray(
+        reinterpret_cast<const char*>(UNSAFE_TODO(tests[i]).str),
+        UNSAFE_TODO(tests[i]).length, &string_list)))
+        << UNSAFE_TODO(tests[i]).test_name;
+    EXPECT_EQ(UNSAFE_TODO(tests[i]).count, string_list.size())
+        << UNSAFE_TODO(tests[i]).test_name;
     std::vector<char> buffer;
     buffer.resize(WStringPairListSize(string_list));
     StringArrayToMultiSZBytes(string_list, &buffer);
-    EXPECT_TRUE(CompareBuffers(const_cast<const char*>(&buffer[0]),
-                               reinterpret_cast<const char*>(tests[i].str),
-                               tests[i].length))
-        << tests[i].test_name;
+    EXPECT_TRUE(
+        CompareBuffers(const_cast<const char*>(&buffer[0]),
+                       reinterpret_cast<const char*>(UNSAFE_TODO(tests[i]).str),
+                       UNSAFE_TODO(tests[i]).length))
+        << UNSAFE_TODO(tests[i]).test_name;
   }
 
   StringTest failures[] = {
@@ -144,9 +142,9 @@
   for (size_t i = 0; i < std::size(failures); i++) {
     std::vector<PendingMove> string_list;
     EXPECT_FALSE(SUCCEEDED(MultiSZBytesToStringArray(
-        reinterpret_cast<const char*>(failures[i].str), failures[i].length,
-        &string_list)))
-        << failures[i].test_name;
+        reinterpret_cast<const char*>(UNSAFE_TODO(failures[i]).str),
+        UNSAFE_TODO(failures[i]).length, &string_list)))
+        << UNSAFE_TODO(failures[i]).test_name;
   }
 }
 
@@ -181,7 +179,8 @@
   for (size_t i = 0; i < std::size(expected_paths); ++i) {
     EXPECT_FALSE(iter == pending_moves.end());
     if (iter != pending_moves.end()) {
-      base::FilePath short_path_name(GetShortPathName(expected_paths[i]));
+      base::FilePath short_path_name(
+          GetShortPathName(UNSAFE_TODO(expected_paths[i])));
       base::FilePath move_path(iter->first);
       EXPECT_TRUE(MatchPendingDeletePath(short_path_name, move_path));
       ++iter;
@@ -235,7 +234,8 @@
   for (size_t i = 0; i < std::size(expected_paths); ++i) {
     EXPECT_FALSE(iter == pending_moves.end());
     if (iter != pending_moves.end()) {
-      base::FilePath short_path_name(GetShortPathName(expected_paths[i]));
+      base::FilePath short_path_name(
+          GetShortPathName(UNSAFE_TODO(expected_paths[i])));
       base::FilePath move_path(iter->first);
       EXPECT_TRUE(MatchPendingDeletePath(short_path_name, move_path));
       ++iter;
diff --git a/chrome/installer/util/delete_reg_key_work_item_unittest.cc b/chrome/installer/util/delete_reg_key_work_item_unittest.cc
index 6902ecf..031f291f9 100644
--- a/chrome/installer/util/delete_reg_key_work_item_unittest.cc
+++ b/chrome/installer/util/delete_reg_key_work_item_unittest.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/installer/util/delete_reg_key_work_item.h"
 
 #include <windows.h>
@@ -15,6 +10,7 @@
 
 #include <memory>
 
+#include "base/compiler_specific.h"
 #include "base/logging.h"
 #include "base/win/registry.h"
 #include "base/win/security_descriptor.h"
@@ -43,7 +39,7 @@
       std::wstring(test_data_.base_path() + L"\\NoKeyHere\\OrHere")};
   RegKey key;
   for (size_t i = 0; i < std::size(key_paths); ++i) {
-    const std::wstring& key_path = key_paths[i];
+    const std::wstring& key_path = UNSAFE_TODO(key_paths[i]);
     std::unique_ptr<DeleteRegKeyWorkItem> item(
         WorkItem::CreateDeleteRegKeyWorkItem(test_data_.root_key(), key_path,
                                              WorkItem::kWow64Default));
diff --git a/chrome/installer/util/google_update_settings_unittest.cc b/chrome/installer/util/google_update_settings_unittest.cc
index 64cc156..8b2e448 100644
--- a/chrome/installer/util/google_update_settings_unittest.cc
+++ b/chrome/installer/util/google_update_settings_unittest.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/installer/util/google_update_settings.h"
 
 #include <windows.h>
@@ -17,6 +12,7 @@
 #include <string_view>
 
 #include "base/base_paths.h"
+#include "base/compiler_specific.h"
 #include "base/hash/hash.h"
 #include "base/path_service.h"
 #include "base/strings/utf_string_conversions.h"
@@ -192,8 +188,8 @@
 
     for (const wchar_t* const* inputs : input_arrays) {
       for (size_t input_idx = 0; input_idx < std::size(plain); ++input_idx) {
-        const wchar_t* input = inputs[input_idx];
-        const wchar_t* output = outputs[input_idx];
+        const wchar_t* input = UNSAFE_TODO(inputs[input_idx]);
+        const wchar_t* output = UNSAFE_TODO(outputs[input_idx]);
         SCOPED_TRACE(::testing::Message() << "input=\"" << input << "\"");
         SCOPED_TRACE(::testing::Message() << "output=\"" << output << "\"");
 
diff --git a/chrome/installer/util/install_service_work_item_impl.cc b/chrome/installer/util/install_service_work_item_impl.cc
index 5e9e2db3..7bc9b2f 100644
--- a/chrome/installer/util/install_service_work_item_impl.cc
+++ b/chrome/installer/util/install_service_work_item_impl.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/installer/util/install_service_work_item_impl.h"
 
 #include <cguid.h>
@@ -18,6 +13,7 @@
 #include <utility>
 
 #include "base/check.h"
+#include "base/compiler_specific.h"
 #include "base/files/file_path.h"
 #include "base/logging.h"
 #include "base/metrics/histogram_functions.h"
@@ -556,10 +552,10 @@
   // strings in the multi-sz.
   const wchar_t* scan = multi_sz;
   do {
-    scan += wcslen(scan) + 1;
+    UNSAFE_TODO(scan += wcslen(scan) + 1);
   } while (*scan);
 
-  return std::vector<wchar_t>(multi_sz, scan + 1);
+  return std::vector<wchar_t>(multi_sz, UNSAFE_TODO(scan + 1));
 }
 
 // static
diff --git a/chrome/installer/util/install_service_work_item_unittest.cc b/chrome/installer/util/install_service_work_item_unittest.cc
index 7a1f6578..71220ad6 100644
--- a/chrome/installer/util/install_service_work_item_unittest.cc
+++ b/chrome/installer/util/install_service_work_item_unittest.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/390223051): Remove C-library calls to fix the errors.
-#pragma allow_unsafe_libc_calls
-#endif
-
 #include "chrome/installer/util/install_service_work_item.h"
 
 #include <shlobj.h>
@@ -15,6 +10,7 @@
 #include <vector>
 
 #include "base/command_line.h"
+#include "base/compiler_specific.h"
 #include "base/files/file_path.h"
 #include "base/strings/strcat_win.h"
 #include "base/test/metrics/histogram_tester.h"
@@ -212,7 +208,8 @@
   constexpr wchar_t kZeroMultiSz[] = L"";
   std::vector<wchar_t> vec =
       InstallServiceWorkItemImpl::MultiSzToVector(kZeroMultiSz);
-  EXPECT_TRUE(!memcmp(vec.data(), &kZeroMultiSz, sizeof(kZeroMultiSz)));
+  EXPECT_TRUE(
+      !UNSAFE_TODO(memcmp(vec.data(), &kZeroMultiSz, sizeof(kZeroMultiSz))));
   EXPECT_EQ(vec.size(), std::size(kZeroMultiSz));
 
   vec = InstallServiceWorkItemImpl::MultiSzToVector(nullptr);
@@ -220,12 +217,13 @@
 
   constexpr wchar_t kRpcMultiSz[] = L"RPCSS\0";
   vec = InstallServiceWorkItemImpl::MultiSzToVector(kRpcMultiSz);
-  EXPECT_TRUE(!memcmp(vec.data(), &kRpcMultiSz, sizeof(kRpcMultiSz)));
+  EXPECT_TRUE(
+      !UNSAFE_TODO(memcmp(vec.data(), &kRpcMultiSz, sizeof(kRpcMultiSz))));
   EXPECT_EQ(vec.size(), std::size(kRpcMultiSz));
 
   constexpr wchar_t kMultiSz[] = L"RPCSS\0LSASS\0";
   vec = InstallServiceWorkItemImpl::MultiSzToVector(kMultiSz);
-  EXPECT_TRUE(!memcmp(vec.data(), &kMultiSz, sizeof(kMultiSz)));
+  EXPECT_TRUE(!UNSAFE_TODO(memcmp(vec.data(), &kMultiSz, sizeof(kMultiSz))));
   EXPECT_EQ(vec.size(), std::size(kMultiSz));
 }
 
diff --git a/chrome/installer/util/l10n_string_util.cc b/chrome/installer/util/l10n_string_util.cc
index b4c18f9..a76c55b 100644
--- a/chrome/installer/util/l10n_string_util.cc
+++ b/chrome/installer/util/l10n_string_util.cc
@@ -4,11 +4,6 @@
 //
 // This file defines utility functions for fetching localized resources.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/installer/util/l10n_string_util.h"
 
 #include <windows.h>
@@ -22,6 +17,7 @@
 #include <vector>
 
 #include "base/check.h"
+#include "base/compiler_specific.h"
 #include "base/containers/buffer_iterator.h"
 #include "base/containers/heap_array.h"
 #include "base/containers/span.h"
@@ -107,7 +103,8 @@
         // The bundle is a sequence of ATLSTRINGRESOURCEIMAGE structures, which
         // are each a DWORD length followed by that many wide characters.
         bundle_size = ::SizeofResource(CURRENT_MODULE(), bundle_handle);
-        base::BufferIterator<const uint8_t> iterator(bundle_data, bundle_size);
+        base::BufferIterator<const uint8_t> UNSAFE_TODO(
+            iterator(bundle_data, bundle_size));
         // Scan forward in the bundle past all preceding messages.
         for (int index = message_id & 0xF; index; --index) {
           if (const auto* length = iterator.Object<const WORD>(); length) {
@@ -218,8 +215,8 @@
   }
 
   // Return the variant of |base_message_id| for the current mode.
-  return mode_strings[install_static::InstallDetails::Get()
-                          .install_mode_index()];
+  return UNSAFE_TODO(
+      mode_strings)[install_static::InstallDetails::Get().install_mode_index()];
 }
 
 }  // namespace installer
diff --git a/chrome/installer/util/lzma_util.cc b/chrome/installer/util/lzma_util.cc
index 0a2ab53..3474f8f0 100644
--- a/chrome/installer/util/lzma_util.cc
+++ b/chrome/installer/util/lzma_util.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/installer/util/lzma_util.h"
 
 #include <windows.h>
diff --git a/chrome/installer/util/registry_key_backup.cc b/chrome/installer/util/registry_key_backup.cc
index d0265b4..5018303 100644
--- a/chrome/installer/util/registry_key_backup.cc
+++ b/chrome/installer/util/registry_key_backup.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/installer/util/registry_key_backup.h"
 
 #include <stdint.h>
@@ -18,6 +13,7 @@
 #include <vector>
 
 #include "base/check.h"
+#include "base/compiler_specific.h"
 #include "base/logging.h"
 #include "base/win/registry.h"
 
@@ -111,7 +107,7 @@
                            DWORD data_size) {
   name_.assign(name_buffer, name_size);
   type_ = type;
-  data_.assign(data, data + data_size);
+  data_.assign(data, UNSAFE_TODO(data + data_size));
 }
 
 RegistryKeyBackup::KeyData::KeyData() = default;
diff --git a/chrome/installer/util/scoped_token_privilege_unittest.cc b/chrome/installer/util/scoped_token_privilege_unittest.cc
index 87b8989..64deeb8 100644
--- a/chrome/installer/util/scoped_token_privilege_unittest.cc
+++ b/chrome/installer/util/scoped_token_privilege_unittest.cc
@@ -2,17 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/installer/util/scoped_token_privilege.h"
 
 #include <shlobj.h>
 
 #include <memory>
 
+#include "base/compiler_specific.h"
 #include "base/containers/heap_array.h"
 #include "base/logging.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -57,12 +53,12 @@
   const DWORD buffer_size = desired_size + 1;
   auto name_buffer = base::HeapArray<wchar_t>::WithSize(buffer_size);
   for (int i = privileges->PrivilegeCount - 1; i >= 0; --i) {
-    LUID_AND_ATTRIBUTES& luid_and_att = privileges->Privileges[i];
+    LUID_AND_ATTRIBUTES& luid_and_att = UNSAFE_TODO(privileges->Privileges[i]);
     size = buffer_size;
     ::LookupPrivilegeName(nullptr, &luid_and_att.Luid, name_buffer.data(),
                           &size);
     if (size == desired_size &&
-        wcscmp(name_buffer.data(), privilege_name) == 0) {
+        UNSAFE_TODO(wcscmp(name_buffer.data(), privilege_name)) == 0) {
       return luid_and_att.Attributes == SE_PRIVILEGE_ENABLED;
     }
   }
diff --git a/chrome/installer/util/set_reg_value_work_item.cc b/chrome/installer/util/set_reg_value_work_item.cc
index 9353ed0..7662249 100644
--- a/chrome/installer/util/set_reg_value_work_item.cc
+++ b/chrome/installer/util/set_reg_value_work_item.cc
@@ -2,13 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/installer/util/set_reg_value_work_item.h"
 
+#include "base/compiler_specific.h"
 #include "base/logging.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
@@ -22,7 +18,8 @@
                         std::vector<uint8_t>* binary_data) {
   DCHECK(binary_data);
   const uint8_t* data = reinterpret_cast<const uint8_t*>(str_value.c_str());
-  binary_data->assign(data, data + (str_value.length() + 1) * sizeof(wchar_t));
+  binary_data->assign(
+      data, UNSAFE_TODO(data + (str_value.length() + 1) * sizeof(wchar_t)));
 }
 
 // Transforms |binary_data| into its wstring representation (assuming
@@ -86,7 +83,7 @@
   DCHECK(wow64_access == 0 || wow64_access == KEY_WOW64_32KEY ||
          wow64_access == KEY_WOW64_64KEY);
   const uint8_t* data = reinterpret_cast<const uint8_t*>(&value_data);
-  value_.assign(data, data + sizeof(value_data));
+  value_.assign(data, UNSAFE_TODO(data + sizeof(value_data)));
 }
 
 SetRegValueWorkItem::SetRegValueWorkItem(HKEY predefined_root,
@@ -106,7 +103,7 @@
   DCHECK(wow64_access == 0 || wow64_access == KEY_WOW64_32KEY ||
          wow64_access == KEY_WOW64_64KEY);
   const uint8_t* data = reinterpret_cast<const uint8_t*>(&value_data);
-  value_.assign(data, data + sizeof(value_data));
+  value_.assign(data, UNSAFE_TODO(data + sizeof(value_data)));
 }
 
 SetRegValueWorkItem::SetRegValueWorkItem(
diff --git a/chrome/installer/util/shell_util.cc b/chrome/installer/util/shell_util.cc
index b68f7bee2..7da4a13 100644
--- a/chrome/installer/util/shell_util.cc
+++ b/chrome/installer/util/shell_util.cc
@@ -7,11 +7,6 @@
 // work is done by the local functions defined in anonymous namespace in
 // this class.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/installer/util/shell_util.h"
 
 #include <objbase.h>
@@ -30,6 +25,7 @@
 #include <utility>
 
 #include "base/command_line.h"
+#include "base/compiler_specific.h"
 #include "base/containers/span.h"
 #include "base/files/file_enumerator.h"
 #include "base/files/file_path.h"
@@ -482,19 +478,23 @@
   const std::wstring html_prog_id(GetBrowserProgId(suffix));
   // Register HTML and PDF Prog IDs (e.g., ChromePDF) with the corresponding
   // file association.
-  for (int i = 0; ShellUtil::kPotentialFileAssociations[i] != nullptr; i++) {
+  for (int i = 0;
+       UNSAFE_TODO(ShellUtil::kPotentialFileAssociations[i]) != nullptr; i++) {
     entries->push_back(std::make_unique<RegistryEntry>(
         capabilities + L"\\FileAssociations",
-        ShellUtil::kPotentialFileAssociations[i],
-        wcscmp(ShellUtil::kPotentialFileAssociations[i], L".pdf") == 0
+        UNSAFE_TODO(ShellUtil::kPotentialFileAssociations[i]),
+        UNSAFE_TODO(
+            wcscmp(ShellUtil::kPotentialFileAssociations[i], L".pdf")) == 0
             ? GetPDFProgId(suffix)
             : html_prog_id));
   }
-  for (int i = 0; ShellUtil::kPotentialProtocolAssociations[i] != nullptr;
+  for (int i = 0;
+       UNSAFE_TODO(ShellUtil::kPotentialProtocolAssociations[i]) != nullptr;
        i++) {
     entries->push_back(std::make_unique<RegistryEntry>(
         capabilities + L"\\URLAssociations",
-        ShellUtil::kPotentialProtocolAssociations[i], html_prog_id));
+        UNSAFE_TODO(ShellUtil::kPotentialProtocolAssociations[i]),
+        html_prog_id));
   }
 }
 
@@ -536,9 +536,11 @@
       chrome_exe.DirName().value()));
 
   const std::wstring html_prog_id(GetBrowserProgId(suffix));
-  for (int i = 0; ShellUtil::kPotentialFileAssociations[i] != nullptr; i++) {
+  for (int i = 0;
+       UNSAFE_TODO(ShellUtil::kPotentialFileAssociations[i]) != nullptr; i++) {
     GetAppExtRegistrationEntries(
-        html_prog_id, ShellUtil::kPotentialFileAssociations[i], entries);
+        html_prog_id, UNSAFE_TODO(ShellUtil::kPotentialFileAssociations[i]),
+        entries);
   }
 }
 
@@ -614,18 +616,23 @@
     std::vector<std::unique_ptr<RegistryEntry>>* entries) {
   // File extension associations.
   std::wstring html_prog_id(GetBrowserProgId(suffix));
-  for (int i = 0; ShellUtil::kDefaultFileAssociations[i] != nullptr; i++) {
+  for (int i = 0;
+       UNSAFE_TODO(ShellUtil::kDefaultFileAssociations[i]) != nullptr; i++) {
     GetAppDefaultRegistrationEntries(
-        html_prog_id, ShellUtil::kDefaultFileAssociations[i], true, entries);
+        html_prog_id, UNSAFE_TODO(ShellUtil::kDefaultFileAssociations[i]), true,
+        entries);
   }
 
   // Protocols associations.
   std::wstring chrome_open = ShellUtil::GetChromeShellOpenCmd(chrome_exe);
   std::wstring chrome_icon = ShellUtil::FormatIconLocation(
       chrome_exe, install_static::GetAppIconResourceIndex());
-  for (int i = 0; ShellUtil::kBrowserProtocolAssociations[i] != nullptr; i++) {
-    GetXPStyleUserProtocolEntries(ShellUtil::kBrowserProtocolAssociations[i],
-                                  chrome_icon, chrome_open, entries);
+  for (int i = 0;
+       UNSAFE_TODO(ShellUtil::kBrowserProtocolAssociations[i]) != nullptr;
+       i++) {
+    GetXPStyleUserProtocolEntries(
+        UNSAFE_TODO(ShellUtil::kBrowserProtocolAssociations[i]), chrome_icon,
+        chrome_open, entries);
   }
 
   // start->Internet shortcut.
@@ -1053,14 +1060,17 @@
           if (base::StartsWith(current_app.get(), mode_browser_prog_id_prefix,
                                base::CompareCase::SENSITIVE)) {
             return current_app_len == mode_browser_prog_id_prefix.length() ||
-                   current_app[mode_browser_prog_id_prefix.length()] == L'.';
+                   UNSAFE_TODO(
+                       current_app[mode_browser_prog_id_prefix.length()]) ==
+                       L'.';
           }
           if (is_pdf) {
             const std::wstring mode_pdf_prog_id_prefix(mode.pdf_prog_id_prefix);
             if (base::StartsWith(current_app.get(), mode_pdf_prog_id_prefix,
                                  base::CompareCase::SENSITIVE)) {
               return current_app_len == mode_pdf_prog_id_prefix.length() ||
-                     current_app[mode_pdf_prog_id_prefix.length()] == L'.';
+                     UNSAFE_TODO(
+                         current_app[mode_pdf_prog_id_prefix.length()]) == L'.';
             }
           }
           return false;
diff --git a/chrome/installer/util/shell_util_unittest.cc b/chrome/installer/util/shell_util_unittest.cc
index cb5e040..6afbf6e 100644
--- a/chrome/installer/util/shell_util_unittest.cc
+++ b/chrome/installer/util/shell_util_unittest.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/installer/util/shell_util.h"
 
 #include <cguid.h>
@@ -19,6 +14,7 @@
 #include "base/base_paths.h"
 #include "base/base_paths_win.h"
 #include "base/command_line.h"
+#include "base/compiler_specific.h"
 #include "base/files/file_enumerator.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
@@ -1122,7 +1118,7 @@
   static const std::set<std::wstring> FileExtensions() {
     std::set<std::wstring> file_extensions;
     for (size_t i = 0; i < std::size(kTestFileExtensions); ++i)
-      file_extensions.insert(kTestFileExtensions[i]);
+      file_extensions.insert(UNSAFE_TODO(kTestFileExtensions[i]));
     return file_extensions;
   }
 
diff --git a/chrome/notification_helper/notification_activator.cc b/chrome/notification_helper/notification_activator.cc
index de932aa..c6ac241b 100644
--- a/chrome/notification_helper/notification_activator.cc
+++ b/chrome/notification_helper/notification_activator.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/notification_helper/notification_activator.h"
 
 #include <windows.h>
@@ -16,6 +11,7 @@
 #include <string>
 
 #include "base/command_line.h"
+#include "base/compiler_specific.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/process/process.h"
 #include "base/win/windows_types.h"
@@ -122,9 +118,9 @@
 
   // Check to see if a user response (inline reply) is also supplied.
   for (ULONG i = 0; i < count; ++i) {
-    if (lstrcmpW(kUserResponse, data[i].Key) == 0) {
+    if (lstrcmpW(kUserResponse, UNSAFE_TODO(data[i]).Key) == 0) {
       command_line.AppendSwitchNative(switches::kNotificationInlineReply,
-                                      data[i].Value);
+                                      UNSAFE_TODO(data[i]).Value);
       break;
     }
   }
@@ -132,7 +128,7 @@
   std::wstring params(command_line.GetCommandLineString());
 
   SHELLEXECUTEINFO info;
-  memset(&info, 0, sizeof(info));
+  UNSAFE_TODO(memset(&info, 0, sizeof(info)));
   info.cbSize = sizeof(info);
   info.fMask =
       SEE_MASK_NOASYNC | SEE_MASK_FLAG_LOG_USAGE | SEE_MASK_NOCLOSEPROCESS;
diff --git a/chrome/services/media_gallery_util/media_parser_android_unittest.cc b/chrome/services/media_gallery_util/media_parser_android_unittest.cc
index c0f1ccf..46bc57f 100644
--- a/chrome/services/media_gallery_util/media_parser_android_unittest.cc
+++ b/chrome/services/media_gallery_util/media_parser_android_unittest.cc
@@ -2,17 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/services/media_gallery_util/media_parser_android.h"
 
 #include <memory>
 #include <optional>
 #include <vector>
 
+#include "base/compiler_specific.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/functional/callback_helpers.h"
@@ -44,7 +40,7 @@
 bool HasValidYUVData(const media::VideoFrame& frame) {
   bool valid = false;
   for (size_t i = 0; i < 8; ++i) {
-    valid |= *(frame.data(media::VideoFrame::Plane::kY) + i);
+    valid |= *(UNSAFE_TODO(frame.data(media::VideoFrame::Plane::kY) + i));
     if (valid)
       break;
   }
@@ -72,7 +68,8 @@
     base::File file(file_path_, base::File::Flags::FLAG_OPEN |
                                     base::File::Flags::FLAG_READ);
     auto buffer = std::vector<uint8_t>(length);
-    int bytes_read = file.Read(position, (char*)(buffer.data()), length);
+    int bytes_read =
+        UNSAFE_TODO(file.Read(position, (char*)(buffer.data()), length));
     if (bytes_read < length)
       buffer.resize(bytes_read);
 
diff --git a/chrome/services/sharing/nearby/decoder/nearby_decoder_decode_advertisement_fuzzer.cc b/chrome/services/sharing/nearby/decoder/nearby_decoder_decode_advertisement_fuzzer.cc
index cab4df3..43cf38ca 100644
--- a/chrome/services/sharing/nearby/decoder/nearby_decoder_decode_advertisement_fuzzer.cc
+++ b/chrome/services/sharing/nearby/decoder/nearby_decoder_decode_advertisement_fuzzer.cc
@@ -2,22 +2,18 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
-#include "chrome/services/sharing/nearby/decoder/nearby_decoder.h"
-
 #include <stddef.h>
 #include <stdint.h>
+
 #include <memory>
 #include <vector>
 
+#include "base/compiler_specific.h"
 #include "base/logging.h"
 #include "base/no_destructor.h"
 #include "base/run_loop.h"
 #include "base/task/single_thread_task_executor.h"
+#include "chrome/services/sharing/nearby/decoder/nearby_decoder.h"
 #include "chromeos/ash/services/nearby/public/mojom/nearby_decoder.mojom.h"
 #include "chromeos/ash/services/nearby/public/mojom/nearby_decoder_types.mojom.h"
 #include "mojo/core/embedder/embedder.h"
@@ -44,7 +40,7 @@
 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   static base::NoDestructor<Environment> environment;
 
-  std::vector<uint8_t> buffer(data, data + size);
+  std::vector<uint8_t> buffer(data, UNSAFE_TODO(data + size));
   base::RunLoop run_loop;
   environment->decoder->DecodeAdvertisement(
       buffer, base::BindOnce(
diff --git a/chrome/services/sharing/nearby/decoder/nearby_decoder_decode_frame_fuzzer.cc b/chrome/services/sharing/nearby/decoder/nearby_decoder_decode_frame_fuzzer.cc
index 3b205a0..6ad57f0 100644
--- a/chrome/services/sharing/nearby/decoder/nearby_decoder_decode_frame_fuzzer.cc
+++ b/chrome/services/sharing/nearby/decoder/nearby_decoder_decode_frame_fuzzer.cc
@@ -2,22 +2,18 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
-#include "chrome/services/sharing/nearby/decoder/nearby_decoder.h"
-
 #include <stddef.h>
 #include <stdint.h>
+
 #include <memory>
 #include <vector>
 
+#include "base/compiler_specific.h"
 #include "base/logging.h"
 #include "base/no_destructor.h"
 #include "base/run_loop.h"
 #include "base/task/single_thread_task_executor.h"
+#include "chrome/services/sharing/nearby/decoder/nearby_decoder.h"
 #include "chromeos/ash/services/nearby/public/mojom/nearby_decoder.mojom.h"
 #include "chromeos/ash/services/nearby/public/mojom/nearby_decoder_types.mojom.h"
 #include "mojo/core/embedder/embedder.h"
@@ -44,7 +40,7 @@
 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   static base::NoDestructor<Environment> environment;
 
-  std::vector<uint8_t> buffer(data, data + size);
+  std::vector<uint8_t> buffer(data, UNSAFE_TODO(data + size));
   base::RunLoop run_loop;
   environment->decoder->DecodeFrame(
       buffer,
diff --git a/chrome/services/sharing/nearby/nearby_connections_conversions.cc b/chrome/services/sharing/nearby/nearby_connections_conversions.cc
index 380e3d8..4e917b1 100644
--- a/chrome/services/sharing/nearby/nearby_connections_conversions.cc
+++ b/chrome/services/sharing/nearby/nearby_connections_conversions.cc
@@ -2,13 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/services/sharing/nearby/nearby_connections_conversions.h"
 
+#include "base/compiler_specific.h"
 #include "base/files/file_path.h"
 #include "base/functional/callback.h"
 #include "base/task/sequenced_task_runner.h"
@@ -84,8 +80,8 @@
 }
 
 std::vector<uint8_t> ByteArrayToMojom(const ByteArray& byte_array) {
-  return std::vector<uint8_t>(byte_array.data(),
-                              byte_array.data() + byte_array.size());
+  return std::vector<uint8_t>(
+      byte_array.data(), UNSAFE_TODO(byte_array.data() + byte_array.size()));
 }
 
 ByteArray ByteArrayFromMojom(const std::vector<uint8_t>& byte_array) {
diff --git a/chrome/services/sharing/nearby/platform/ble_medium.cc b/chrome/services/sharing/nearby/platform/ble_medium.cc
index 6d4fe7e..84467de3 100644
--- a/chrome/services/sharing/nearby/platform/ble_medium.cc
+++ b/chrome/services/sharing/nearby/platform/ble_medium.cc
@@ -2,13 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/services/sharing/nearby/platform/ble_medium.h"
 
+#include "base/compiler_specific.h"
 #include "base/containers/contains.h"
 #include "base/metrics/histogram_functions.h"
 #include "chrome/services/sharing/nearby/platform/bluetooth_device.h"
@@ -68,8 +64,9 @@
   mojo::PendingRemote<bluetooth::mojom::Advertisement> pending_advertisement;
   bool success = adapter_->RegisterAdvertisement(
       service_uuid,
-      std::vector<uint8_t>(advertisement.data(),
-                           advertisement.data() + advertisement.size()),
+      std::vector<uint8_t>(
+          advertisement.data(),
+          UNSAFE_TODO(advertisement.data() + advertisement.size())),
       /*use_scan_data=*/true, /*connectable=*/false, &pending_advertisement);
 
   if (!success || !pending_advertisement.is_valid()) {
diff --git a/chrome/services/sharing/nearby/platform/ble_v2_gatt_server.cc b/chrome/services/sharing/nearby/platform/ble_v2_gatt_server.cc
index e5f8693..63ce721 100644
--- a/chrome/services/sharing/nearby/platform/ble_v2_gatt_server.cc
+++ b/chrome/services/sharing/nearby/platform/ble_v2_gatt_server.cc
@@ -2,14 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/services/sharing/nearby/platform/ble_v2_gatt_server.h"
 
 #include "base/check.h"
+#include "base/compiler_specific.h"
 #include "base/containers/contains.h"
 #include "base/functional/bind.h"
 #include "base/logging.h"
@@ -396,7 +392,8 @@
   }
 
   const uint8_t* bytes = reinterpret_cast<const uint8_t*>(data.data());
-  std::vector<uint8_t> read_value(bytes + offset, bytes + data.size());
+  std::vector<uint8_t> read_value(UNSAFE_TODO(bytes + offset),
+                                  UNSAFE_TODO(bytes + data.size()));
   metrics::RecordOnLocalCharacteristicReadResult(/*success=*/true);
   std::move(callback).Run(
       bluetooth::mojom::LocalCharacteristicReadResult::NewData(
diff --git a/chrome/services/sharing/nearby/platform/ble_v2_medium.cc b/chrome/services/sharing/nearby/platform/ble_v2_medium.cc
index b978af3..7799ac5 100644
--- a/chrome/services/sharing/nearby/platform/ble_v2_medium.cc
+++ b/chrome/services/sharing/nearby/platform/ble_v2_medium.cc
@@ -2,12 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
 #include "chrome/services/sharing/nearby/platform/ble_v2_medium.h"
 
+#include "base/compiler_specific.h"
 #include "base/containers/flat_set.h"
 #include "base/logging.h"
 #include "base/notimplemented.h"
@@ -195,7 +192,8 @@
         "{UUID:" + std::string(it->first) +
         ",data size:" + base::NumberToString(it->second.size()) + ",data=0x" +
         base::HexEncode(std::vector<uint8_t>(
-            it->second.data(), it->second.data() + it->second.size())) +
+            it->second.data(),
+            UNSAFE_TODO(it->second.data() + it->second.size()))) +
         (std::next(it) == advertising_data.service_data.end() ? "}" : "}, ");
   }
   VLOG(1) << __func__
@@ -257,8 +255,9 @@
     mojo::PendingRemote<bluetooth::mojom::Advertisement> pending_advertisement;
     bool success = adapter_->RegisterAdvertisement(
         service_uuid,
-        std::vector<uint8_t>(entry.second.data(),
-                             entry.second.data() + entry.second.size()),
+        std::vector<uint8_t>(
+            entry.second.data(),
+            UNSAFE_TODO(entry.second.data() + entry.second.size())),
         /*use_scan_data=*/use_scan_response,
         /*connectable=*/advertise_set_parameters.is_connectable,
         &pending_advertisement);
diff --git a/chrome/services/sharing/nearby/platform/input_file.cc b/chrome/services/sharing/nearby/platform/input_file.cc
index 91f58d0..13f32e58 100644
--- a/chrome/services/sharing/nearby/platform/input_file.cc
+++ b/chrome/services/sharing/nearby/platform/input_file.cc
@@ -2,15 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/services/sharing/nearby/platform/input_file.h"
 
 #include <vector>
 
+#include "base/compiler_specific.h"
 #include "base/logging.h"
 #include "base/notimplemented.h"
 #include "third_party/abseil-cpp/absl/time/time.h"
@@ -48,7 +44,7 @@
   }
 
   std::vector<char> buf(size);
-  int num_bytes_read = file_.ReadAtCurrentPos(buf.data(), size);
+  int num_bytes_read = UNSAFE_TODO(file_.ReadAtCurrentPos(buf.data(), size));
 
   if (num_bytes_read < 0 || num_bytes_read > GetTotalSize())
     return Exception::kIo;
diff --git a/chrome/services/sharing/nearby/platform/wifi_direct_socket_unittest.cc b/chrome/services/sharing/nearby/platform/wifi_direct_socket_unittest.cc
index 2e44bd0..60baeab1 100644
--- a/chrome/services/sharing/nearby/platform/wifi_direct_socket_unittest.cc
+++ b/chrome/services/sharing/nearby/platform/wifi_direct_socket_unittest.cc
@@ -2,15 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/services/sharing/nearby/platform/wifi_direct_socket.h"
 
 #include <algorithm>
 
+#include "base/compiler_specific.h"
 #include "base/task/thread_pool.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/task_environment.h"
@@ -59,8 +55,8 @@
     }
 
     auto bytes_to_write = std::max(uint(buf_len), uint(data_to_read_.size()));
-    std::copy(data_to_read_.data(), data_to_read_.data() + bytes_to_write,
-              buf->data());
+    std::copy(data_to_read_.data(),
+              UNSAFE_TODO(data_to_read_.data() + bytes_to_write), buf->data());
     return bytes_to_write;
   }
 
@@ -77,7 +73,8 @@
       int buf_len,
       net::CompletionOnceCallback callback,
       const net::NetworkTrafficAnnotationTag& traffic_annotation) override {
-    write_data_ = std::vector(buf->bytes(), buf->bytes() + buf_len);
+    write_data_ =
+        std::vector(buf->bytes(), UNSAFE_TODO(buf->bytes() + buf_len));
     return buf_len;
   }
 
diff --git a/chrome/services/sharing/webrtc/ipc_packet_socket_factory.cc b/chrome/services/sharing/webrtc/ipc_packet_socket_factory.cc
index 587e08f..08131031 100644
--- a/chrome/services/sharing/webrtc/ipc_packet_socket_factory.cc
+++ b/chrome/services/sharing/webrtc/ipc_packet_socket_factory.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/services/sharing/webrtc/ipc_packet_socket_factory.h"
 
 #include <stddef.h>
@@ -405,7 +400,8 @@
   send_bytes_available_ -= data_size;
 
   uint64_t packet_id = client_->Send(
-      address_chrome, base::span(static_cast<const uint8_t*>(data), data_size),
+      address_chrome,
+      UNSAFE_TODO(base::span(static_cast<const uint8_t*>(data), data_size)),
       options);
 
   // Ensure packet_id is not 0. It can't be the case according to
@@ -460,7 +456,7 @@
     return -1;
   }
 
-  *value = options_[p2p_socket_option];
+  *value = UNSAFE_TODO(options_[p2p_socket_option]);
   return 0;
 }
 
@@ -473,7 +469,7 @@
     return -1;
   }
 
-  options_[p2p_socket_option] = value;
+  UNSAFE_TODO(options_[p2p_socket_option]) = value;
 
   if (state_ == IS_OPEN) {
     // Options will be applied when state becomes IS_OPEN in OnOpen.
@@ -513,11 +509,13 @@
 
   // Set all pending options if any.
   for (int i = 0; i < network::P2P_SOCKET_OPT_MAX; ++i) {
-    if (options_[i] != kDefaultNonSetOptionValue)
-      DoSetOption(static_cast<network::P2PSocketOption>(i), options_[i]);
+    if (UNSAFE_TODO(options_[i]) != kDefaultNonSetOptionValue) {
+      DoSetOption(static_cast<network::P2PSocketOption>(i),
+                  UNSAFE_TODO(options_[i]));
+    }
   }
 
-  SignalAddressReady(this, local_address_);
+  NotifyAddressReady(this, local_address_);
   if (IsTcpClientSocket(type_)) {
     // If remote address is unresolved, set resolved remote IP address received
     // in the callback. This address will be used while sending the packets
@@ -536,7 +534,7 @@
 
     // SignalConnect after updating the |remote_address_| so that the listener
     // can get the resolved remote address.
-    SignalConnect(this);
+    NotifyConnect(this);
   }
 }
 
@@ -559,7 +557,7 @@
 
   in_flight_packet_records_.pop_front();
 
-  SignalSentPacket(this, webrtc::SentPacketInfo(send_metrics.rtc_packet_id,
+  NotifySentPacket(this, webrtc::SentPacketInfo(send_metrics.rtc_packet_id,
                                                 send_metrics.send_time_ms));
 
   if (writable_signal_expected_ && send_bytes_available_ > 0) {
@@ -568,7 +566,7 @@
     //    static_cast<int>(in_flight_packet_records_.size())));
 
     writable_signal_expected_ = false;
-    SignalReadyToSend(this);
+    NotifyReadyToSend(this);
   }
 }
 
@@ -578,7 +576,7 @@
   state_ = IS_ERROR;
   error_ = ECONNABORTED;
   if (!was_closed) {
-    SignalClose(this, 0);
+    NotifyClosed(0);
   }
 }
 
diff --git a/chrome/services/speech/soda/cros_soda_client.cc b/chrome/services/speech/soda/cros_soda_client.cc
index f9f9f2c..2fd5674 100644
--- a/chrome/services/speech/soda/cros_soda_client.cc
+++ b/chrome/services/speech/soda/cros_soda_client.cc
@@ -2,12 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/services/speech/soda/cros_soda_client.h"
+
+#include "base/compiler_specific.h"
 #include "base/run_loop.h"
 #include "chromeos/services/machine_learning/public/cpp/service_connection.h"
 #include "chromeos/services/machine_learning/public/mojom/machine_learning_service.mojom.h"
@@ -54,8 +51,9 @@
   DCHECK(IsInitialized()) << "Unable to add audio before starting.";
   const uint8_t* audio_buffer_casted =
       reinterpret_cast<const uint8_t*>(audio_buffer);
-  std::vector<uint8_t> audio(audio_buffer_casted,
-                             audio_buffer_casted + audio_buffer_size);
+  std::vector<uint8_t> audio(
+      audio_buffer_casted,
+      UNSAFE_TODO(audio_buffer_casted + audio_buffer_size));
   soda_recognizer_->AddAudio(audio);
 }
 
diff --git a/chrome/services/util_win/public/mojom/util_win_mojom_traits.cc b/chrome/services/util_win/public/mojom/util_win_mojom_traits.cc
index 8e37ea3..cfd2a26 100644
--- a/chrome/services/util_win/public/mojom/util_win_mojom_traits.cc
+++ b/chrome/services/util_win/public/mojom/util_win_mojom_traits.cc
@@ -2,17 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/services/util_win/public/mojom/util_win_mojom_traits.h"
 
 #include <limits.h> /* UINT_MAX */
 
 #include <utility>
 
+#include "base/compiler_specific.h"
 #include "base/notreached.h"
 #include "base/numerics/safe_math.h"
 #include "base/strings/string_util.h"
@@ -224,7 +220,8 @@
 // static
 base::span<const uint8_t> StructTraits<chrome::mojom::ClsIdDataView,
                                        ::CLSID>::bytes(const ::CLSID& input) {
-  return base::span(reinterpret_cast<const uint8_t*>(&input), sizeof(input));
+  return UNSAFE_TODO(
+      base::span(reinterpret_cast<const uint8_t*>(&input), sizeof(input)));
 }
 
 // static
@@ -237,7 +234,7 @@
 
   const ::CLSID* cls_id = reinterpret_cast<const ::CLSID*>(bytes_view.data());
 
-  memcpy(out, cls_id, sizeof(*out));
+  UNSAFE_TODO(memcpy(out, cls_id, sizeof(*out)));
   return true;
 }
 
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 5ec25f9..7fc13ae 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -390,8 +390,6 @@
       "../browser/extensions/extension_with_management_policy_apitest.h",
       "../browser/extensions/mixin_based_extension_apitest.cc",
       "../browser/extensions/mixin_based_extension_apitest.h",
-      "../browser/extensions/permissions/permissions_test_util.cc",
-      "../browser/extensions/permissions/permissions_test_util.h",
       "../browser/extensions/test_extension_action_dispatcher_observer.cc",
       "../browser/extensions/test_extension_action_dispatcher_observer.h",
       "../browser/extensions/test_extension_environment.cc",
@@ -4079,6 +4077,7 @@
       "//chrome/browser/webauthn",
       "//chrome/browser/webauthn:unexportable_key_utils",
       "//chrome/browser/webdata_services",
+      "//chrome/common:mojo_bindings",
       "//components/contextual_tasks/public:feature_list",
       "//components/enterprise/connectors/core:cloud_content_scanning",
       "//components/live_caption:live_translate",
@@ -9388,7 +9387,6 @@
       "../browser/extensions/permissions/permissions_manager_unittest.cc",
       "../browser/extensions/permissions/permissions_updater_unittest.cc",
       "../browser/extensions/permissions/scripting_permissions_modifier_unittest.cc",
-      "../browser/extensions/permissions/site_permissions_helper_unittest.cc",
       "../browser/extensions/permissions_based_management_policy_provider_unittest.cc",
       "../browser/extensions/policy_handlers_unittest.cc",
       "../browser/extensions/shared_module_service_unittest.cc",
diff --git a/chrome/test/chromedriver/net/pipe_connection_win.cc b/chrome/test/chromedriver/net/pipe_connection_win.cc
index e6599fa1..12a5dd53d 100644
--- a/chrome/test/chromedriver/net/pipe_connection_win.cc
+++ b/chrome/test/chromedriver/net/pipe_connection_win.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/test/chromedriver/net/pipe_connection_win.h"
 
 #include <windows.h>
@@ -18,6 +13,7 @@
 #include <memory>
 #include <string>
 
+#include "base/compiler_specific.h"
 #include "base/containers/span.h"
 #include "base/json/json_reader.h"
 #include "base/logging.h"
@@ -182,8 +178,8 @@
     }
     while (bytes_read < size) {
       DWORD size_read = 0;
-      bool had_error = !ReadFile(file, buffer + bytes_read, size - bytes_read,
-                                 &size_read, nullptr);
+      bool had_error = !ReadFile(file, UNSAFE_TODO(buffer + bytes_read),
+                                 size - bytes_read, &size_read, nullptr);
       if (had_error) {
         if (!shutting_down_.IsSet()) {
           VLOG(logging::LOGGING_ERROR)
@@ -365,8 +361,8 @@
       }
       DWORD bytes_written = 0;
       bool had_error =
-          !WriteFile(file, bytes + total_written, static_cast<DWORD>(length),
-                     &bytes_written, nullptr);
+          !WriteFile(file, UNSAFE_TODO(bytes + total_written),
+                     static_cast<DWORD>(length), &bytes_written, nullptr);
       if (had_error) {
         if (!shutting_down_.IsSet()) {
           VLOG(logging::LOGGING_ERROR) << "Could not write into pipe";
diff --git a/chrome/test/data/webui/signin/profile_customization_test.ts b/chrome/test/data/webui/signin/profile_customization_test.ts
index 5ced869..a185a66 100644
--- a/chrome/test/data/webui/signin/profile_customization_test.ts
+++ b/chrome/test/data/webui/signin/profile_customization_test.ts
@@ -253,3 +253,40 @@
     return browserProxy.whenCalled('deleteProfile');
   });
 });
+
+suite('ProfileCustomizationLocalProfileFrictionReductionExp', function() {
+  let app: ProfileCustomizationAppElement;
+  let browserProxy: TestProfileCustomizationBrowserProxy;
+
+  setup(function() {
+    loadTimeData.overrideValues({
+      profileName: 'TestNameLocalProfile',
+      isLocalProfileCreation: true,
+      shouldShowDefaultProfileName: true,
+    });
+    browserProxy = new TestProfileCustomizationBrowserProxy();
+    ProfileCustomizationBrowserProxyImpl.setInstance(browserProxy);
+  });
+
+  async function initializeApp() {
+    document.body.innerHTML = window.trustedTypes!.emptyHTML;
+    app = document.createElement('profile-customization-app');
+    document.body.append(app);
+    await browserProxy.whenCalled('initialized');
+  }
+
+  test('PrefillProfileNameInFrictionReductionExp', async function() {
+    await initializeApp();
+    await app.$.nameInput.updateComplete;
+    await app.$.nameInput.updateComplete;
+
+    const doneButton = app.$.doneButton;
+    assertFalse(doneButton.disabled);
+    doneButton.click();
+
+    const profileName = await browserProxy.whenCalled('done');
+    assertEquals('TestNameLocalProfile', profileName);
+
+    return microtasksFinished();
+  });
+});
diff --git a/chrome/test/fuzzing/renderer_fuzzing/in_process_renderer_fuzzing.h b/chrome/test/fuzzing/renderer_fuzzing/in_process_renderer_fuzzing.h
index 8c593a6..b08c72e 100644
--- a/chrome/test/fuzzing/renderer_fuzzing/in_process_renderer_fuzzing.h
+++ b/chrome/test/fuzzing/renderer_fuzzing/in_process_renderer_fuzzing.h
@@ -5,12 +5,8 @@
 #ifndef CHROME_TEST_FUZZING_RENDERER_FUZZING_IN_PROCESS_RENDERER_FUZZING_H_
 #define CHROME_TEST_FUZZING_RENDERER_FUZZING_IN_PROCESS_RENDERER_FUZZING_H_
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "base/base64.h"
+#include "base/compiler_specific.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/test/fuzzing/in_process_fuzzer.h"
 #include "chrome/test/fuzzing/in_process_proto_fuzzer.h"
@@ -82,7 +78,7 @@
 template <typename RendererFuzzer>
 int RendererFuzzerProxy<RendererFuzzer>::Fuzz(const uint8_t* data,
                                               size_t size) {
-  base::span<const uint8_t> data_span(data, size);
+  auto data_span = UNSAFE_TODO(base::span<const uint8_t>(data, size));
 
   auto b64 = base::Base64Encode(data_span);
   auto* contents = browser()->tab_strip_model()->GetActiveWebContents();
diff --git a/chrome/updater/BUILD.gn b/chrome/updater/BUILD.gn
index f8cfe4d1..ae9d830 100644
--- a/chrome/updater/BUILD.gn
+++ b/chrome/updater/BUILD.gn
@@ -1007,6 +1007,12 @@
         "win/updater_tests.rc",
       ]
 
+      configs -= [ "//build/config/win:winver" ]
+      configs += [
+        "//chrome/updater/app/server/win:winver",
+        "//chrome/updater/win:wrl_strict",
+      ]
+
       deps += [
         "app/server/win:updater_idl",
         "app/server/win:updater_internal_idl",
diff --git a/chrome/updater/app/server/ipc_unittest.cc b/chrome/updater/app/server/ipc_unittest.cc
index 4c07169c4..97a5cdb 100644
--- a/chrome/updater/app/server/ipc_unittest.cc
+++ b/chrome/updater/app/server/ipc_unittest.cc
@@ -37,6 +37,10 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/multiprocess_func_list.h"
 
+#if BUILDFLAG(IS_WIN)
+#include <wrl/module.h>
+#endif  // BUILDFLAG(IS_WIN)
+
 namespace updater {
 
 class UpdaterIPCTestCase : public testing::Test {
@@ -379,6 +383,12 @@
             std::move(callback).Run(UpdateService::Result::kInstallFailed);
           });
 
+#if BUILDFLAG(IS_WIN)
+  ASSERT_HRESULT_SUCCEEDED(
+      Microsoft::WRL::Module<Microsoft::WRL::OutOfProc>::GetModule()
+          .RegisterObjects(L"ActiveUser"));
+#endif  // BUILDFLAG(IS_WIN)
+
   // Create a stub and wait for the endpoint to be created before launching the
   // client process.
   base::RunLoop run_loop;
@@ -391,6 +401,12 @@
       kClientProcessName, base::GetMultiProcessTestChildBaseCommandLine(),
       /*options=*/{});
   EXPECT_EQ(WaitForProcessExit(child_process), 0);
+
+#if BUILDFLAG(IS_WIN)
+  EXPECT_HRESULT_SUCCEEDED(
+      Microsoft::WRL::Module<Microsoft::WRL::OutOfProc>::GetModule()
+          .UnregisterObjects());
+#endif  // BUILDFLAG(IS_WIN)
 }
 
 MULTIPROCESS_TEST_MAIN(UpdateServiceClient) {
@@ -537,6 +553,12 @@
   EXPECT_CALL(on_ipc_callback, Run(FakeUpdateServiceInternal::FuncTag::kRun));
   EXPECT_CALL(on_ipc_callback, Run(FakeUpdateServiceInternal::FuncTag::kHello));
 
+#if BUILDFLAG(IS_WIN)
+  ASSERT_HRESULT_SUCCEEDED(
+      Microsoft::WRL::Module<Microsoft::WRL::OutOfProc>::GetModule()
+          .RegisterObjects(L"InternalUser"));
+#endif  // BUILDFLAG(IS_WIN)
+
   auto service_stub = std::make_unique<UpdateServiceInternalStub>(
       base::MakeRefCounted<FakeUpdateServiceInternal>(on_ipc_callback.Get()),
       UpdaterScope::kUser, base::DoNothing(), base::DoNothing());
@@ -545,6 +567,12 @@
       kClientProcessName, base::GetMultiProcessTestChildBaseCommandLine(),
       /*options=*/{});
   EXPECT_EQ(WaitForProcessExit(child_process), 0);
+
+#if BUILDFLAG(IS_WIN)
+  EXPECT_HRESULT_SUCCEEDED(
+      Microsoft::WRL::Module<Microsoft::WRL::OutOfProc>::GetModule()
+          .UnregisterObjects());
+#endif  // BUILDFLAG(IS_WIN)
 }
 
 MULTIPROCESS_TEST_MAIN(UpdateServiceInternalClient) {
diff --git a/chrome/updater/certificate_tag.cc b/chrome/updater/certificate_tag.cc
index 290fc34..8cb035e 100644
--- a/chrome/updater/certificate_tag.cc
+++ b/chrome/updater/certificate_tag.cc
@@ -2,13 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/390223051): Remove C-library calls to fix the errors.
-#pragma allow_unsafe_libc_calls
-#endif
-
 #include "chrome/updater/certificate_tag.h"
 
+#include <sys/types.h>
+
+#include <cstddef>
 #include <cstdint>
 #include <cstring>
 #include <memory>
@@ -21,6 +19,8 @@
 #include "base/check_op.h"
 #include "base/compiler_specific.h"
 #include "base/containers/span.h"
+#include "base/containers/span_writer.h"
+#include "base/numerics/checked_math.h"
 #include "chrome/updater/certificate_tag_internal.h"
 #include "third_party/abseil-cpp/absl/functional/overload.h"
 #include "third_party/boringssl/src/include/openssl/bytestring.h"
@@ -131,8 +131,12 @@
       return FailedParse{};
     }
 
-    if (CBS_len(&oid) == sizeof(kTagOID) &&
-        memcmp(CBS_data(&oid), kTagOID, sizeof(kTagOID)) == 0) {
+    // SAFETY: Ths boringssl api guarantees that the buffer contains the number
+    // of bytes returned by `CBS_len`.
+    // https://commondatastorage.googleapis.com/chromium-boringssl-docs/bytestring.h.html#CBS_data
+    base::span<const uint8_t> oid_span =
+        UNSAFE_BUFFERS(base::span(CBS_data(&oid), CBS_len(&oid)));
+    if (oid_span == kTagOID) {
       return SpanFromCBS(&contents);
     }
   }
@@ -474,11 +478,12 @@
     return std::nullopt;
   }
 
-  // Copy the CBB result into a std::vector, padding to 8-byte alignment.
-  // SAFETY: the CBB data comes in from boringssl as a memory buffer.
   std::vector<uint8_t> ret;
   const size_t padding = (8 - cbb_len % 8) % 8;
   ret.reserve(cbb_len + padding);
+  // Copy the CBB result into a std::vector, padding to 8-byte alignment.
+  // SAFETY: the CBB data comes in from boringssl as a memory buffer; see
+  // https://commondatastorage.googleapis.com/chromium-boringssl-docs/bytestring.h.html#CBB_finish
   UNSAFE_BUFFERS(ret.insert(ret.begin(), cbb_data, cbb_data + cbb_len));
   ret.insert(ret.end(), padding, 0);
   OPENSSL_free(cbb_data);
@@ -497,11 +502,13 @@
   static constexpr size_t kSizeofWinCertificateHeader = 8;
   std::vector<uint8_t> win_certificate_header(kSizeofWinCertificateHeader);
   const uint32_t certs_size = kSizeofWinCertificateHeader + ret->size();
-  memcpy(&win_certificate_header[0], &certs_size, sizeof(certs_size));
-  memcpy(&win_certificate_header[4], &kAttributeCertificateRevision,
-         sizeof(kAttributeCertificateRevision));
-  memcpy(&win_certificate_header[6], &kAttributeCertificateTypePKCS7SignedData,
-         sizeof(kAttributeCertificateTypePKCS7SignedData));
+  {
+    auto span_writer = base::SpanWriter<uint8_t>(win_certificate_header);
+    span_writer.Write(base::byte_span_from_ref(certs_size));
+    span_writer.Write(base::byte_span_from_ref(kAttributeCertificateRevision));
+    span_writer.Write(
+        base::byte_span_from_ref(kAttributeCertificateTypePKCS7SignedData));
+  }
 
   ret->insert(ret->begin(), win_certificate_header.begin(),
               win_certificate_header.end());
@@ -510,13 +517,13 @@
   // `binary_` span.
   CHECK_LE(attr_cert_offset_, binary_.size_bytes());
   ret->insert(ret->begin(), binary_.data(),
-              UNSAFE_BUFFERS(binary_.data() + attr_cert_offset_));
+              binary_.subspan(attr_cert_offset_).data());
 
   // Inject the updated length in the `IMAGE_DATA_DIRECTORY` structure that
   // delineates the `WIN_CERTIFICATE` structure.
-  // SAFETY: byte manipulation of a C data structure.
-  memcpy(UNSAFE_BUFFERS(ret->data() + certs_size_offset_), &certs_size,
-         sizeof(certs_size));
+  base::span(*ret)
+      .subspan(certs_size_offset_)
+      .copy_prefix_from(base::byte_span_from_ref(certs_size));
   return ret;
 }
 
@@ -580,8 +587,16 @@
     // Load the mini stream, the root directory's stream. root must be dir entry
     // zero.
     MSIDirEntry root;
-    const uint64_t offset = header_.first_dir_sector * sector_format_.size;
-    std::memcpy(&root, &contents_[offset], sizeof(MSIDirEntry));
+    // It is okay to static-cast here since sector_format_.size is a 64bit
+    // integer, but its value is at most 4096.
+    const size_t offset =
+        base::CheckMul(header_.first_dir_sector, sector_format_.size)
+            .ValueOrDie<size_t>();
+    base::byte_span_from_ref(root).copy_from_nonoverlapping(
+        base::as_byte_span(contents_)
+            .subspan(static_cast<size_t>(offset))
+            .first(sizeof(MSIDirEntry)));
+
     mini_contents = ReadStream("mini stream", root.stream_first_sector,
                                root.stream_size, true, false);
     sector_size = kMiniStreamSectorSize;
@@ -682,13 +697,15 @@
 SignedDataDir MSIBinary::SignedDataDirFromSector(uint64_t dir_sector) {
   MSIDirEntry sig_dir_entry;
   for (uint64_t i = 0; i < sector_format_.size / kNumDirEntryBytes; ++i) {
-    const uint64_t offset =
-        dir_sector * sector_format_.size + i * kNumDirEntryBytes;
-    std::memcpy(&sig_dir_entry, &contents_[offset], sizeof(MSIDirEntry));
-    if (std::equal(
-            sig_dir_entry.name,
-            UNSAFE_BUFFERS(sig_dir_entry.name + sig_dir_entry.num_name_bytes),
-            std::begin(kSignatureName))) {
+    const size_t offset =
+        base::CheckAdd(base::CheckMul(dir_sector, sector_format_.size),
+                       base::CheckMul(i, kNumDirEntryBytes))
+            .ValueOrDie<size_t>();
+    base::byte_span_from_ref(sig_dir_entry)
+        .copy_from_nonoverlapping(
+            base::as_byte_span(contents_).subspan(offset, sizeof(MSIDirEntry)));
+    if (base::as_byte_span(sig_dir_entry.name)
+            .first(sig_dir_entry.num_name_bytes) == kSignatureName) {
       return {sig_dir_entry, offset, true};
     }
   }
@@ -835,12 +852,11 @@
   // Parse the header.
   msi_binary->header_bytes_ = std::vector<uint8_t>(
       file_contents.begin(), file_contents.begin() + kNumHeaderTotalBytes);
-  std::memcpy(&msi_binary->header_, &msi_binary->header_bytes_[0],
-              sizeof(MSIHeader));
-  if (std::memcmp(msi_binary->header_.magic, kMsiHeaderSignature,
-                  sizeof(kMsiHeaderSignature)) != 0 ||
-      std::memcmp(msi_binary->header_.clsid, kMsiHeaderClsid,
-                  sizeof(kMsiHeaderClsid)) != 0) {
+  base::byte_span_from_ref(msi_binary->header_)
+      .copy_from_nonoverlapping(
+          base::span(msi_binary->header_bytes_).first(sizeof(MSIHeader)));
+  if (base::span(msi_binary->header_.magic) != kMsiHeaderSignature ||
+      base::span(msi_binary->header_.clsid) != kMsiHeaderClsid) {
     // Not an msi file.
     return {};
   }
@@ -904,35 +920,47 @@
   const size_t signed_data_offset =
       first_signed_data_sector * sector_format_.size;
 
-  // Write out the...
-  // ...header,
-  std::vector<uint8_t> header_sector_bytes(sector_format_.size);
-  std::memcpy(&header_sector_bytes[0], &header_, sizeof(MSIHeader));
-  for (int i = 0; i < kNumDifatHeaderEntries; ++i) {
-    std::memcpy(&header_sector_bytes[kNumHeaderContentBytes + i * 4],
-                &difat_entries_[i], sizeof(uint32_t));
-  }
-
-  // ...content,
-  // Make a copy of the content bytes, since new data will be overlaid on it.
   const size_t new_contents_size =
       sector_format_.size * FirstFreeFatEntry(new_fat_entries);
+  std::vector<uint8_t> binary(sector_format_.size + new_contents_size);
+  // Write out the header content.
+  {
+    auto header_sector_span = base::span(binary).first(
+        base::checked_cast<size_t>(sector_format_.size));
+    auto header_writer = base::SpanWriter<uint8_t>(header_sector_span);
+    header_writer.Write(
+        base::byte_span_from_ref(header_).first(sizeof(MSIHeader)));
+
+    for (const int32_t fat_entry :
+         base::span(difat_entries_).first<kNumDifatHeaderEntries>()) {
+      header_writer.Write(base::byte_span_from_ref(fat_entry));
+    }
+  }
+
+  // Make a copy of the content bytes, since new data will be overlaid on it.
   CHECK_GT(new_contents_size, signed_data_offset + signed_data.size());
-  std::vector<uint8_t> new_contents(new_contents_size);
-  std::memcpy(&new_contents[0], &contents_[0], signed_data_offset);
-
+  auto new_contents = base::span(binary).subspan(
+      base::checked_cast<size_t>(sector_format_.size));
+  new_contents.first(signed_data_offset)
+      .copy_from_nonoverlapping(
+          base::as_byte_span(contents_).first(signed_data_offset));
   // ...signedData directory entry from local modified copy,
-  std::memcpy(&new_contents[sig_dir_offset_], &new_sig_dir_entry,
-              sizeof(MSIDirEntry));
-
+  new_contents
+      .subspan(base::checked_cast<size_t>(sig_dir_offset_), sizeof(MSIDirEntry))
+      .copy_from_nonoverlapping(base::byte_span_from_ref(new_sig_dir_entry)
+                                    .first(sizeof(MSIDirEntry)));
   // ...difat entries,
   // In case difat sectors were added for huge files.
   for (size_t i = 0; i < difat_sectors_.size(); ++i) {
     const int index = kNumDifatHeaderEntries + i * sector_format_.ints;
     uint64_t offset = difat_sectors_[i] * sector_format_.size;
     for (int j = 0; j < sector_format_.ints; ++j) {
-      std::memcpy(&new_contents[offset + j * 4], &difat_entries_[index + j],
-                  sizeof(uint32_t));
+      new_contents
+          .subspan(base::checked_cast<size_t>(offset + j * sizeof(uint32_t)),
+                   sizeof(uint32_t))
+          .copy_from_nonoverlapping(
+              base::byte_span_from_ref(difat_entries_[index + j])
+                  .first(sizeof(uint32_t)));
     }
   }
 
@@ -944,24 +972,24 @@
         !IsLastInSector(sector_format_, i)) {
       const uint64_t offset = difat_entries_[i] * sector_format_.size;
       for (int j = 0; j < sector_format_.ints; ++j) {
-        std::memcpy(&new_contents[offset + j * 4], &new_fat_entries[index + j],
-                    sizeof(uint32_t));
+        new_contents
+            .subspan(base::checked_cast<size_t>(offset + j * sizeof(uint32_t)),
+                     sizeof(uint32_t))
+            .copy_from_nonoverlapping(
+                base::byte_span_from_ref(new_fat_entries[index + j])
+                    .first(sizeof(uint32_t)));
       }
       index += sector_format_.ints;
     }
   }
 
   // ...signedData
-  // `new_contents` is zero-initialized, so no need to add padding to end of
-  // sector. The sectors allocated for signedData are guaranteed contiguous.
-  std::memcpy(&new_contents[signed_data_offset], &signed_data[0],
-              signed_data.size());
+  // `binary` is zero-initialized, therefore `new_contents` is zero-initialized,
+  // so no need to add padding to end of sector. The sectors allocated for
+  // signedData are guaranteed contiguous.
+  new_contents.subspan(signed_data_offset, signed_data.size())
+      .copy_from_nonoverlapping(signed_data);
 
-  // ...finally, build and return the new binary.
-  std::vector<uint8_t> binary(header_sector_bytes.size() + new_contents.size());
-  std::memcpy(&binary[0], &header_sector_bytes[0], header_sector_bytes.size());
-  std::memcpy(&binary[header_sector_bytes.size()], &new_contents[0],
-              new_contents.size());
   return binary;
 }
 
diff --git a/chrome/updater/certificate_tag_internal.h b/chrome/updater/certificate_tag_internal.h
index 5b7352c..0bc1a98 100644
--- a/chrome/updater/certificate_tag_internal.h
+++ b/chrome/updater/certificate_tag_internal.h
@@ -327,4 +327,18 @@
 
 }  // namespace updater::tagging::internal
 
+namespace base {
+// We prefer bit-wise copying converting struct objects to span of bytes. Please
+// see
+// https://source.chromium.org/chromium/chromium/src/+/main:base/containers/span.h?q=kCanSafelyConvertToByteSpan
+// for more details.
+template <>
+inline constexpr bool
+    kCanSafelyConvertToByteSpan<::updater::tagging::internal::MSIDirEntry> =
+        true;
+template <>
+inline constexpr bool
+    kCanSafelyConvertToByteSpan<::updater::tagging::internal::MSIHeader> = true;
+}  // namespace base
+
 #endif  // CHROME_UPDATER_CERTIFICATE_TAG_INTERNAL_H_
diff --git a/chrome/updater/ipc/update_service_dialer_win.cc b/chrome/updater/ipc/update_service_dialer_win.cc
index ef7cf08f..32f842df 100644
--- a/chrome/updater/ipc/update_service_dialer_win.cc
+++ b/chrome/updater/ipc/update_service_dialer_win.cc
@@ -78,10 +78,7 @@
   auto endpoint = [&]() -> std::optional<mojo::PlatformChannelEndpoint> {
     Microsoft::WRL::ComPtr<IUnknown> result =
         DialUpdateService(scope, is_internal_service);
-
-    // TODO(crbug.com/456542123): Fix `ipc_unittest.cc` to work if
-    // `DialUpdateService` fails even once.
-    if (tries >= 1 && !result) {
+    if (!result) {
       return std::nullopt;
     }
 
diff --git a/chrome/updater/mac/keystone/agent_main.cc b/chrome/updater/mac/keystone/agent_main.cc
index a0662c9..4105473 100644
--- a/chrome/updater/mac/keystone/agent_main.cc
+++ b/chrome/updater/mac/keystone/agent_main.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include <unistd.h>
 
 #include <iostream>
@@ -17,6 +12,7 @@
 
 #include "base/at_exit.h"
 #include "base/command_line.h"
+#include "base/compiler_specific.h"
 #include "base/containers/contains.h"
 #include "base/files/file_path.h"
 #include "base/functional/bind.h"
@@ -57,7 +53,7 @@
   std::map<std::string, std::string> result;
   std::string key;
   for (int i = 1; i < argc; ++i) {
-    std::string arg(argv[i]);
+    std::string arg(UNSAFE_TODO(argv[i]));
     if (base::StartsWith(arg, "-")) {
       key = arg.substr(1);
       result[key] = "";
diff --git a/chrome/updater/win/installer/string.cc b/chrome/updater/win/installer/string.cc
index bc684aac..74b433a79 100644
--- a/chrome/updater/win/installer/string.cc
+++ b/chrome/updater/win/installer/string.cc
@@ -2,17 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/updater/win/installer/string.h"
 
 #include <windows.h>
 
 #include <algorithm>
 
+#include "base/compiler_specific.h"
 #include "base/strings/string_number_conversions.h"
 
 namespace {
@@ -40,7 +36,7 @@
   }
 
   std::ranges::copy(base::HexEncode(bytes, size), str);
-  str[size * 2] = L'\0';
+  UNSAFE_TODO(str[size * 2]) = L'\0';
   return true;
 }
 
@@ -49,7 +45,7 @@
     return 0;
   }
   size_t len = 0;
-  while (--alloc_size && str[len] != L'\0') {
+  while (--alloc_size && UNSAFE_TODO(str[len]) != L'\0') {
     ++len;
   }
   return len;
@@ -62,7 +58,7 @@
 
   wchar_t* write = dest;
   for (size_t remaining = dest_size; remaining != 0; --remaining) {
-    if ((*write++ = *src++) == L'\0') {
+    if ((*UNSAFE_TODO(write++) = *UNSAFE_TODO(src++)) == L'\0') {
       return true;
     }
   }
@@ -90,7 +86,7 @@
   // Use SafeStrLen instead of lstrlen just in case the |dest| buffer isn't
   // terminated.
   size_t str_len = SafeStrLen(dest, dest_size);
-  return SafeStrCopy(dest + str_len, dest_size - str_len, src);
+  return SafeStrCopy(UNSAFE_TODO(dest + str_len), dest_size - str_len, src);
 }
 
 bool StrStartsWith(const wchar_t* str, const wchar_t* start_str) {
@@ -98,8 +94,8 @@
     return false;
   }
 
-  for (int i = 0; start_str[i] != L'\0'; ++i) {
-    if (!EqualASCIICharI(str[i], start_str[i])) {
+  for (int i = 0; UNSAFE_TODO(start_str[i]) != L'\0'; ++i) {
+    if (!EqualASCIICharI(UNSAFE_TODO(str[i]), UNSAFE_TODO(start_str[i]))) {
       return false;
     }
   }
@@ -112,14 +108,16 @@
     return path;
   }
 
-  const wchar_t* current = &path[size - 1];
+  const wchar_t* current = &UNSAFE_TODO(path[size - 1]);
   while (current != path && L'\\' != *current) {
-    --current;
+    UNSAFE_TODO(--current);
   }
 
   // If no path separator found, just return |path|.
   // Otherwise, return a pointer right after the separator.
-  return ((current == path) && (L'\\' != *current)) ? current : (current + 1);
+  return ((current == path) && (L'\\' != *current))
+             ? current
+             : (UNSAFE_TODO(current + 1));
 }
 
 wchar_t* GetNameFromPathExt(wchar_t* path, size_t size) {
diff --git a/chrome/updater/win/ui/owner_draw_controls.cc b/chrome/updater/win/ui/owner_draw_controls.cc
index 10ae7f23..c83efd7 100644
--- a/chrome/updater/win/ui/owner_draw_controls.cc
+++ b/chrome/updater/win/ui/owner_draw_controls.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/updater/win/ui/owner_draw_controls.h"
 
 #include <algorithm>
@@ -14,6 +9,7 @@
 #include <vector>
 
 #include "base/check_op.h"
+#include "base/compiler_specific.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/updater/util/util.h"
 #include "chrome/updater/win/ui/l10n_util.h"
@@ -563,7 +559,8 @@
 
   if (rgn.GetRegionData(&rgndata, rgndata_size)) {
     for (DWORD count = 0; count < rgndata.rdh.nCount; count++) {
-      CRect r = reinterpret_cast<RECT*>(rgndata.Buffer + count * sizeof(RECT));
+      CRect r = reinterpret_cast<RECT*>(
+          UNSAFE_TODO(rgndata.Buffer + count * sizeof(RECT)));
       CRect bottom_edge_rect = r;
 
       // Have a 2-pixel bottom edge.
diff --git a/chrome/utility/image_writer/image_writer_mac.cc b/chrome/utility/image_writer/image_writer_mac.cc
index 7bffdc0c..7a8dbd06 100644
--- a/chrome/utility/image_writer/image_writer_mac.cc
+++ b/chrome/utility/image_writer/image_writer_mac.cc
@@ -2,10 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
+#include "chrome/utility/image_writer/image_writer.h"
 
 #include <CoreFoundation/CoreFoundation.h>
 #include <IOKit/IOBSD.h>
@@ -20,6 +17,7 @@
 
 #include "base/apple/scoped_cftyperef.h"
 #include "base/command_line.h"
+#include "base/compiler_specific.h"
 #include "base/files/scoped_file.h"
 #include "base/functional/bind.h"
 #include "base/mac/scoped_ioobject.h"
@@ -31,7 +29,6 @@
 #include "chrome/common/extensions/image_writer/image_writer_util_mac.h"
 #include "chrome/utility/image_writer/disk_unmounter_mac.h"
 #include "chrome/utility/image_writer/error_message_strings.h"
-#include "chrome/utility/image_writer/image_writer.h"
 
 namespace image_writer {
 
@@ -143,7 +140,7 @@
 
     if (cmsg_socket_header && cmsg_socket_header->cmsg_level == SOL_SOCKET &&
         cmsg_socket_header->cmsg_type == SCM_RIGHTS) {
-      fd = *reinterpret_cast<int*>(CMSG_DATA(cmsg_socket_header));
+      fd = *reinterpret_cast<int*>(UNSAFE_TODO(CMSG_DATA(cmsg_socket_header)));
     }
   }
 
diff --git a/chrome/utility/image_writer/image_writer_win.cc b/chrome/utility/image_writer/image_writer_win.cc
index 420f5b0..634a637 100644
--- a/chrome/utility/image_writer/image_writer_win.cc
+++ b/chrome/utility/image_writer/image_writer_win.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/utility/image_writer/image_writer.h"
 
 #include <windows.h>
@@ -15,6 +10,7 @@
 #include <stddef.h>
 #include <winioctl.h>
 
+#include "base/compiler_specific.h"
 #include "base/containers/heap_array.h"
 #include "base/logging.h"
 #include "chrome/utility/image_writer/error_message_strings.h"
@@ -118,11 +114,11 @@
          FindNextVolume(volume_finder, volume_path, MAX_PATH + 1)) {
     first_volume = false;
 
-    size_t length = wcsnlen(volume_path, MAX_PATH + 1);
+    size_t length = UNSAFE_TODO(wcsnlen(volume_path, MAX_PATH + 1));
     if (length < 1) {
       continue;
     }
-    volume_path[length - 1] = L'\0';
+    UNSAFE_TODO(volume_path[length - 1]) = L'\0';
 
     volume_handle = CreateFile(volume_path,
                                GENERIC_READ | GENERIC_WRITE,
diff --git a/chromecast/android/lint-baseline.xml b/chromecast/android/lint-baseline.xml
index 1b781a6..1624e61 100644
--- a/chromecast/android/lint-baseline.xml
+++ b/chromecast/android/lint-baseline.xml
@@ -4,28 +4,17 @@
     <issue
         id="PictureInPictureIssue"
         message="An activity in this app supports picture-in-picture and the targetSdkVersion is 31 or above; it is therefore strongly recommended to call both `setAutoEnterEnabled(true)` and `setSourceRectHint(...)`"
-        errorLine1="  &lt;application android:name=&quot;org.chromium.chromecast.shell.CastBrowserApplication&quot; android:icon=&quot;@drawable/ic_settings_cast&quot;>"
-        errorLine2="   ~~~~~~~~~~~">
+        errorLine1="    &lt;application>"
+        errorLine2="     ~~~~~~~~~~~">
         <location
-            file="gen/chromecast/cast_browser_apk__lint/AndroidManifest.xml"
-            line="34"
-            column="4"/>
-    </issue>
-
-    <issue
-        id="DiscouragedApi"
-        message="Fixed screen orientations will be ignored in most cases, starting from Android 16. Android is moving toward a model where apps are expected to adapt to various orientations, display sizes, and aspect ratios."
-        errorLine1="    &lt;activity android:name=&quot;org.chromium.chromecast.shell.CastWebContentsActivity&quot; android:theme=&quot;@style/CastShellTheme&quot; android:exported=&quot;true&quot; android:hardwareAccelerated=&quot;true&quot; android:launchMode=&quot;singleInstance&quot; android:process=&quot;:cast_browser_process&quot; android:screenOrientation=&quot;landscape&quot; android:taskAffinity=&quot;.CastWebContentsActivity&quot; android:supportsPictureInPicture=&quot;true&quot; android:configChanges=&quot;orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|screenLayout|smallestScreenSize|uiMode&quot; android:excludeFromRecents=&quot;false&quot; android:noHistory=&quot;false&quot; android:showWhenLocked=&quot;true&quot;>"
-        errorLine2="                                                                                                                                                                                                                                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="gen/chromecast/cast_browser_apk__lint/AndroidManifest.xml"
-            line="59"
-            column="257"/>
+            file="android_lint_cache/aars/play-services-base.aar/AndroidManifest.xml"
+            line="19"
+            column="6"/>
     </issue>
 
     <issue
         id="Overdraw"
-        message="Possible overdraw: Root element paints background `#FFFFFF` with a theme that also paints a background (inferred theme is `@style/CastShellTheme`)"
+        message="Possible overdraw: Root element paints background `#FFFFFF` with a theme that also paints a background (inferred theme is `@android:style/Theme.Holo`)"
         errorLine1="    android:background=&quot;#FFFFFF&quot;"
         errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -35,10 +24,43 @@
     </issue>
 
     <issue
-        id="RtlEnabled"
-        message="The project references RTL attributes, but does not explicitly enable or disable RTL support with `android:supportsRtl` in the manifest">
+        id="UnusedResources"
+        message="The resource `R.color.ic_settings_cast_background` appears to be unused"
+        errorLine1="  &lt;color name=&quot;ic_settings_cast_background&quot;>#1c73e8&lt;/color>"
+        errorLine2="         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="gen/chromecast/cast_browser_apk__lint/AndroidManifest.xml"/>
+            file="../../chromecast/browser/android/apk/res-values/values/colors.xml"
+            line="3"
+            column="10"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.drawable.ic_cast_vector` appears to be unused"
+        errorLine1="&lt;vector xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
+        errorLine2="^">
+        <location
+            file="../../chromecast/browser/android/apk/res/drawable-nodpi/ic_cast_vector.xml"
+            line="1"
+            column="1"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.drawable.ic_settings_cast` appears to be unused">
+        <location
+            file="../../chromecast/browser/android/apk/res/drawable-hdpi/ic_settings_cast.png"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.style.CastShellTheme` appears to be unused"
+        errorLine1="    &lt;style name=&quot;CastShellTheme&quot; parent=&quot;@android:style/Theme.Holo.Light.NoActionBar&quot;>"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../chromecast/browser/android/apk/res-values/values-v17/styles.xml"
+            line="9"
+            column="12"/>
     </issue>
 
 </issues>
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM
index 3bac98f..62865539 100644
--- a/chromeos/CHROMEOS_LKGM
+++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@
-16487.0.0-1073240
\ No newline at end of file
+16488.0.0-1073263
\ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_ar.xtb b/chromeos/strings/chromeos_strings_ar.xtb
index d76459b9..aebe4c9 100644
--- a/chromeos/strings/chromeos_strings_ar.xtb
+++ b/chromeos/strings/chromeos_strings_ar.xtb
@@ -967,7 +967,7 @@
 <translation id="5227902338748591677">الجدول الزمني للمظهر الداكن</translation>
 <translation id="5229104491259541281">تحويل "<ph name="QUERY" />"</translation>
 <translation id="5229344016299762883">الخروج من وضع ملء الشاشة</translation>
-<translation id="5234764350956374838">تجاهل</translation>
+<translation id="5234764350956374838">إغلاق</translation>
 <translation id="5236119614998611749">تعذَّر إنشاء الملخّص</translation>
 <translation id="5244638145904800454">{NUM_ROOL_APPS,plural,offset:1 =1{لقد ضبط مشرفك "<ph name="APP_NAME" />" لبدء تشغيله تلقائيًا في كل مرة يتم فيها تسجيل الدخول.}=2{لقد ضبط مشرفك "<ph name="APP_NAME" />" وتطبيقًا آخر لبدء تشغيلهما تلقائيًا في كل مرة يتم فيها تسجيل الدخول.}zero{لقد ضبط مشرفك "<ph name="APP_NAME" />" و# تطبيق آخر لبدء تشغيلها تلقائيًا في كل مرة يتم فيها تسجيل الدخول.}few{لقد ضبط مشرفك "<ph name="APP_NAME" />" و# تطبيقات أخرى لبدء تشغيلها تلقائيًا في كل مرة يتم فيها تسجيل الدخول.}many{لقد ضبط مشرفك "<ph name="APP_NAME" />" و# تطبيقًا آخر لبدء تشغيلها تلقائيًا في كل مرة يتم فيها تسجيل الدخول.}other{لقد ضبط مشرفك "<ph name="APP_NAME" />" و# تطبيق آخر لبدء تشغيلها تلقائيًا في كل مرة يتم فيها تسجيل الدخول.}}</translation>
 <translation id="5248419081947706722">أزرق</translation>
diff --git a/chromeos/strings/chromeos_strings_is.xtb b/chromeos/strings/chromeos_strings_is.xtb
index 96d3c4f..f260604 100644
--- a/chromeos/strings/chromeos_strings_is.xtb
+++ b/chromeos/strings/chromeos_strings_is.xtb
@@ -1405,7 +1405,7 @@
 <translation id="7162487448488904999">Gallerí</translation>
 <translation id="7170236477717446850">Prófílmynd</translation>
 <translation id="7171919371520438592">Festa glugga á minni hliðinni til <ph name="DIRECTION" /> á skjánum</translation>
-<translation id="7172721935181587524">1 mynd</translation>
+<translation id="7172721935181587524">Ein mynd</translation>
 <translation id="7177485034254901881"><ph name="MANAGER" /> hefur umsjón með þessu <ph name="DEVICE_TYPE" />. Kerfisstjórar geta stillt tækið í gegnum fjartengingu.</translation>
 <translation id="7180611975245234373">Endurnýja</translation>
 <translation id="7180865173735832675">Sérsníða</translation>
diff --git a/chromeos/strings/chromeos_strings_th.xtb b/chromeos/strings/chromeos_strings_th.xtb
index 84f671c..daafaa4 100644
--- a/chromeos/strings/chromeos_strings_th.xtb
+++ b/chromeos/strings/chromeos_strings_th.xtb
@@ -142,7 +142,7 @@
           เลือก "ขอแรงบันดาลใจหน่อย" เพื่อรับตัวเลือกรูปภาพ AI ที่เป็นเอกลักษณ์และหลากหลายยิ่งขึ้น
           <ph name="LINE_BREAK" />
           <ph name="LINE_BREAK" />
-          เมื่อสร้างด้วย AI ระบบจะส่งพรอมต์ไปยังเซิร์ฟเวอร์ AI ของ Google เพื่อสร้างรูปภาพและปรับปรุงผลิตภัณฑ์โดยเป็นไปตาม<ph name="BEGIN_LINK_GOOGLE_PRIVACY_POLICY" />นโยบายความเป็นส่วนตัวของ Google<ph name="END_LINK_GOOGLE_PRIVACY_POLICY" />
+          เมื่อสร้างด้วย AI ระบบจะส่งพรอมต์ไปยังเซิร์ฟเวอร์ Google AI เพื่อสร้างรูปภาพและปรับปรุงผลิตภัณฑ์โดยเป็นไปตาม<ph name="BEGIN_LINK_GOOGLE_PRIVACY_POLICY" />นโยบายความเป็นส่วนตัวของ Google<ph name="END_LINK_GOOGLE_PRIVACY_POLICY" />
           <ph name="LINE_BREAK" />
           <ph name="LINE_BREAK" />
           Generative AI เป็นเวอร์ชันทดลองที่อยู่ในช่วงการพัฒนาขั้นต้น และมีให้บริการจํากัดในขณะนี้</translation>
@@ -1421,7 +1421,7 @@
 <translation id="7221869452894271364">โหลดหน้านี้ใหม่</translation>
 <translation id="7223952304612664117">การตั้งค่านี้จะช่วยให้บริการของระบบใช้ความแม่นยำของตำแหน่งเพื่อระบุตำแหน่งของคุณได้ ความแม่นยำของตำแหน่งจะใช้ข้อมูลเกี่ยวกับสัญญาณไร้สายและเซ็นเซอร์เพื่อประมาณตำแหน่งของอุปกรณ์</translation>
 <translation id="7233782086689993269">คืนค่าแป้นพิมพ์ลัดแล้ว</translation>
-<translation id="723419678599947502">สร้างชื่อโดยใช้ AI ของ Google</translation>
+<translation id="723419678599947502">สร้างชื่อโดยใช้ Google AI</translation>
 <translation id="725133483556299729">เลือกอีเมล</translation>
 <translation id="7255187042098209569">ชมพูและม่วง</translation>
 <translation id="7267918995585557751">รีเซ็ตเพื่อให้หน้าเริ่มต้นใช้งานเริ่มต้นไม่ใช่เว็บไซต์ฟิชชิง โปรดใช้เฉพาะเว็บไซต์ที่คุณเชื่อถือเท่านั้น</translation>
diff --git a/chromeos/strings/chromeos_strings_uz.xtb b/chromeos/strings/chromeos_strings_uz.xtb
index 90e8b9a..c8306fc 100644
--- a/chromeos/strings/chromeos_strings_uz.xtb
+++ b/chromeos/strings/chromeos_strings_uz.xtb
@@ -1635,7 +1635,7 @@
 <translation id="8167413449582155132">Google AI yaratgan fon rasmi</translation>
 <translation id="8171020708598805594">Transkripsiyalarni avtomatik yaratish, Google AI yordamida yozuv xulosalarini olish va audio ichidan qidirish. Ovozli yozuvlarni hatto internetga ulanmagan holda yarating.</translation>
 <translation id="8179976553408161302">Enter</translation>
-<translation id="8181979490873420600">Dars vositalari ekran namoyishi</translation>
+<translation id="8181979490873420600">Class Tools ekran namoyishi</translation>
 <translation id="8183975772394450380">sohil</translation>
 <translation id="819278132617411009">Google AI yordamida unundorlikni oshiring</translation>
 <translation id="8200772114523450471">Davom ettirish</translation>
diff --git a/clank b/clank
index 19a0031..fc0d215 160000
--- a/clank
+++ b/clank
@@ -1 +1 @@
-Subproject commit 19a00310460af8fc9faf6db9a2fafd2ef4973037
+Subproject commit fc0d2159fce5fec82a40f0e7684a715427917675
diff --git a/components/autofill/core/browser/payments/credit_card_save_manager.cc b/components/autofill/core/browser/payments/credit_card_save_manager.cc
index 13612b4a..fd27e59 100644
--- a/components/autofill/core/browser/payments/credit_card_save_manager.cc
+++ b/components/autofill/core/browser/payments/credit_card_save_manager.cc
@@ -222,7 +222,7 @@
 
 bool CreditCardSaveManager::AttemptToOfferCardLocalSave(
     const CreditCard& card) {
-  if (!client_->GetPaymentsAutofillClient()->LocalCardSaveIsSupported()) {
+  if (!payments_autofill_client().LocalCardSaveIsSupported()) {
     return false;
   }
   card_save_candidate_ = card;
@@ -366,7 +366,7 @@
     const bool uploading_local_card,
     ukm::SourceId ukm_source_id) {
   payments::PaymentsNetworkInterface* payments_network_interface =
-      client_->GetPaymentsAutofillClient()->GetPaymentsNetworkInterface();
+      payments_autofill_client().GetPaymentsNetworkInterface();
   // Abort the uploading if `payments_network_interface` is nullptr.
   if (!payments_network_interface) {
     return;
@@ -570,7 +570,7 @@
   show_save_prompt_ = !DetermineAndLogCvcSaveStrikeDatabaseBlockDecision();
   // TODO(crbug.com/40931101): Refactor ShowSaveCreditCardToCloud to change
   // legal_message_lines_ to optional.
-  client_->GetPaymentsAutofillClient()->ShowSaveCreditCardToCloud(
+  payments_autofill_client().ShowSaveCreditCardToCloud(
       card_save_candidate_, legal_message_lines_,
       payments::PaymentsAutofillClient::SaveCreditCardOptions()
           .with_show_prompt(show_save_prompt_.value())
@@ -631,7 +631,7 @@
     // because the local save bubble does not support the expiration date fix
     // flow.
     bool run_save_card_fallback =
-        client_->GetPaymentsAutofillClient()->LocalCardSaveIsSupported();
+        payments_autofill_client().LocalCardSaveIsSupported();
 
     if (run_save_card_fallback &&
         !upload_request_.card
@@ -672,7 +672,7 @@
           : std::nullopt;
 
   // Show credit card upload feedback.
-  client_->GetPaymentsAutofillClient()->CreditCardUploadCompleted(
+  payments_autofill_client().CreditCardUploadCompleted(
       result, std::move(on_confirmation_closed_callback));
 
   if (observer_for_testing_) {
@@ -685,10 +685,10 @@
     std::optional<payments::GetDetailsForEnrollmentResponseDetails>
         get_details_for_enrollment_response_details) {
   // Hides save card confirmation dialog if still showing.
-  client_->GetPaymentsAutofillClient()->HideSaveCardPrompt();
+  payments_autofill_client().HideSaveCardPrompt();
 
   if (auto* virtual_card_enrollment_manager =
-      client_->GetPaymentsAutofillClient()->GetVirtualCardEnrollmentManager()) {
+          payments_autofill_client().GetVirtualCardEnrollmentManager()) {
     virtual_card_enrollment_manager->InitVirtualCardEnroll(
         credit_card, VirtualCardEnrollmentSource::kUpstream,
         base::BindOnce(
@@ -775,7 +775,7 @@
     }
 
     // Do *not* call
-    // `client_->GetPaymentsAutofillClient()->GetPaymentsNetworkInterface()->Prepare()`
+    // `payments_autofill_client().GetPaymentsNetworkInterface()->Prepare()`
     // here. We shouldn't send credentials until the user has explicitly
     // accepted a prompt to upload.
     if (!supported_card_bin_ranges.empty() &&
@@ -854,7 +854,7 @@
       observer_for_testing_->OnOfferLocalSave();
     }
 
-    client_->GetPaymentsAutofillClient()->ShowSaveCreditCardLocally(
+    payments_autofill_client().ShowSaveCreditCardLocally(
         card_save_candidate_, options,
         base::BindOnce(&CreditCardSaveManager::OnUserDidDecideOnLocalSave,
                        weak_ptr_factory_.GetWeakPtr()));
@@ -874,7 +874,7 @@
 }
 
 void CreditCardSaveManager::OfferCvcLocalSave() {
-  client_->GetPaymentsAutofillClient()->ShowSaveCreditCardLocally(
+  payments_autofill_client().ShowSaveCreditCardLocally(
       card_save_candidate_,
       payments::PaymentsAutofillClient::SaveCreditCardOptions()
           .with_show_prompt(show_save_prompt_.value_or(false))
@@ -932,11 +932,11 @@
     if (observer_for_testing_) {
       observer_for_testing_->OnOfferUploadSave();
     }
-    client_->GetPaymentsAutofillClient()->ShowSaveCreditCardToCloud(
+    payments_autofill_client().ShowSaveCreditCardToCloud(
         upload_request_.card, legal_message_lines_, options,
         base::BindOnce(&CreditCardSaveManager::OnUserDidDecideOnUploadSave,
                        weak_ptr_factory_.GetWeakPtr()));
-    client_->GetPaymentsAutofillClient()->LoadRiskData(
+    payments_autofill_client().LoadRiskData(
         base::BindOnce(&CreditCardSaveManager::OnDidGetUploadRiskData,
                        weak_ptr_factory_.GetWeakPtr()));
 
@@ -1282,13 +1282,12 @@
 #if BUILDFLAG(IS_ANDROID)
       // On Android, requesting cardholder name is a two step flow.
       if (should_request_name_from_user_) {
-        client_->GetPaymentsAutofillClient()->ConfirmAccountNameFixFlow(
-            base::BindOnce(
-                &CreditCardSaveManager::OnUserDidAcceptAccountNameFixFlow,
-                weak_ptr_factory_.GetWeakPtr()));
+        payments_autofill_client().ConfirmAccountNameFixFlow(base::BindOnce(
+            &CreditCardSaveManager::OnUserDidAcceptAccountNameFixFlow,
+            weak_ptr_factory_.GetWeakPtr()));
         // On Android, requesting expiration date is a two step flow.
       } else if (should_request_expiration_date_from_user_) {
-        client_->GetPaymentsAutofillClient()->ConfirmExpirationDateFixFlow(
+        payments_autofill_client().ConfirmExpirationDateFixFlow(
             upload_request_.card,
             base::BindOnce(
                 &CreditCardSaveManager::OnUserDidAcceptExpirationDateFixFlow,
@@ -1436,7 +1435,7 @@
 #endif
   // Virtual card enrollment manager may not be set of CWV clients.
   if (auto* virtual_card_enrollment_manager =
-      client_->GetPaymentsAutofillClient()->GetVirtualCardEnrollmentManager()) {
+          payments_autofill_client().GetVirtualCardEnrollmentManager()) {
     virtual_card_enrollment_manager
       ->SetSaveCardBubbleAcceptedTimestamp(AutofillClock::Now());
   }
diff --git a/components/autofill/core/browser/payments/credit_card_save_manager.h b/components/autofill/core/browser/payments/credit_card_save_manager.h
index 708fa709..0c879ce 100644
--- a/components/autofill/core/browser/payments/credit_card_save_manager.h
+++ b/components/autofill/core/browser/payments/credit_card_save_manager.h
@@ -362,6 +362,10 @@
   PaymentsDataManager& payments_data_manager();
   const PaymentsDataManager& payments_data_manager() const;
 
+  payments::PaymentsAutofillClient& payments_autofill_client() {
+    return *client_->GetPaymentsAutofillClient();
+  }
+
   const raw_ref<AutofillClient> client_;
 
   // The credit card to be saved if local credit card or local or server CVC
diff --git a/components/autofill/core/browser/permissions/autofill_ai/autofill_ai_permission_utils.cc b/components/autofill/core/browser/permissions/autofill_ai/autofill_ai_permission_utils.cc
index bd42c821..6c3265f8 100644
--- a/components/autofill/core/browser/permissions/autofill_ai/autofill_ai_permission_utils.cc
+++ b/components/autofill/core/browser/permissions/autofill_ai/autofill_ai_permission_utils.cc
@@ -18,6 +18,7 @@
 #include "components/autofill/core/browser/data_model/autofill_ai/entity_type.h"
 #include "components/autofill/core/browser/data_model/autofill_ai/entity_type_names.h"
 #include "components/autofill/core/browser/foundations/autofill_client.h"
+#include "components/autofill/core/common/autofill_debug_features.h"
 #include "components/autofill/core/common/autofill_features.h"
 #include "components/autofill/core/common/autofill_prefs.h"
 #include "components/feature_engagement/public/feature_constants.h"
@@ -564,6 +565,10 @@
     return false;
   }
 
+  if (base::FeatureList::IsEnabled(features::debug::kAutofillAiForceOptIn)) {
+    return true;
+  }
+
   if (base::FeatureList::IsEnabled(
           features::kAutofillAiSetSyncablePrefFromAccountPref)) {
     return prefs::IsAutofillAiSyncedOptInStatusEnabled(prefs);
diff --git a/components/autofill/core/common/autofill_debug_features.cc b/components/autofill/core/common/autofill_debug_features.cc
index 6435eb12..2ae54907 100644
--- a/components/autofill/core/common/autofill_debug_features.cc
+++ b/components/autofill/core/common/autofill_debug_features.cc
@@ -11,6 +11,10 @@
 
 namespace autofill::features::debug {
 
+// When enabled, the user will be considered to be opted-in to Autofill AI by
+// default. Used for development purposes.
+BASE_FEATURE(kAutofillAiForceOptIn, base::FEATURE_DISABLED_BY_DEFAULT);
+
 // Testing tool that collects metrics during a run of the captured site tests
 // and dumps the collected metrics into a specified output directory.
 // For each test, a file named {test-name}.txt is created. It contains all the
diff --git a/components/autofill/core/common/autofill_debug_features.h b/components/autofill/core/common/autofill_debug_features.h
index 32bdfdd..d444dc42 100644
--- a/components/autofill/core/common/autofill_debug_features.h
+++ b/components/autofill/core/common/autofill_debug_features.h
@@ -17,6 +17,8 @@
 // All features in alphabetical order.
 
 COMPONENT_EXPORT(AUTOFILL)
+BASE_DECLARE_FEATURE(kAutofillAiForceOptIn);
+COMPONENT_EXPORT(AUTOFILL)
 BASE_DECLARE_FEATURE(kAutofillCapturedSiteTestsMetricsScraper);
 COMPONENT_EXPORT(AUTOFILL)
 BASE_DECLARE_FEATURE_PARAM(std::string,
diff --git a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettingsPageZoomTest.java b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettingsPageZoomTest.java
index d4e169c..f383b82a 100644
--- a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettingsPageZoomTest.java
+++ b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettingsPageZoomTest.java
@@ -14,6 +14,7 @@
 
 import android.view.View;
 
+import androidx.test.InstrumentationRegistry;
 import androidx.test.espresso.ViewInteraction;
 import androidx.test.espresso.action.ViewActions;
 import androidx.test.filters.SmallTest;
@@ -109,6 +110,8 @@
                 (fragment) -> ((AccessibilitySettings) fragment).setDelegate(mDelegate));
         mAccessibilitySettings =
                 (AccessibilitySettings) mSettingsActivityTestRule.getPreferenceFragment();
+
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
     }
 
     @After
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb
index 84648d1..4ff8beb9 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb
@@ -389,7 +389,7 @@
 <translation id="5198930230016462977">تم إغلاق البطاقة السفلية لتخصيص صفحة علامة التبويب الجديدة</translation>
 <translation id="5216942107514965959">تمّت زيارة الموقع الإلكتروني آخر مرّة اليوم</translation>
 <translation id="5225463052809312700">تفعيل الكاميرا</translation>
-<translation id="5234764350956374838">تجاهل</translation>
+<translation id="5234764350956374838">إغلاق</translation>
 <translation id="5239623327352565343">تمت الموافقة على طلب الوصول إلى الموقع الجغرافي.</translation>
 <translation id="5246825184569358663">سيؤدي هذا الإجراء إلى حذف جميع البيانات المخزّنة على الجهاز، بما في ذلك ملفات تعريف الارتباط، وإعادة ضبط جميع الأذونات الممنوحة للنطاق <ph name="DOMAIN" /> وجميع المواقع الإلكترونية ضِمنه.</translation>
 <translation id="5264323282659631142">إزالة شريحة "<ph name="CHIP_LABEL" />"</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb
index f89a70d..5febff7 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb
@@ -512,7 +512,7 @@
 <translation id="656065428026159829">Voir plus</translation>
 <translation id="6561560012278703671">Activer les notifications discrètes (empêche les notifications de vous interrompre)</translation>
 <translation id="6565144332292237355">Les sites peuvent utiliser cette fonctionnalité pour rechercher les appareils sur votre réseau local et s'y connecter</translation>
-<translation id="6593061639179217415">Version pour ordinateur</translation>
+<translation id="6593061639179217415">Version ordinateur</translation>
 <translation id="659938948789980540">{COUNT,plural, =1{Cookies autorisés pour <ph name="RWS_MEMBERS_COUNT" /> site <ph name="RWS_OWNER" />}one{Cookies autorisés pour <ph name="RWS_MEMBERS_COUNT" /> site <ph name="RWS_OWNER" />}other{Cookies autorisés pour <ph name="RWS_MEMBERS_COUNT" /> sites <ph name="RWS_OWNER" />}}</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> Go</translation>
 <translation id="6612358246767739896">Contenu protégé</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb
index 161f3b5d..3bc398e3 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb
@@ -243,7 +243,7 @@
 <translation id="3611658447322220736">אתרים שנסגרו לאחרונה יכולים לסיים שליחה וקבלה של נתונים</translation>
 <translation id="3619294456800709762">אתרים יכולים להפעיל את מצב 'תמונה בתוך תמונה' אוטומטית</translation>
 <translation id="3628308229821498208">הצעות לחיפוש</translation>
-<translation id="363748948745453283">המערכת משתמשת במיקום המשוער</translation>
+<translation id="363748948745453283">האתר משתמש במיקום המשוער</translation>
 <translation id="3641456520301071208">אתרים יכולים לבקש הרשאת גישה למיקומך</translation>
 <translation id="3658847490588580244">גיליון תחתון של דפדפן ברירת המחדל</translation>
 <translation id="3669841141196828854">{COUNT,plural, =1{אתר אחד (<ph name="RWS_MEMBERS_COUNT" />) בקבוצת האתרים של <ph name="RWS_OWNER" /> שיש לו הרשאה לראות את הפעילות שלך בקבוצה}one{‫<ph name="RWS_MEMBERS_COUNT" /> אתרים בקבוצת האתרים של <ph name="RWS_OWNER" /> שיש להם הרשאה לראות את הפעילות שלך בקבוצה}two{‫<ph name="RWS_MEMBERS_COUNT" /> אתרים בקבוצת האתרים של <ph name="RWS_OWNER" /> שיש להם הרשאה לראות את הפעילות שלך בקבוצה}other{‫<ph name="RWS_MEMBERS_COUNT" /> אתרים בקבוצת האתרים של <ph name="RWS_OWNER" /> שיש להם הרשאה לראות את הפעילות שלך בקבוצה}}</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb
index 2e4d181..36382f2 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb
@@ -434,7 +434,7 @@
 <translation id="5750869797196646528">Rastreamento de mãos</translation>
 <translation id="5753570386948603678">Excluir do histórico</translation>
 <translation id="5771720122942595109">Bloqueada: <ph name="PERMISSION_1" /></translation>
-<translation id="5792627621688759634">Deslize entre páginas usando um touchpad</translation>
+<translation id="5792627621688759634">Troque de página usando um touchpad</translation>
 <translation id="5801457289562671820">Recomendado pela sua organização</translation>
 <translation id="5804241973901381774">Permissões</translation>
 <translation id="5817042798620209981">Caixa de diálogo de informações do site</translation>
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/FullscreenAlertDialogTest.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/FullscreenAlertDialogTest.java
index 50413e2..221540b 100644
--- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/FullscreenAlertDialogTest.java
+++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/FullscreenAlertDialogTest.java
@@ -12,6 +12,7 @@
 
 import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.DialogFragment;
+import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.SmallTest;
 
 import org.hamcrest.Matchers;
@@ -52,6 +53,8 @@
         var fragment = new TestDialogFragment();
         fragment.show(sActivity.getSupportFragmentManager(), "");
 
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
         CriteriaHelper.pollUiThread(
                 () -> Criteria.checkThat(fragment.mDialog.isShowing(), Matchers.is(true)));
     }
@@ -68,6 +71,8 @@
                     dialog.show();
                 });
 
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
         CriteriaHelper.pollUiThread(
                 () ->
                         Criteria.checkThat(
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RichRadioButtonListUnitTest.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RichRadioButtonListUnitTest.java
index 2cdfb19..03fe8b9 100644
--- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RichRadioButtonListUnitTest.java
+++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RichRadioButtonListUnitTest.java
@@ -16,6 +16,7 @@
 
 import androidx.annotation.Nullable;
 import androidx.recyclerview.widget.RecyclerView;
+import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.SmallTest;
 
 import org.junit.Assert;
@@ -84,6 +85,8 @@
                     mRecyclerView = mRichRadioButtonList.getRecyclerViewForTesting();
                 });
 
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
         Assert.assertNotNull(
                 "RichRadioButtonList should not be null after setup.", mRichRadioButtonList);
         Assert.assertNotNull("RecyclerView should not be null after setup.", mRecyclerView);
@@ -100,6 +103,7 @@
                             viewHolder);
                     viewHolder.itemView.performClick();
                 });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
     }
 
     private @Nullable String getSelectedItemIdFromAdapter() {
@@ -203,6 +207,7 @@
                             mMockListener);
                     mRichRadioButtonList.setSelectedItem("id_optA");
                 });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
 
         Assert.assertEquals(
                 "Initial selected item ID should be 'id_optA'.",
@@ -260,6 +265,7 @@
                             options, RichRadioButtonList.LayoutMode.TWO_COLUMN_GRID, mMockListener);
                     mRichRadioButtonList.setSelectedItem("grid_top_left");
                 });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
 
         Assert.assertEquals(
                 "Initial selected item ID should be 'grid_top_left'.",
@@ -317,6 +323,7 @@
                     clearInvocations(mMockListener);
                     mRichRadioButtonList.setSelectedItem("item1");
                 });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
 
         // Click on the already selected item.
         performClickOnItem(0);
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/dragreorder/DragReorderableRecyclerViewAdapterTest.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/dragreorder/DragReorderableRecyclerViewAdapterTest.java
index ad911d86..779cbc4 100644
--- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/dragreorder/DragReorderableRecyclerViewAdapterTest.java
+++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/dragreorder/DragReorderableRecyclerViewAdapterTest.java
@@ -15,6 +15,7 @@
 import androidx.annotation.IntDef;
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
+import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.SmallTest;
 
 import org.junit.After;
@@ -94,6 +95,7 @@
 
                     mAdapter.enableDrag();
                 });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
     }
 
     @After
@@ -175,6 +177,8 @@
                     mModelList.add(buildListItem("draggable_1", Type.DRAGGABLE));
                 });
 
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
         ThreadUtils.runOnUiThreadBlocking(
                 () -> {
                     mAdapter.simulateDragForTests(1, 0);
@@ -194,6 +198,8 @@
                     mModelList.add(buildListItem("draggable_2", Type.DRAGGABLE));
                 });
 
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
         ThreadUtils.runOnUiThreadBlocking(
                 () -> {
                     mAdapter.simulateDragForTests(1, 0);
@@ -215,6 +221,8 @@
                     mModelList.add(buildListItem("draggable_2", Type.DRAGGABLE));
                 });
 
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
         ThreadUtils.runOnUiThreadBlocking(
                 () -> {
                     mAdapter.simulateDragForTests(0, 1);
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/list_view/TouchTrackingListViewTest.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/list_view/TouchTrackingListViewTest.java
index 137aa6c..7ebe999 100644
--- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/list_view/TouchTrackingListViewTest.java
+++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/list_view/TouchTrackingListViewTest.java
@@ -20,6 +20,7 @@
 import android.view.ViewGroup;
 import android.widget.ArrayAdapter;
 
+import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.SmallTest;
 
 import org.junit.Rule;
@@ -136,6 +137,8 @@
                             });
                 });
 
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
         return touchTrackingListView;
     }
 
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/listmenu/BrowserUiListMenuRenderTest.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/listmenu/BrowserUiListMenuRenderTest.java
index 36f0d6f..bd88311 100644
--- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/listmenu/BrowserUiListMenuRenderTest.java
+++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/listmenu/BrowserUiListMenuRenderTest.java
@@ -18,6 +18,7 @@
 import android.widget.ListView;
 
 import androidx.appcompat.content.res.AppCompatResources;
+import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.MediumTest;
 
 import org.junit.After;
@@ -109,6 +110,7 @@
                             activity.getResources().getDimensionPixelSize(R.dimen.list_menu_width);
                     activity.setContentView(mView, new LayoutParams(width, WRAP_CONTENT));
                 });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
     }
 
     @After
@@ -154,6 +156,7 @@
                     item.model.get(CLICK_LISTENER).onClick(mView);
                     contentView.scrollListBy(5);
                 });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
         mRenderTestRule.render(mView, "basic_list_menu_submenu_scroll");
     }
 
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json
index 760fe29..f5d482c 100644
--- a/components/certificate_transparency/data/log_list.json
+++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@
 {
-  "version": "74.30",
-  "log_list_timestamp": "2025-11-19T12:52:36Z",
+  "version": "75.1",
+  "log_list_timestamp": "2025-11-20T12:53:20Z",
   "operators": [
     {
       "name": "Google",
@@ -184,8 +184,8 @@
           "url": "https://ct.cloudflare.com/logs/nimbus2027/",
           "mmd": 86400,
           "state": {
-            "qualified": {
-              "timestamp": "2025-09-05T00:00:00Z"
+            "usable": {
+              "timestamp": "2025-11-15T00:00:00Z"
             }
           },
           "temporal_interval": {
diff --git a/components/cronet/android/BUILD.gn b/components/cronet/android/BUILD.gn
index 36c3ec9e..345db30 100644
--- a/components/cronet/android/BUILD.gn
+++ b/components/cronet/android/BUILD.gn
@@ -1532,8 +1532,6 @@
   lint_baseline_file = "lint-baseline.xml"
   lint_suppressions_file = "lint-suppressions.xml"
 
-  lint_min_sdk_version = 23
-
   apk_name = "CronetTestInstrumentation"
   android_manifest = "test/javatests/AndroidManifest.xml"
 
diff --git a/components/cronet/android/lint-baseline.xml b/components/cronet/android/lint-baseline.xml
index 56546252..31f63b2 100644
--- a/components/cronet/android/lint-baseline.xml
+++ b/components/cronet/android/lint-baseline.xml
@@ -1,4 +1,15 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <issues format="6" by="lint 9.0.0-alpha14" type="baseline" client="" dependencies="true" name="" variant="all" version="9.0.0-alpha14">
 
+    <issue
+        id="UnusedResources"
+        message="The resource `R.xml.network_security_config` appears to be unused"
+        errorLine1="&lt;network-security-config>"
+        errorLine2="^">
+        <location
+            file="../../components/cronet/android/test/res/xml/network_security_config.xml"
+            line="9"
+            column="1"/>
+    </issue>
+
 </issues>
diff --git a/components/cronet/android/test/javatests/AndroidManifest.xml b/components/cronet/android/test/javatests/AndroidManifest.xml
index bde9886..18cd22d 100644
--- a/components/cronet/android/test/javatests/AndroidManifest.xml
+++ b/components/cronet/android/test/javatests/AndroidManifest.xml
@@ -10,6 +10,9 @@
             android:versionCode="1"
             android:versionName="1.0"
             tools:ignore="ScopedStorage">
+
+    <uses-sdk android:minSdkVersion="23"/>
+
     <!-- tools:ignore="ScopedStorage" stops the linter from yelling at us for
          bypassing Scoped Storage. -->
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
diff --git a/components/gcm_driver/crypto/encryption_header_parsers_unittest.cc b/components/gcm_driver/crypto/encryption_header_parsers_unittest.cc
index 00b3fa6..b026a1e9 100644
--- a/components/gcm_driver/crypto/encryption_header_parsers_unittest.cc
+++ b/components/gcm_driver/crypto/encryption_header_parsers_unittest.cc
@@ -65,23 +65,24 @@
 
   struct ExpectedResults {
     const char* const header;
-    struct {
+    struct ParsedValues {
       const char* const keyid;
       const char* const salt;
       uint64_t rs;
-    } parsed_values[kNumberOfValues];
+    };
+    std::array<ParsedValues, kNumberOfValues> parsed_values;
   };
   auto expected_results = std::to_array<ExpectedResults>({
       {"keyid=foo;salt=c2l4dGVlbmNvb2xieXRlcw;rs=1024,keyid=foo;salt=c2l4dGVlbm"
        "Nvb2xieXRlcw;rs=1024",
-       {{"foo", "sixteencoolbytes", 1024}, {"foo", "sixteencoolbytes", 1024}}},
+       {{{"foo", "sixteencoolbytes", 1024}, {"foo", "sixteencoolbytes", 1024}}}},
       {"keyid=foo,salt=c2l4dGVlbmNvb2xieXRlcw;rs=1024",
-       {{"foo", "", kDefaultRecordSize}, {"", "sixteencoolbytes", 1024}}},
+       {{{"foo", "", kDefaultRecordSize}, {"", "sixteencoolbytes", 1024}}}},
       {"keyid=foo,keyid=bar;salt=c2l4dGVlbmNvb2xieXRlcw;rs=1024",
-       {{"foo", "", kDefaultRecordSize}, {"bar", "sixteencoolbytes", 1024}}},
+       {{{"foo", "", kDefaultRecordSize}, {"bar", "sixteencoolbytes", 1024}}}},
       {"keyid=\"foo,keyid=bar\",salt=c2l4dGVlbmNvb2xieXRlcw",
-       {{"foo,keyid=bar", "", kDefaultRecordSize},
-        {"", "sixteencoolbytes", kDefaultRecordSize}}},
+       {{{"foo,keyid=bar", "", kDefaultRecordSize},
+         {"", "sixteencoolbytes", kDefaultRecordSize}}}},
   });
 
   for (size_t i = 0; i < std::size(expected_results); i++) {
@@ -93,12 +94,9 @@
     for (size_t j = 0; j < kNumberOfValues; ++j) {
       ASSERT_TRUE(iterator.GetNext());
 
-      UNSAFE_TODO(EXPECT_EQ(expected_results[i].parsed_values[j].keyid,
-                            iterator.keyid()));
-      UNSAFE_TODO(EXPECT_EQ(expected_results[i].parsed_values[j].salt,
-                            iterator.salt()));
-      UNSAFE_TODO(
-          EXPECT_EQ(expected_results[i].parsed_values[j].rs, iterator.rs()));
+      EXPECT_EQ(expected_results[i].parsed_values[j].keyid, iterator.keyid());
+      EXPECT_EQ(expected_results[i].parsed_values[j].salt, iterator.salt());
+      EXPECT_EQ(expected_results[i].parsed_values[j].rs, iterator.rs());
     }
 
     EXPECT_FALSE(iterator.GetNext());
@@ -215,23 +213,24 @@
 
   struct ExpectedResults {
     const char* const header;
-    struct {
+    struct ParsedValues {
       const char* const keyid;
       const char* const aesgcm128;
       const char* const dh;
-    } parsed_values[kNumberOfValues];
+    };
+    std::array<ParsedValues, kNumberOfValues> parsed_values;
   };
   auto expected_results = std::to_array<ExpectedResults>({
       {"keyid=foo;aesgcm128=c2l4dGVlbmNvb2xieXRlcw;dh=dHdlbHZlY29vbGJ5dGVz,"
        "keyid=bar;aesgcm128=dHdlbHZlY29vbGJ5dGVz;dh=c2l4dGVlbmNvb2xieXRlcw",
-       {{"foo", "sixteencoolbytes", "twelvecoolbytes"},
-        {"bar", "twelvecoolbytes", "sixteencoolbytes"}}},
+       {{{"foo", "sixteencoolbytes", "twelvecoolbytes"},
+         {"bar", "twelvecoolbytes", "sixteencoolbytes"}}}},
       {"keyid=foo,aesgcm128=c2l4dGVlbmNvb2xieXRlcw",
-       {{"foo", "", ""}, {"", "sixteencoolbytes", ""}}},
+       {{{"foo", "", ""}, {"", "sixteencoolbytes", ""}}}},
       {"keyid=foo,keyid=bar;dh=dHdlbHZlY29vbGJ5dGVz",
-       {{"foo", "", ""}, {"bar", "", "twelvecoolbytes"}}},
+       {{{"foo", "", ""}, {"bar", "", "twelvecoolbytes"}}}},
       {"keyid=\"foo,keyid=bar\",aesgcm128=c2l4dGVlbmNvb2xieXRlcw",
-       {{"foo,keyid=bar", "", ""}, {"", "sixteencoolbytes", ""}}},
+       {{{"foo,keyid=bar", "", ""}, {"", "sixteencoolbytes", ""}}}},
   });
 
   for (size_t i = 0; i < std::size(expected_results); i++) {
@@ -243,12 +242,10 @@
     for (size_t j = 0; j < kNumberOfValues; ++j) {
       ASSERT_TRUE(iterator.GetNext());
 
-      UNSAFE_TODO(EXPECT_EQ(expected_results[i].parsed_values[j].keyid,
-                            iterator.keyid()));
-      UNSAFE_TODO(EXPECT_EQ(expected_results[i].parsed_values[j].aesgcm128,
-                            iterator.aesgcm128()));
-      UNSAFE_TODO(
-          EXPECT_EQ(expected_results[i].parsed_values[j].dh, iterator.dh()));
+      EXPECT_EQ(expected_results[i].parsed_values[j].keyid, iterator.keyid());
+      EXPECT_EQ(expected_results[i].parsed_values[j].aesgcm128,
+                iterator.aesgcm128());
+      EXPECT_EQ(expected_results[i].parsed_values[j].dh, iterator.dh());
     }
 
     EXPECT_FALSE(iterator.GetNext());
diff --git a/components/history/core/browser/history_backend_observer.h b/components/history/core/browser/history_backend_observer.h
index d9b301b..06bfc2c 100644
--- a/components/history/core/browser/history_backend_observer.h
+++ b/components/history/core/browser/history_backend_observer.h
@@ -43,6 +43,9 @@
   // database. `is_from_expiration` is true if the modification is caused by
   // automatic history expiration (the visit count got reduced by expiring some
   // of the visits); it is false if the modification is caused by user action.
+  //
+  // Callers may receive URLRows that contain 404 visits and thus have visit
+  // counts or times that take 404 errors into account.
   virtual void OnURLsModified(HistoryBackend* history_backend,
                               const URLRows& changed_urls,
                               bool is_from_expiration) = 0;
diff --git a/components/history/core/browser/history_service_observer.h b/components/history/core/browser/history_service_observer.h
index f1b6e6d8..f9b4328 100644
--- a/components/history/core/browser/history_service_observer.h
+++ b/components/history/core/browser/history_service_observer.h
@@ -61,6 +61,9 @@
   // `changed_urls` lists the information for each of the URLs affected. The
   // rows will have the IDs that are currently in effect in the main history
   // database.
+  //
+  // Callers may receive URLRows that contain 404 visits and thus have
+  // visit counts or times that take 404 errors into account.
   virtual void OnURLsModified(HistoryService* history_service,
                               const URLRows& changed_urls) {}
 
diff --git a/components/language_detection/core/embedding_lookup.cc b/components/language_detection/core/embedding_lookup.cc
index 9a07df2..5afb422 100644
--- a/components/language_detection/core/embedding_lookup.cc
+++ b/components/language_detection/core/embedding_lookup.cc
@@ -4,8 +4,12 @@
 
 #include "components/language_detection/core/embedding_lookup.h"
 
+#include <type_traits>
+
 #include "base/check_op.h"
 #include "base/compiler_specific.h"
+#include "base/containers/span.h"
+#include "base/numerics/safe_conversions.h"
 #include "components/language_detection/core/quantization_utils.h"
 #include "third_party/flatbuffers/src/include/flatbuffers/flexbuffers.h"
 #include "third_party/tflite/src/tensorflow/lite/kernels/internal/tensor_ctypes.h"
@@ -75,6 +79,25 @@
   delete reinterpret_cast<EmbeddingLookupOpParams*>(buffer);
 }
 
+template <typename T, typename TensorType>
+  requires(std::is_same_v<std::remove_const_t<TensorType>, TfLiteTensor>)
+auto GetTensorDataSpan(TensorType* tensor) {
+  CHECK_EQ(tensor->bytes % sizeof(T), 0u);
+  // SAFETY: We have checked that the size of `data` (given by `tensor->bytes`)
+  // divides cleanly by the sizeof T so this buffer is promised to be in bounds.
+  return UNSAFE_BUFFERS(
+      base::span(tflite::GetTensorData<T>(tensor), tensor->bytes / sizeof(T)));
+}
+
+template <typename TfLiteIntArrayType>
+  requires(
+      std::is_same_v<std::remove_const_t<TfLiteIntArrayType>, TfLiteIntArray>)
+auto GetSpanFromTfLiteIntArray(TfLiteIntArrayType* array) {
+  // SAFETY: TfLite stores the size with the TfLiteIntArray.
+  return UNSAFE_BUFFERS(
+      base::span(array->data, base::checked_cast<size_t>(array->size)));
+}
+
 TfLiteStatus Resize(TfLiteContext* context, TfLiteNode* node) {
   TfLiteTensor* output = tflite::GetOutput(context, node, kOutputLabel);
   TF_LITE_ENSURE(context, output != nullptr);
@@ -82,12 +105,14 @@
       reinterpret_cast<EmbeddingLookupOpParams*>(node->user_data);
   TF_LITE_ENSURE_OK(context, params->Validate(context));
   TfLiteIntArray* output_size = TfLiteIntArrayCreate(2);
-  output_size->data[0] = 1;
+  base::span<int> output_data = GetSpanFromTfLiteIntArray(output_size);
+  output_data[0] = 1;
   const TfLiteTensor* input_tensor =
       tflite::GetInput(context, node, kEmbeddingTable);
   TF_LITE_ENSURE(context, input_tensor != nullptr);
-  const int input_embedding_size = UNSAFE_TODO(input_tensor->dims->data[1]);
-  UNSAFE_TODO(output_size->data[1]) = GetOutputEmbeddingSize(
+  const int input_embedding_size =
+      GetSpanFromTfLiteIntArray(input_tensor->dims)[1];
+  output_data[1] = GetOutputEmbeddingSize(
       input_embedding_size, params->IsQuantized(), params->GetNumBits());
   return context->ResizeTensor(context, output, output_size);
 }
@@ -110,19 +135,23 @@
                   const TfLiteTensor* embedding_table,
                   const float min_val,
                   const float max_val,
-                  float* data,
-                  const EmbeddingLookupOpParams* params) {
+                  const EmbeddingLookupOpParams* params,
+                  TfLiteTensor* output) {
   const bool is_quantized = params->IsQuantized();
   const int num_precision_bits = params->GetNumBits();
-  const int input_embedding_size = UNSAFE_TODO(embedding_table->dims->data[1]);
-  const int num_tokens = UNSAFE_TODO(input->dims->data[1]);
-  const int output_embedding_size = GetOutputEmbeddingSize(
-      input_embedding_size, is_quantized, num_precision_bits);
+  const int input_embedding_size =
+      GetSpanFromTfLiteIntArray(embedding_table->dims)[1];
+  const int num_tokens = GetSpanFromTfLiteIntArray(input->dims)[1];
+  const size_t output_embedding_size =
+      base::checked_cast<size_t>(GetOutputEmbeddingSize(
+          input_embedding_size, is_quantized, num_precision_bits));
   int num_embeddings = 0;
   std::vector<float> final_embedding(output_embedding_size, 0.0);
+  base::span<const uint32> embedding_table_data =
+      GetTensorDataSpan<uint32>(embedding_table);
+  base::span<const int32> input_data = GetTensorDataSpan<int32>(input);
   for (int token_idx = 0; token_idx < num_tokens; token_idx++) {
-    const int32 token =
-        UNSAFE_TODO(tflite::GetTensorData<int32>(input)[token_idx]);
+    const int32 token = input_data[token_idx];
     if (token == 0) {
       break;
     }
@@ -135,8 +164,8 @@
           GetQuantizationParams(min_val, max_val, num_precision_bits);
       for (int embed_idx = 0; embed_idx < input_embedding_size; embed_idx++) {
         // Extract the packed embedding at the given index.
-        uint32 packed_embedding = UNSAFE_TODO(tflite::GetTensorData<uint32>(
-            embedding_table)[token * input_embedding_size + embed_idx]);
+        uint32 packed_embedding =
+            embedding_table_data[token * input_embedding_size + embed_idx];
         for (int num_dims_extracted = 0;
              num_dims_extracted < compression_factor; num_dims_extracted++) {
           uint32 quantized_val = (packed_embedding & mask);
@@ -160,9 +189,12 @@
     }
     ++num_embeddings;
   }
+
+  base::span<float> output_data =
+      GetTensorDataSpan<float>(output).first(output_embedding_size);
   // Compute the mean of the embeddings.
-  for (int embed_idx = 0; embed_idx < output_embedding_size; embed_idx++) {
-    UNSAFE_TODO(data[embed_idx]) =
+  for (size_t embed_idx = 0; embed_idx < output_embedding_size; embed_idx++) {
+    output_data[embed_idx] =
         final_embedding[embed_idx] / (std::max(num_embeddings, 1));
   }
 }
@@ -193,9 +225,8 @@
     return kTfLiteError;
   }
   // Compute the output embedding.
-  GetEmbedding(input, embedding_table, tflite::GetTensorData<float>(min_val)[0],
-               tflite::GetTensorData<float>(max_val)[0],
-               tflite::GetTensorData<float>(output), params);
+  GetEmbedding(input, embedding_table, GetTensorDataSpan<float>(min_val)[0],
+               GetTensorDataSpan<float>(max_val)[0], params, output);
   return kTfLiteOk;
 }
 
diff --git a/components/legion/client.cc b/components/legion/client.cc
index 5e5e2acf..477afa3 100644
--- a/components/legion/client.cc
+++ b/components/legion/client.cc
@@ -144,6 +144,10 @@
                              const std::string& text,
                              OnTextRequestCompletedCallback callback) {
   proto::GenerateContentRequest request;
+  if (feature_name ==
+      proto::FeatureName::FEATURE_NAME_DEMO_GEMINI_GENERATE_CONTENT) {
+    request.set_model("dev_v3xs");
+  }
   auto* content = request.add_contents();
   content->set_role("user");
   auto* part = content->add_parts();
diff --git a/components/legion/proto/legion.proto b/components/legion/proto/legion.proto
index d04445a..0410450 100644
--- a/components/legion/proto/legion.proto
+++ b/components/legion/proto/legion.proto
@@ -44,9 +44,14 @@
 enum FeatureName {
   FEATURE_NAME_UNSPECIFIED = 0;
   FEATURE_NAME_DEMO_GEMINI_GENERATE_CONTENT = 3;
+  FEATURE_NAME_CHROME_ZERO_STATE_SUGGESTION = 700;
 }
 
 message GenerateContentRequest {
+  // This field is meant for fast prototyping and will only be respected when
+  // the feature name is FEATURE_NAME_DEMO_GEMINI_GENERATE_CONTENT.
+  string model = 1;
+
   repeated Content contents = 2;
 }
 
diff --git a/components/management/resources/management.css b/components/management/resources/management.css
index ec5c4a9..1edc8d7 100644
--- a/components/management/resources/management.css
+++ b/components/management/resources/management.css
@@ -79,6 +79,7 @@
 }
 
 #connectors-section-title,
+#browser-reporting-title,
 #profile-reporting-title {
   font-size: 1.4em;
   font-weight: normal;
diff --git a/components/management/resources/management.html b/components/management/resources/management.html
index 8ceffcf..5c4c9391 100644
--- a/components/management/resources/management.html
+++ b/components/management/resources/management.html
@@ -17,6 +17,34 @@
         <a id="learn-more-link" target="_blank" href="$i18n{learnMoreURL}">$i18n{learnMore}</a>
       </div>
 
+      <div id="browser-reporting-info" class="hidden">
+        <div id="browser-reporting-title" class="heading">
+            $i18n{browserReporting}
+        </div>
+
+        <div id="browser-reporting-explanation" class="description-text">
+          $i18n{browserReportingExplanation}
+        </div>
+
+        <ul id="browser-reporting-list" class="description-text">
+          <li>$i18n{browserReportingOverview}</li>
+          <li>
+            $i18n{browserReportingDeviceInformation}
+            <ul>
+              <li>$i18n{browserReportingDeviceInformationContinued}</li>
+            </ul>
+          </li>
+          <li>
+            $i18n{browserReportingBrowserAndProfiles}
+            <ul>
+              <li>$i18n{browserReportingBrowserAndProfilesContinued}</li>
+            </ul>
+          </li>
+          <li>$i18n{browserReportingPolicy}</li>
+          <li>$i18nRaw{browserReportingLearnMore}</li>
+        </ul>
+      </div>
+
       <div id="profile-reporting-info" class="hidden">
         <div id="profile-reporting-title" class="heading">
           $i18n{browserReporting}
diff --git a/components/management/resources/management.ts b/components/management/resources/management.ts
index 8fde515..482c068 100644
--- a/components/management/resources/management.ts
+++ b/components/management/resources/management.ts
@@ -12,10 +12,15 @@
  * specific event sections based on flags.
  */
 function populateConnectorsSection() {
-  // Profile reporting section.
+  // Browser/profile reporting section. If both are active, only show the
+  // browser reporting section.
+  const browserReportingEnabled =
+      loadTimeData.getBoolean('browserReportingEnabled');
   const profileReportingEnabled =
       loadTimeData.getBoolean('profileReportingEnabled');
-  if (profileReportingEnabled) {
+  if (browserReportingEnabled) {
+    getRequiredElement('browser-reporting-info').classList.remove('hidden');
+  } else if (profileReportingEnabled) {
     getRequiredElement('profile-reporting-info').classList.remove('hidden');
   }
 
diff --git a/components/management_strings.grdp b/components/management_strings.grdp
index 427874d..979dfeb 100644
--- a/components/management_strings.grdp
+++ b/components/management_strings.grdp
@@ -395,6 +395,33 @@
   <message name="IDS_MANAGEMENT_BROWSER_REPORTING" desc="Title of the types of browser reporting section of the page" formatter_data="android_java">
     Browser
   </message>
+  <if expr="is_ios">
+    <message name="IDS_MANAGEMENT_BROWSER_REPORTING_EXPLANATION" desc="Message explaining to users what browser information is being reported that admins can access">
+      Profile, browser, and device information is accessible to your administrator. They can see:
+    </message>
+    <message name="IDS_MANAGEMENT_BROWSER_REPORTING_OVERVIEW" desc="Item in a list of information viewable by the enterprise admin, indicating that the admin can view the user's browser and work profile overview.">
+      Browser overview
+    </message>
+    <message name="IDS_MANAGEMENT_BROWSER_REPORTING_DEVICE_INFORMATION" desc="Item in a list of information viewable by the enterprise admin, indicating that the admin can view the user's device information.">
+      Device information
+    </message>
+    <message name="IDS_MANAGEMENT_BROWSER_REPORTING_DEVICE_INFORMATION_CONTINUED" desc="Item in a list of information viewable by the enterprise admin, clarifying what 'device information' means.">
+      Such as device ID, name, OS version and OS username
+    </message>
+    <message name="IDS_MANAGEMENT_BROWSER_REPORTING_BROWSER_AND_PROFILES" desc="Item in a list of information viewable by the enterprise admin, indicating that the admin can view browser and profile information.">
+      Browsers &amp; profiles information (including personal and work profiles)
+    </message>
+    <message name="IDS_MANAGEMENT_BROWSER_REPORTING_BROWSER_AND_PROFILES_CONTINUED" desc="Item in a list of information viewable by the enterprise admin, clarifying what 'browser &amp; profiles information' means.">
+      Such as profile usernames &amp; browser versions
+    </message>
+    <message name="IDS_MANAGEMENT_BROWSER_REPORTING_POLICY" desc="Item in a list of information viewable by the enterprise admin, indicating that the admin can view the user's browser and work profile policies.">
+      Applied browser policies (machine and profile policies)
+    </message>
+    <message name="IDS_MANAGEMENT_BROWSER_REPORTING_LEARN_MORE" desc="Learn more link for profile reporting management information to provide additional informaiton">
+      <ph name="BEGIN_LINK">&lt;a target="_blank" href="https://support.google.com/chrome/a/answer/9227157"&gt;</ph>More details<ph name="END_LINK">&lt;/a&gt;</ph>
+    </message>
+  </if>
+
 
   <!-- Profile reporting management message-->
   <message name="IDS_MANAGEMENT_PROFILE_REPORTING_EXPLANATION" desc="Message explaining browser reporting" formatter_data="android_java">
diff --git a/components/management_strings_grdp/IDS_MANAGEMENT_BROWSER_REPORTING_BROWSER_AND_PROFILES.png.sha1 b/components/management_strings_grdp/IDS_MANAGEMENT_BROWSER_REPORTING_BROWSER_AND_PROFILES.png.sha1
new file mode 100644
index 0000000..98fa1fc9
--- /dev/null
+++ b/components/management_strings_grdp/IDS_MANAGEMENT_BROWSER_REPORTING_BROWSER_AND_PROFILES.png.sha1
@@ -0,0 +1 @@
+63eda2a37c71d6aea19b94675eab11815a645fed
\ No newline at end of file
diff --git a/components/management_strings_grdp/IDS_MANAGEMENT_BROWSER_REPORTING_BROWSER_AND_PROFILES_CONTINUED.png.sha1 b/components/management_strings_grdp/IDS_MANAGEMENT_BROWSER_REPORTING_BROWSER_AND_PROFILES_CONTINUED.png.sha1
new file mode 100644
index 0000000..98fa1fc9
--- /dev/null
+++ b/components/management_strings_grdp/IDS_MANAGEMENT_BROWSER_REPORTING_BROWSER_AND_PROFILES_CONTINUED.png.sha1
@@ -0,0 +1 @@
+63eda2a37c71d6aea19b94675eab11815a645fed
\ No newline at end of file
diff --git a/components/management_strings_grdp/IDS_MANAGEMENT_BROWSER_REPORTING_DEVICE_INFORMATION.png.sha1 b/components/management_strings_grdp/IDS_MANAGEMENT_BROWSER_REPORTING_DEVICE_INFORMATION.png.sha1
new file mode 100644
index 0000000..98fa1fc9
--- /dev/null
+++ b/components/management_strings_grdp/IDS_MANAGEMENT_BROWSER_REPORTING_DEVICE_INFORMATION.png.sha1
@@ -0,0 +1 @@
+63eda2a37c71d6aea19b94675eab11815a645fed
\ No newline at end of file
diff --git a/components/management_strings_grdp/IDS_MANAGEMENT_BROWSER_REPORTING_DEVICE_INFORMATION_CONTINUED.png.sha1 b/components/management_strings_grdp/IDS_MANAGEMENT_BROWSER_REPORTING_DEVICE_INFORMATION_CONTINUED.png.sha1
new file mode 100644
index 0000000..98fa1fc9
--- /dev/null
+++ b/components/management_strings_grdp/IDS_MANAGEMENT_BROWSER_REPORTING_DEVICE_INFORMATION_CONTINUED.png.sha1
@@ -0,0 +1 @@
+63eda2a37c71d6aea19b94675eab11815a645fed
\ No newline at end of file
diff --git a/components/management_strings_grdp/IDS_MANAGEMENT_BROWSER_REPORTING_EXPLANATION.png.sha1 b/components/management_strings_grdp/IDS_MANAGEMENT_BROWSER_REPORTING_EXPLANATION.png.sha1
index 62df621..98fa1fc9 100644
--- a/components/management_strings_grdp/IDS_MANAGEMENT_BROWSER_REPORTING_EXPLANATION.png.sha1
+++ b/components/management_strings_grdp/IDS_MANAGEMENT_BROWSER_REPORTING_EXPLANATION.png.sha1
@@ -1 +1 @@
-f76faa01908a0fa0196b788370ffe88c119e71e0
\ No newline at end of file
+63eda2a37c71d6aea19b94675eab11815a645fed
\ No newline at end of file
diff --git a/components/management_strings_grdp/IDS_MANAGEMENT_BROWSER_REPORTING_LEARN_MORE.png.sha1 b/components/management_strings_grdp/IDS_MANAGEMENT_BROWSER_REPORTING_LEARN_MORE.png.sha1
new file mode 100644
index 0000000..98fa1fc9
--- /dev/null
+++ b/components/management_strings_grdp/IDS_MANAGEMENT_BROWSER_REPORTING_LEARN_MORE.png.sha1
@@ -0,0 +1 @@
+63eda2a37c71d6aea19b94675eab11815a645fed
\ No newline at end of file
diff --git a/components/management_strings_grdp/IDS_MANAGEMENT_BROWSER_REPORTING_OVERVIEW.png.sha1 b/components/management_strings_grdp/IDS_MANAGEMENT_BROWSER_REPORTING_OVERVIEW.png.sha1
new file mode 100644
index 0000000..98fa1fc9
--- /dev/null
+++ b/components/management_strings_grdp/IDS_MANAGEMENT_BROWSER_REPORTING_OVERVIEW.png.sha1
@@ -0,0 +1 @@
+63eda2a37c71d6aea19b94675eab11815a645fed
\ No newline at end of file
diff --git a/components/management_strings_grdp/IDS_MANAGEMENT_BROWSER_REPORTING_POLICY.png.sha1 b/components/management_strings_grdp/IDS_MANAGEMENT_BROWSER_REPORTING_POLICY.png.sha1
new file mode 100644
index 0000000..98fa1fc9
--- /dev/null
+++ b/components/management_strings_grdp/IDS_MANAGEMENT_BROWSER_REPORTING_POLICY.png.sha1
@@ -0,0 +1 @@
+63eda2a37c71d6aea19b94675eab11815a645fed
\ No newline at end of file
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_pt-BR.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_pt-BR.xtb
index c34c07b..cfef05c 100644
--- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_pt-BR.xtb
+++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_pt-BR.xtb
@@ -18,7 +18,7 @@
 <translation id="4341944745395709813">sempre abrir links no chrome, sempre usar o chrome, chrome como navegador padrão, navegador padrão, definir o chrome como o navegador padrão, navegador principal, fazer com que o chrome seja o padrão, transformar o chrome no navegador padrão, tornar o chrome meu navegador padrão, abrir links no chrome, escolher o chrome como navegador padrão, navegador principal, pesquisar no chrome, definir o chrome como padrão, usar o chrome como navegador padrão</translation>
 <translation id="4367205929005172598">encontrar smartphone perdido, encontre meu dispositivo</translation>
 <translation id="4692900934258103694">dentro, para, como, o, a, um, uma, fazer, em, no, na, meu, minha, sobre, eu</translation>
-<translation id="4834023075966161189">criar arquivo dos documentos google, criar documento do google, abrir documento do google</translation>
+<translation id="4834023075966161189">criar arquivo do Google Docs, criar documento do google, abrir documento do google</translation>
 <translation id="4922709528022057939">dinossauro do chrome, jogo do dinossauro, iniciar jogo do dinossauro</translation>
 <translation id="5061612070235737664">mudar fonte do navegador, fontes do chrome</translation>
 <translation id="6413237123574479071">gerenciar formas de pagamento, atualizar cartão de crédito</translation>
diff --git a/components/one_time_tokens/core/browser/one_time_token_service_impl.cc b/components/one_time_tokens/core/browser/one_time_token_service_impl.cc
index 49b5202..40a0602e 100644
--- a/components/one_time_tokens/core/browser/one_time_token_service_impl.cc
+++ b/components/one_time_tokens/core/browser/one_time_token_service_impl.cc
@@ -14,7 +14,8 @@
 namespace one_time_tokens {
 
 OneTimeTokenServiceImpl::OneTimeTokenServiceImpl(SmsOtpBackend* sms_otp_backend)
-    : sms_{false, sms_otp_backend}, cache_(kCacheDurationForOldTokens) {}
+    : sms_{.has_pending_request = false, .backend = sms_otp_backend},
+      cache_(kCacheDurationForOldTokens) {}
 OneTimeTokenServiceImpl::~OneTimeTokenServiceImpl() = default;
 
 void OneTimeTokenServiceImpl::GetRecentOneTimeTokens(Callback callback) {
diff --git a/components/optimization_guide/core/BUILD.gn b/components/optimization_guide/core/BUILD.gn
index 19b28a9..d6c4a86 100644
--- a/components/optimization_guide/core/BUILD.gn
+++ b/components/optimization_guide/core/BUILD.gn
@@ -239,6 +239,7 @@
       "model_execution/model_execution_features.h",
       "model_execution/model_execution_features_controller.cc",
       "model_execution/model_execution_features_controller.h",
+      "model_execution/model_execution_fetcher.h",
       "model_execution/model_execution_fetcher_impl.cc",
       "model_execution/model_execution_fetcher_impl.h",
       "model_execution/model_execution_manager.cc",
diff --git a/components/optimization_guide/core/model_execution/model_execution_fetcher.h b/components/optimization_guide/core/model_execution/model_execution_fetcher.h
new file mode 100644
index 0000000..3c92fc8
--- /dev/null
+++ b/components/optimization_guide/core/model_execution/model_execution_fetcher.h
@@ -0,0 +1,46 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_OPTIMIZATION_GUIDE_CORE_MODEL_EXECUTION_MODEL_EXECUTION_FETCHER_H_
+#define COMPONENTS_OPTIMIZATION_GUIDE_CORE_MODEL_EXECUTION_MODEL_EXECUTION_FETCHER_H_
+
+#include <optional>
+
+#include "base/functional/callback.h"
+#include "base/time/time.h"
+#include "base/types/expected.h"
+#include "components/optimization_guide/core/model_execution/feature_keys.h"
+#include "components/optimization_guide/core/model_execution/optimization_guide_model_execution_error.h"
+#include "components/optimization_guide/proto/model_execution.pb.h"
+
+namespace signin {
+class IdentityManager;
+}  // namespace signin
+
+namespace optimization_guide {
+
+using ModelExecuteResponseCallback = base::OnceCallback<void(
+    base::expected<const proto::ExecuteResponse,
+                   OptimizationGuideModelExecutionError>)>;
+
+// Interface for fetching model executions from the remote Optimization Guide
+// Service.
+class ModelExecutionFetcher {
+ public:
+  virtual ~ModelExecutionFetcher() = default;
+
+  // Executes a model for the given `feature`. The `request_metadata` is the
+  // feature-specific request metadata. The `callback` is invoked when the
+  // execution is complete.
+  virtual void ExecuteModel(
+      ModelBasedCapabilityKey feature,
+      signin::IdentityManager* identity_manager,
+      const google::protobuf::MessageLite& request_metadata,
+      std::optional<base::TimeDelta> timeout,
+      ModelExecuteResponseCallback callback) = 0;
+};
+
+}  // namespace optimization_guide
+
+#endif  // COMPONENTS_OPTIMIZATION_GUIDE_CORE_MODEL_EXECUTION_MODEL_EXECUTION_FETCHER_H_
diff --git a/components/optimization_guide/core/model_execution/model_execution_fetcher_impl.h b/components/optimization_guide/core/model_execution/model_execution_fetcher_impl.h
index e4f8109..df9dfa7 100644
--- a/components/optimization_guide/core/model_execution/model_execution_fetcher_impl.h
+++ b/components/optimization_guide/core/model_execution/model_execution_fetcher_impl.h
@@ -16,6 +16,7 @@
 #include "base/time/time.h"
 #include "base/types/expected.h"
 #include "components/optimization_guide/core/model_execution/feature_keys.h"
+#include "components/optimization_guide/core/model_execution/model_execution_fetcher.h"
 #include "components/optimization_guide/core/model_execution/optimization_guide_model_execution_error.h"
 #include "components/optimization_guide/proto/model_execution.pb.h"
 #include "url/gurl.h"
@@ -33,11 +34,7 @@
 
 namespace optimization_guide {
 
-using ModelExecuteResponseCallback = base::OnceCallback<void(
-    base::expected<const proto::ExecuteResponse,
-                   OptimizationGuideModelExecutionError>)>;
-
-class ModelExecutionFetcherImpl {
+class ModelExecutionFetcherImpl : public ModelExecutionFetcher {
  public:
   ModelExecutionFetcherImpl(
       scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
@@ -48,13 +45,13 @@
   ModelExecutionFetcherImpl& operator=(const ModelExecutionFetcherImpl&) =
       delete;
 
-  ~ModelExecutionFetcherImpl();
+  ~ModelExecutionFetcherImpl() override;
 
   void ExecuteModel(ModelBasedCapabilityKey feature,
                     signin::IdentityManager* identity_manager,
                     const google::protobuf::MessageLite& request_metadata,
                     std::optional<base::TimeDelta> timeout,
-                    ModelExecuteResponseCallback callback);
+                    ModelExecuteResponseCallback callback) override;
 
  private:
   // Invoked when the access token is received, to continue with the model
diff --git a/components/optimization_guide/core/model_execution/model_execution_manager.cc b/components/optimization_guide/core/model_execution/model_execution_manager.cc
index b705b58..d737f4c 100644
--- a/components/optimization_guide/core/model_execution/model_execution_manager.cc
+++ b/components/optimization_guide/core/model_execution/model_execution_manager.cc
@@ -216,16 +216,24 @@
   }
   FetcherId fetcher_id = next_model_execution_fetcher_id++;
   auto fetcher_it = fetchers_for_feature.emplace(
-      std::piecewise_construct, std::forward_as_tuple(fetcher_id),
-      std::forward_as_tuple(url_loader_factory_, model_execution_service_url_,
-                            optimization_guide_logger_));
-  fetcher_it.first->second.ExecuteModel(
+      fetcher_id, CreateModelExecutionFetcher(feature));
+  fetcher_it.first->second->ExecuteModel(
       feature, identity_manager_, request_metadata, timeout,
       base::BindOnce(&ModelExecutionManager::OnModelExecuteResponse,
                      weak_ptr_factory_.GetWeakPtr(), feature, fetcher_id,
                      std::move(log_ai_data_request), std::move(callback)));
 }
 
+std::unique_ptr<ModelExecutionFetcher>
+ModelExecutionManager::CreateModelExecutionFetcher(
+    ModelBasedCapabilityKey feature) {
+  // TODO(crbug.com/460052805): Add PI fetcher implementation depending on
+  // ModelBasedCapabilityKey and feature flags.
+  return std::make_unique<ModelExecutionFetcherImpl>(
+      url_loader_factory_, model_execution_service_url_,
+      optimization_guide_logger_);
+}
+
 void ModelExecutionManager::OnModelExecuteResponse(
     ModelBasedCapabilityKey feature,
     FetcherId fetcher_id,
diff --git a/components/optimization_guide/core/model_execution/model_execution_manager.h b/components/optimization_guide/core/model_execution/model_execution_manager.h
index 7eddde90..2f516d4 100644
--- a/components/optimization_guide/core/model_execution/model_execution_manager.h
+++ b/components/optimization_guide/core/model_execution/model_execution_manager.h
@@ -34,7 +34,7 @@
 
 namespace optimization_guide {
 
-class ModelExecutionFetcherImpl;
+class ModelExecutionFetcher;
 
 class ModelExecutionManager final {
  public:
@@ -75,7 +75,11 @@
 
   // All active executions for a certain feature.
   using ActiveFeatureExecutions =
-      std::map<FetcherId, ModelExecutionFetcherImpl>;
+      std::map<FetcherId, std::unique_ptr<ModelExecutionFetcher>>;
+
+  // Creates a new ModelExecutionFetcher for |feature|.
+  std::unique_ptr<ModelExecutionFetcher> CreateModelExecutionFetcher(
+      ModelBasedCapabilityKey feature);
 
   // Invoked when the model execution result is available.
   void OnModelExecuteResponse(
diff --git a/components/paint_preview/player/android/javatests/src/org/chromium/components/paintpreview/player/PaintPreviewPlayerTest.java b/components/paint_preview/player/android/javatests/src/org/chromium/components/paintpreview/player/PaintPreviewPlayerTest.java
index becfc3b..52ced4ef 100644
--- a/components/paint_preview/player/android/javatests/src/org/chromium/components/paintpreview/player/PaintPreviewPlayerTest.java
+++ b/components/paint_preview/player/android/javatests/src/org/chromium/components/paintpreview/player/PaintPreviewPlayerTest.java
@@ -107,6 +107,7 @@
                     mLayout = new FrameLayout(mActivityTestRule.getActivity());
                     mActivityTestRule.getActivity().setContentView(mLayout);
                 });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
         AccountManagerFacadeProvider.setInstanceForTests(new FakeAccountManagerFacade());
         NativeLibraryTestUtils.loadNativeLibraryAndInitBrowserProcess();
     }
diff --git a/components/payments/content/browser_binding/browser_bound_key_store_desktop.cc b/components/payments/content/browser_binding/browser_bound_key_store_desktop.cc
index 8950c41..5a27fa9 100644
--- a/components/payments/content/browser_binding/browser_bound_key_store_desktop.cc
+++ b/components/payments/content/browser_binding/browser_bound_key_store_desktop.cc
@@ -79,8 +79,10 @@
 
 void BrowserBoundKeyStoreDesktop::DeleteBrowserBoundKey(
     std::vector<uint8_t> bbk_id) {
-  if (key_provider_) {
-    key_provider_->DeleteSigningKeySlowly(bbk_id);
+  if (crypto::StatefulUnexportableKeyProvider* stateful_provider =
+          key_provider_ ? key_provider_->AsStatefulUnexportableKeyProvider()
+                        : nullptr) {
+    stateful_provider->DeleteSigningKeySlowly(bbk_id);
   }
 }
 
diff --git a/components/pdf/renderer/BUILD.gn b/components/pdf/renderer/BUILD.gn
index 0f3b652..0d2f597e 100644
--- a/components/pdf/renderer/BUILD.gn
+++ b/components/pdf/renderer/BUILD.gn
@@ -22,6 +22,8 @@
     "pdf_accessibility_tree.cc",
     "pdf_accessibility_tree_builder.cc",
     "pdf_accessibility_tree_builder.h",
+    "pdf_accessibility_tree_builder_heuristic.cc",
+    "pdf_accessibility_tree_builder_heuristic.h",
     "pdf_ax_action_target.cc",
     "pdf_view_web_plugin_client.cc",
     "pdf_view_web_plugin_client.h",
diff --git a/components/pdf/renderer/pdf_accessibility_tree_builder.cc b/components/pdf/renderer/pdf_accessibility_tree_builder.cc
index 0de3f79..e2470f0 100644
--- a/components/pdf/renderer/pdf_accessibility_tree_builder.cc
+++ b/components/pdf/renderer/pdf_accessibility_tree_builder.cc
@@ -8,9 +8,9 @@
 #include <queue>
 #include <string>
 
-#include "base/containers/fixed_flat_map.h"
 #include "base/i18n/break_iterator.h"
 #include "base/strings/utf_string_conversion_utils.h"
+#include "components/pdf/renderer/pdf_accessibility_tree_builder_heuristic.h"
 #include "components/strings/grit/components_strings.h"
 #include "pdf/accessibility_structs.h"
 #include "pdf/page_character_index.h"
@@ -26,196 +26,6 @@
 
 namespace {
 
-// Don't try to apply font size thresholds to automatically identify headings
-// if the median font size is not at least this many points.
-const float kMinimumFontSize = 5.0f;
-
-// Don't try to apply paragraph break thresholds to automatically identify
-// paragraph breaks if the median line break is not at least this many points.
-const float kMinimumLineSpacing = 5.0f;
-
-// Ratio between the font size of one text run and the median on the page
-// for that text run to be considered to be a heading instead of normal text.
-const float kHeadingFontSizeRatio = 1.2f;
-
-// Ratio between the line spacing between two lines and the median on the
-// page for that line spacing to be considered a paragraph break.
-const float kParagraphLineSpacingRatio = 1.2f;
-
-// This class is used as part of our heuristic to determine which text runs live
-// on the same "line".  As we process runs, we keep a weighted average of the
-// top and bottom coordinates of the line, and if a new run falls within that
-// range (within a threshold) it is considered part of the line.
-class LineHelper {
- public:
-  explicit LineHelper(
-      const std::vector<chrome_pdf::AccessibilityTextRunInfo>& text_runs)
-      : text_runs_(text_runs) {
-    StartNewLine(0);
-  }
-
-  LineHelper(const LineHelper&) = delete;
-  LineHelper& operator=(const LineHelper&) = delete;
-
-  void StartNewLine(size_t current_index) {
-    DCHECK(current_index == 0 || current_index < text_runs_->size());
-    start_index_ = current_index;
-    accumulated_weight_top_ = 0.0f;
-    accumulated_weight_bottom_ = 0.0f;
-    accumulated_width_ = 0.0f;
-  }
-
-  void ProcessNextRun(size_t run_index) {
-    DCHECK_LT(run_index, text_runs_->size());
-    RemoveOldRunsUpTo(run_index);
-    AddRun((*text_runs_)[run_index].bounds);
-  }
-
-  bool IsRunOnSameLine(size_t run_index) const {
-    DCHECK_LT(run_index, text_runs_->size());
-
-    // Calculate new top/bottom bounds for our line.
-    if (accumulated_width_ == 0.0f) {
-      return false;
-    }
-
-    float line_top = accumulated_weight_top_ / accumulated_width_;
-    float line_bottom = accumulated_weight_bottom_ / accumulated_width_;
-
-    // Look at the next run, and determine how much it overlaps the line.
-    const auto& run_bounds = (*text_runs_)[run_index].bounds;
-    if (run_bounds.height() == 0.0f) {
-      return false;
-    }
-
-    float clamped_top = std::max(line_top, run_bounds.y());
-    float clamped_bottom =
-        std::min(line_bottom, run_bounds.y() + run_bounds.height());
-    if (clamped_bottom < clamped_top) {
-      return false;
-    }
-
-    float coverage = (clamped_bottom - clamped_top) / (run_bounds.height());
-
-    // See if it falls within the line (within our threshold).
-    constexpr float kLineCoverageThreshold = 0.25f;
-    return coverage > kLineCoverageThreshold;
-  }
-
- private:
-  void AddRun(const gfx::RectF& run_bounds) {
-    float run_width = fabsf(run_bounds.width());
-    accumulated_width_ += run_width;
-    accumulated_weight_top_ += run_bounds.y() * run_width;
-    accumulated_weight_bottom_ +=
-        (run_bounds.y() + run_bounds.height()) * run_width;
-  }
-
-  void RemoveRun(const gfx::RectF& run_bounds) {
-    float run_width = fabsf(run_bounds.width());
-    accumulated_width_ -= run_width;
-    accumulated_weight_top_ -= run_bounds.y() * run_width;
-    accumulated_weight_bottom_ -=
-        (run_bounds.y() + run_bounds.height()) * run_width;
-  }
-
-  void RemoveOldRunsUpTo(size_t stop_index) {
-    // Remove older runs from the weighted average if we've exceeded the
-    // threshold distance from them. We remove them to prevent e.g. drop-caps
-    // from unduly influencing future lines.
-    constexpr float kBoxRemoveWidthThreshold = 3.0f;
-    while (start_index_ < stop_index &&
-           accumulated_width_ > (*text_runs_)[start_index_].bounds.width() *
-                                    kBoxRemoveWidthThreshold) {
-      const auto& old_bounds = (*text_runs_)[start_index_].bounds;
-      RemoveRun(old_bounds);
-      start_index_++;
-    }
-  }
-
-  const raw_ref<const std::vector<chrome_pdf::AccessibilityTextRunInfo>>
-      text_runs_;
-  size_t start_index_;
-  float accumulated_weight_top_;
-  float accumulated_weight_bottom_;
-  float accumulated_width_;
-};
-
-bool BreakParagraph(
-    const std::vector<chrome_pdf::AccessibilityTextRunInfo>& text_runs,
-    uint32_t text_run_index,
-    float paragraph_spacing_threshold) {
-  // Check to see if its also a new paragraph, i.e., if the distance between
-  // lines is greater than the threshold.  If there's no threshold, that
-  // means there weren't enough lines to compute an accurate median, so
-  // we compare against the line size instead.
-  float line_spacing = fabsf(text_runs[text_run_index + 1].bounds.y() -
-                             text_runs[text_run_index].bounds.y());
-  return ((paragraph_spacing_threshold > 0 &&
-           line_spacing > paragraph_spacing_threshold) ||
-          (paragraph_spacing_threshold == 0 &&
-           line_spacing > kParagraphLineSpacingRatio *
-                              text_runs[text_run_index].bounds.height()));
-}
-
-void BuildStaticNode(ui::AXNodeData** static_text_node,
-                     std::string* static_text) {
-  // If we're in the middle of building a static text node, finish it before
-  // moving on to the next object.
-  if (*static_text_node) {
-    (*static_text_node)
-        ->AddStringAttribute(ax::mojom::StringAttribute::kName, (*static_text));
-    static_text->clear();
-  }
-  *static_text_node = nullptr;
-}
-
-void ComputeParagraphAndHeadingThresholds(
-    const std::vector<chrome_pdf::AccessibilityTextRunInfo>& text_runs,
-    float* out_heading_font_size_threshold,
-    float* out_paragraph_spacing_threshold) {
-  // Scan over the font sizes and line spacing within this page and
-  // set heuristic thresholds so that text larger than the median font
-  // size can be marked as a heading, and spacing larger than the median
-  // line spacing can be a paragraph break.
-  std::vector<float> font_sizes;
-  std::vector<float> line_spacings;
-  for (size_t i = 0; i < text_runs.size(); ++i) {
-    font_sizes.push_back(text_runs[i].style.font_size);
-    if (i > 0) {
-      const auto& cur = text_runs[i].bounds;
-      const auto& prev = text_runs[i - 1].bounds;
-      if (cur.y() > prev.y() + prev.height() / 2) {
-        line_spacings.push_back(cur.y() - prev.y());
-      }
-    }
-  }
-  if (font_sizes.size() > 2) {
-    std::sort(font_sizes.begin(), font_sizes.end());
-    float median_font_size = font_sizes[font_sizes.size() / 2];
-    if (median_font_size > kMinimumFontSize) {
-      *out_heading_font_size_threshold =
-          median_font_size * kHeadingFontSizeRatio;
-    }
-  }
-  if (line_spacings.size() > 4) {
-    std::sort(line_spacings.begin(), line_spacings.end());
-    float median_line_spacing = line_spacings[line_spacings.size() / 2];
-    if (median_line_spacing > kMinimumLineSpacing) {
-      *out_paragraph_spacing_threshold =
-          median_line_spacing * kParagraphLineSpacingRatio;
-    }
-  }
-}
-
-void ConnectPreviousAndNextOnLine(ui::AXNodeData* previous_on_line_node,
-                                  ui::AXNodeData* next_on_line_node) {
-  previous_on_line_node->AddIntAttribute(ax::mojom::IntAttribute::kNextOnLineId,
-                                         next_on_line_node->id);
-  next_on_line_node->AddIntAttribute(ax::mojom::IntAttribute::kPreviousOnLineId,
-                                     previous_on_line_node->id);
-}
-
 ax::mojom::Role GetRoleForButtonType(chrome_pdf::ButtonType button_type) {
   switch (button_type) {
     case chrome_pdf::ButtonType::kRadioButton:
@@ -253,22 +63,6 @@
   return char_offsets;
 }
 
-template <typename T>
-bool IsObjectInTextRun(const std::vector<T>& objects,
-                       uint32_t object_index,
-                       size_t text_run_index) {
-  return (object_index < objects.size() &&
-          objects[object_index].text_run_index <= text_run_index);
-}
-
-template <typename T>
-bool IsObjectWithRangeInTextRun(const std::vector<T>& objects,
-                                uint32_t object_index,
-                                size_t text_run_index) {
-  return (object_index < objects.size() &&
-          objects[object_index].text_range.index <= text_run_index);
-}
-
 bool IsTextRenderModeFill(const chrome_pdf::AccessibilityTextRenderMode& mode) {
   switch (mode) {
     case chrome_pdf::AccessibilityTextRenderMode::kFill:
@@ -294,85 +88,6 @@
   }
 }
 
-size_t NormalizeTextRunIndex(uint32_t object_end_text_run_index,
-                             size_t current_text_run_index) {
-  return std::max<size_t>(
-      object_end_text_run_index,
-      current_text_run_index ? current_text_run_index - 1 : 0);
-}
-
-// Please keep the below map as close as possible to the list defined in the PDF
-// Specification, ISO 32000-1:2008, table 333.
-ax::mojom::Role StructureElementTypeToAccessibilityRole(
-    const std::string& element_type) {
-  static constexpr auto kStructureElementTypeToAccessibilityRoleMap =
-      base::MakeFixedFlatMap<std::string_view, ax::mojom::Role>(
-          {{"Document", ax::mojom::Role::kDocument},
-           {"Part", ax::mojom::Role::kDocPart},
-           {"Art", ax::mojom::Role::kArticle},
-           {"Sect", ax::mojom::Role::kSection},
-           {"Div", ax::mojom::Role::kGenericContainer},
-           {"BlockQuote", ax::mojom::Role::kBlockquote},
-           {"Caption", ax::mojom::Role::kCaption},
-           {"TOC", ax::mojom::Role::kDocToc},
-           {"TOCI", ax::mojom::Role::kListItem},
-           {"Index", ax::mojom::Role::kDocIndex},
-           {"P", ax::mojom::Role::kParagraph},
-           {"H", ax::mojom::Role::kHeading},
-           {"H1", ax::mojom::Role::kHeading},
-           {"H2", ax::mojom::Role::kHeading},
-           {"H3", ax::mojom::Role::kHeading},
-           {"H4", ax::mojom::Role::kHeading},
-           {"H5", ax::mojom::Role::kHeading},
-           {"H6", ax::mojom::Role::kHeading},
-           {"L", ax::mojom::Role::kList},
-           {"LI", ax::mojom::Role::kListItem},
-           {"Lbl", ax::mojom::Role::kListMarker},
-           {"LBody", ax::mojom::Role::kNone},  // Presentational.
-           {"Table", ax::mojom::Role::kTable},
-           {"TR", ax::mojom::Role::kRow},
-           {"TH", ax::mojom::Role::kRowHeader},
-           {"THead", ax::mojom::Role::kRowGroup},
-           {"TBody", ax::mojom::Role::kRowGroup},
-           {"TFoot", ax::mojom::Role::kRowGroup},
-           {"TD", ax::mojom::Role::kCell},
-           {"Span", ax::mojom::Role::kStaticText},
-           {"Link", ax::mojom::Role::kLink},
-           {"Figure", ax::mojom::Role::kFigure},
-           {"Formula", ax::mojom::Role::kMath},
-           {"Form", ax::mojom::Role::kForm}});
-
-  if (auto iter =
-          kStructureElementTypeToAccessibilityRoleMap.find(element_type);
-      iter != kStructureElementTypeToAccessibilityRoleMap.end()) {
-    return iter->second;
-  }
-  // Return something that could at least make some sense, other than
-  // `kUnknown`.
-  return ax::mojom::Role::kParagraph;
-}
-
-std::optional<uint32_t> StructureElementTypeToHeadingLevel(
-    const std::string& element_type) {
-  if (StructureElementTypeToAccessibilityRole(element_type) ==
-      ax::mojom::Role::kHeading) {
-    if (element_type == "H" || element_type == "H1") {
-      return 1;
-    } else if (element_type == "H2") {
-      return 2;
-    } else if (element_type == "H3") {
-      return 3;
-    } else if (element_type == "H4") {
-      return 4;
-    } else if (element_type == "H5") {
-      return 5;
-    } else if (element_type == "H6") {
-      return 6;
-    }
-  }
-  return std::nullopt;
-}
-
 }  // namespace
 
 namespace pdf {
@@ -432,174 +147,9 @@
 PdfAccessibilityTreeBuilder::~PdfAccessibilityTreeBuilder() = default;
 
 void PdfAccessibilityTreeBuilder::BuildPageTree() {
-  ComputeParagraphAndHeadingThresholds(*text_runs_,
-                                       &heading_font_size_threshold_,
-                                       &paragraph_spacing_threshold_);
-
-  ui::AXNodeData* block_node = nullptr;
-  ui::AXNodeData* static_text_node = nullptr;
-  ui::AXNodeData* previous_on_line_node = nullptr;
-  std::string static_text;
-  LineHelper line_helper(*text_runs_);
-  bool pdf_forms_enabled =
-      base::FeatureList::IsEnabled(chrome_pdf::features::kAccessiblePDFForm);
-#if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
-  bool ocr_block = false;
-  bool has_ocr_text = false;
-#endif
-
-  for (size_t text_run_index = 0; text_run_index < text_runs_->size();
-       ++text_run_index) {
-    const chrome_pdf::AccessibilityTextRunInfo& text_run =
-        (*text_runs_)[text_run_index];
-
-#if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
-    // OCR text should be marked by nodes before and after it.
-    bool ocr_block_start = text_run.is_searchified && !ocr_block;
-    bool ocr_block_end = !text_run.is_searchified && ocr_block;
-    if (ocr_block_start || ocr_block_end) {
-      // If already inside a block, end it.
-      // PDF searchifier only processes pages that have no text, hence OCR text
-      // is never added in the middle of a paragraph.
-      if (block_node) {
-        BuildStaticNode(&static_text_node, &static_text);
-        block_node = nullptr;
-      }
-      CHECK(ocr_block_start || text_run_index);
-      gfx::PointF position =
-          ocr_block_start
-              ? text_run.bounds.origin()
-              : (*text_runs_)[text_run_index - 1].bounds.bottom_right();
-      page_node_->child_ids.push_back(
-          CreateOcrWrapperNode(position, ocr_block_start)->id);
-      ocr_block = ocr_block_start;
-      has_ocr_text = true;
-    }
-#endif  // BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
-    // If we don't have a block level node, create one.
-    if (!block_node) {
-      block_node =
-          CreateBlockLevelNode(text_run.tag_type, text_run.style.font_size);
-      page_node_->child_ids.push_back(block_node->id);
-    }
-
-    // If the `text_run_index` is less than or equal to the link's
-    // `text_run_index`, then push the link node in the block.
-    if (IsObjectWithRangeInTextRun(*links_, current_link_index_,
-                                   text_run_index)) {
-      BuildStaticNode(&static_text_node, &static_text);
-      const chrome_pdf::AccessibilityLinkInfo& link =
-          (*links_)[current_link_index_++];
-      AddLinkToParaNode(link, block_node, &previous_on_line_node,
-                        &text_run_index);
-
-      if (link.text_range.count == 0) {
-        continue;
-      }
-
-    } else if (IsObjectInTextRun(*images_, current_image_index_,
-                                 text_run_index)) {
-      BuildStaticNode(&static_text_node, &static_text);
-      AddImageToParaNode((*images_)[current_image_index_++], block_node,
-                         &text_run_index);
-      continue;
-    } else if (IsObjectWithRangeInTextRun(
-                   *highlights_, current_highlight_index_, text_run_index)) {
-      BuildStaticNode(&static_text_node, &static_text);
-      AddHighlightToParaNode((*highlights_)[current_highlight_index_++],
-                             block_node, &previous_on_line_node,
-                             &text_run_index);
-    } else if (IsObjectInTextRun(*text_fields_, current_text_field_index_,
-                                 text_run_index) &&
-               pdf_forms_enabled) {
-      BuildStaticNode(&static_text_node, &static_text);
-      AddTextFieldToParaNode((*text_fields_)[current_text_field_index_++],
-                             block_node, &text_run_index);
-      continue;
-    } else if (IsObjectInTextRun(*buttons_, current_button_index_,
-                                 text_run_index) &&
-               pdf_forms_enabled) {
-      BuildStaticNode(&static_text_node, &static_text);
-      AddButtonToParaNode((*buttons_)[current_button_index_++], block_node,
-                          &text_run_index);
-      continue;
-    } else if (IsObjectInTextRun(*choice_fields_, current_choice_field_index_,
-                                 text_run_index) &&
-               pdf_forms_enabled) {
-      BuildStaticNode(&static_text_node, &static_text);
-      AddChoiceFieldToParaNode((*choice_fields_)[current_choice_field_index_++],
-                               block_node, &text_run_index);
-      continue;
-    } else {
-      chrome_pdf::PageCharacterIndex page_char_index = {
-          page_index_, text_run_start_indices_[text_run_index]};
-
-      // This node is for the text inside the block, it includes the text of all
-      // of the text runs.
-      if (!static_text_node) {
-        static_text_node = CreateStaticTextNode(page_char_index);
-        block_node->child_ids.push_back(static_text_node->id);
-      }
-
-      // Add this text run to the current static text node.
-      ui::AXNodeData* inline_text_box_node =
-          CreateInlineTextBoxNode(text_run, page_char_index);
-      static_text_node->child_ids.push_back(inline_text_box_node->id);
-
-      static_text += inline_text_box_node->GetStringAttribute(
-          ax::mojom::StringAttribute::kName);
-
-      block_node->relative_bounds.bounds.Union(
-          inline_text_box_node->relative_bounds.bounds);
-      static_text_node->relative_bounds.bounds.Union(
-          inline_text_box_node->relative_bounds.bounds);
-
-      if (previous_on_line_node) {
-        ConnectPreviousAndNextOnLine(previous_on_line_node,
-                                     inline_text_box_node);
-      } else {
-        line_helper.StartNewLine(text_run_index);
-      }
-      line_helper.ProcessNextRun(text_run_index);
-
-      if (text_run_index < text_runs_->size() - 1) {
-        if (line_helper.IsRunOnSameLine(text_run_index + 1)) {
-          // The next run is on the same line.
-          previous_on_line_node = inline_text_box_node;
-        } else {
-          // The next run is on a new line.
-          previous_on_line_node = nullptr;
-        }
-      }
-    }
-
-    if (text_run_index == text_runs_->size() - 1) {
-      BuildStaticNode(&static_text_node, &static_text);
-      break;
-    }
-
-    if (!previous_on_line_node) {
-      if (BreakParagraph(*text_runs_, text_run_index,
-                         paragraph_spacing_threshold_)) {
-        BuildStaticNode(&static_text_node, &static_text);
-        block_node = nullptr;
-      }
-    }
-  }
-
-#if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
-  // Add the wrapper node if still in OCR block and text runs finish.
-  if (ocr_block) {
-    page_node_->child_ids.push_back(
-        CreateOcrWrapperNode(text_runs_->back().bounds.bottom_right(),
-                             /*start=*/false)
-            ->id);
-  }
-
-  AddRemainingAnnotations(block_node, has_ocr_text);
-#else
-  AddRemainingAnnotations(block_node);
-#endif
+  // Build tree using heuristics.
+  // TODO(crbug.com/40707542): Add structure tree mode for tagged PDFs.
+  PdfAccessibilityTreeBuilderHeuristic(*this).BuildPageTree();
 }
 
 void PdfAccessibilityTreeBuilder::AddWordStartsAndEnds(
@@ -644,33 +194,6 @@
   return node_ptr;
 }
 
-ui::AXNodeData* PdfAccessibilityTreeBuilder::CreateBlockLevelNode(
-    const std::string& text_run_type,
-    float font_size) {
-  ui::AXNodeData* block_node = CreateAndAppendNode(
-      StructureElementTypeToAccessibilityRole(text_run_type),
-      ax::mojom::Restriction::kReadOnly);
-  block_node->AddBoolAttribute(ax::mojom::BoolAttribute::kIsLineBreakingObject,
-                               true);
-  if (std::optional<uint32_t> level =
-          StructureElementTypeToHeadingLevel(text_run_type);
-      level) {
-    block_node->AddIntAttribute(ax::mojom::IntAttribute::kHierarchicalLevel,
-                                *level);
-    // TODO(crbug.com/40707542): Set the HTML tag to "h*" by creating a helper
-    // in `AXEnumUtils`.
-  }
-
-  if (mark_headings_using_heuristic_ && heading_font_size_threshold_ > 0 &&
-      font_size > heading_font_size_threshold_) {
-    block_node->role = ax::mojom::Role::kHeading;
-    block_node->AddIntAttribute(ax::mojom::IntAttribute::kHierarchicalLevel, 2);
-    block_node->AddStringAttribute(ax::mojom::StringAttribute::kHtmlTag, "h2");
-  }
-
-  return block_node;
-}
-
 ui::AXNodeData* PdfAccessibilityTreeBuilder::CreateStaticTextNode() {
   ui::AXNodeData* static_text_node = CreateAndAppendNode(
       ax::mojom::Role::kStaticText, ax::mojom::Restriction::kReadOnly);
@@ -996,256 +519,4 @@
 }
 #endif  // BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
 
-void PdfAccessibilityTreeBuilder::AddTextToAXNode(
-    size_t start_text_run_index,
-    uint32_t end_text_run_index,
-    ui::AXNodeData* ax_node,
-    ui::AXNodeData** previous_on_line_node) {
-  chrome_pdf::PageCharacterIndex page_char_index = {
-      page_index_, text_run_start_indices_[start_text_run_index]};
-  ui::AXNodeData* ax_static_text_node = CreateStaticTextNode(page_char_index);
-  ax_node->child_ids.push_back(ax_static_text_node->id);
-  // Accumulate the text of the node.
-  std::string ax_name;
-  LineHelper line_helper(*text_runs_);
-
-  for (size_t text_run_index = start_text_run_index;
-       text_run_index <= end_text_run_index; ++text_run_index) {
-    const chrome_pdf::AccessibilityTextRunInfo& text_run =
-        (*text_runs_)[text_run_index];
-    page_char_index.char_index = text_run_start_indices_[text_run_index];
-    // Add this text run to the current static text node.
-    ui::AXNodeData* inline_text_box_node =
-        CreateInlineTextBoxNode(text_run, page_char_index);
-    ax_static_text_node->child_ids.push_back(inline_text_box_node->id);
-
-    ax_static_text_node->relative_bounds.bounds.Union(
-        inline_text_box_node->relative_bounds.bounds);
-    ax_name += inline_text_box_node->GetStringAttribute(
-        ax::mojom::StringAttribute::kName);
-
-    if (*previous_on_line_node) {
-      ConnectPreviousAndNextOnLine(*previous_on_line_node,
-                                   inline_text_box_node);
-    } else {
-      line_helper.StartNewLine(text_run_index);
-    }
-    line_helper.ProcessNextRun(text_run_index);
-
-    if (text_run_index < text_runs_->size() - 1) {
-      if (line_helper.IsRunOnSameLine(text_run_index + 1)) {
-        // The next run is on the same line.
-        *previous_on_line_node = inline_text_box_node;
-      } else {
-        // The next run is on a new line.
-        *previous_on_line_node = nullptr;
-      }
-    }
-  }
-
-  ax_node->AddStringAttribute(ax::mojom::StringAttribute::kName, ax_name);
-  ax_static_text_node->AddStringAttribute(ax::mojom::StringAttribute::kName,
-                                          ax_name);
-}
-
-void PdfAccessibilityTreeBuilder::AddTextToObjectNode(
-    size_t object_text_run_index,
-    uint32_t object_text_run_count,
-    ui::AXNodeData* object_node,
-    ui::AXNodeData* para_node,
-    ui::AXNodeData** previous_on_line_node,
-    size_t* text_run_index) {
-  // Annotation objects can overlap in PDF. There can be two overlapping
-  // scenarios: Partial overlap and Complete overlap.
-  // Partial overlap
-  //
-  // Link A starts      Link B starts     Link A ends            Link B ends
-  //      |a1                |b1               |a2                    |b2
-  // -----------------------------------------------------------------------
-  //                                    Text
-  //
-  // Complete overlap
-  // Link A starts      Link B starts     Link B ends            Link A ends
-  //      |a1                |b1               |b2                    |a2
-  // -----------------------------------------------------------------------
-  //                                    Text
-  //
-  // For overlapping annotations, both annotations would store the full
-  // text data and nothing will get truncated. For partial overlap, link `A`
-  // would contain text between a1 and a2 while link `B` would contain text
-  // between b1 and b2. For complete overlap as well, link `A` would contain
-  // text between a1 and a2 and link `B` would contain text between b1 and
-  // b2. The links would appear in the tree in the order of which they are
-  // present. In the tree for both overlapping scenarios, link `A` would
-  // appear first in the tree and link `B` after it.
-
-  // If `object_text_run_count` > 0, then the object is part of the page text.
-  // Make the text runs contained by the object children of the object node.
-  size_t end_text_run_index = object_text_run_index + object_text_run_count;
-  uint32_t object_end_text_run_index =
-      std::min(end_text_run_index, text_runs_->size()) - 1;
-  AddTextToAXNode(object_text_run_index, object_end_text_run_index, object_node,
-                  previous_on_line_node);
-
-  para_node->relative_bounds.bounds.Union(object_node->relative_bounds.bounds);
-
-  *text_run_index =
-      NormalizeTextRunIndex(object_end_text_run_index, *text_run_index);
-}
-
-void PdfAccessibilityTreeBuilder::AddLinkToParaNode(
-    const chrome_pdf::AccessibilityLinkInfo& link,
-    ui::AXNodeData* para_node,
-    ui::AXNodeData** previous_on_line_node,
-    size_t* text_run_index) {
-  ui::AXNodeData* link_node = CreateLinkNode(link);
-  para_node->child_ids.push_back(link_node->id);
-
-  // If `link.text_range.count` == 0, then the link is not part of the page
-  // text. Push it ahead of the current text run.
-  if (link.text_range.count == 0) {
-    --(*text_run_index);
-    return;
-  }
-
-  // Make the text runs contained by the link children of
-  // the link node.
-  AddTextToObjectNode(link.text_range.index, link.text_range.count, link_node,
-                      para_node, previous_on_line_node, text_run_index);
-}
-
-void PdfAccessibilityTreeBuilder::AddImageToParaNode(
-    const chrome_pdf::AccessibilityImageInfo& image,
-    ui::AXNodeData* para_node,
-    size_t* text_run_index) {
-  // If the `text_run_index` is less than or equal to the image's text run
-  // index, then push the image ahead of the current text run.
-  ui::AXNodeData* image_node = CreateImageNode(image);
-  para_node->child_ids.push_back(image_node->id);
-  --(*text_run_index);
-}
-
-void PdfAccessibilityTreeBuilder::AddHighlightToParaNode(
-    const chrome_pdf::AccessibilityHighlightInfo& highlight,
-    ui::AXNodeData* para_node,
-    ui::AXNodeData** previous_on_line_node,
-    size_t* text_run_index) {
-  ui::AXNodeData* highlight_node = CreateHighlightNode(highlight);
-  para_node->child_ids.push_back(highlight_node->id);
-
-  // Make the text runs contained by the highlight children of
-  // the highlight node.
-  AddTextToObjectNode(highlight.text_range.index, highlight.text_range.count,
-                      highlight_node, para_node, previous_on_line_node,
-                      text_run_index);
-
-  if (!highlight.note_text.empty()) {
-    ui::AXNodeData* popup_note_node = CreatePopupNoteNode(highlight);
-    highlight_node->child_ids.push_back(popup_note_node->id);
-  }
-}
-
-void PdfAccessibilityTreeBuilder::AddTextFieldToParaNode(
-    const chrome_pdf::AccessibilityTextFieldInfo& text_field,
-    ui::AXNodeData* para_node,
-    size_t* text_run_index) {
-  // If the `text_run_index` is less than or equal to the text_field's text
-  // run index, then push the text_field ahead of the current text run.
-  ui::AXNodeData* text_field_node = CreateTextFieldNode(text_field);
-  para_node->child_ids.push_back(text_field_node->id);
-  --(*text_run_index);
-}
-
-void PdfAccessibilityTreeBuilder::AddButtonToParaNode(
-    const chrome_pdf::AccessibilityButtonInfo& button,
-    ui::AXNodeData* para_node,
-    size_t* text_run_index) {
-  // If the `text_run_index` is less than or equal to the button's text
-  // run index, then push the button ahead of the current text run.
-  ui::AXNodeData* button_node = CreateButtonNode(button);
-  para_node->child_ids.push_back(button_node->id);
-  --(*text_run_index);
-}
-
-void PdfAccessibilityTreeBuilder::AddChoiceFieldToParaNode(
-    const chrome_pdf::AccessibilityChoiceFieldInfo& choice_field,
-    ui::AXNodeData* para_node,
-    size_t* text_run_index) {
-  // If the `text_run_index` is less than or equal to the choice_field's text
-  // run index, then push the choice_field ahead of the current text run.
-  ui::AXNodeData* choice_field_node = CreateChoiceFieldNode(choice_field);
-  para_node->child_ids.push_back(choice_field_node->id);
-  --(*text_run_index);
-}
-
-void PdfAccessibilityTreeBuilder::AddRemainingAnnotations(
-    ui::AXNodeData* para_node
-#if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
-    ,
-    bool ocr_applied
-#endif
-) {
-  // If we don't have additional links, images or form fields to insert in the
-  // tree, then return.
-  if (current_link_index_ >= links_->size() &&
-      current_image_index_ >= images_->size() &&
-      current_text_field_index_ >= text_fields_->size() &&
-      current_button_index_ >= buttons_->size() &&
-      current_choice_field_index_ >= choice_fields_->size()) {
-    return;
-  }
-
-  // If we don't have a paragraph node, create a new one.
-  if (!para_node) {
-    para_node = CreateAndAppendNode(ax::mojom::Role::kParagraph,
-                                    ax::mojom::Restriction::kReadOnly);
-    page_node_->child_ids.push_back(para_node->id);
-  }
-  // Push all the links not anchored to any text run to the last paragraph.
-  for (size_t i = current_link_index_; i < links_->size(); i++) {
-    ui::AXNodeData* link_node = CreateLinkNode((*links_)[i]);
-    para_node->child_ids.push_back(link_node->id);
-  }
-
-  // Push all the images not anchored to any text run to the last paragraph
-  // unless OCR has run. PDF Searchify either OCRs all images on a page, or none
-  // of them.
-  bool push_remaining_images = true;
-#if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
-  push_remaining_images = !ocr_applied;
-#endif
-  if (push_remaining_images) {
-    for (size_t i = current_image_index_; i < images_->size(); i++) {
-      const chrome_pdf::AccessibilityImageInfo& image_info = (*images_)[i];
-      ui::AXNodeData* image_node = CreateImageNode(image_info);
-      para_node->child_ids.push_back(image_node->id);
-    }
-  }
-
-  if (base::FeatureList::IsEnabled(chrome_pdf::features::kAccessiblePDFForm)) {
-    // Push all the text fields not anchored to any text run to the last
-    // paragraph.
-    for (size_t i = current_text_field_index_; i < text_fields_->size(); i++) {
-      ui::AXNodeData* text_field_node = CreateTextFieldNode((*text_fields_)[i]);
-      para_node->child_ids.push_back(text_field_node->id);
-    }
-
-    // Push all the buttons not anchored to any text run to the last
-    // paragraph.
-    for (size_t i = current_button_index_; i < buttons_->size(); i++) {
-      ui::AXNodeData* button_node = CreateButtonNode((*buttons_)[i]);
-      para_node->child_ids.push_back(button_node->id);
-    }
-
-    // Push all the choice fields not anchored to any text run to the last
-    // paragraph.
-    for (size_t i = current_choice_field_index_; i < choice_fields_->size();
-         i++) {
-      ui::AXNodeData* choice_field_node =
-          CreateChoiceFieldNode((*choice_fields_)[i]);
-      para_node->child_ids.push_back(choice_field_node->id);
-    }
-  }
-}
-
 }  // namespace pdf
diff --git a/components/pdf/renderer/pdf_accessibility_tree_builder.h b/components/pdf/renderer/pdf_accessibility_tree_builder.h
index 32b8256..881c02e 100644
--- a/components/pdf/renderer/pdf_accessibility_tree_builder.h
+++ b/components/pdf/renderer/pdf_accessibility_tree_builder.h
@@ -13,7 +13,6 @@
 #include "components/pdf/renderer/pdf_accessibility_tree.h"
 #include "pdf/accessibility_structs.h"
 #include "pdf/page_character_index.h"
-#include "services/screen_ai/buildflags/buildflags.h"
 #include "third_party/blink/public/web/web_ax_object.h"
 #include "ui/accessibility/ax_enums.mojom-shared.h"
 
@@ -53,11 +52,11 @@
   void BuildPageTree();
 
  private:
+  friend class PdfAccessibilityTreeBuilderHeuristic;
+
   void AddWordStartsAndEnds(ui::AXNodeData* inline_text_box);
   ui::AXNodeData* CreateAndAppendNode(ax::mojom::Role role,
                                       ax::mojom::Restriction restriction);
-  ui::AXNodeData* CreateBlockLevelNode(const std::string& text_run_type,
-                                       float font_size);
   ui::AXNodeData* CreateStaticTextNode();
   ui::AXNodeData* CreateStaticTextNode(
       const chrome_pdf::PageCharacterIndex& page_char_index);
@@ -91,45 +90,6 @@
 #if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
   ui::AXNodeData* CreateOcrWrapperNode(const gfx::PointF& position, bool start);
 #endif
-  void AddTextToAXNode(size_t start_text_run_index,
-                       uint32_t end_text_run_index,
-                       ui::AXNodeData* ax_node,
-                       ui::AXNodeData** previous_on_line_node);
-  void AddTextToObjectNode(size_t object_text_run_index,
-                           uint32_t object_text_run_count,
-                           ui::AXNodeData* object_node,
-                           ui::AXNodeData* para_node,
-                           ui::AXNodeData** previous_on_line_node,
-                           size_t* text_run_index);
-  void AddLinkToParaNode(const chrome_pdf::AccessibilityLinkInfo& link,
-                         ui::AXNodeData* para_node,
-                         ui::AXNodeData** previous_on_line_node,
-                         size_t* text_run_index);
-  void AddImageToParaNode(const chrome_pdf::AccessibilityImageInfo& image,
-                          ui::AXNodeData* para_node,
-                          size_t* text_run_index);
-  void AddHighlightToParaNode(
-      const chrome_pdf::AccessibilityHighlightInfo& highlight,
-      ui::AXNodeData* para_node,
-      ui::AXNodeData** previous_on_line_node,
-      size_t* text_run_index);
-  void AddTextFieldToParaNode(
-      const chrome_pdf::AccessibilityTextFieldInfo& text_field,
-      ui::AXNodeData* para_node,
-      size_t* text_run_index);
-  void AddButtonToParaNode(const chrome_pdf::AccessibilityButtonInfo& button,
-                           ui::AXNodeData* para_node,
-                           size_t* text_run_index);
-  void AddChoiceFieldToParaNode(
-      const chrome_pdf::AccessibilityChoiceFieldInfo& choice_field,
-      ui::AXNodeData* para_node,
-      size_t* text_run_index);
-  void AddRemainingAnnotations(ui::AXNodeData* para_node
-#if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
-                               ,
-                               bool ocr_applied
-#endif
-  );
 
   const bool mark_headings_using_heuristic_;
   std::vector<uint32_t> text_run_start_indices_;
@@ -137,21 +97,16 @@
       text_runs_;
   const raw_ref<const std::vector<chrome_pdf::AccessibilityCharInfo>> chars_;
   const raw_ref<const std::vector<chrome_pdf::AccessibilityLinkInfo>> links_;
-  uint32_t current_link_index_ = 0;
   const raw_ref<const std::vector<chrome_pdf::AccessibilityImageInfo>> images_;
-  uint32_t current_image_index_ = 0;
   const raw_ref<const std::vector<chrome_pdf::AccessibilityHighlightInfo>>
       highlights_;
-  uint32_t current_highlight_index_ = 0;
   const raw_ref<const std::vector<chrome_pdf::AccessibilityTextFieldInfo>>
       text_fields_;
-  uint32_t current_text_field_index_ = 0;
   const raw_ref<const std::vector<chrome_pdf::AccessibilityButtonInfo>>
       buttons_;
-  uint32_t current_button_index_ = 0;
   const raw_ref<const std::vector<chrome_pdf::AccessibilityChoiceFieldInfo>>
       choice_fields_;
-  uint32_t current_choice_field_index_ = 0;
+
   uint32_t page_index_;
   raw_ptr<ui::AXNodeData> root_node_;
   raw_ptr<ui::AXNodeData> page_node_;
@@ -161,8 +116,6 @@
       node_id_to_page_char_index_;
   raw_ptr<std::map<int32_t, PdfAccessibilityTree::AnnotationInfo>>
       node_id_to_annotation_info_;
-  float heading_font_size_threshold_ = 0;
-  float paragraph_spacing_threshold_ = 0;
 };
 
 }  // namespace pdf
diff --git a/components/pdf/renderer/pdf_accessibility_tree_builder_heuristic.cc b/components/pdf/renderer/pdf_accessibility_tree_builder_heuristic.cc
new file mode 100644
index 0000000..db71f0a
--- /dev/null
+++ b/components/pdf/renderer/pdf_accessibility_tree_builder_heuristic.cc
@@ -0,0 +1,788 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/pdf/renderer/pdf_accessibility_tree_builder_heuristic.h"
+
+#include <algorithm>
+#include <cmath>
+#include <optional>
+#include <string>
+#include <vector>
+
+#include "base/check.h"
+#include "base/check_op.h"
+#include "base/containers/fixed_flat_map.h"
+#include "base/feature_list.h"
+#include "base/memory/raw_ref.h"
+#include "components/pdf/renderer/pdf_accessibility_tree_builder.h"
+#include "pdf/accessibility_structs.h"
+#include "pdf/pdf_features.h"
+#include "ui/accessibility/ax_enums.mojom-shared.h"
+#include "ui/accessibility/ax_node_data.h"
+#include "ui/gfx/geometry/point_f.h"
+#include "ui/gfx/geometry/rect_f.h"
+
+namespace {
+
+// Don't try to apply font size thresholds to automatically identify headings
+// if the median font size is not at least this many points.
+constexpr float kMinimumFontSize = 5.0f;
+
+// Don't try to apply paragraph break thresholds to automatically identify
+// paragraph breaks if the median line break is not at least this many points.
+constexpr float kMinimumLineSpacing = 5.0f;
+
+// Ratio between the font size of one text run and the median on the page
+// for that text run to be considered to be a heading instead of normal text.
+constexpr float kHeadingFontSizeRatio = 1.2f;
+
+// Ratio between the line spacing between two lines and the median on the
+// page for that line spacing to be considered a paragraph break.
+constexpr float kParagraphLineSpacingRatio = 1.2f;
+
+// This class is used as part of our heuristic to determine which text runs live
+// on the same "line".  As we process runs, we keep a weighted average of the
+// top and bottom coordinates of the line, and if a new run falls within that
+// range (within a threshold) it is considered part of the line.
+class LineHelper {
+ public:
+  explicit LineHelper(
+      const std::vector<chrome_pdf::AccessibilityTextRunInfo>& text_runs)
+      : text_runs_(text_runs) {
+    StartNewLine(0);
+  }
+
+  LineHelper(const LineHelper&) = delete;
+  LineHelper& operator=(const LineHelper&) = delete;
+
+  void StartNewLine(size_t current_index) {
+    DCHECK(current_index == 0 || current_index < text_runs_->size());
+    start_index_ = current_index;
+    accumulated_weight_top_ = 0.0f;
+    accumulated_weight_bottom_ = 0.0f;
+    accumulated_width_ = 0.0f;
+  }
+
+  void ProcessNextRun(size_t run_index) {
+    DCHECK_LT(run_index, text_runs_->size());
+    RemoveOldRunsUpTo(run_index);
+    AddRun((*text_runs_)[run_index].bounds);
+  }
+
+  bool IsRunOnSameLine(size_t run_index) const {
+    DCHECK_LT(run_index, text_runs_->size());
+
+    // Calculate new top/bottom bounds for our line.
+    if (accumulated_width_ == 0.0f) {
+      return false;
+    }
+
+    float line_top = accumulated_weight_top_ / accumulated_width_;
+    float line_bottom = accumulated_weight_bottom_ / accumulated_width_;
+
+    // Look at the next run, and determine how much it overlaps the line.
+    const auto& run_bounds = (*text_runs_)[run_index].bounds;
+    if (run_bounds.height() == 0.0f) {
+      return false;
+    }
+
+    float clamped_top = std::max(line_top, run_bounds.y());
+    float clamped_bottom =
+        std::min(line_bottom, run_bounds.y() + run_bounds.height());
+    if (clamped_bottom < clamped_top) {
+      return false;
+    }
+
+    float coverage = (clamped_bottom - clamped_top) / (run_bounds.height());
+
+    // See if it falls within the line (within our threshold).
+    constexpr float kLineCoverageThreshold = 0.25f;
+    return coverage > kLineCoverageThreshold;
+  }
+
+ private:
+  void AddRun(const gfx::RectF& run_bounds) {
+    float run_width = fabsf(run_bounds.width());
+    accumulated_width_ += run_width;
+    accumulated_weight_top_ += run_bounds.y() * run_width;
+    accumulated_weight_bottom_ +=
+        (run_bounds.y() + run_bounds.height()) * run_width;
+  }
+
+  void RemoveRun(const gfx::RectF& run_bounds) {
+    float run_width = fabsf(run_bounds.width());
+    accumulated_width_ -= run_width;
+    accumulated_weight_top_ -= run_bounds.y() * run_width;
+    accumulated_weight_bottom_ -=
+        (run_bounds.y() + run_bounds.height()) * run_width;
+  }
+
+  void RemoveOldRunsUpTo(size_t stop_index) {
+    // Remove older runs from the weighted average if we've exceeded the
+    // threshold distance from them. We remove them to prevent e.g. drop-caps
+    // from unduly influencing future lines.
+    constexpr float kBoxRemoveWidthThreshold = 3.0f;
+    while (start_index_ < stop_index &&
+           accumulated_width_ > (*text_runs_)[start_index_].bounds.width() *
+                                    kBoxRemoveWidthThreshold) {
+      const auto& old_bounds = (*text_runs_)[start_index_].bounds;
+      RemoveRun(old_bounds);
+      start_index_++;
+    }
+  }
+
+  const raw_ref<const std::vector<chrome_pdf::AccessibilityTextRunInfo>>
+      text_runs_;
+  size_t start_index_;
+  float accumulated_weight_top_;
+  float accumulated_weight_bottom_;
+  float accumulated_width_;
+};
+
+// Please keep the below map as close as possible to the list defined in the PDF
+// Specification, ISO 32000-1:2008, table 333.
+ax::mojom::Role StructureElementTypeToAccessibilityRole(
+    const std::string& element_type) {
+  static constexpr auto kStructureElementTypeToAccessibilityRoleMap =
+      base::MakeFixedFlatMap<std::string_view, ax::mojom::Role>(
+          {{"Document", ax::mojom::Role::kDocument},
+           {"Part", ax::mojom::Role::kDocPart},
+           {"Art", ax::mojom::Role::kArticle},
+           {"Sect", ax::mojom::Role::kSection},
+           {"Div", ax::mojom::Role::kGenericContainer},
+           {"BlockQuote", ax::mojom::Role::kBlockquote},
+           {"Caption", ax::mojom::Role::kCaption},
+           {"TOC", ax::mojom::Role::kDocToc},
+           {"TOCI", ax::mojom::Role::kListItem},
+           {"Index", ax::mojom::Role::kDocIndex},
+           {"P", ax::mojom::Role::kParagraph},
+           {"H", ax::mojom::Role::kHeading},
+           {"H1", ax::mojom::Role::kHeading},
+           {"H2", ax::mojom::Role::kHeading},
+           {"H3", ax::mojom::Role::kHeading},
+           {"H4", ax::mojom::Role::kHeading},
+           {"H5", ax::mojom::Role::kHeading},
+           {"H6", ax::mojom::Role::kHeading},
+           {"L", ax::mojom::Role::kList},
+           {"LI", ax::mojom::Role::kListItem},
+           {"Lbl", ax::mojom::Role::kListMarker},
+           {"LBody", ax::mojom::Role::kNone},  // Presentational.
+           {"Table", ax::mojom::Role::kTable},
+           {"TR", ax::mojom::Role::kRow},
+           {"TH", ax::mojom::Role::kRowHeader},
+           {"THead", ax::mojom::Role::kRowGroup},
+           {"TBody", ax::mojom::Role::kRowGroup},
+           {"TFoot", ax::mojom::Role::kRowGroup},
+           {"TD", ax::mojom::Role::kCell},
+           {"Span", ax::mojom::Role::kStaticText},
+           {"Link", ax::mojom::Role::kLink},
+           {"Figure", ax::mojom::Role::kFigure},
+           {"Formula", ax::mojom::Role::kMath},
+           {"Form", ax::mojom::Role::kForm}});
+
+  if (auto iter =
+          kStructureElementTypeToAccessibilityRoleMap.find(element_type);
+      iter != kStructureElementTypeToAccessibilityRoleMap.end()) {
+    return iter->second;
+  }
+  // Return something that could at least make some sense, other than
+  // `kUnknown`.
+  return ax::mojom::Role::kParagraph;
+}
+
+std::optional<uint32_t> StructureElementTypeToHeadingLevel(
+    const std::string& element_type) {
+  if (StructureElementTypeToAccessibilityRole(element_type) ==
+      ax::mojom::Role::kHeading) {
+    if (element_type == "H" || element_type == "H1") {
+      return 1;
+    } else if (element_type == "H2") {
+      return 2;
+    } else if (element_type == "H3") {
+      return 3;
+    } else if (element_type == "H4") {
+      return 4;
+    } else if (element_type == "H5") {
+      return 5;
+    } else if (element_type == "H6") {
+      return 6;
+    }
+  }
+  return std::nullopt;
+}
+
+template <typename T>
+bool IsObjectInTextRun(const std::vector<T>& objects,
+                       uint32_t object_index,
+                       size_t text_run_index) {
+  return (object_index < objects.size() &&
+          objects[object_index].text_run_index <= text_run_index);
+}
+
+template <typename T>
+bool IsObjectWithRangeInTextRun(const std::vector<T>& objects,
+                                uint32_t object_index,
+                                size_t text_run_index) {
+  return (object_index < objects.size() &&
+          objects[object_index].text_range.index <= text_run_index);
+}
+
+size_t NormalizeTextRunIndex(uint32_t object_end_text_run_index,
+                             size_t current_text_run_index) {
+  return std::max<size_t>(
+      object_end_text_run_index,
+      current_text_run_index ? current_text_run_index - 1 : 0);
+}
+
+void ComputeParagraphAndHeadingThresholds(
+    const std::vector<chrome_pdf::AccessibilityTextRunInfo>& text_runs,
+    float* out_heading_font_size_threshold,
+    float* out_paragraph_spacing_threshold) {
+  // Scan over the font sizes and line spacing within this page and
+  // set heuristic thresholds so that text larger than the median font
+  // size can be marked as a heading, and spacing larger than the median
+  // line spacing can be a paragraph break.
+  std::vector<float> font_sizes;
+  std::vector<float> line_spacings;
+  for (size_t i = 0; i < text_runs.size(); ++i) {
+    font_sizes.push_back(text_runs[i].style.font_size);
+    if (i > 0) {
+      const auto& cur = text_runs[i].bounds;
+      const auto& prev = text_runs[i - 1].bounds;
+      if (cur.y() > prev.y() + prev.height() / 2) {
+        line_spacings.push_back(cur.y() - prev.y());
+      }
+    }
+  }
+  if (font_sizes.size() > 2) {
+    std::sort(font_sizes.begin(), font_sizes.end());
+    float median_font_size = font_sizes[font_sizes.size() / 2];
+    if (median_font_size > kMinimumFontSize) {
+      *out_heading_font_size_threshold =
+          median_font_size * kHeadingFontSizeRatio;
+    }
+  }
+  if (line_spacings.size() > 4) {
+    std::sort(line_spacings.begin(), line_spacings.end());
+    float median_line_spacing = line_spacings[line_spacings.size() / 2];
+    if (median_line_spacing > kMinimumLineSpacing) {
+      *out_paragraph_spacing_threshold =
+          median_line_spacing * kParagraphLineSpacingRatio;
+    }
+  }
+}
+
+bool BreakParagraph(
+    const std::vector<chrome_pdf::AccessibilityTextRunInfo>& text_runs,
+    uint32_t text_run_index,
+    float paragraph_spacing_threshold) {
+  // Check to see if its also a new paragraph, i.e., if the distance between
+  // lines is greater than the threshold.  If there's no threshold, that
+  // means there weren't enough lines to compute an accurate median, so
+  // we compare against the line size instead.
+  float line_spacing = fabsf(text_runs[text_run_index + 1].bounds.y() -
+                             text_runs[text_run_index].bounds.y());
+  return ((paragraph_spacing_threshold > 0 &&
+           line_spacing > paragraph_spacing_threshold) ||
+          (paragraph_spacing_threshold == 0 &&
+           line_spacing > kParagraphLineSpacingRatio *
+                              text_runs[text_run_index].bounds.height()));
+}
+
+void BuildStaticNode(ui::AXNodeData** static_text_node,
+                     std::string* static_text) {
+  // If we're in the middle of building a static text node, finish it before
+  // moving on to the next object.
+  if (*static_text_node) {
+    (*static_text_node)
+        ->AddStringAttribute(ax::mojom::StringAttribute::kName, (*static_text));
+    static_text->clear();
+  }
+  *static_text_node = nullptr;
+}
+
+void ConnectPreviousAndNextOnLine(ui::AXNodeData* previous_on_line_node,
+                                  ui::AXNodeData* next_on_line_node) {
+  previous_on_line_node->AddIntAttribute(ax::mojom::IntAttribute::kNextOnLineId,
+                                         next_on_line_node->id);
+  next_on_line_node->AddIntAttribute(ax::mojom::IntAttribute::kPreviousOnLineId,
+                                     previous_on_line_node->id);
+}
+
+}  // namespace
+
+namespace pdf {
+
+PdfAccessibilityTreeBuilderHeuristic::PdfAccessibilityTreeBuilderHeuristic(
+    PdfAccessibilityTreeBuilder& builder)
+    : builder_(builder) {}
+
+void PdfAccessibilityTreeBuilderHeuristic::BuildPageTree() {
+  ComputeParagraphAndHeadingThresholds(*builder_->text_runs_,
+                                       &heading_font_size_threshold_,
+                                       &paragraph_spacing_threshold_);
+
+  ui::AXNodeData* block_node = nullptr;
+  ui::AXNodeData* static_text_node = nullptr;
+  ui::AXNodeData* previous_on_line_node = nullptr;
+  std::string static_text;
+  LineHelper line_helper(*builder_->text_runs_);
+  bool pdf_forms_enabled =
+      base::FeatureList::IsEnabled(chrome_pdf::features::kAccessiblePDFForm);
+#if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
+  bool ocr_block = false;
+  bool has_ocr_text = false;
+#endif
+
+  for (size_t text_run_index = 0; text_run_index < builder_->text_runs_->size();
+       ++text_run_index) {
+    const chrome_pdf::AccessibilityTextRunInfo& text_run =
+        (*builder_->text_runs_)[text_run_index];
+
+#if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
+    // OCR text should be marked by nodes before and after it.
+    bool ocr_block_start = text_run.is_searchified && !ocr_block;
+    bool ocr_block_end = !text_run.is_searchified && ocr_block;
+    if (ocr_block_start || ocr_block_end) {
+      // If already inside a block, end it.
+      // PDF searchifier only processes pages that have no text, hence OCR text
+      // is never added in the middle of a paragraph.
+      if (block_node) {
+        BuildStaticNode(&static_text_node, &static_text);
+        block_node = nullptr;
+      }
+      CHECK(ocr_block_start || text_run_index);
+      gfx::PointF position = ocr_block_start
+                                 ? text_run.bounds.origin()
+                                 : (*builder_->text_runs_)[text_run_index - 1]
+                                       .bounds.bottom_right();
+      builder_->page_node_->child_ids.push_back(
+          builder_->CreateOcrWrapperNode(position, ocr_block_start)->id);
+      ocr_block = ocr_block_start;
+      has_ocr_text = true;
+    }
+#endif  // BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
+    // If we don't have a block level node, create one.
+    if (!block_node) {
+      block_node =
+          CreateBlockLevelNode(text_run.tag_type, text_run.style.font_size);
+      builder_->page_node_->child_ids.push_back(block_node->id);
+    }
+
+    // If the `text_run_index` is less than or equal to the link's
+    // `text_run_index`, then push the link node in the block.
+    if (IsObjectWithRangeInTextRun(*builder_->links_, current_link_index_,
+                                   text_run_index)) {
+      BuildStaticNode(&static_text_node, &static_text);
+      const chrome_pdf::AccessibilityLinkInfo& link =
+          (*builder_->links_)[current_link_index_++];
+      AddLinkToParaNode(link, block_node, &previous_on_line_node,
+                        &text_run_index);
+
+      if (link.text_range.count == 0) {
+        continue;
+      }
+
+    } else if (IsObjectInTextRun(*builder_->images_, current_image_index_,
+                                 text_run_index)) {
+      BuildStaticNode(&static_text_node, &static_text);
+      AddImageToParaNode((*builder_->images_)[current_image_index_++],
+                         block_node, &text_run_index);
+      continue;
+    } else if (IsObjectWithRangeInTextRun(*builder_->highlights_,
+                                          current_highlight_index_,
+                                          text_run_index)) {
+      BuildStaticNode(&static_text_node, &static_text);
+      AddHighlightToParaNode(
+          (*builder_->highlights_)[current_highlight_index_++], block_node,
+          &previous_on_line_node, &text_run_index);
+    } else if (IsObjectInTextRun(*builder_->text_fields_,
+                                 current_text_field_index_, text_run_index) &&
+               pdf_forms_enabled) {
+      BuildStaticNode(&static_text_node, &static_text);
+      AddTextFieldToParaNode(
+          (*builder_->text_fields_)[current_text_field_index_++], block_node,
+          &text_run_index);
+      continue;
+    } else if (IsObjectInTextRun(*builder_->buttons_, current_button_index_,
+                                 text_run_index) &&
+               pdf_forms_enabled) {
+      BuildStaticNode(&static_text_node, &static_text);
+      AddButtonToParaNode((*builder_->buttons_)[current_button_index_++],
+                          block_node, &text_run_index);
+      continue;
+    } else if (IsObjectInTextRun(*builder_->choice_fields_,
+                                 current_choice_field_index_, text_run_index) &&
+               pdf_forms_enabled) {
+      BuildStaticNode(&static_text_node, &static_text);
+      AddChoiceFieldToParaNode(
+          (*builder_->choice_fields_)[current_choice_field_index_++],
+          block_node, &text_run_index);
+      continue;
+    } else {
+      chrome_pdf::PageCharacterIndex page_char_index = {
+          builder_->page_index_,
+          builder_->text_run_start_indices_[text_run_index]};
+
+      // This node is for the text inside the block, it includes the text of all
+      // of the text runs.
+      if (!static_text_node) {
+        static_text_node = builder_->CreateStaticTextNode(page_char_index);
+        block_node->child_ids.push_back(static_text_node->id);
+      }
+
+      // Add this text run to the current static text node.
+      ui::AXNodeData* inline_text_box_node =
+          builder_->CreateInlineTextBoxNode(text_run, page_char_index);
+      static_text_node->child_ids.push_back(inline_text_box_node->id);
+
+      static_text += inline_text_box_node->GetStringAttribute(
+          ax::mojom::StringAttribute::kName);
+
+      block_node->relative_bounds.bounds.Union(
+          inline_text_box_node->relative_bounds.bounds);
+      static_text_node->relative_bounds.bounds.Union(
+          inline_text_box_node->relative_bounds.bounds);
+
+      if (previous_on_line_node) {
+        ConnectPreviousAndNextOnLine(previous_on_line_node,
+                                     inline_text_box_node);
+      } else {
+        line_helper.StartNewLine(text_run_index);
+      }
+      line_helper.ProcessNextRun(text_run_index);
+
+      if (text_run_index < builder_->text_runs_->size() - 1) {
+        if (line_helper.IsRunOnSameLine(text_run_index + 1)) {
+          // The next run is on the same line.
+          previous_on_line_node = inline_text_box_node;
+        } else {
+          // The next run is on a new line.
+          previous_on_line_node = nullptr;
+        }
+      }
+    }
+
+    if (text_run_index == builder_->text_runs_->size() - 1) {
+      BuildStaticNode(&static_text_node, &static_text);
+      break;
+    }
+
+    if (!previous_on_line_node) {
+      if (BreakParagraph(*builder_->text_runs_, text_run_index,
+                         paragraph_spacing_threshold_)) {
+        BuildStaticNode(&static_text_node, &static_text);
+        block_node = nullptr;
+      }
+    }
+  }
+
+#if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
+  // Add the wrapper node if still in OCR block and text runs finish.
+  if (ocr_block) {
+    builder_->page_node_->child_ids.push_back(
+        builder_
+            ->CreateOcrWrapperNode(
+                builder_->text_runs_->back().bounds.bottom_right(),
+                /*start=*/false)
+            ->id);
+  }
+
+  AddRemainingAnnotations(block_node, has_ocr_text);
+#else
+  AddRemainingAnnotations(block_node);
+#endif
+}
+
+ui::AXNodeData* PdfAccessibilityTreeBuilderHeuristic::CreateBlockLevelNode(
+    const std::string& text_run_type,
+    float font_size) {
+  ui::AXNodeData* block_node = builder_->CreateAndAppendNode(
+      StructureElementTypeToAccessibilityRole(text_run_type),
+      ax::mojom::Restriction::kReadOnly);
+  block_node->AddBoolAttribute(ax::mojom::BoolAttribute::kIsLineBreakingObject,
+                               true);
+  if (std::optional<uint32_t> level =
+          StructureElementTypeToHeadingLevel(text_run_type);
+      level) {
+    block_node->AddIntAttribute(ax::mojom::IntAttribute::kHierarchicalLevel,
+                                *level);
+    // TODO(crbug.com/40707542): Set the HTML tag to "h*" by creating a helper
+    // in `AXEnumUtils`.
+  }
+
+  if (builder_->mark_headings_using_heuristic_ &&
+      heading_font_size_threshold_ > 0 &&
+      font_size > heading_font_size_threshold_) {
+    block_node->role = ax::mojom::Role::kHeading;
+    block_node->AddIntAttribute(ax::mojom::IntAttribute::kHierarchicalLevel, 2);
+    block_node->AddStringAttribute(ax::mojom::StringAttribute::kHtmlTag, "h2");
+  }
+
+  return block_node;
+}
+
+void PdfAccessibilityTreeBuilderHeuristic::AddTextToAXNode(
+    size_t start_text_run_index,
+    uint32_t end_text_run_index,
+    ui::AXNodeData* ax_node,
+    ui::AXNodeData** previous_on_line_node) {
+  chrome_pdf::PageCharacterIndex page_char_index = {
+      builder_->page_index_,
+      builder_->text_run_start_indices_[start_text_run_index]};
+  ui::AXNodeData* ax_static_text_node =
+      builder_->CreateStaticTextNode(page_char_index);
+  ax_node->child_ids.push_back(ax_static_text_node->id);
+  // Accumulate the text of the node.
+  std::string ax_name;
+  LineHelper line_helper(*builder_->text_runs_);
+
+  for (size_t text_run_index = start_text_run_index;
+       text_run_index <= end_text_run_index; ++text_run_index) {
+    const chrome_pdf::AccessibilityTextRunInfo& text_run =
+        (*builder_->text_runs_)[text_run_index];
+    page_char_index.char_index =
+        builder_->text_run_start_indices_[text_run_index];
+    // Add this text run to the current static text node.
+    ui::AXNodeData* inline_text_box_node =
+        builder_->CreateInlineTextBoxNode(text_run, page_char_index);
+    ax_static_text_node->child_ids.push_back(inline_text_box_node->id);
+
+    ax_static_text_node->relative_bounds.bounds.Union(
+        inline_text_box_node->relative_bounds.bounds);
+    ax_name += inline_text_box_node->GetStringAttribute(
+        ax::mojom::StringAttribute::kName);
+
+    if (*previous_on_line_node) {
+      ConnectPreviousAndNextOnLine(*previous_on_line_node,
+                                   inline_text_box_node);
+    } else {
+      line_helper.StartNewLine(text_run_index);
+    }
+    line_helper.ProcessNextRun(text_run_index);
+
+    if (text_run_index < builder_->text_runs_->size() - 1) {
+      if (line_helper.IsRunOnSameLine(text_run_index + 1)) {
+        // The next run is on the same line.
+        *previous_on_line_node = inline_text_box_node;
+      } else {
+        // The next run is on a new line.
+        *previous_on_line_node = nullptr;
+      }
+    }
+  }
+
+  ax_node->AddStringAttribute(ax::mojom::StringAttribute::kName, ax_name);
+  ax_static_text_node->AddStringAttribute(ax::mojom::StringAttribute::kName,
+                                          ax_name);
+}
+
+void PdfAccessibilityTreeBuilderHeuristic::AddTextToObjectNode(
+    size_t object_text_run_index,
+    uint32_t object_text_run_count,
+    ui::AXNodeData* object_node,
+    ui::AXNodeData* para_node,
+    ui::AXNodeData** previous_on_line_node,
+    size_t* text_run_index) {
+  // Annotation objects can overlap in PDF. There can be two overlapping
+  // scenarios: Partial overlap and Complete overlap.
+  // Partial overlap
+  //
+  // Link A starts      Link B starts     Link A ends            Link B ends
+  //      |a1                |b1               |a2                    |b2
+  // -----------------------------------------------------------------------
+  //                                    Text
+  //
+  // Complete overlap
+  // Link A starts      Link B starts     Link B ends            Link A ends
+  //      |a1                |b1               |b2                    |a2
+  // -----------------------------------------------------------------------
+  //                                    Text
+  //
+  // For overlapping annotations, both annotations would store the full
+  // text data and nothing will get truncated. For partial overlap, link `A`
+  // would contain text between a1 and a2 while link `B` would contain text
+  // between b1 and b2. For complete overlap as well, link `A` would contain
+  // text between a1 and a2 and link `B` would contain text between b1 and
+  // b2. The links would appear in the tree in the order of which they are
+  // present. In the tree for both overlapping scenarios, link `A` would
+  // appear first in the tree and link `B` after it.
+
+  // If `object_text_run_count` > 0, then the object is part of the page text.
+  // Make the text runs contained by the object children of the object node.
+  size_t end_text_run_index = object_text_run_index + object_text_run_count;
+  uint32_t object_end_text_run_index =
+      std::min(end_text_run_index, builder_->text_runs_->size()) - 1;
+  AddTextToAXNode(object_text_run_index, object_end_text_run_index, object_node,
+                  previous_on_line_node);
+
+  para_node->relative_bounds.bounds.Union(object_node->relative_bounds.bounds);
+
+  *text_run_index =
+      NormalizeTextRunIndex(object_end_text_run_index, *text_run_index);
+}
+
+void PdfAccessibilityTreeBuilderHeuristic::AddLinkToParaNode(
+    const chrome_pdf::AccessibilityLinkInfo& link,
+    ui::AXNodeData* para_node,
+    ui::AXNodeData** previous_on_line_node,
+    size_t* text_run_index) {
+  ui::AXNodeData* link_node = builder_->CreateLinkNode(link);
+  para_node->child_ids.push_back(link_node->id);
+
+  // If `link.text_range.count` == 0, then the link is not part of the page
+  // text. Push it ahead of the current text run.
+  if (link.text_range.count == 0) {
+    --(*text_run_index);
+    return;
+  }
+
+  // Make the text runs contained by the link children of
+  // the link node.
+  AddTextToObjectNode(link.text_range.index, link.text_range.count, link_node,
+                      para_node, previous_on_line_node, text_run_index);
+}
+
+void PdfAccessibilityTreeBuilderHeuristic::AddImageToParaNode(
+    const chrome_pdf::AccessibilityImageInfo& image,
+    ui::AXNodeData* para_node,
+    size_t* text_run_index) {
+  // If the `text_run_index` is less than or equal to the image's text run
+  // index, then push the image ahead of the current text run.
+  ui::AXNodeData* image_node = builder_->CreateImageNode(image);
+  para_node->child_ids.push_back(image_node->id);
+  --(*text_run_index);
+}
+
+void PdfAccessibilityTreeBuilderHeuristic::AddHighlightToParaNode(
+    const chrome_pdf::AccessibilityHighlightInfo& highlight,
+    ui::AXNodeData* para_node,
+    ui::AXNodeData** previous_on_line_node,
+    size_t* text_run_index) {
+  ui::AXNodeData* highlight_node = builder_->CreateHighlightNode(highlight);
+  para_node->child_ids.push_back(highlight_node->id);
+
+  // Make the text runs contained by the highlight children of
+  // the highlight node.
+  AddTextToObjectNode(highlight.text_range.index, highlight.text_range.count,
+                      highlight_node, para_node, previous_on_line_node,
+                      text_run_index);
+
+  if (!highlight.note_text.empty()) {
+    ui::AXNodeData* popup_note_node = builder_->CreatePopupNoteNode(highlight);
+    highlight_node->child_ids.push_back(popup_note_node->id);
+  }
+}
+
+void PdfAccessibilityTreeBuilderHeuristic::AddTextFieldToParaNode(
+    const chrome_pdf::AccessibilityTextFieldInfo& text_field,
+    ui::AXNodeData* para_node,
+    size_t* text_run_index) {
+  // If the `text_run_index` is less than or equal to the text_field's text
+  // run index, then push the text_field ahead of the current text run.
+  ui::AXNodeData* text_field_node = builder_->CreateTextFieldNode(text_field);
+  para_node->child_ids.push_back(text_field_node->id);
+  --(*text_run_index);
+}
+
+void PdfAccessibilityTreeBuilderHeuristic::AddButtonToParaNode(
+    const chrome_pdf::AccessibilityButtonInfo& button,
+    ui::AXNodeData* para_node,
+    size_t* text_run_index) {
+  // If the `text_run_index` is less than or equal to the button's text
+  // run index, then push the button ahead of the current text run.
+  ui::AXNodeData* button_node = builder_->CreateButtonNode(button);
+  para_node->child_ids.push_back(button_node->id);
+  --(*text_run_index);
+}
+
+void PdfAccessibilityTreeBuilderHeuristic::AddChoiceFieldToParaNode(
+    const chrome_pdf::AccessibilityChoiceFieldInfo& choice_field,
+    ui::AXNodeData* para_node,
+    size_t* text_run_index) {
+  // If the `text_run_index` is less than or equal to the choice_field's text
+  // run index, then push the choice_field ahead of the current text run.
+  ui::AXNodeData* choice_field_node =
+      builder_->CreateChoiceFieldNode(choice_field);
+  para_node->child_ids.push_back(choice_field_node->id);
+  --(*text_run_index);
+}
+
+void PdfAccessibilityTreeBuilderHeuristic::AddRemainingAnnotations(
+    ui::AXNodeData* para_node
+#if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
+    ,
+    bool ocr_applied
+#endif
+) {
+  // If we don't have additional links, images or form fields to insert in the
+  // tree, then return.
+  if (current_link_index_ >= builder_->links_->size() &&
+      current_image_index_ >= builder_->images_->size() &&
+      current_text_field_index_ >= builder_->text_fields_->size() &&
+      current_button_index_ >= builder_->buttons_->size() &&
+      current_choice_field_index_ >= builder_->choice_fields_->size()) {
+    return;
+  }
+
+  // If we don't have a paragraph node, create a new one.
+  if (!para_node) {
+    para_node = builder_->CreateAndAppendNode(
+        ax::mojom::Role::kParagraph, ax::mojom::Restriction::kReadOnly);
+    builder_->page_node_->child_ids.push_back(para_node->id);
+  }
+  // Push all the links not anchored to any text run to the last paragraph.
+  for (size_t i = current_link_index_; i < builder_->links_->size(); i++) {
+    ui::AXNodeData* link_node =
+        builder_->CreateLinkNode((*builder_->links_)[i]);
+    para_node->child_ids.push_back(link_node->id);
+  }
+
+  // Push all the images not anchored to any text run to the last paragraph
+  // unless OCR has run. PDF Searchify either OCRs all images on a page, or none
+  // of them.
+  bool push_remaining_images = true;
+#if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
+  push_remaining_images = !ocr_applied;
+#endif
+  if (push_remaining_images) {
+    for (size_t i = current_image_index_; i < builder_->images_->size(); i++) {
+      const chrome_pdf::AccessibilityImageInfo& image_info =
+          (*builder_->images_)[i];
+      ui::AXNodeData* image_node = builder_->CreateImageNode(image_info);
+      para_node->child_ids.push_back(image_node->id);
+    }
+  }
+
+  if (base::FeatureList::IsEnabled(chrome_pdf::features::kAccessiblePDFForm)) {
+    // Push all the text fields not anchored to any text run to the last
+    // paragraph.
+    for (size_t i = current_text_field_index_;
+         i < builder_->text_fields_->size(); i++) {
+      ui::AXNodeData* text_field_node =
+          builder_->CreateTextFieldNode((*builder_->text_fields_)[i]);
+      para_node->child_ids.push_back(text_field_node->id);
+    }
+
+    // Push all the buttons not anchored to any text run to the last
+    // paragraph.
+    for (size_t i = current_button_index_; i < builder_->buttons_->size();
+         i++) {
+      ui::AXNodeData* button_node =
+          builder_->CreateButtonNode((*builder_->buttons_)[i]);
+      para_node->child_ids.push_back(button_node->id);
+    }
+
+    // Push all the choice fields not anchored to any text run to the last
+    // paragraph.
+    for (size_t i = current_choice_field_index_;
+         i < builder_->choice_fields_->size(); i++) {
+      ui::AXNodeData* choice_field_node =
+          builder_->CreateChoiceFieldNode((*builder_->choice_fields_)[i]);
+      para_node->child_ids.push_back(choice_field_node->id);
+    }
+  }
+}
+
+}  // namespace pdf
diff --git a/components/pdf/renderer/pdf_accessibility_tree_builder_heuristic.h b/components/pdf/renderer/pdf_accessibility_tree_builder_heuristic.h
new file mode 100644
index 0000000..ecd59f2f
--- /dev/null
+++ b/components/pdf/renderer/pdf_accessibility_tree_builder_heuristic.h
@@ -0,0 +1,130 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_PDF_RENDERER_PDF_ACCESSIBILITY_TREE_BUILDER_HEURISTIC_H_
+#define COMPONENTS_PDF_RENDERER_PDF_ACCESSIBILITY_TREE_BUILDER_HEURISTIC_H_
+
+#include <cstddef>
+#include <cstdint>
+
+#include "base/memory/raw_ref.h"
+#include "services/screen_ai/buildflags/buildflags.h"
+
+namespace chrome_pdf {
+struct AccessibilityButtonInfo;
+struct AccessibilityChoiceFieldInfo;
+struct AccessibilityHighlightInfo;
+struct AccessibilityImageInfo;
+struct AccessibilityLinkInfo;
+struct AccessibilityTextFieldInfo;
+}  // namespace chrome_pdf
+
+namespace ui {
+struct AXNodeData;
+}
+
+namespace pdf {
+
+class PdfAccessibilityTreeBuilder;
+
+// Heuristic-based accessibility tree building for untagged PDFs.
+//
+// This file contains functions used to build accessibility trees from untagged
+// PDFs that lack semantic structure information. These functions use:
+//
+// 1. Index-based tracking: Matches page objects (links, images, highlights,
+//    form fields) to text runs using sequential index tracking.
+//
+// 2. Heuristic analysis: Infers semantic structure (paragraphs, headings,
+//    lines) by analyzing visual layout properties like font sizes, line
+//    spacing, and spatial relationships.
+//
+
+// This class implements the complete heuristic accessibility tree building
+// algorithm for untagged PDFs.
+class PdfAccessibilityTreeBuilderHeuristic {
+ public:
+  explicit PdfAccessibilityTreeBuilderHeuristic(
+      PdfAccessibilityTreeBuilder& builder);
+
+  PdfAccessibilityTreeBuilderHeuristic(
+      const PdfAccessibilityTreeBuilderHeuristic&) = delete;
+  PdfAccessibilityTreeBuilderHeuristic& operator=(
+      const PdfAccessibilityTreeBuilderHeuristic&) = delete;
+
+  // Main entry point for heuristic tree building. Processes all text runs
+  // sequentially, applying heuristics to determine block structure and
+  // inserting page objects (links, images, forms) based on index tracking.
+  void BuildPageTree();
+
+ private:
+  ui::AXNodeData* CreateBlockLevelNode(const std::string& text_run_type,
+                                       float font_size);
+
+  void AddTextToAXNode(size_t start_text_run_index,
+                       uint32_t end_text_run_index,
+                       ui::AXNodeData* ax_node,
+                       ui::AXNodeData** previous_on_line_node);
+
+  void AddTextToObjectNode(size_t object_text_run_index,
+                           uint32_t object_text_run_count,
+                           ui::AXNodeData* object_node,
+                           ui::AXNodeData* para_node,
+                           ui::AXNodeData** previous_on_line_node,
+                           size_t* text_run_index);
+
+  void AddLinkToParaNode(const chrome_pdf::AccessibilityLinkInfo& link,
+                         ui::AXNodeData* para_node,
+                         ui::AXNodeData** previous_on_line_node,
+                         size_t* text_run_index);
+
+  void AddImageToParaNode(const chrome_pdf::AccessibilityImageInfo& image,
+                          ui::AXNodeData* para_node,
+                          size_t* text_run_index);
+
+  void AddHighlightToParaNode(
+      const chrome_pdf::AccessibilityHighlightInfo& highlight,
+      ui::AXNodeData* para_node,
+      ui::AXNodeData** previous_on_line_node,
+      size_t* text_run_index);
+
+  void AddTextFieldToParaNode(
+      const chrome_pdf::AccessibilityTextFieldInfo& text_field,
+      ui::AXNodeData* para_node,
+      size_t* text_run_index);
+
+  void AddButtonToParaNode(const chrome_pdf::AccessibilityButtonInfo& button,
+                           ui::AXNodeData* para_node,
+                           size_t* text_run_index);
+
+  void AddChoiceFieldToParaNode(
+      const chrome_pdf::AccessibilityChoiceFieldInfo& choice_field,
+      ui::AXNodeData* para_node,
+      size_t* text_run_index);
+
+  void AddRemainingAnnotations(ui::AXNodeData* para_node
+#if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
+                               ,
+                               bool ocr_applied
+#endif
+  );
+
+  raw_ref<PdfAccessibilityTreeBuilder> builder_;
+
+  // Heuristic-specific state for sequential processing and analysis.
+  float heading_font_size_threshold_ = 0;
+  float paragraph_spacing_threshold_ = 0;
+
+  // Sequential index tracking for page objects.
+  uint32_t current_link_index_ = 0;
+  uint32_t current_image_index_ = 0;
+  uint32_t current_highlight_index_ = 0;
+  uint32_t current_text_field_index_ = 0;
+  uint32_t current_button_index_ = 0;
+  uint32_t current_choice_field_index_ = 0;
+};
+
+}  // namespace pdf
+
+#endif  // COMPONENTS_PDF_RENDERER_PDF_ACCESSIBILITY_TREE_BUILDER_HEURISTIC_H_
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb
index 2a0f427..c331fe6 100644
--- a/components/policy/resources/policy_templates_de.xtb
+++ b/components/policy/resources/policy_templates_de.xtb
@@ -2381,13 +2381,6 @@
 <translation id="2614156176932194496">Einstellungen für die KI‑Modus-Integrationen von Google in der Adressleiste und im Suchfeld der Seite „Neuer Tab“.</translation>
 <translation id="2615240493030733717">Informationen zur Zeitzone ausgeben</translation>
 <translation id="2619258867868873629">Das Ziel von „Als PDF speichern“ und das Ziel von „In Google Drive speichern“ auf <ph name="PRODUCT_OS_NAME" />-Geräten</translation>
-<translation id="262035875928535253">Konfiguriere die Liste der Domains, in denen <ph name="PRODUCT_NAME" /> den <ph name="PASSWORD_MANAGER_NAME" /> deaktivieren soll. Dadurch werden die Workflows „Speichern“ und „Ausfüllen“ deaktiviert, sodass Passwörter für diese Websites nicht gespeichert oder automatisch in Webformularen ausgefüllt werden.
-
-Wenn eine Domain in der Liste aufgeführt ist, wird der <ph name="PASSWORD_MANAGER_NAME" /> für diese deaktiviert.
-
-Ist eine Domain nicht in der Liste enthalten, ist der <ph name="PASSWORD_MANAGER_NAME" /> für diese verfügbar.
-
-Wenn die Richtlinie nicht konfiguriert ist, ist der <ph name="PASSWORD_MANAGER_NAME" /> für alle Domains verfügbar.</translation>
 <translation id="2621290137818374425">Wenn die Richtlinie konfiguriert ist, werden die Certificate Transparency-Offenlegungspflichten für die Hostnamen in den angegebenen URLs deaktiviert. Dadurch sind Zertifikate weiterhin zulässig, die andernfalls nicht vertrauenswürdig wären, weil sie nicht ordnungsgemäß offengelegt wurden. Es ist aber schwerer, fehlerhaft ausgestellte Zertifikate für diese Hosts zu erkennen.
 
       Wenn die Richtlinie nicht konfiguriert ist, werden alle Zertifikate, für die eine Certificate Transparency-Offenlegung erforderlich ist und die nicht offengelegt werden, von <ph name="PRODUCT_NAME" /> als nicht vertrauenswürdig behandelt.
@@ -10165,7 +10158,7 @@
 
 Ist die Richtlinie deaktiviert oder nicht konfiguriert, umfasst der generierte Kerberos-SPN keinen Port.</translation>
 <translation id="7877924399554599110">Ermöglicht das Zusammenführen von Nutzer-Cloud-Richtlinien zu Richtlinien auf Maschinenebene</translation>
-<translation id="7879142313118107127">Aus Sicherheitsgründen erfordert die Web-API „<ph name="REQUEST_FULLSCREEN_API_NAME" />“ die vorherige Ausführung einer Geste zur vorübergehenden Aktivierung durch den Nutzer; andernfalls tritt ein Fehler auf. Durch die persönlichen Einstellungen von Nutzern kann es bestimmten Ursprüngen erlaubt sein, diese API ohne vorherige Nutzergeste aufzurufen, wie unter <ph name="AUTOMATIC_FULLSCREEN_HELP_URL" /> beschrieben.
+<translation id="7879142313118107127">Aus Sicherheitsgründen erfordert das Aufrufen der Web-API „<ph name="REQUEST_FULLSCREEN_API_NAME" />“ eine vorherige Nutzergeste („vorübergehende Aktivierung“), andernfalls tritt ein Fehler auf. Durch die persönlichen Einstellungen von Nutzern kann es bestimmten Ursprüngen erlaubt sein, diese API ohne vorherige Nutzergeste aufzurufen, wie unter <ph name="AUTOMATIC_FULLSCREEN_HELP_URL" /> beschrieben.
 
 Diese Richtlinie ersetzt die persönlichen Einstellungen der Nutzer und lässt zu, dass übereinstimmende Ursprünge die API ohne vorherige Nutzergeste aufrufen.
 
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb
index 222cd990..f432399 100644
--- a/components/policy/resources/policy_templates_es-419.xtb
+++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -2498,13 +2498,6 @@
 <translation id="2614156176932194496">Configuración de las integraciones del Modo IA de Google en la barra de direcciones y el cuadro de búsqueda de la página Nueva pestaña.</translation>
 <translation id="2615240493030733717">Envía información sobre la zona horaria</translation>
 <translation id="2619258867868873629">El destino de "Guardar como PDF" y el destino de "Guardar en Google Drive" en dispositivos <ph name="PRODUCT_OS_NAME" /></translation>
-<translation id="262035875928535253">Configura la lista de dominios en los que <ph name="PRODUCT_NAME" /> debe inhabilitar el <ph name="PASSWORD_MANAGER_NAME" />. Esto significa que se inhabilitarán los flujos de trabajo de guardar y completar, lo que garantiza que las contraseñas de esos sitios web no se puedan guardar ni completar automáticamente en formularios web.
-
-Si un dominio está presente en la lista, se inhabilitará el <ph name="PASSWORD_MANAGER_NAME" />.
-
-Si un dominio no está presente en la lista, el <ph name="PASSWORD_MANAGER_NAME" /> estará disponible para él.
-
-Si no estableces la política, el <ph name="PASSWORD_MANAGER_NAME" /> estará disponible para todos los dominios.</translation>
 <translation id="2621290137818374425">Si estableces la política, se desactivarán los requisitos de divulgación del Certificado de transparencia para los nombres de host en las URLs especificadas. Si bien esta acción dificulta la detección de los certificados que se usan de forma incorrecta, los hosts pueden seguir usando certificados que, de otra manera, no serían de confianza (porque no se divulgaron correctamente a nivel público).
 
       Si no estableces esta política, <ph name="PRODUCT_NAME" /> considerará que no son de confianza los certificados que requieran divulgación mediante el Certificado de transparencia y, a pesar de ello, no se hayan divulgado.
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb
index e0463bd..cc8e2466 100644
--- a/components/policy/resources/policy_templates_es.xtb
+++ b/components/policy/resources/policy_templates_es.xtb
@@ -1844,6 +1844,7 @@
 <translation id="2258126710006312594">Permite que los usuarios con acceso remoto transfieran archivos al host y desde el host</translation>
 <translation id="225830954785359083">Impedir que las páginas muestren ventanas emergentes durante la descarga</translation>
 <translation id="2261648512244797294">Inhabilitar el protocolo Privet de impresión obsoleto</translation>
+<translation id="2262701937800507517">Usar el orden del algoritmo de cifrado predeterminado de <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="2263881357524831360">Permitir el uso de gestores de contraseñas de terceros en <ph name="PRODUCT_NAME" /> para <ph name="ANDROID_NAME" /></translation>
 <translation id="2266422599396179941">Permitir que los usuarios envíen sugerencias
 </translation>
@@ -2386,13 +2387,6 @@
 <translation id="2614156176932194496">Configuración de las integraciones de Modo IA de Google en la barra de direcciones y en el cuadro de búsqueda de la página Nueva pestaña.</translation>
 <translation id="2615240493030733717">Informar sobre la zona horaria</translation>
 <translation id="2619258867868873629">El destino de Guardar como PDF y de Guardar en Google Drive en dispositivos <ph name="PRODUCT_OS_NAME" /></translation>
-<translation id="262035875928535253">Configura la lista de dominios en los que <ph name="PRODUCT_NAME" /> debe inhabilitar <ph name="PASSWORD_MANAGER_NAME" />. Esto significa que los flujos de trabajo de guardar y rellenar se desactivarán, lo que asegura que las contraseñas de esos sitios web no se puedan guardar ni rellenar automáticamente en formularios web.
-
-Si un dominio está en la lista, se inhabilitará <ph name="PASSWORD_MANAGER_NAME" /> en dicho dominio.
-
-Si no aparece en la lista, <ph name="PASSWORD_MANAGER_NAME" /> estará disponible en el dominio en cuestión.
-
-Si no se define esta política, <ph name="PASSWORD_MANAGER_NAME" /> estará disponible en todos los dominios.</translation>
 <translation id="2621290137818374425">Si se establece esta política, se desactivarán los requisitos de divulgación de transparencia en los certificados para los nombres de host de las URLs especificadas. Aunque resulte más difícil detectar certificados que se hayan publicado incorrectamente, los hosts pueden seguir usando certificados que, de lo contrario, no serían de confianza (por no haberse comunicado públicamente de forma correcta).
 
       Si no se asigna ningún valor a esta política, los certificados que se deban comunicar a través de la transparencia en los certificados no serán de confianza para <ph name="PRODUCT_NAME" /> si no se comunican.
@@ -2603,6 +2597,23 @@
 <translation id="2812417768214606683">Esta política especifica una lista de dispositivos de almacenamiento USB que están exentos de las políticas <ph name="EXTERNAL_STORAGE_DISABLED_POLICY_NAME" /> y <ph name="EXTERNAL_STORAGE_READ_ONLY_POLICY_NAME" />.
 
 Las entradas son pares de identificador de proveedor del USB e identificador de producto que permiten identificar el modelo específico del dispositivo USB.</translation>
+<translation id="2816735327277809365">Esta política configura <ph name="PRODUCT_OS_NAME" /> para que ordene sus algoritmos de cifrado preferidos en TLS 1.3 de forma que se refleje una preferencia por los algoritmos que hayan sido aprobados por un régimen de cumplimiento específico al hacer solicitudes de red desde la pantalla de inicio de sesión.
+
+Si se define esta política, no se garantiza que se negocien algoritmos específicos.
+
+Esta política permite que los operadores de servidores que quieran admitir clientes con y sin requisitos de cumplimiento normativo distingan entre esos clientes y solo usen determinados algoritmos no predeterminados con mayor potencia criptográfica para aquellos que estén configurados explícitamente para preferirlos.
+
+Si se asigna el valor <ph name="CNSA_NAME" /> a esta política, se configura <ph name="PRODUCT_OS_NAME" /> para que prefiera los algoritmos de cifrado necesarios para cumplir los requisitos de las versiones 1.0 y 2.0 del Commercial National Security Algorithm Suite (CNSA 1.0 y 2.0).
+
+Si no se define esta política o se le asigna el valor <ph name="DEFAULT_NAME" />, <ph name="PRODUCT_OS_NAME" /> se configurará para que use sus algoritmos de cifrado predeterminados.
+
+No es necesario definir esta política por motivos de seguridad. La criptografía predeterminada que usa <ph name="PRODUCT_OS_NAME" /> es lo suficientemente potente como para resistir un ataque de fuerza bruta que utilice toda la energía del Sol.
+
+Si se define esta política, <ph name="PRODUCT_OS_NAME" /> será más lento al hacer solicitudes de red desde la pantalla de inicio de sesión.
+
+Esta política solo afecta a TLS 1.3 y QUIC, no a versiones anteriores de TLS.
+
+Esta política de dispositivos es equivalente a la política de usuarios <ph name="PREFER_SLOW_CIPHERS_POLICY_NAME" />, pero, en su lugar, se aplica al perfil de inicio de sesión en la pantalla de inicio de sesión.</translation>
 <translation id="2816964824289752181">Habilitar <ph name="DESK_API_NAME" /> para el control de terceros de <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="2818074121667686266">Si se asigna el valor "Habilitada" a esta política o no se le asigna ninguno, significa que, con la excepción de las URL que se hayan incluido en la lista AudioCaptureAllowedUrls, se solicitará a los usuarios acceso a la captura de audio.
 
@@ -4984,6 +4995,25 @@
 
       Para obtener información detallada sobre los patrones de URL válidos, consulta https://chromeenterprise.google/policies/url-patterns.</translation>
 <translation id="4485425108474077672">Configurar la URL de la página Nueva pestaña</translation>
+<translation id="4485667899983529614">Esta política configura <ph name="PRODUCT_OS_NAME" /> para que ordene sus algoritmos de acuerdo de claves preferidos (grupos admitidos) en TLS 1.3 de forma que se refleje una preferencia por los algoritmos que hayan sido aprobados por un régimen de cumplimiento específico al hacer solicitudes de red desde la pantalla de inicio de sesión.
+
+Si se define esta política, no se garantiza que se negocien algoritmos específicos.
+
+Esta política permite que los operadores de servidores que quieran admitir clientes con y sin requisitos de cumplimiento normativo distingan entre esos clientes y solo usen determinados algoritmos no predeterminados con mayor potencia criptográfica para aquellos que estén configurados explícitamente para preferirlos.
+
+Si se asigna el valor <ph name="CNSA2_NAME" /> a esta política, se configura <ph name="PRODUCT_OS_NAME" /> para que prefiera los métodos de intercambio de claves necesarios para cumplir los requisitos del Commercial National Security Algorithm Suite 2.0 (CNSA 2.0).
+
+Si no se define esta política o se le asigna el valor <ph name="DEFAULT_NAME" />, <ph name="PRODUCT_OS_NAME" /> se configura para que use sus métodos predeterminados de intercambio de claves.
+
+Si se asigna a esta política un valor que configure <ph name="PRODUCT_OS_NAME" /> para que prefiera un algoritmo de acuerdo de claves poscuántico, pero <ph name="DEVICE_POST_QUANTUM_KEY_AGREEMENT_ENABLED_POLICY_NAME" /> está inhabilitado, el ajuste de <ph name="DEVICE_POST_QUANTUM_KEY_AGREEMENT_ENABLED_POLICY_NAME" /> tendrá prioridad.
+
+No es necesario definir esta política por motivos de seguridad. La criptografía predeterminada que usa <ph name="PRODUCT_OS_NAME" /> es lo suficientemente potente como para resistir un ataque de fuerza bruta que utilice toda la energía del Sol.
+
+Si se define esta política, <ph name="PRODUCT_OS_NAME" /> será más lento al hacer solicitudes de red desde la pantalla de inicio de sesión.
+
+Esta política solo afecta a TLS 1.3 y QUIC, no a versiones anteriores de TLS.
+
+Esta política de dispositivos es equivalente a la política de usuarios <ph name="PREFER_SLOW_KEX_ALGORITHMS_POLICY_NAME" />, pero, en su lugar, se aplica al perfil de inicio de sesión en la pantalla de inicio de sesión.</translation>
 <translation id="4488959486611931919">Nota: No se ha notificado ningún fallo del sitio desde que Chrome empezó a bloquear estas cookies de forma predeterminada a partir de la versión M118, por lo que esta función no se podrá configurar (y esta política no tendrá ningún efecto) a partir de la versión M127.
 
 Esta política inhabilita temporalmente los cambios en la forma en que Chrome gestiona las cookies configuradas mediante JavaScript que contienen determinados caracteres de control (NULL, retorno de carro y salto de línea).
@@ -5510,6 +5540,7 @@
 <translation id="4802905909524200151">Configurar comportamiento de actualización del firmware de <ph name="TPM_FIRMWARE_UPDATE_TPM" /></translation>
 <translation id="4804828344300125154">Reiniciar siempre cuando el usuario cierre sesión.</translation>
 <translation id="4807950475297505572">Eliminar usuarios utilizados hace más tiempo hasta que haya suficiente espacio libre</translation>
+<translation id="4808129082654355104">Dar prioridad a los algoritmos de cifrado específicos para TLS en la pantalla de inicio de sesión del dispositivo</translation>
 <translation id="4812270373673968774">Si se asigna el valor "Siempre" a esta política, se ocultará automáticamente la estantería de <ph name="PRODUCT_OS_NAME" />. Si se le asigna el valor "Nunca", la estantería nunca se ocultará automáticamente.
 
       Si le asignas un valor a esta política, los usuarios no podrán cambiarlo. Si no se le asigna ninguno, los usuarios decidirán si la estantería se oculta automáticamente.</translation>
@@ -6355,6 +6386,7 @@
 La función no está disponible si la sincronización de contraseñas está desactivada (ya sea mediante la configuración del usuario o porque la política <ph name="SYNC_DISABLED" /> esté habilitada).
 
 Las cuentas gestionadas no pueden unirse ni crear grupos familiares, por lo que no pueden compartir contraseñas.</translation>
+<translation id="5326771913945855850">Usar los grupos admitidos predeterminados de <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="532848608876725157">Habilitar DNS-over-HTTPS con alternativa no segura</translation>
 <translation id="5328965694451556034">Informar de inicio o cierre de sesión</translation>
 <translation id="5329018127554115226">El modo Alta eficiencia se inhabilitará.</translation>
@@ -10024,6 +10056,7 @@
 <translation id="7712245244073542805">Impresión de plataforma mediante proceso de navegador.</translation>
 <translation id="7713608076604149344">Restricciones de descarga</translation>
 <translation id="7713845740295404764">Informar de eventos de inicio o cierre de sesión</translation>
+<translation id="7715155449217638248">Dar prioridad a los algoritmos de intercambio de claves específicos para TLS en la pantalla de inicio de sesión del dispositivo</translation>
 <translation id="7715711044277116530">Porcentaje que permite ajustar el retraso de inactividad de la pantalla en el modo de presentación</translation>
 <translation id="7715838249298819250">No permitir el uso de Captura de texto.</translation>
 <translation id="7716020145539921591">Esta política está obsoleta. Se debe usar la política <ph name="PROXY_SETTINGS_POLICY_NAME" /> en su lugar.
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb
index 08d693e..41298379 100644
--- a/components/policy/resources/policy_templates_fr.xtb
+++ b/components/policy/resources/policy_templates_fr.xtb
@@ -2383,13 +2383,6 @@
 <translation id="2614156176932194496">Paramètres des intégrations du Mode IA de Google dans la barre d'adresse et le champ de recherche de la page "Nouvel onglet".</translation>
 <translation id="2615240493030733717">Transmettre le fuseau horaire</translation>
 <translation id="2619258867868873629">Destinations "Enregistrer au format PDF" et "Enregistrer dans Google Drive" sur les appareils <ph name="PRODUCT_OS_NAME" /></translation>
-<translation id="262035875928535253">Configurez la liste des domaines sur lesquels <ph name="PRODUCT_NAME" /> doit désactiver le <ph name="PASSWORD_MANAGER_NAME" />. Cela signifie que les workflows d'enregistrement et de remplissage seront désactivés, de sorte que les mots de passe de ces sites Web ne pourront pas être enregistrés ou remplis automatiquement dans des formulaires Web.
-
-Si un domaine figure dans la liste, le <ph name="PASSWORD_MANAGER_NAME" /> sera désactivé pour ce domaine.
-
-Si un domaine n'est pas présent dans la liste, le <ph name="PASSWORD_MANAGER_NAME" /> sera disponible pour ce domaine.
-
-Si cette règle n'est pas configurée, le <ph name="PASSWORD_MANAGER_NAME" /> sera disponible pour tous les domaines.</translation>
 <translation id="2621290137818374425">Permet de désactiver l'application des exigences de divulgation stipulées dans les règles de transparence des certificats pour les noms d'hôte dans la liste d'URL spécifiées. Même si cela complique la détection des certificats qui ne sont pas émis correctement, les hôtes peuvent continuer d'utiliser des certificats qui ne seraient sinon pas jugés fiables (pour ne pas avoir été communiqués au public comme il se doit).
 
       Si cette règle n'est pas configurée, cela signifie que si les certificats ne sont pas communiqués tel que le prévoient les règles de transparence des certificats, <ph name="PRODUCT_NAME" /> considère alors qu'ils ne sont pas fiables.
@@ -3841,7 +3834,7 @@
 
       Si cette règle n'est pas configurée, la règle <ph name="DEFAULT_GEOLOCATION_SETTING" /> s'applique pour tous les sites, à condition qu'elle soit définie. Si ce n'est pas le cas, le paramètre défini par l'utilisateur s'applique.
 
-      Pour en savoir plus sur les formats <ph name="URL_LABEL" /> valides, veuillez consulter https://chromeenterprise.google/policies/url-patterns. Les caractères génériques (<ph name="WILDCARD_VALUE" />) sont autorisés.</translation>
+      Pour en savoir plus sur les formats d‘<ph name="URL_LABEL" /> valides, veuillez consulter https://chromeenterprise.google/policies/url-patterns. Les caractères génériques (<ph name="WILDCARD_VALUE" />) sont autorisés.</translation>
 <translation id="3675303748198647471">setTimeout(…, 0) est souvent utilisée pour décomposer les longues tâches JavaScript.
           Lorsque cette règle est activée, les fonctions setTimeouts et setIntervals ayant un intervalle inférieur à 4 ms ne sont pas limitées de façon aussi agressive.
           Les performances à court terme sont alors meilleures, mais les fonctions setTimeouts des sites abusant de l'API seront finalement encore limitées.
@@ -11864,13 +11857,13 @@
        Notez également qu'elle ne sera plus applicable à compter de la version 84 de <ph name="PRODUCT_NAME" />.</translation>
 <translation id="9010080992450148617">Autoriser les utilisateurs inscrits au Programme Protection Avancée à envoyer leurs téléchargements à Google pour une analyse approfondie</translation>
 <translation id="9012101302849557459">Étendre la compatibilité pour les applis Chrome sur <ph name="MS_WIN_NAME" />, <ph name="MAC_OS_NAME" /> et <ph name="LINUX_OS_NAME" />.</translation>
-<translation id="9012332684658600011">Lorsque cette règle est activée, la requête principale est bloquée chaque fois qu'un avertissement est censé s'afficher dans les <ph name="CHROME_DEVTOOLS_NAME" /> en raison de l'échec des vérifications <ph name="LOCAL_NETWORK_ACCESS" />.
+<translation id="9012332684658600011">Lorsque cette règle est activée, la requête principale est bloquée chaque fois qu'un avertissement est censé s'afficher dans les <ph name="CHROME_DEVTOOLS_NAME" /> en raison de l'échec des vérifications "<ph name="LOCAL_NETWORK_ACCESS" />".
 
-Si cette règle est désactivée ou n'est pas configurée, les requêtes <ph name="LOCAL_NETWORK_ACCESS" /> utiliseront le traitement par défaut.
+Si cette règle est désactivée ou n'est pas configurée, les requêtes "<ph name="LOCAL_NETWORK_ACCESS" />" utiliseront le traitement par défaut.
 
-Pour connaître les restrictions concernant <ph name="LOCAL_NETWORK_ACCESS" />, consultez https://wicg.github.io/local-network-access/.
+Pour connaître les restrictions concernant "<ph name="LOCAL_NETWORK_ACCESS" />", consultez https://wicg.github.io/local-network-access/.
 
-Cette règle est obsolète, car <ph name="LOCAL_NETWORK_ACCESS" /> a été lancée par défaut. La règle sera supprimée dans une prochaine version.</translation>
+Cette règle est obsolète, car "<ph name="LOCAL_NETWORK_ACCESS" />" a été lancée par défaut. La règle sera supprimée dans une prochaine version.</translation>
 <translation id="9013875414788074110">Lors de la connexion, l'authentification dans <ph name="PRODUCT_OS_NAME" /> peut être effectuée sur un serveur (en ligne) ou à l'aide d'un mot de passe en cache (hors connexion).
 
       Si cette règle est définie sur la valeur -1, l'utilisateur peut s'authentifier hors connexion sans limite de temps. Si elle est définie sur une autre valeur, celle-ci indique le délai suite à une authentification en ligne après lequel l'utilisateur doit à nouveau procéder à cette authentification.
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb
index 1fe3de0c..62be8a9 100644
--- a/components/policy/resources/policy_templates_id.xtb
+++ b/components/policy/resources/policy_templates_id.xtb
@@ -2503,13 +2503,6 @@
 <translation id="2614156176932194496">Setelan untuk integrasi Mode AI Google di kolom URL dan kotak penelusuran halaman Tab Baru.</translation>
 <translation id="2615240493030733717">Melaporkan Info Zona waktu</translation>
 <translation id="2619258867868873629">Tujuan 'Simpan sebagai PDF', serta tujuan 'Simpan ke Google Drive' di perangkat <ph name="PRODUCT_OS_NAME" /></translation>
-<translation id="262035875928535253">Konfigurasi daftar domain tempat <ph name="PRODUCT_NAME" /> harus menonaktifkan <ph name="PASSWORD_MANAGER_NAME" />. Artinya, alur kerja Simpan dan Isi Otomatis akan dinonaktifkan, sehingga sandi untuk situs tersebut tidak dapat disimpan atau diisi otomatis ke formulir web.
-
-Jika ada domain dalam daftar, <ph name="PASSWORD_MANAGER_NAME" /> akan dinonaktifkan untuk domain tersebut.
-
-Jika domain tidak ada dalam daftar, <ph name="PASSWORD_MANAGER_NAME" /> akan tersedia untuk domain tersebut.
-
-Jika kebijakan ini tidak disetel, <ph name="PASSWORD_MANAGER_NAME" /> akan tersedia untuk semua domain.</translation>
 <translation id="2621290137818374425">Menyetel kebijakan akan menonaktifkan persyaratan pengungkapan Transparansi Sertifikat untuk nama host di URL yang ditentukan. Meskipun mempersulit deteksi salah terbit sertifikat, host tetap dapat menggunakan sertifikat yang tidak tepercaya (karena tidak diungkapkan secara publik dengan sesuai).
 
       Jika kebijakan ini tidak disetel, berarti saat sertifikat yang memerlukan pengungkapan melalui Transparansi Sertifikat tidak diungkapkan, <ph name="PRODUCT_NAME" /> tidak akan memercayai sertifikat tersebut.
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb
index c634dce..02293d57 100644
--- a/components/policy/resources/policy_templates_it.xtb
+++ b/components/policy/resources/policy_templates_it.xtb
@@ -2443,13 +2443,6 @@
 <translation id="2614156176932194496">Impostazioni per le integrazioni di AI Mode di Google nella barra degli indirizzi e nella casella di ricerca della pagina Nuova scheda.</translation>
 <translation id="2615240493030733717">Segnala informazioni sul fuso orario</translation>
 <translation id="2619258867868873629">La destinazione "Salva come PDF" e la destinazione "Salva su Google Drive" sui dispositivi <ph name="PRODUCT_OS_NAME" /></translation>
-<translation id="262035875928535253">Configura l'elenco di domini in cui <ph name="PRODUCT_NAME" /> deve disattivare <ph name="PASSWORD_MANAGER_NAME" />. Ciò significa che i workflow di salvataggio e compilazione verranno disattivati, in modo che le password di questi siti web non possano essere salvate o compilate automaticamente nei moduli web.
-
-Se un dominio è presente nell'elenco, <ph name="PASSWORD_MANAGER_NAME" /> verrà disattivato per quel dominio.
-
-Se un dominio non è presente nell'elenco, <ph name="PASSWORD_MANAGER_NAME" /> sarà disponibile per il dominio.
-
-Se la policy non viene configurata, <ph name="PASSWORD_MANAGER_NAME" /> sarà disponibile per tutti i domini.</translation>
 <translation id="2621290137818374425">La configurazione della policy consente di disattivare i requisiti relativi alle informative di Certificate Transparency per i nomi host negli URL specificati. Anche se rilevare certificati emessi in modo scorretto diventa più difficile, gli host possono continuare a utilizzare certificati che altrimenti non verrebbero ritenuti attendibili, in quanto non resi pubblici in modo appropriato.
 
       Se la policy non viene configurata e se i certificati che richiedono informative tramite Certificate Transparency non vengono comunicati, <ph name="PRODUCT_NAME" /> non ritiene attendibili questi certificati.
@@ -2484,7 +2477,7 @@
 Se la policy viene impostata su false o se non viene configurata, il controllo della connettività IPv6 non viene sostituito.
 Il sistema eseguirà una query sui record AAAA soltanto quando può essere connesso a un host IPv6 globale.</translation>
 <translation id="2647069081229792812">Attiva o disattiva la funzione di modifica dei preferiti</translation>
-<translation id="264771271300359481">Non consentire ai siti di usare l'autorizzazione di accesso dei siti agli appunti</translation>
+<translation id="264771271300359481">Non consentire ai siti di usare l'autorizzazione di accesso agli appunti</translation>
 <translation id="2649537800219643135">Origine immagine schermata di blocco schermo utente.</translation>
 <translation id="2649896281375932517">Consenti agli utenti di decidere</translation>
 <translation id="2650049181907741121">Azione da compiere quando l'utente chiude lo schermo</translation>
@@ -5698,7 +5691,7 @@
 <translation id="4860900625632464759">Consenti agli utenti di sincronizzare i messaggi SMS tra il telefono e Chromebook</translation>
 <translation id="486146220825734683">Non consentire agli utenti di memorizzare le password Kerberos</translation>
 <translation id="4861767323695239729">Configura i metodi di immissione consentiti in una sessione utente</translation>
-<translation id="4866159293453405598">La configurazione della policy consente di impostare un elenco di pattern URL che specificano i siti che non possono usare l'autorizzazione per il sito ad accedere agli appunti. Tutte le operazioni relative agli appunti nelle origini corrispondenti ai pattern non sono incluse. Ad esempio, gli utenti potranno ancora incollare usando scorciatoie da tastiera perché questa operazione non è controllata dall'autorizzazione per il sito ad accedere agli appunti.
+<translation id="4866159293453405598">La configurazione della policy consente di impostare un elenco di pattern URL che specificano i siti che non possono usare l'autorizzazione di accesso agli appunti. Tutte le operazioni relative agli appunti nelle origini corrispondenti ai pattern non sono incluse. Ad esempio, gli utenti potranno ancora incollare usando scorciatoie da tastiera perché questa operazione non è controllata dall'autorizzazione di accesso agli appunti.
 
       Se la policy non viene configurata, <ph name="DEFAULT_CLIPBOARD_SETTING" /> si applica per tutti i siti, se impostata. In caso contrario, viene applicata l'impostazione personale dell'utente.
 
@@ -6323,7 +6316,7 @@
 
       Se la policy viene impostata su Disabled o se non viene configurata, lo stato dell'attività del dispositivo non verrà segnalato.
       Se la policy viene impostata su Enabled, lo stato dell'attività del dispositivo verrà segnalato al server, che potrà rilevare se il dispositivo è offline, purché l'utente sia affiliato.</translation>
-<translation id="5237063248422984115">La configurazione della policy consente di impostare un elenco di pattern URL che specificano i siti che possono usare l'autorizzazione per il sito ad accedere agli appunti. Tutte le operazioni relative agli appunti nelle origini corrispondenti ai pattern non sono incluse. Ad esempio, gli utenti potranno ancora incollare usando scorciatoie da tastiera perché questa operazione non è controllata dall'autorizzazione di accesso dei siti agli appunti.
+<translation id="5237063248422984115">La configurazione della policy consente di impostare un elenco di pattern URL che specificano i siti che possono usare l'autorizzazione di accesso agli appunti. Tutte le operazioni relative agli appunti nelle origini corrispondenti ai pattern non sono incluse. Ad esempio, gli utenti potranno ancora incollare usando scorciatoie da tastiera perché questa operazione non è controllata dall'autorizzazione di accesso agli appunti.
 
 
       Se la policy non viene configurata, <ph name="DEFAULT_CLIPBOARD_SETTING" /> si applica per tutti i siti, se impostata. In caso contrario, viene applicata l'impostazione personale dell'utente.
@@ -7040,11 +7033,11 @@
 <translation id="5649046890958064703">Se per la policy <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> viene scelta l'opzione <ph name="PRINTERS_BLACKLIST" />, la configurazione della policy <ph name="DEVICE_NATIVE_PRINTERS_BLACKLIST_POLICY_NAME" /> consente di specificare le stampanti che gli utenti non possono usare. Gli utenti avranno a disposizione tutte le stampanti, tranne quelle i cui ID sono elencati in questa policy. Gli ID devono corrispondere ai campi <ph name="ID_FIELD" /> o <ph name="GUID_FIELD" /> del file specificato nella policy <ph name="DEVICE_PRINTERS_POLICY_NAME" />.
 
       Questa policy è deprecata. Usa la policy <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" />.</translation>
-<translation id="5649773663020498924">Se questa policy viene impostata su 2, i siti non possono usare l'autorizzazione di accesso dei siti agli appunti. Se la policy viene impostata su 3 o se non viene configurata, l'utente può cambiare l'impostazione e stabilire se le API Clipboard sono disponibili quando un sito vuole usarne una.
+<translation id="5649773663020498924">Se questa policy viene impostata su 2, i siti non possono usare l'autorizzazione di accesso agli appunti. Se la policy viene impostata su 3 o se non viene configurata, l'utente può cambiare l'impostazione e stabilire se le API Clipboard sono disponibili quando un sito vuole usarne una.
 
       È possibile eseguire l'override della policy per pattern URL specifici utilizzando le policy <ph name="CLIPBOARD_ALLOWED_FOR_URLS_POLICY_NAME" /> e <ph name="CLIPBOARD_BLOCKED_FOR_URLS_POLICY_NAME" />.
 
-      Questa policy incide soltanto sulle operazioni relative agli appunti controllate dall'autorizzazione di accesso dei siti agli appunti e non sulle scritture di appunti purificate o sulle operazioni di copia e incolla affidabili.</translation>
+      Questa policy incide soltanto sulle operazioni relative agli appunti controllate dall'autorizzazione di accesso agli appunti e non sulle scritture di appunti purificate o sulle operazioni di copia e incolla affidabili.</translation>
 <translation id="5649788773465136073">Disattiva l'uso degli identificatori di contenuti protetti con i siti, il che potrebbe comportare una qualità inferiore della riproduzione dei contenuti protetti.</translation>
 <translation id="5650256117857913687">Non consente agli utenti che accedono da remoto di aprire gli URL lato host nel browser client locale</translation>
 <translation id="5650716720715977549">Applica limitazioni alle richieste agli endpoint di rete con un livello di protezione più alto</translation>
@@ -8331,7 +8324,7 @@
       1) Le impostazioni internazionali specificate dall'utente (se configurate).
       2) Le impostazioni internazionali di sistema.
       3) Le impostazioni internazionali di riserva (en-US).</translation>
-<translation id="6493089139124468815">Consenti ai siti di chiedere all'utente di concedere l'autorizzazione di accesso dei siti agli appunti</translation>
+<translation id="6493089139124468815">Consenti ai siti di chiedere all'utente di concedere l'autorizzazione di accesso agli appunti</translation>
 <translation id="6493918190032622602">Versione minima consentita di <ph name="PRODUCT_OS_NAME" />.</translation>
 <translation id="6495337487202227251">Tieni presente che questa policy è obsoleta e verrà rimossa nella versione 85 di <ph name="PRODUCT_OS_NAME" />. Usa la policy <ph name="SCREEN_LOCK_DELAYS_POLICY_NAME" />.
 
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb
index f745f59..a4cd452 100644
--- a/components/policy/resources/policy_templates_ja.xtb
+++ b/components/policy/resources/policy_templates_ja.xtb
@@ -2291,13 +2291,6 @@
 <translation id="2614156176932194496">アドレスバーと新しいタブページの検索ボックスでの Google AI モード統合の設定。</translation>
 <translation id="2615240493030733717">タイムゾーン情報を報告する</translation>
 <translation id="2619258867868873629"><ph name="PRODUCT_OS_NAME" /> デバイスの [PDF に保存] の保存先と [Google ドライブに保存] の保存先</translation>
-<translation id="262035875928535253"><ph name="PRODUCT_NAME" /> で <ph name="PASSWORD_MANAGER_NAME" /> を必ず無効にするドメインのリストを設定します。これにより、保存と入力のワークフローが無効になり、これらのウェブサイトのパスワードを保存したり、ウェブフォームに自動入力したりできなくなります。
-
-リストに含めたドメインでは、<ph name="PASSWORD_MANAGER_NAME" /> が無効になります。
-
-リストに含めていないドメインでは、<ph name="PASSWORD_MANAGER_NAME" /> を使用できます。
-
-このポリシーを未設定のままにした場合、<ph name="PASSWORD_MANAGER_NAME" /> はすべてのドメインで使用できます。</translation>
 <translation id="2621290137818374425">このポリシーを設定した場合、指定した URL 内のホスト名について、Certificate Transparency(証明書の透明性)の開示要件が無効になります。ホストに対して間違って発行された証明書は検出が難しくなりますが、適切に公開されていないことを理由に通常であれば信頼できないものとして扱われる証明書でも、引き続き使用できるようになります。ポリシーを未設定のままにした場合、Certificate Transparency(証明書の透明性)に基づき開示が必要な証明書が開示されていなければ、<ph name="PRODUCT_NAME" /> で信頼されません。
 
       URL のパターンは、https://support.google.com/chrome/a?p=url_blocklist_filter_format の形式で指定します。ただし、スキーム、ポート、パスに関係なく特定のホスト名に対して証明書が有効になるため、<ph name="PRODUCT_NAME" /> で考慮されるのは URL のホスト名の部分のみです。ワイルドカードを使ったホストの指定はサポートされていません。</translation>
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb
index 3673ec1..b68e7b40 100644
--- a/components/policy/resources/policy_templates_ko.xtb
+++ b/components/policy/resources/policy_templates_ko.xtb
@@ -2417,13 +2417,6 @@
 <translation id="2614156176932194496">주소 표시줄과 새 탭 페이지 검색창에 표시되는 Google AI 모드 통합 설정입니다.</translation>
 <translation id="2615240493030733717">시간대 정보 보고</translation>
 <translation id="2619258867868873629"><ph name="PRODUCT_OS_NAME" /> 기기에서의 'PDF로 저장' 위치 및 'Google Drive에 저장' 위치</translation>
-<translation id="262035875928535253"><ph name="PRODUCT_NAME" />에서 <ph name="PASSWORD_MANAGER_NAME" />를 사용 중지해야 하는 도메인 목록을 구성합니다. 즉, 저장 및 입력 워크플로가 사용 중지되므로 해당 웹사이트의 비밀번호를 저장하거나 웹 양식에 자동으로 입력할 수 없습니다.
-
-목록에 도메인이 있는 경우 해당 도메인에 대해 <ph name="PASSWORD_MANAGER_NAME" />가 사용 중지됩니다.
-
-목록에 도메인이 없으면 <ph name="PASSWORD_MANAGER_NAME" />를 사용할 수 있습니다.
-
-정책을 설정하지 않으면 모든 도메인에서 <ph name="PASSWORD_MANAGER_NAME" />를 사용할 수 있습니다.</translation>
 <translation id="2621290137818374425">정책을 설정하면 지정된 URL의 호스트 이름에 인증서 투명성 공개 요구사항이 사용 중지됩니다. 이렇게 하면 잘못 발급된 인증서를 감지하기는 어려워지지만 적절하게 공개되지 않아 신뢰할 수 없던 인증서를 호스트에서 계속해서 사용할 수 있습니다.
 
       정책을 설정하지 않으면 인증서 투명성을 통해 공개해야 하는 인증서가 공개되지 않은 경우 <ph name="PRODUCT_NAME" />에서 인증서를 신뢰하지 않습니다.
@@ -11434,7 +11427,7 @@
 이는 사용자가 변경할 수 없으며 사진은 항상 정의된 디렉터리에 저장됩니다.
 
 정책은 <ph name="DOWNLOAD_DIRECTORY_POLICY_NAME" /> 정책과 동일한 형식을 사용합니다.
-위치는 로컬 파일 시스템 또는 <ph name="GOOGLE_DRIVE_NAME" />('${google_drive}' 접두사 사용) 또는 <ph name="MICROSOFT_ONE_DRIVE_NAME" />('${microsoft_onedrive}' 접두사 사용)로 설정될 수 있습니다.
+위치는 로컬 파일 시스템 또는 <ph name="GOOGLE_DRIVE_NAME" />('${google_drive}' 접두사 사용) 또는 <ph name="MICROSOFT_ONE_DRIVE_NAME" />('${microsoft_onedrive}' 접두사 사용)(으)로 설정될 수 있습니다.
 정책을 빈 문자열로 설정하면 사진이 기본 '내 파일/카메라' 디렉터리에 저장됩니다.
 사용 가능한 변수 목록(https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables)을 참고하세요.
 
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb
index 0194d7a..77ff8783 100644
--- a/components/policy/resources/policy_templates_nl.xtb
+++ b/components/policy/resources/policy_templates_nl.xtb
@@ -2381,13 +2381,6 @@
 <translation id="2614156176932194496">Instellingen voor integraties van de AI-modus van Google in de adresbalk en het zoekvak op de pagina Nieuw tabblad.</translation>
 <translation id="2615240493030733717">Informatie over tijdzone rapporteren</translation>
 <translation id="2619258867868873629">De bestemming Opslaan als pdf en de bestemming Opslaan in Google Drive op <ph name="PRODUCT_OS_NAME" />-apparaten</translation>
-<translation id="262035875928535253">Stel de lijst met domeinen in waarvoor <ph name="PRODUCT_NAME" /> <ph name="PASSWORD_MANAGER_NAME" /> moet uitzetten. Dit betekent dat de workflows Opslaan en Invullen worden uitgezet, zodat wachtwoorden voor die websites niet worden opgeslagen of automatisch worden ingevuld in webformulieren.
-
-Als een domein in de lijst staat, wordt <ph name="PASSWORD_MANAGER_NAME" /> voor dat domein uitgezet.
-
-Als een domein niet in de lijst staat, is <ph name="PASSWORD_MANAGER_NAME" /> beschikbaar voor dat domein.
-
-Als je het beleid niet instelt, is <ph name="PASSWORD_MANAGER_NAME" /> beschikbaar voor alle domeinen.</translation>
 <translation id="2621290137818374425">Als je het beleid instelt, wordt de handhaving van vereisten voor openbaarmaking via Certificaattransparantie uitgezet voor de hostnamen in de opgegeven URL's. Hoewel het moeilijker wordt om misbruik van certificaten vast te stellen, kunnen hosts certificaten blijven gebruiken die anders niet zouden worden vertrouwd (omdat deze niet op de juiste manier openbaar zijn gemaakt).
 
 Als je het beleid niet instelt, betekent dit dat als certificaten die openbaar moeten worden gemaakt via Certificaattransparantie niet openbaar worden gemaakt, de betreffende certificaten niet door <ph name="PRODUCT_NAME" /> worden vertrouwd.
@@ -3480,7 +3473,7 @@
       De experimentele instelling wordt in de toekomst verwijderd als het inline inlogproces alle SSO-inlogprocessen volledig ondersteunt.</translation>
 <translation id="3435229811562571593">Hiermee wordt een lijst met URL-patronen voor sites ingesteld waarmee sites worden gespecificeerd waarvoor het recht voor lokale lettertypen automatisch wordt geweigerd. Dit beperkt de mogelijkheid van sites om informatie over lokale lettertypen te bekijken.
 
-      Ga naar https://chromeenterprise.google/policies/url-patterns voor gedetailleerde informatie over geldige site-URL-patronen. Jokertekens (<ph name="WILDCARD_VALUE" />) zijn toegestaan. Dit beleid zoekt alleen overeenkomsten op basis van de herkomst, dus elk pad in het URL-patroon wordt genegeerd.
+      Ga naar https://chromeenterprise.google/policies/url-patterns voor gedetailleerde informatie over geldige site-URL-patronen. Jokertekens (<ph name="WILDCARD_VALUE" />) zijn toegestaan. Dit beleid zoekt alleen overeenkomsten op basis van de oorsprong, dus elk pad in het URL-patroon wordt genegeerd.
 
       Als dit beleid niet is ingesteld voor een site, is het beleid van <ph name="DEFAULT_LOCAL_FONTS_SETTING_POLICY_NAME" /> van toepassing op de site (als dit is ingesteld), anders worden de standaardinstellingen van de browser gevolgd en kunnen gebruikers per site kiezen of ze dit recht willen verlenen.</translation>
 <translation id="3435796032110614169">Verwijderen van afdrukgeschiedenis toestaan</translation>
@@ -10143,7 +10136,7 @@
 Jokertekens (<ph name="WILDCARD_VALUE" />) zijn toegestaan.
 
 Oorsprongen die overeenkomen met zowel geblokkeerde als toegestane beleidspatronen worden geblokkeerd.
-Voor oorsprongen waarvoor geen informatie is in beleid of gebruikersinstellingen is een eerder gebruikersgebaar vereist om deze API aan te roepen.</translation>
+Voor oorsprongen waarvoor geen informatie is in beleid of gebruikersinstellingen, is een eerder gebruikersgebaar vereist om deze API aan te roepen.</translation>
 <translation id="7881421274383404138">Met dit beleid worden bedrijfsprinters ingesteld. De indeling komt overeen met de dictionary <ph name="PRINTERS_POLICY_NAME" />, waarbij voor elke printer ook een veld <ph name="ID_FIELD" /> of <ph name="GUID_FIELD" /> verplicht is voor de toelatingslijst of weigeringslijst. Bestanden moeten een json-indeling hebben en mogen maximaal 5 MB zijn. In een bestand van 5 MB kunnen ongeveer 21.000 printers staan. De cryptografische hash wordt gebruikt om de integriteit van de download te verifiëren. Het bestand wordt gedownload, gecachet en opnieuw gedownload als de URL of de hash wordt gewijzigd. <ph name="PRODUCT_OS_NAME" /> downloadt het bestand voor printerconfiguraties en maakt printers beschikbaar in overeenstemming met <ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME" />, <ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME" /> en <ph name="PRINTERS_BULK_BLOCKLIST_POLICY_NAME" />.
 
       Dit beleid is niet van invloed op de mogelijkheid van gebruikers om printers op afzonderlijke apparaten in te stellen. Het is bedoeld als aanvulling op de printerinstellingen van afzonderlijke gebruikers.
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb
index e6c0f4ec..b285e67 100644
--- a/components/policy/resources/policy_templates_pt-BR.xtb
+++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -2497,13 +2497,6 @@
 <translation id="2614156176932194496">Configurações das integrações do Modo IA do Google na barra de endereço e na caixa de pesquisa da página "Nova guia".</translation>
 <translation id="2615240493030733717">Enviar informações de fuso horário</translation>
 <translation id="2619258867868873629">Os destinos "Salvar como PDF" e "Salvar no Google Drive" em dispositivos <ph name="PRODUCT_OS_NAME" /></translation>
-<translation id="262035875928535253">Configure a lista de domínios em que <ph name="PRODUCT_NAME" /> precisa desativar <ph name="PASSWORD_MANAGER_NAME" />. Isso significa que os fluxos de trabalho de salvar e preencher serão desativados, garantindo que as senhas desses sites não sejam salvas nem preenchidas automaticamente em formulários on-line.
-
-Se um domínio estiver na lista, <ph name="PASSWORD_MANAGER_NAME" /> será desativado para ele.
-
-Se um domínio não estiver na lista, <ph name="PASSWORD_MANAGER_NAME" /> vai estar disponível para ele.
-
-Se a política for deixada sem definição, <ph name="PASSWORD_MANAGER_NAME" /> vai ficar disponível para todos os domínios.</translation>
 <translation id="2621290137818374425">A definição da política desativa os requisitos de divulgação de Transparência dos certificados para os nomes de host nos URLs especificados. Embora dificultem a detecção de certificados incorretos, os hosts podem continuar usando certificados que, de outro modo, não seriam confiáveis, já que não foram divulgados publicamente de maneira adequada.
 
       Deixar esta política sem definição significa que, se os certificados que precisam ser divulgados pela Transparência dos certificados não forem, o <ph name="PRODUCT_NAME" /> não confiará nesses certificados.
@@ -3634,11 +3627,11 @@
       Se você desativar ou não definir esta configuração, o novo fluxo de login in-line será usado por padrão. Os usuários podem ativar o antigo fluxo de login baseado na Web com a flag de linha de comando --enable-web-based-signin.
 
       A configuração experimental será removida no futuro, quando o login in-line for compatível com todos os fluxos de login SSO.</translation>
-<translation id="3435229811562571593">Define uma lista de padrões de URL especificando sites que negam permissão a fontes locais automaticamente. Isso limita a capacidade dos sites de ver informações sobre fontes locais.
+<translation id="3435229811562571593">Define uma lista de padrões de URL que especificam quais sites negam permissão a fontes locais automaticamente. Isso limita a capacidade dos sites de ver informações sobre fontes locais.
 
-      Para saber mais sobre padrões de URL válidos, consulte https://chromeenterprise.google/policies/url-patterns. Caracteres curinga (<ph name="WILDCARD_VALUE" />) são permitidos. A política só faz a correspondência de origens, então os caminhos no padrão do URL serão ignorados.
+      Para informações mais detalhadas sobre padrões de URL válidos, consulte https://chromeenterprise.google/policies/url-patterns. Caracteres curinga (<ph name="WILDCARD_VALUE" />) são permitidos. A política só faz a correspondência de origens, então os caminhos no padrão do URL serão ignorados.
 
-      Se esta política for deixada sem definição para um site, a política de <ph name="DEFAULT_LOCAL_FONTS_SETTING_POLICY_NAME" /> será aplicada, quando configurada. Caso contrário, a permissão vai seguir os padrões do navegador e autorizar a escolha dos usuários para cada site.</translation>
+      Se esta política não for definida para um site, a política de <ph name="DEFAULT_LOCAL_FONTS_SETTING_POLICY_NAME" /> será aplicada, quando configurada. Caso contrário, a permissão vai seguir os padrões do navegador e autorizar a escolha dos usuários para cada site.</translation>
 <translation id="3435796032110614169">Permite a exclusão do histórico de trabalhos de impressão</translation>
 <translation id="3436217793443508863">O tempo, em milissegundos, sem entrada do usuário até que a tela seja bloqueada quando o dispositivo estiver funcionando com energia da bateria.</translation>
 <translation id="3437391374720747482">Preferir métodos de troca de chaves que atendam aos requisitos do CNSA 2.0</translation>
@@ -4763,11 +4756,11 @@
 Se a política for definida, será possível listar os padrões de URL que especificam quais sites não têm permissão para se comunicar usando a API Direct Sockets.
 Os padrões válidos são limitados a Apps Isolados da Web.
 
-Se a política não tiver definição, <ph name="DEFAULT_DIRECT_SOCKETS_SETTING_POLICY_NAME" /> será aplicada a todos os sites, se estiver definida.
+Se a política não for definida, <ph name="DEFAULT_DIRECT_SOCKETS_SETTING_POLICY_NAME" /> será aplicada a todos os sites, se esta estiver configurada.
 
 Os padrões de URL não podem entrar em conflito com <ph name="DIRECT_SOCKETS_ALLOWED_FOR_URLS_POLICY_NAME" />. Nenhuma política terá precedência se um URL tiver correspondência com ambas.
 
-Para saber mais sobre padrões de URL válidos, consulte https://chromeenterprise.google/policies/url-patterns. O valor <ph name="WILDCARD_VALUE" /> não é aceito para esta política.</translation>
+Para informações mais detalhadas sobre padrões de URL válidos, consulte https://chromeenterprise.google/policies/url-patterns. O valor <ph name="WILDCARD_VALUE" /> não é aceito para esta política.</translation>
 <translation id="4192388905594723944">URL para validação do token de autenticação do cliente de acesso remoto</translation>
 <translation id="4195119404667420672">A pré-busca de SpeculationRules pode ser enviada para URLs controlados pelo ServiceWorkers.</translation>
 <translation id="4195698007674066525">Usar o teclado numérico por padrão para a entrada de senhas</translation>
@@ -10610,7 +10603,7 @@
 Esta política substitui as configurações pessoais dos usuários e permite que origens correspondentes
 chamem a API sem uma interação anterior do usuário.
 
-Para saber mais sobre padrões de URL válidos, consulte
+Para informações mais detalhadas sobre os padrões de URL válidos, consulte
 https://chromeenterprise.google/policies/url-patterns.
 Caracteres curinga (<ph name="WILDCARD_VALUE" />) são permitidos.
 
@@ -10752,13 +10745,13 @@
 <translation id="7974114691960514888">Esta política não é mais suportada. Ativa o uso de servidores STUN e de retransmissão ao estabelecer conexão a um cliente remoto. Se esta configuração estiver ativada, este computador pode descobrir e conectar-se a computadores host remotos mesmo se separados por um firewall. Se esta configuração estiver desativada e conexões de UDP enviadas forem filtradas pelo firewall, este computador só poderá estabelecer conexões a computadores host na rede local.</translation>
 <translation id="7975777377454336782">Esta política permite definir uma lista de padrões de URL que especificam as origens de nível superior em que o particionamento de armazenamento de terceiros (do iframe de origem cruzada) precisa ser desativado.
 
-Se ela for deixada sem definição ou se uma origem de nível superior não corresponder a um dos padrões de URL, <ph name="DEFAULT_THIRD_PARTY_STORAGE_PARTITIONING_SETTING_POLICY_NAME" /> será aplicada.
+Se ela não for definida ou se uma origem de nível superior não corresponder a um dos padrões de URL, <ph name="DEFAULT_THIRD_PARTY_STORAGE_PARTITIONING_SETTING_POLICY_NAME" /> será aplicada.
 
-Para saber mais sobre padrões válidos, consulte https://chromeenterprise.google/policies/url-patterns. Os padrões listados aqui são tratados como origens, não URLs. Assim, recomendamos que você não especifique um caminho.
+Para informações mais detalhadas sobre padrões válidos, consulte https://chromeenterprise.google/policies/url-patterns. Os padrões listados aqui são tratados como origens, não URLs. Assim, recomendamos que você não especifique um caminho.
 
 Para conferir informações detalhadas sobre o particionamento de armazenamento de terceiros, consulte https://developers.google.com/privacy-sandbox/cookies/storage-partitioning.
 
-Isso será removido no Chrome 145, e é recomendável usar o método requestStorageAccess: https://developer.mozilla.org/en-US/docs/Web/API/Document/requestStorageAccess (em inglês). Você pode enviar feedback em https://crbug.com/425248669 (em inglês).</translation>
+Ele será removido no Chrome 145, e é recomendável usar o método requestStorageAccess: https://developer.mozilla.org/en-US/docs/Web/API/Document/requestStorageAccess (em inglês). Você pode enviar feedback em https://crbug.com/425248669 (em inglês).</translation>
 <translation id="7976103461034266553">Quando esta política estiver ativada, a função setTimeout() do JavaScript com um tempo limite de 0ms não vai ser limitada a 1ms.
           Quando ela estiver desativada, a função setTimeout() do JavaScript com um tempo limite de 0ms será limitada a 1ms.
           Se a política for deixada sem definição, use o comportamento padrão do navegador para o limite da função setTimeout().
@@ -11396,11 +11389,11 @@
 Se a política for definida como <ph name="PROVISION_MANAGED_CLIENT_CERTIFICATE_FOR_BROWSER_DISABLED" /> (valor 0) ou deixada sem definição, o <ph name="PRODUCT_NAME" /> não vai solicitar o certificado do cliente. Esta política foi ativada anteriormente. Assim, se o certificado do cliente gerenciado de um navegador já tiver sido provisionado, ele não será excluído, mas não vai ficar disponível para conexões mTLS nem será renovado quando expirar.</translation>
 <translation id="8401567123761348600">Se a política for definida, será possível configurar uma lista de padrões de URL que especifique os sites que podem acessar sensores de luz e movimento.
 
-      Se a política não tiver definição, <ph name="DEFAULT_SENSORS_SETTING_POLICY_NAME" /> será aplicada a todos os sites, se estiver definida. Caso contrário, a configuração pessoal do usuário será aplicada.
+      Se a política não for definida, <ph name="DEFAULT_SENSORS_SETTING_POLICY_NAME" /> será aplicada a todos os sites, se esta estiver configurada. Caso contrário, a configuração pessoal do usuário será aplicada.
 
-      Se o mesmo padrão de URL existir nesta política e na política <ph name="SENSORS_BLOCKED_FOR_URLS_POLICY_NAME" />, a segunda terá prioridade e o acesso a sensores de luz e movimento será bloqueado.
+      Se o mesmo padrão de URL existir nesta política e na política <ph name="SENSORS_BLOCKED_FOR_URLS_POLICY_NAME" />, a segunda terá prioridade, e o acesso a sensores de luz e movimento será bloqueado.
 
-      Para saber mais sobre padrões de <ph name="URL_LABEL" /> válidos, consulte https://chromeenterprise.google/policies/url-patterns. Caracteres curinga (<ph name="WILDCARD_VALUE" />) são permitidos.</translation>
+      Para informações mais detalhadas sobre padrões de <ph name="URL_LABEL" /> válidos, consulte https://chromeenterprise.google/policies/url-patterns. Caracteres curinga (<ph name="WILDCARD_VALUE" />) são permitidos.</translation>
 <translation id="8402079500086185021">Sempre abrir arquivos em PDF externamente</translation>
 <translation id="8402357110539568621">Ativar o recurso de acessibilidade do teclado virtual.
 
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb
index 8e3a639e..b32a7e08 100644
--- a/components/policy/resources/policy_templates_ru.xtb
+++ b/components/policy/resources/policy_templates_ru.xtb
@@ -2391,13 +2391,6 @@
 <translation id="2614156176932194496">Настройки интеграции режима ИИ от Google в адресной строке и окне поиска на странице с новой вкладкой</translation>
 <translation id="2615240493030733717">Передача информации о часовом поясе</translation>
 <translation id="2619258867868873629">Варианты "Сохранить как PDF" и "Сохранить на Google Диске" на устройствах <ph name="PRODUCT_OS_NAME" /></translation>
-<translation id="262035875928535253">Вы можете настроить список доменов, при обращении к которым <ph name="PRODUCT_NAME" /> отключает функцию "<ph name="PASSWORD_MANAGER_NAME" />". Это приведет к тому, что на указанных сайтах перестанут работать функции сохранения и автозаполнения паролей в веб-формах.
-
-Для доменов, внесенных в список, <ph name="PASSWORD_MANAGER_NAME" /> будет недоступен.
-
-<ph name="PASSWORD_MANAGER_NAME" /> будет работать для остальных сайтов, которые не указаны в списке.
-
-Если правило не настроено, <ph name="PASSWORD_MANAGER_NAME" /> будет доступен для всех доменов.</translation>
 <translation id="2621290137818374425">Если правило настроено, то для имен хостов в указанных URL будет отключена проверка сертификатов. Хосты смогут продолжать работу с ненадежными сертификатами, не прошедшими проверку безопасности. При этом выявлять ненадежные сертификаты для таких хостов станет сложнее.
 
       Если правило не настроено, то <ph name="PRODUCT_NAME" /> будет считать ненадежными любые сертификаты, не прошедшие проверку безопасности.
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb
index 8d38215c..9a5c99b6 100644
--- a/components/policy/resources/policy_templates_th.xtb
+++ b/components/policy/resources/policy_templates_th.xtb
@@ -1845,6 +1845,7 @@
 <translation id="2258126710006312594">อนุญาตให้ผู้ใช้ที่เข้าถึงจากระยะไกลโอนไฟล์ไปยัง/จากโฮสต์</translation>
 <translation id="225830954785359083">ป้องกันไม่ให้หน้าเว็บแสดงป๊อปอัปในระหว่างการยกเลิกการโหลด</translation>
 <translation id="2261648512244797294">ปิดใช้การพิมพ์ Privet ที่เลิกใช้งาน</translation>
+<translation id="2262701937800507517">ใช้ลำดับการเข้ารหัสเริ่มต้นของ <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="2263881357524831360">อนุญาตให้ใช้เครื่องมือจัดการรหัสผ่านของบุคคลที่สามใน <ph name="PRODUCT_NAME" /> บน <ph name="ANDROID_NAME" /></translation>
 <translation id="2266422599396179941">อนุญาตให้ผู้ใช้ส่งความคิดเห็น</translation>
 <translation id="2268891553068901979">การตั้งค่านโยบายเป็น "เปิดใช้" จะปิดการซิงค์ <ph name="GOOGLE_DRIVE_NAME" /> ในแอป Files ของ <ph name="PRODUCT_OS_NAME" /> เมื่ออุปกรณ์ใช้การเชื่อมต่อเครือข่ายมือถือ ระบบจะซิงค์ข้อมูลกับ Google ไดรฟ์เมื่ออุปกรณ์เชื่อมต่อผ่าน Wi-Fi หรืออีเทอร์เน็ตเท่านั้น
@@ -2389,13 +2390,6 @@
 <translation id="2614156176932194496">การตั้งค่าสำหรับการผสานรวมโหมด AI ของ Google ในแถบที่อยู่และช่องค้นหาในหน้าแท็บใหม่</translation>
 <translation id="2615240493030733717">รายงานข้อมูลเขตเวลา</translation>
 <translation id="2619258867868873629">ปลายทางของ "บันทึกเป็น PDF" และปลายทางของ "บันทึกลงใน Google ไดรฟ์" ในอุปกรณ์ <ph name="PRODUCT_OS_NAME" /></translation>
-<translation id="262035875928535253">กำหนดค่ารายการโดเมนที่ <ph name="PRODUCT_NAME" /> ควรปิดใช้ <ph name="PASSWORD_MANAGER_NAME" /> ซึ่งหมายความว่าระบบจะปิดใช้เวิร์กโฟลว์ "บันทึกและป้อนข้อมูล" เพื่อป้องกันไม่ให้บันทึกหรือป้อนรหัสผ่านของเว็บไซต์เหล่านั้นลงในแบบฟอร์มบนเว็บโดยอัตโนมัติ
-
-หากโดเมนอยู่ในรายการ ระบบจะปิดใช้ <ph name="PASSWORD_MANAGER_NAME" /> สำหรับโดเมนนั้น
-
-หากโดเมนไม่อยู่ในรายการ <ph name="PASSWORD_MANAGER_NAME" /> จะพร้อมใช้งานสำหรับโดเมนนั้น
-
-หากไม่ได้ตั้งค่านโยบาย <ph name="PASSWORD_MANAGER_NAME" /> จะพร้อมใช้งานสำหรับโดเมนทั้งหมด</translation>
 <translation id="2621290137818374425">การตั้งค่านโยบายจะปิดใช้ข้อกำหนดในการเปิดเผยข้อมูลความโปร่งใสของใบรับรองสำหรับชื่อโฮสต์ใน URL ที่ระบุ โฮสต์สามารถใช้ใบรับรองที่ไม่น่าเชื่อถือต่อไปได้ (เนื่องจากไม่มีการเปิดเผยต่อสาธารณะอย่างเหมาะสม) แต่จะทำให้ตรวจหาใบรับรองที่ออกอย่างไม่ถูกต้องได้ยากขึ้น
 
       การไม่ตั้งค่านโยบายนี้หมายความว่าหากไม่มีการเปิดเผยความโปร่งใสของใบรับรองตามที่ใบรับรองกำหนด "<ph name="PRODUCT_NAME" />" ก็จะไม่เชื่อถือใบรับรองนั้น
@@ -2603,6 +2597,23 @@
 <translation id="2812417768214606683">นโยบายนี้ระบุรายการอุปกรณ์จัดเก็บข้อมูล USB ที่ได้รับการยกเว้นจากนโยบาย <ph name="EXTERNAL_STORAGE_DISABLED_POLICY_NAME" /> และ <ph name="EXTERNAL_STORAGE_READ_ONLY_POLICY_NAME" />
 
 รายการต่างๆ เป็นการจับคู่ระหว่างตัวระบุผู้ให้บริการ USB และตัวระบุผลิตภัณฑ์ซึ่งระบุรุ่นอุปกรณ์ USB ที่เจาะจง</translation>
+<translation id="2816735327277809365">นโยบายนี้กำหนดค่า <ph name="PRODUCT_OS_NAME" /> เพื่อจัดลำดับการเข้ารหัสลับที่ต้องการใน TLS 1.3 เพื่อแสดงถึงความต้องการอัลกอริทึมที่ได้รับการอนุมัติจากระเบียบการปฏิบัติตามข้อกำหนดที่เฉพาะเจาะจง เมื่อส่งคำขอเครือข่ายจากหน้าจอเข้าสู่ระบบ
+
+การตั้งค่านโยบายนี้ไม่ได้รับประกันว่าอัลกอริทึมที่เฉพาะเจาะจงจะได้รับการเจรจา
+
+นโยบายนี้มีขึ้นเพื่อให้ผู้ให้บริการเซิร์ฟเวอร์ที่ต้องการรองรับไคลเอ็นต์ทั้งที่มีและไม่มีข้อกำหนดด้านการปฏิบัติตามข้อกำหนดสามารถแยกความแตกต่างระหว่างไคลเอ็นต์เหล่านั้น และเลือกใช้เฉพาะอัลกอริทึมที่ไม่ใช่ค่าเริ่มต้นบางรายการซึ่งมีวิทยาการเข้ารหัสที่มีความปลอดภัยระดับสูงสำหรับไคลเอ็นต์ที่กำหนดค่าไว้อย่างชัดเจนให้ต้องการใช้อัลกอริทึมเหล่านั้น
+
+การตั้งค่านโยบายเป็น "<ph name="CNSA_NAME" />" จะกำหนดค่า <ph name="PRODUCT_OS_NAME" /> ให้เลือกใช้การเข้ารหัสที่จำเป็นสำหรับการปฏิบัติตามข้อกำหนดของชุดอัลกอริทึมเพื่อความมั่นคงแห่งชาติเชิงพาณิชย์เวอร์ชัน 1.0 และ 2.0 (Commercial National Security Algorithm Suite 1.0 และ 2.0 หรือ CNSA 1.0 และ 2.0)
+
+การไม่ตั้งค่านโยบายหรือตั้งค่าเป็น "<ph name="DEFAULT_NAME" />" จะกำหนดค่า <ph name="PRODUCT_OS_NAME" /> ให้ใช้การเข้ารหัสตามค่าเริ่มต้น
+
+ไม่จำเป็นต้องตั้งค่านโยบายนี้เพื่อความปลอดภัย วิทยาการเข้ารหัสเริ่มต้นที่ <ph name="PRODUCT_OS_NAME" /> ใช้มีความปลอดภัยเพียงพอที่จะป้องกันการโจมตีแบบบรูตฟอร์ซโดยใช้พลังงานทั้งหมดของดวงอาทิตย์
+
+การตั้งค่านโยบายนี้จะทำให้ <ph name="PRODUCT_OS_NAME" /> ทำงานช้าลงเมื่อส่งคำขอเครือข่ายจากหน้าจอเข้าสู่ระบบ
+
+นโยบายนี้มีผลเฉพาะกับ TLS 1.3 และ QUIC เท่านั้น โดยไม่มีผลกับ TLS เวอร์ชันก่อนหน้า
+
+นโยบายอุปกรณ์นี้เทียบเท่านโยบายผู้ใช้ <ph name="PREFER_SLOW_CIPHERS_POLICY_NAME" /> แต่จะมีผลกับโปรไฟล์การลงชื่อเข้าใช้บนหน้าจอเข้าสู่ระบบแทน</translation>
 <translation id="2816964824289752181">เปิดใช้ <ph name="DESK_API_NAME" /> สำหรับการควบคุม <ph name="PRODUCT_OS_NAME" /> ของบุคคลที่สาม</translation>
 <translation id="2818074121667686266">เมื่อตั้งค่านโยบายเป็น "เปิดใช้" หรือไม่ได้ตั้งค่า ผู้ใช้จะได้รับข้อความแจ้งหากมีการเข้าถึงการจับเสียง ยกเว้นใน URL ที่ตั้งค่าไว้ในรายการ AudioCaptureAllowedUrls
 
@@ -4381,7 +4392,7 @@
 สำหรับ <ph name="PRODUCT_OS_NAME" /> นโยบายนี้เกี่ยวข้องกับเอกสารรับรองระยะไกลซึ่งระบบสร้างใบรับรองโดยอัตโนมัติแล้วอัปโหลดไปยังเซิร์ฟเวอร์ โปรดใช้นโยบาย <ph name="DEVICE_LOGIN_SCREEN_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST_POLICY_NAME" /> สำหรับการใช้งานโฟลว์เอกสารรับรองบนหน้าจอการเข้าสู่ระบบของอุปกรณ์
 
 ดูข้อมูลโดยละเอียดเกี่ยวกับรูปแบบ <ph name="URL_LABEL" /> ที่ถูกต้องได้ที่ https://support.google.com/chrome/a?p=url_blocklist_filter_format</translation>
-<translation id="406637577497776959">การตั้งค่านโยบายนี้เป็นการระบุรายการ URL ที่จะมีการจับคู่รูปแบบกับต้นทางการรักษาความปลอดภัยของ URL ที่ขอ หากรูปแบบตรงกัน ระบบจะให้สิทธิ์เข้าถึงอุปกรณ์จับภาพวิดีโอโดยไม่แสดงข้อความแจ้ง
+<translation id="406637577497776959">การตั้งค่านโยบายนี้เป็นการระบุรายการ URL ที่จะมีการจับคู่รูปแบบกับต้นทางการรักษาความปลอดภัยของ URL ที่ขอ หากรูปแบบตรงกัน ระบบจะให้สิทธิ์เข้าถึงอุปกรณ์บันทึกวิดีโอโดยไม่แสดงข้อความแจ้ง
 
       ดูข้อมูลโดยละเอียดเกี่ยวกับรูปแบบ <ph name="URL_LABEL" /> ที่ถูกต้องได้ที่ https://chromeenterprise.google/policies/url-patterns/ อย่างไรก็ตาม โปรดทราบว่านโยบายนี้ไม่รองรับรูปแบบ "*" ที่ตรงกับ URL ใดก็ตาม</translation>
 <translation id="4070039109671307724">เบ็ดเตล็ด</translation>
@@ -4972,6 +4983,25 @@
 
       ดูข้อมูลโดยละเอียดเกี่ยวกับรูปแบบ URL ที่ถูกต้องได้ที่ https://chromeenterprise.google/policies/url-patterns/</translation>
 <translation id="4485425108474077672">กำหนดค่า URL หน้าแท็บใหม่</translation>
+<translation id="4485667899983529614">นโยบายนี้กำหนดค่า <ph name="PRODUCT_OS_NAME" /> เพื่อจัดลำดับอัลกอริทึมของข้อตกลงเกี่ยวกับคีย์ที่ต้องการ (กลุ่มที่รองรับ) ใน TLS 1.3 เพื่อแสดงถึงความต้องการอัลกอริทึมที่ได้รับการอนุมัติจากระเบียบการปฏิบัติตามข้อกำหนดที่เฉพาะเจาะจง เมื่อส่งคำขอเครือข่ายจากหน้าจอเข้าสู่ระบบ
+
+การตั้งค่านโยบายนี้ไม่ได้รับประกันว่าอัลกอริทึมที่เฉพาะเจาะจงจะได้รับการเจรจา
+
+นโยบายนี้มีขึ้นเพื่อให้ผู้ให้บริการเซิร์ฟเวอร์ที่ต้องการรองรับไคลเอ็นต์ทั้งที่มีและไม่มีข้อกำหนดด้านการปฏิบัติตามข้อกำหนดสามารถแยกความแตกต่างระหว่างไคลเอ็นต์เหล่านั้น และเลือกใช้เฉพาะอัลกอริทึมที่ไม่ใช่ค่าเริ่มต้นบางรายการซึ่งมีวิทยาการเข้ารหัสที่มีความปลอดภัยระดับสูงสำหรับไคลเอ็นต์ที่กำหนดค่าไว้อย่างชัดเจนให้ต้องการใช้อัลกอริทึมเหล่านั้น
+
+การตั้งค่านโยบายเป็น "<ph name="CNSA2_NAME" />" จะกำหนดค่า <ph name="PRODUCT_OS_NAME" /> ให้เลือกใช้วิธีการแลกเปลี่ยนคีย์ที่จำเป็นสำหรับการปฏิบัติตามข้อกำหนดของชุดอัลกอริทึมเพื่อความมั่นคงแห่งชาติเชิงพาณิชย์เวอร์ชัน 2.0 (Commercial National Security Algorithm Suite 2.0 หรือ CNSA 2.0)
+
+การไม่ตั้งค่านโยบาย หรือตั้งค่าเป็น "<ph name="DEFAULT_NAME" />" จะกำหนดค่า <ph name="PRODUCT_OS_NAME" /> ให้ใช้วิธีการแลกเปลี่ยนคีย์ตามค่าเริ่มต้น
+
+หากตั้งค่านโยบายนี้เป็นค่าที่จะกำหนดค่า <ph name="PRODUCT_OS_NAME" /> ให้เลือกใช้อัลกอริทึมของข้อตกลงเกี่ยวกับคีย์ในการเข้ารหัสเพื่อรักษาความปลอดภัยจากคอมพิวเตอร์ควอนตัม แต่ <ph name="DEVICE_POST_QUANTUM_KEY_AGREEMENT_ENABLED_POLICY_NAME" /> ปิดใช้อยู่ การตั้งค่าของ <ph name="DEVICE_POST_QUANTUM_KEY_AGREEMENT_ENABLED_POLICY_NAME" /> จะมีความสำคัญเหนือกว่า
+
+ไม่จำเป็นต้องตั้งค่านโยบายนี้เพื่อความปลอดภัย วิทยาการเข้ารหัสเริ่มต้นที่ <ph name="PRODUCT_OS_NAME" /> ใช้มีความปลอดภัยเพียงพอที่จะป้องกันการโจมตีแบบบรูตฟอร์ซโดยใช้พลังงานทั้งหมดของดวงอาทิตย์
+
+การตั้งค่านโยบายนี้จะทำให้ <ph name="PRODUCT_OS_NAME" /> ทำงานช้าลงเมื่อส่งคำขอเครือข่ายจากหน้าจอเข้าสู่ระบบ
+
+นโยบายนี้มีผลเฉพาะกับ TLS 1.3 และ QUIC เท่านั้น โดยไม่มีผลกับ TLS เวอร์ชันก่อนหน้า
+
+นโยบายอุปกรณ์นี้เทียบเท่านโยบายผู้ใช้ <ph name="PREFER_SLOW_KEX_ALGORITHMS_POLICY_NAME" /> แต่จะมีผลกับโปรไฟล์การลงชื่อเข้าใช้บนหน้าจอเข้าสู่ระบบแทน</translation>
 <translation id="4488959486611931919">หมายเหตุ: ไม่มีการรายงานความเสียหายของเว็บไซต์นับตั้งแต่ Chrome เริ่มบล็อกคุกกี้เหล่านี้โดยค่าเริ่มต้นตั้งแต่ในเวอร์ชัน M118 ดังนั้นฟังก์ชันนี้จะกำหนดค่าไม่ได้ (และนโยบายนี้จะไม่มีผล) โดยเริ่มตั้งแต่เวอร์ชัน M127 เป็นต้นไป
 
 นโยบายนี้ช่วยให้สามารถเลือกไม่รับการเปลี่ยนแปลงได้ชั่วคราวสำหรับวิธีที่ Chrome จัดการคุกกี้ที่ตั้งค่าผ่าน JavaScript ซึ่งมีอักขระควบคุมบางอย่าง (Null, อักขระขึ้นบรรทัดใหม่ และป้อนบรรทัด)
@@ -5488,6 +5518,7 @@
 <translation id="4802905909524200151">กำหนดค่าพฤติกรรมอัปเดตเฟิร์มแวร์ <ph name="TPM_FIRMWARE_UPDATE_TPM" /></translation>
 <translation id="4804828344300125154">รีบูตทุกครั้งเมื่อผู้ใช้ออกจากระบบ</translation>
 <translation id="4807950475297505572">ผู้ใช้ที่มีการใช้งานล่าสุดน้อยที่สุดจะถูกลบจนกว่าจะมีที่ว่างเพียงพอ</translation>
+<translation id="4808129082654355104">เลือกใช้อัลกอริทึมการเข้ารหัสลับที่เฉพาะเจาะจงสำหรับ TLS สำหรับหน้าจอเข้าสู่ระบบของอุปกรณ์</translation>
 <translation id="4812270373673968774">การตั้งค่านโยบายเป็น "เสมอ" จะซ่อนแถบ <ph name="PRODUCT_OS_NAME" /> โดยอัตโนมัติ การตั้งค่านโยบายเป็น "ไม่เลย" จะแสดงแถบดังกล่าวเสมอ
 
       หากคุณตั้งค่านโยบายนี้ ผู้ใช้จะเปลี่ยนไม่ได้ หากไม่ได้ตั้งค่า ผู้ใช้จะเป็นผู้เลือกว่าจะซ่อนแถบดังกล่าวโดยอัตโนมัติหรือไม่</translation>
@@ -6305,6 +6336,7 @@
 ฟีเจอร์นี้จะใช้งานไม่ได้หากการซิงค์รหัสผ่านปิดอยู่ (ไม่ว่าจะเป็นการปิดผ่านการตั้งค่าของผู้ใช้หรือการปิดเนื่องจากนโยบาย <ph name="SYNC_DISABLED" /> เปิดใช้อยู่)
 
 บัญชีที่จัดการไม่มีสิทธิ์เข้าร่วมหรือสร้างกลุ่มครอบครัว จึงไม่สามารถแชร์รหัสผ่านได้</translation>
+<translation id="5326771913945855850">ใช้กลุ่มที่รองรับเริ่มต้นของ <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="532848608876725157">เปิดใช้โหมด DNS-over-HTTPS ที่มีการถอยหลังกลับที่ไม่ปลอดภัย</translation>
 <translation id="5328965694451556034">รายงานการเข้าสู่ระบบ/ออกจากระบบ</translation>
 <translation id="5329018127554115226">ระบบจะปิดใช้โหมดประสิทธิภาพสูง</translation>
@@ -8919,7 +8951,7 @@
 
 การตั้งค่านโยบายจะควบคุมการรายงานเหตุการณ์เปิดและปิด URL ของเว็บไซต์สำหรับ URL ที่เพิ่มในรายการที่อนุญาต
 หากไม่ได้ตั้งค่านโยบาย ระบบจะไม่รายงานเหตุการณ์ของเว็บไซต์
-ดูข้อมูลโดยละเอียดเกี่ยวกับรูปแบบ URL ที่ถูกต้องได้ที่ https://chromeenterprise.google/policies/url-patterns/ นโยบายนี้อนุญาตเฉพาะรูปแบบ HTTP URL และ HTTPS URL เท่านั้น</translation>
+ดูข้อมูลโดยละเอียดเกี่ยวกับรูปแบบ URL ที่ถูกต้องได้ที่ https://chromeenterprise.google/policies/url-patterns/ นโยบายนี้อนุญาตเฉพาะ URL Scheme แบบ HTTP และ HTTPS เท่านั้น</translation>
 <translation id="7007704186032892878">แสดงข้อมูลเข้าสู่ระบบ Wi-Fi ที่ใช้งานอยู่ของคีออสก์แต่ละแอปในระดับอุปกรณ์</translation>
 <translation id="7008308728445338159">เปิดใช้การตรวจสอบการสกัดกั้น DNS แล้ว</translation>
 <translation id="7009043124653876961">ปิดใช้การแนะนำอีโมจิเมื่อผู้ใช้พิมพ์</translation>
@@ -9134,11 +9166,11 @@
 
 หากปิดใช้นโยบายนี้ ระบบจะไม่จำรหัสผ่านและจะนำรหัสผ่านที่จัดเก็บไว้ก่อนหน้านี้ออกทั้งหมด ผู้ใช้จะต้องป้อนรหัสผ่านทุกครั้งที่จำเป็นต้องตรวจสอบสิทธิ์กับระบบ Kerberos การตรวจสอบสิทธิ์มักจะเกิดขึ้นตั้งแต่ทุกๆ 8 ชั่วโมงไปจนถึงหลายเดือน ขึ้นอยู่กับการตั้งค่าของเซิร์ฟเวอร์</translation>
 <translation id="7126928806195745404">การตั้งค่า JavaScript</translation>
-<translation id="7127108620894338616">การตั้งค่านโยบายจะให้คุณสร้างรายการรูปแบบ URL ซึ่งจับภาพแท็บที่มีต้นทางเดียวกันได้
+<translation id="7127108620894338616">การตั้งค่านโยบายจะให้คุณสร้างรายการรูปแบบ URL ซึ่งบันทึกแท็บที่มีต้นทางเดียวกันได้
 
-      การไม่ตั้งค่านโยบายจะทำให้ระบบไม่พิจารณาเว็บไซต์เพื่อทำการลบล้างที่การจับภาพระดับนี้
+      การไม่ตั้งค่านโยบายจะทำให้ระบบไม่พิจารณาเว็บไซต์เพื่อทำการลบล้างที่การบันทึกระดับนี้
 
-      โปรดทราบว่าจะยังมีการจับภาพแอป Chrome ในโหมดหน้าต่างซึ่งมีต้นทางเดียวกับเว็บไซต์นี้ได้อยู่
+      โปรดทราบว่าจะยังมีการบันทึกแอป Chrome ในโหมดหน้าต่างซึ่งมีต้นทางเดียวกับเว็บไซต์นี้ได้อยู่
 
       หากเว็บไซต์ตรงกับรูปแบบ URL ในนโยบายนี้ ระบบจะไม่พิจารณานโยบาย <ph name="TAB_CAPTURE_ALLOWED_BY_ORIGINS_POLICY_NAME" />, <ph name="WINDOW_CAPTURE_ALLOWED_BY_ORIGINS_POLICY_NAME" />, <ph name="SCREEN_CAPTURE_ALLOWED_BY_ORIGINS_POLICY_NAME" /> และ <ph name="SCREEN_CAPTURE_ALLOWED_POLICY_NAME" />
 
@@ -9938,6 +9970,7 @@
 <translation id="7712245244073542805">การพิมพ์ของแพลตฟอร์มจากกระบวนการของเบราว์เซอร์</translation>
 <translation id="7713608076604149344">ข้อจำกัดในการดาวน์โหลด</translation>
 <translation id="7713845740295404764">รายงานเหตุการณ์การเข้าสู่ระบบ/ออกจากระบบ</translation>
+<translation id="7715155449217638248">เลือกใช้อัลกอริทึมการแลกเปลี่ยนคีย์ที่เฉพาะเจาะจงสำหรับ TLS สำหรับหน้าจอเข้าสู่ระบบของอุปกรณ์</translation>
 <translation id="7715711044277116530">เปอร์เซ็นต์ของระดับการปรับการหน่วงเวลาการสลัวหน้าจอในโหมดการนำเสนอ</translation>
 <translation id="7715838249298819250">ไม่อนุญาตให้จับภาพข้อความ</translation>
 <translation id="7716020145539921591">นโยบายนี้เลิกใช้งานไปแล้ว โปรดใช้ <ph name="PROXY_SETTINGS_POLICY_NAME" /> แทน
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb
index 6fab21a8..9f40659 100644
--- a/components/policy/resources/policy_templates_tr.xtb
+++ b/components/policy/resources/policy_templates_tr.xtb
@@ -2446,13 +2446,6 @@
 <translation id="2614156176932194496">Adres çubuğundaki ve Yeni Sekme sayfası arama kutusundaki Google'ın AI Modu entegrasyonlarıyla ilgili ayarlar.</translation>
 <translation id="2615240493030733717">Saat dilimi bilgisi raporlama</translation>
 <translation id="2619258867868873629"><ph name="PRODUCT_OS_NAME" /> cihazlardaki "PDF olarak kaydet" hedefinin yanı sıra "Google Drive'a kaydet" hedefi</translation>
-<translation id="262035875928535253"><ph name="PRODUCT_NAME" /> tarafından <ph name="PASSWORD_MANAGER_NAME" /> hizmetinin devre dışı bırakılacağı alanların listesini yapılandırın. Bu durumda Kaydet ve Doldur iş akışları devre dışı bırakılır ve bu web sitelerindeki şifreler kaydedilemez veya web formlarında otomatik olarak doldurulamaz.
-
-Listede yer alan bir alan için <ph name="PASSWORD_MANAGER_NAME" /> devre dışı bırakılır.
-
-Listede yer almayan bir alan için <ph name="PASSWORD_MANAGER_NAME" /> kullanılabilir.
-
-Politika ayarlanmadan bırakılırsa <ph name="PASSWORD_MANAGER_NAME" /> tüm alanlar için kullanılabilir.</translation>
 <translation id="2621290137818374425">Politikanın ayarlanması, belirtilen URL'lerdeki ana makine adları için Sertifika Şeffaflığı açıklama gereksinimlerini kapatır. Yanlış kullanılan sertifikaları algılamayı zorlaştırırken kurumsal ana makineler, aksi halde güvenilmeyecek olan (uygun bir şekilde herkese açık olarak paylaşılmadığından) sertifikaları kullanmaya devam edebilir.
 
       Politikanın ayarlanmadan bırakılması, Sertifika Şeffaflığı aracılığıyla açıklama gerektiren sertifikaların açıklanmaması durumunda <ph name="PRODUCT_NAME" /> ürününün bu sertifikalara güvenmeyeceği anlamına gelir.
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb
index b302986b..19b596d2 100644
--- a/components/policy/resources/policy_templates_uk.xtb
+++ b/components/policy/resources/policy_templates_uk.xtb
@@ -2399,13 +2399,6 @@
 <translation id="2614156176932194496">Налаштування для інтеграцій режиму ШІ від Google в адресному рядку й полі пошуку на сторінці нової вкладки.</translation>
 <translation id="2615240493030733717">Повідомляти інформацію про часовий пояс</translation>
 <translation id="2619258867868873629">Варіанти "Зберегти у форматі PDF" і "Зберегти на Google Диску" на пристроях <ph name="PRODUCT_OS_NAME" /></translation>
-<translation id="262035875928535253">За допомогою цього правила можна налаштувати список доменів, для яких у <ph name="PRODUCT_NAME" /> буде вимкнено <ph name="PASSWORD_MANAGER_NAME" />. Це означає, що робочі процеси "Зберегти" й "Заповнити" не працюватимуть, тобто для цих вебсайтів не можна буде зберігати паролі або автоматично заповнювати їх у вебформах.
-
-Якщо додати домен у цей список, для нього<ph name="PASSWORD_MANAGER_NAME" /> буде вимкнено.
-
-Якщо домену немає в списку, <ph name="PASSWORD_MANAGER_NAME" /> працюватиме.
-
-Якщо не налаштувати правило, сервіс <ph name="PASSWORD_MANAGER_NAME" /> буде доступним для всіх доменів.</translation>
 <translation id="2621290137818374425">За допомогою цього правила можна вимкнути обов’язкову перевірку розкриття сертифіката за стандартом Certificate Transparency (CT) для імен хостів у вказаних URL-адресах. Через це виявляти неправильно видані сертифікати буде важче, але хости зможуть і надалі використовувати сертифікати, які в іншому випадку вважалися б ненадійними (оскільки їх дані не розкрили належним чином).
 
       Якщо не налаштувати це правило, <ph name="PRODUCT_NAME" /> не довірятиме сертифікатам, що не відповідають вимогам до розкриття даних за стандартом CT.
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb
index 53a58115..5763b88d 100644
--- a/components/policy/resources/policy_templates_vi.xtb
+++ b/components/policy/resources/policy_templates_vi.xtb
@@ -2407,13 +2407,6 @@
 <translation id="2614156176932194496">Chế độ cài đặt cho phần tích hợp chế độ AI của Google trong thanh địa chỉ và hộp tìm kiếm trên trang Thẻ mới.</translation>
 <translation id="2615240493030733717">Báo cáo thông tin về múi giờ</translation>
 <translation id="2619258867868873629">Đích "Lưu dưới dạng PDF" cũng như đích "Lưu vào Google Drive" trên các thiết bị <ph name="PRODUCT_OS_NAME" /></translation>
-<translation id="262035875928535253">Thiết lập danh sách các miền mà <ph name="PRODUCT_NAME" /> sẽ vô hiệu hoá <ph name="PASSWORD_MANAGER_NAME" />. Nói cách khác, quy trình Lưu và điền sẽ bị vô hiệu hoá, đảm bảo rằng hệ thống không thể lưu hoặc tự động điền mật khẩu cho những trang web đó vào các biểu mẫu web.
-
-Nếu miền có trong danh sách thì <ph name="PASSWORD_MANAGER_NAME" /> sẽ bị vô hiệu hoá đối với miền đó.
-
-Nếu miền không có trong danh sách thì <ph name="PASSWORD_MANAGER_NAME" /> sẽ hoạt động đối với miền đó.
-
-Nếu bạn không đặt chính sách này thì <ph name="PASSWORD_MANAGER_NAME" /> sẽ hoạt động đối với tất cả các miền.</translation>
 <translation id="2621290137818374425">Nếu bạn đặt chính sách này, hệ thống sẽ tắt các yêu cầu tiết lộ về Tính minh bạch của chứng chỉ cho các tên máy chủ trong URL đã chỉ định. Mặc dù điều này khiến việc phát hiện các chứng chỉ bị cấp sai trở nên khó khăn hơn nhưng máy chủ có thể tiếp tục sử dụng các chứng chỉ lẽ ra không được tin cậy (vì các chứng chỉ này không được tiết lộ công khai theo cách thích hợp).
 
       Không đặt chính sách này đồng nghĩa với việc nếu bạn không tiết lộ những chứng chỉ buộc phải tiết lộ thông qua Tính minh bạch của chứng chỉ thì <ph name="PRODUCT_NAME" /> sẽ không tin cậy những chứng chỉ đó.
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb
index 1e69d3d7..228fde8 100644
--- a/components/policy/resources/policy_templates_zh-CN.xtb
+++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -2372,13 +2372,6 @@
 <translation id="2614156176932194496">地址栏和新标签页搜索框的 Google AI 模式集成设置。</translation>
 <translation id="2615240493030733717">报告时区信息</translation>
 <translation id="2619258867868873629">“另存为 PDF”目的地和 <ph name="PRODUCT_OS_NAME" /> 设备上的“保存到 Google 云端硬盘”目的地</translation>
-<translation id="262035875928535253">配置 <ph name="PRODUCT_NAME" /> 应在哪些网域中停用<ph name="PASSWORD_MANAGER_NAME" />。这意味着“保存和填充”工作流程将被停用,以确保无法将这些网站的密码保存或自动填充到网页表单中。
-
-如果某个网域在列表中,则系统会为该网域停用<ph name="PASSWORD_MANAGER_NAME" />。
-
-如果某个网域不在列表中,则该网域将可使用<ph name="PASSWORD_MANAGER_NAME" />。
-
-如果此政策未设置,则所有网域均可使用<ph name="PASSWORD_MANAGER_NAME" />。</translation>
 <translation id="2621290137818374425">设置此政策可关闭对指定网址中所含主机名的证书透明度披露要求。虽然这会导致更难以检测到误颁的证书,但相应主机可以继续使用因没有恰当公开披露相关信息而不受信任的证书。
 
       如果您未设置此政策,<ph name="PRODUCT_NAME" /> 便会将那些应按照证书透明度要求进行披露但却未予披露的证书视为不可信证书。
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb
index b4368d3..5fdc802 100644
--- a/components/policy/resources/policy_templates_zh-TW.xtb
+++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -2343,13 +2343,6 @@
 <translation id="2614156176932194496">網址列和新分頁搜尋框的 Google AI 模式整合設定。</translation>
 <translation id="2615240493030733717">回報時區資訊</translation>
 <translation id="2619258867868873629"><ph name="PRODUCT_OS_NAME" /> 裝置上的「另存為 PDF」目的地和「儲存至 Google 雲端硬碟」目的地</translation>
-<translation id="262035875928535253">設定 <ph name="PRODUCT_NAME" /> 應停用<ph name="PASSWORD_MANAGER_NAME" />的網域清單。這表示系統會停用「儲存及填入」工作流程,確保不會儲存用於這些網站的密碼,也不會在網頁表單中自動填入密碼。
-
-系統會針對清單中的網域停用<ph name="PASSWORD_MANAGER_NAME" />。
-
-如果是未列在清單中的網域,則可使用<ph name="PASSWORD_MANAGER_NAME" />。
-
-如果不設定這項政策,所有網域都可使用<ph name="PASSWORD_MANAGER_NAME" />。</translation>
 <translation id="2621290137818374425">設定這項政策後,系統不會要求指定網址中的主機名稱依憑證透明化揭露規定公開憑證。雖然這會讓系統更難以偵測到誤用憑證的情形,但也因此可讓主機繼續使用因為未依規定對外公開而不受信任的憑證。
 
       如果未設定這項政策,凡是應依憑證透明化規定公開而未公開的憑證,<ph name="PRODUCT_NAME" /> 都會將其視為不受信任的憑證。
diff --git a/components/search_engine_choice_strings.grdp b/components/search_engine_choice_strings.grdp
index 81ce0ac..cba29aa9 100644
--- a/components/search_engine_choice_strings.grdp
+++ b/components/search_engine_choice_strings.grdp
@@ -80,6 +80,9 @@
       <message name="IDS_SEARCH_ENGINE_CHOICE_INFO_DIALOG_TITLE_IOS" desc="This string is the heading of a card that explains why users are being prompted to choose a search engine, and what a search engine does in Chrome. (A search engine provides answers to search queries; this is different from a browser, which displays web pages. A search engine powers many experiences within a browser.) This screen appears when the user taps or clicks “Learn more” on the search engine choice screen. We want users to read this screen and understand that they can use any search engine with Chrome and what the impact of their choice might be.">
           Learn more
       </message>
+      <message name="IDS_SEARCH_ENGINE_CHOICE_CURRENT_DEFAULT_SEARCH_ENGINE" desc="This text appears on a screen that prompts the user to select the search engine that they want to use by default. (A search engine provides answers to search queries; this is different from a browser, which displays web pages. A search engine powers many experiences within a browser.) This screen appears when the user opens Chrome after updating or installing the app. The headline for this screen is “Choose your search engine”. Below this line, users will see a list of search engines to choose from. This screen’s heading establishes “search engine” as the object of the screen, and the screen demonstrates a list of search engines; so, translate “current default” with the correct agreement to refer to “search engines”; the translation of “default” as a noun should match tc/5210298377668316173. The string’s goal is to help users understand what their default search engine was before they saw this screen. If “default” cannot be used as a standalone noun in your language, please use the shorter of these alternative phrases: “your default setting”; “your default search engine”; “your default choice”.">
+          Current default
+      </message>
       <message name="IDS_SEARCH_ENGINE_CHOICE_CURRENT_DEFAULT_SEARCH_ENGINE_PREPEND" desc="This text appears on a screen that prompts the user to select the search engine that they want to use by default. (A search engine provides answers to search queries; this is different from a browser, which displays web pages. A search engine powers many experiences within a browser.) This screen appears when the user opens Chrome after updating or installing the app. The headline for this screen is “Choose your search engine”. Below this line, users will see a list of search engines to choose from. This screen’s heading establishes “search engine” as the object of the screen, and the screen demonstrates a list of search engines; so, translate “current default” with the correct agreement to refer to “search engines”; the translation of “default” as a noun should match tc/5210298377668316173. The string’s goal is to help users understand what their default search engine was before they saw this screen. If “default” cannot be used as a standalone noun in your language, please use the shorter of these alternative phrases: “your default setting”; “your default search engine”; “your default choice”.">
           <ph name="BEGIN_BOLD">BEGIN_BOLD</ph>Current default<ph name="END_BOLD">END_BOLD</ph> · <ph name="MARKETING_SNIPPET">$1<ex>You can use Google to search the web.</ex></ph>
       </message>
diff --git a/components/search_engine_choice_strings_grdp/IDS_SEARCH_ENGINE_CHOICE_CURRENT_DEFAULT_SEARCH_ENGINE.png.sha1 b/components/search_engine_choice_strings_grdp/IDS_SEARCH_ENGINE_CHOICE_CURRENT_DEFAULT_SEARCH_ENGINE.png.sha1
new file mode 100644
index 0000000..d7dcbf8f3
--- /dev/null
+++ b/components/search_engine_choice_strings_grdp/IDS_SEARCH_ENGINE_CHOICE_CURRENT_DEFAULT_SEARCH_ENGINE.png.sha1
@@ -0,0 +1 @@
+c2ecc94f81fd8a0e33c7ba69305f31bd9e2954b2
\ No newline at end of file
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb
index 2079406..2a1a58c0 100644
--- a/components/strings/components_strings_ar.xtb
+++ b/components/strings/components_strings_ar.xtb
@@ -662,6 +662,7 @@
 <translation id="2085876078937250610">حفظ…</translation>
 <translation id="2088913896151127116">إضافة نص</translation>
 <translation id="2090451897496479509">يُرجى التواصل مع مقدِّم الخدمة للحصول على مزيد من المعلومات</translation>
+<translation id="2090686487550343086">‏أرقام الحسابات بصيغة IBAN</translation>
 <translation id="2091887806945687916">الصوت</translation>
 <translation id="2093184051799735948">‏ابحث في <ph name="ENGINE_NAME" /> أو اكتب عنوان URL</translation>
 <translation id="2093982008204312032">‏يحاول Google Chrome إيقاف استخدام Windows Hello لملء كلمات المرور.</translation>
@@ -799,6 +800,7 @@
 <translation id="2283340219607151381">حفظ العناوين وملؤها</translation>
 <translation id="2283447177162560884">تم حذف "<ph name="PAGE_TITLE" />".</translation>
 <translation id="2283599456633275070">السفر</translation>
+<translation id="2285709459648658719">جوازات السفر</translation>
 <translation id="2286383991450886080">34 × 44 بوصة</translation>
 <translation id="2288422996159078444">تتم مراقبة أي نص تكتبه أو أي صفحات تطّلع عليها أو أي نشاط آخر تجريه على الإنترنت، ويمكن أن يتم تغيير المحتوى على المواقع الإلكترونية بدون معرفتك.</translation>
 <translation id="2289385804009217824">قطع</translation>
@@ -2551,6 +2553,7 @@
 <translation id="5137761395480718572">‏يطلب هذا التطبيق إذنًا لتثبيت بيانات اعتماد شبكات Wi-Fi. بعد الإعداد، سيتم تلقائيًا توصيل جهاز <ph name="DEVICE_TYPE" /> بشبكات Wi-Fi المُستخدَمة. لإزالة بيانات الاعتماد هذه، عليك إلغاء تثبيت التطبيق. <ph name="LEARN_MORE" /></translation>
 <translation id="5138014172396933048">البطاقة الافتراضية غير متوفّرة حاليًا. يُرجى التواصل مع المصرف.</translation>
 <translation id="5138227688689900538">عرض أقل</translation>
+<translation id="5140155249377545621">رُخص القيادة</translation>
 <translation id="5144613843429436866">لقد منحت إذن الوصول إلى <ph name="PERMISSION" /> على هذا الموقع الإلكتروني</translation>
 <translation id="5145883236150621069">يوجد رمز خطأ في استجابة السياسة</translation>
 <translation id="5146995429444047494">يتم حظر الإشعارات للنطاق <ph name="ORIGIN" /></translation>
@@ -2600,7 +2603,7 @@
 <translation id="5230815978613972521">B8</translation>
 <translation id="523149107733989821">A4 Extra</translation>
 <translation id="5233071178832586743">يمكن للمشرف الوصول إلى الملف الشخصي المُدار والمتصفّح وبعض معلومات الجهاز. ويمكنه الاطّلاع على معلومات مثل:</translation>
-<translation id="5234764350956374838">تجاهل</translation>
+<translation id="5234764350956374838">إغلاق</translation>
 <translation id="5238301240406177137">الحفظ في الحساب</translation>
 <translation id="5239119062986868403">السعر العادي</translation>
 <translation id="5239623327352565343">تمت الموافقة على طلب الوصول إلى الموقع الجغرافي.</translation>
@@ -4237,6 +4240,7 @@
 <translation id="7886897188117641322">اختَر فئات المواضيع المتنوعة التي يمكن استخدامها للمساعدة في تخصيص الإعلانات</translation>
 <translation id="7887683347370398519">‏تحقق من رمز التحقق من البطاقة (CVC) ثم أعد المحاولة.</translation>
 <translation id="7887885240995164102">الدخول في وضع "نافذة ضمن نافذة"</translation>
+<translation id="7888367499748383555">‏بدون رسوم وبنسبة APR تصل إلى %0 (وفقًا للأهلية)</translation>
 <translation id="7888575728750733395">تحديد لون الصورة</translation>
 <translation id="7890748547282909375">‏سجِّل الدخول إلى Microsoft OneDrive لحفظ لقطة الشاشة</translation>
 <translation id="7890755620327858054">خيار "الدفع الآجل" غير متاح في الوقت الحالي. يُرجى إعادة المحاولة أو اختيار طريقة دفع أخرى.</translation>
diff --git a/components/strings/components_strings_as.xtb b/components/strings/components_strings_as.xtb
index 1764621..ed0a1b1 100644
--- a/components/strings/components_strings_as.xtb
+++ b/components/strings/components_strings_as.xtb
@@ -4231,6 +4231,7 @@
 <translation id="7886897188117641322">বিষয়বস্তুৰ কোনবোৰ বিস্তৃত শিতান বিজ্ঞাপন ব্যক্তিগতকৰণ কৰাত সহায় কৰিবলৈ ব্যৱহাৰ কৰিব পাৰি সেয়া বাছনি কৰক</translation>
 <translation id="7887683347370398519">আপোনাৰ CVC পৰীক্ষা কৰি আকৌ চেষ্টা কৰক</translation>
 <translation id="7887885240995164102">চিত্ৰৰ ভিতৰত চিত্ৰ আৰম্ভ কৰক</translation>
+<translation id="7888367499748383555">কোনো মাচুল নাই, ০% APRৰ পৰা আৰম্ভ (যোগ্যতা সাপেক্ষে)</translation>
 <translation id="7888575728750733395">প্ৰিণ্ট ৰেণ্ডাৰ কৰা ইনটেণ্ট</translation>
 <translation id="7890748547282909375">স্ক্ৰীনশ্বট ছেভ কৰিবলৈ Microsoft OneDriveত ছাইন ইন কৰক</translation>
 <translation id="7890755620327858054">বৰ্তমান পাছত পৰিশোধ কৰাৰ সুবিধাটো উপলব্ধ নহয়। পুনৰ চেষ্টা কৰক বা অন্য এটা পৰিশোধ পদ্ধতি বাছনি কৰক।</translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb
index 865aad5..70016b1 100644
--- a/components/strings/components_strings_bg.xtb
+++ b/components/strings/components_strings_bg.xtb
@@ -662,6 +662,7 @@
 <translation id="2085876078937250610">Запазване…</translation>
 <translation id="2088913896151127116">Добавяне на текст</translation>
 <translation id="2090451897496479509">За повече информация се обърнете към доставчика</translation>
+<translation id="2090686487550343086">IBAN номера</translation>
 <translation id="2091887806945687916">Звук</translation>
 <translation id="2093184051799735948">Търсете с(ъс) <ph name="ENGINE_NAME" /> или въведете URL адрес</translation>
 <translation id="2093982008204312032">Google Chrome се опитва да изключи Windows Hello за попълване на паролите.</translation>
@@ -799,6 +800,7 @@
 <translation id="2283340219607151381">Запазване и попълване на адреси</translation>
 <translation id="2283447177162560884">Изтрихте „<ph name="PAGE_TITLE" />“</translation>
 <translation id="2283599456633275070">Пътувания</translation>
+<translation id="2285709459648658719">Паспорти</translation>
 <translation id="2286383991450886080">34 x 44 инча</translation>
 <translation id="2288422996159078444">Всичко, което въвеждате, всички страници, които преглеждате, и всяка друга активност в мрежата са под наблюдение. Съдържанието на сайтовете може да бъде променяно без ваше знание.</translation>
 <translation id="2289385804009217824">Отрязване</translation>
@@ -2551,6 +2553,7 @@
 <translation id="5137761395480718572">Това приложение иска разрешение да инсталира идентификационните данни за Wi-Fi. След настройването устройството ви <ph name="DEVICE_TYPE" /> ще се свързва автоматично с участващите Wi-Fi мрежи. За да премахнете тези идентификационни данни, деинсталирайте приложението. <ph name="LEARN_MORE" /></translation>
 <translation id="5138014172396933048">В момента няма достъп до виртуалната карта. Свържете се с банката си</translation>
 <translation id="5138227688689900538">Показване на по-малко</translation>
+<translation id="5140155249377545621">Шофьорски книжки</translation>
 <translation id="5144613843429436866">Разрешихте достъп до <ph name="PERMISSION" /> за този сайт</translation>
 <translation id="5145883236150621069">В отговора за правилото присъства код на грешка</translation>
 <translation id="5146995429444047494">Известията за <ph name="ORIGIN" /> са блокирани</translation>
@@ -4237,6 +4240,7 @@
 <translation id="7886897188117641322">Изберете кои широки категории теми могат да се използват за персонализиране на рекламите</translation>
 <translation id="7887683347370398519">Прегледайте кода за проверка и опитайте отново</translation>
 <translation id="7887885240995164102">Преминаване в режим „Картина в картината“</translation>
+<translation id="7888367499748383555">Без такси, с ГПР от 0% (в сила са условия)</translation>
 <translation id="7888575728750733395">Режим на изобразяване на цветовете при отпечатване</translation>
 <translation id="7890748547282909375">Влезте в Microsoft OneDrive, за да запазите екранната снимка</translation>
 <translation id="7890755620327858054">Понастоящем опцията за плащане по-късно не е налице. Опитайте отново или изберете друг начин на плащане.</translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb
index 877dcea..f318eb60 100644
--- a/components/strings/components_strings_bn.xtb
+++ b/components/strings/components_strings_bn.xtb
@@ -663,6 +663,7 @@
 <translation id="2085876078937250610">সেভ করুন…</translation>
 <translation id="2088913896151127116">টেক্সট যোগ করুন</translation>
 <translation id="2090451897496479509">আরও তথ্যের জন্য প্রদানকারীর সাথে যোগাযোগ করুন</translation>
+<translation id="2090686487550343086">IBAN</translation>
 <translation id="2091887806945687916">আওয়াজ</translation>
 <translation id="2093184051799735948"><ph name="ENGINE_NAME" />-এ খুঁজুন বা URL টাইপ করুন</translation>
 <translation id="2093982008204312032">Google Chrome পাসওয়ার্ড পূরণ করার জন্য Windows Hello বন্ধ করার চেষ্টা করছে।</translation>
@@ -800,6 +801,7 @@
 <translation id="2283340219607151381">অ্যাড্রেস পূরণ করে সেভ করুন</translation>
 <translation id="2283447177162560884">'<ph name="PAGE_TITLE" />' মুছে ফেলা হয়েছে</translation>
 <translation id="2283599456633275070">ভ্রমণ</translation>
+<translation id="2285709459648658719">পাসপোর্ট</translation>
 <translation id="2286383991450886080">৩৪ x ৪৪ ইঞ্চি</translation>
 <translation id="2288422996159078444">আপনি যা লিখছেন, যে পৃষ্ঠাগুলি দেখছেন বা ওয়েবে আপনার অন্যান্য অ্যাক্টিভিটি, সব কিছুতেই নজর রাখা হচ্ছে। আপনাকে না জানিয়ে সাইটের কন্টেন্টে পরিবর্তন করা হতে পারে।</translation>
 <translation id="2289385804009217824">ট্রিম করুন</translation>
@@ -2552,6 +2554,7 @@
 <translation id="5137761395480718572">এই অ্যাপটি ওয়াই-ফাই ক্রেডেনশিয়াল ইনস্টল করার জন্য অনুমতি চাইছে। সেট-আপ হয়ে গেলে, আপনার <ph name="DEVICE_TYPE" /> অটোমেটিক অংশগ্রহণকারী ওয়াই ফাই নেটওয়ার্কের সাথে কানেক্ট হয়ে যাবে। এই ক্রেডেনশিয়ালগুলি সরিয়ে দেওয়ার জন্য, অ্যাপ আনইনস্টল করুন। <ph name="LEARN_MORE" /></translation>
 <translation id="5138014172396933048">ভার্চুয়াল কার্ড এই মুহূর্তে উপলভ্য নেই, আপনার ব্যাঙ্কের সাথে যোগাযোগ করুন</translation>
 <translation id="5138227688689900538">কম দেখুন</translation>
+<translation id="5140155249377545621">ড্রাইভিং লাইসেন্স</translation>
 <translation id="5144613843429436866">এই সাইটের জন্য আপনি <ph name="PERMISSION" />-এর অনুমতি দিয়েছেন</translation>
 <translation id="5145883236150621069">নীতি প্রতিক্রিয়ার মধ্যে ত্রুটি কোড উপস্থিত</translation>
 <translation id="5146995429444047494"><ph name="ORIGIN" />-এর বিজ্ঞপ্তি ব্লক করা হয়েছে</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb
index 034e453..5170c34 100644
--- a/components/strings/components_strings_da.xtb
+++ b/components/strings/components_strings_da.xtb
@@ -4237,6 +4237,7 @@
 <translation id="7886897188117641322">Vælg, hvilke generelle emnekategorier der kan bruges til at foretage personlig tilpasning af annoncer</translation>
 <translation id="7887683347370398519">Kontrollér, om din CVC er korrekt, og prøv igen.</translation>
 <translation id="7887885240995164102">Åbn integreret billede</translation>
+<translation id="7888367499748383555">Ingen gebyrer, helt ned til 0 % ÅOP (med forbehold for kvalificering)</translation>
 <translation id="7888575728750733395">Formål for udskriftsgengivelse</translation>
 <translation id="7890748547282909375">Log ind på Microsoft OneDrive for at gemme screenshottet</translation>
 <translation id="7890755620327858054">Betal senere er ikke tilgængelig i øjeblikket. Prøv igen, eller vælg en anden betalingsmetode.</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb
index c0fbacb..b6f0f93 100644
--- a/components/strings/components_strings_en-GB.xtb
+++ b/components/strings/components_strings_en-GB.xtb
@@ -662,6 +662,7 @@
 <translation id="2085876078937250610">Save…</translation>
 <translation id="2088913896151127116">Add text</translation>
 <translation id="2090451897496479509">Contact the provider for more information</translation>
+<translation id="2090686487550343086">IBANs</translation>
 <translation id="2091887806945687916">Sound</translation>
 <translation id="2093184051799735948">Search <ph name="ENGINE_NAME" /> or type URL</translation>
 <translation id="2093982008204312032">Google Chrome is trying to turn off Windows Hello for filling passwords.</translation>
@@ -799,6 +800,7 @@
 <translation id="2283340219607151381">Save and fill addresses</translation>
 <translation id="2283447177162560884">'<ph name="PAGE_TITLE" />' deleted</translation>
 <translation id="2283599456633275070">Travel</translation>
+<translation id="2285709459648658719">Passports</translation>
 <translation id="2286383991450886080">34 in x 44 in</translation>
 <translation id="2288422996159078444">Anything that you type, any pages that you view or any other activity on the web is being watched. Content on sites may be changed without your knowledge.</translation>
 <translation id="2289385804009217824">Trim</translation>
@@ -2551,6 +2553,7 @@
 <translation id="5137761395480718572">This app is requesting permission to install Wi-Fi credentials. After setup, your <ph name="DEVICE_TYPE" /> will automatically connect to participating Wi-Fi networks. To remove these credentials, uninstall the app. <ph name="LEARN_MORE" /></translation>
 <translation id="5138014172396933048">Virtual card is not available at the moment; please contact your bank</translation>
 <translation id="5138227688689900538">Show less</translation>
+<translation id="5140155249377545621">Driving licences</translation>
 <translation id="5144613843429436866">You have allowed <ph name="PERMISSION" /> for this site</translation>
 <translation id="5145883236150621069">Error code present in the policy response</translation>
 <translation id="5146995429444047494">Notifications for <ph name="ORIGIN" /> are blocked</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb
index e427ee6..7b84bb5 100644
--- a/components/strings/components_strings_es.xtb
+++ b/components/strings/components_strings_es.xtb
@@ -662,6 +662,7 @@
 <translation id="2085876078937250610">Guardar…</translation>
 <translation id="2088913896151127116">Añadir texto</translation>
 <translation id="2090451897496479509">Ponte en contacto con el proveedor para obtener más información</translation>
+<translation id="2090686487550343086">IBANs</translation>
 <translation id="2091887806945687916">Sonido</translation>
 <translation id="2093184051799735948">Busca en <ph name="ENGINE_NAME" /> o escribe una URL</translation>
 <translation id="2093982008204312032">Google Chrome está intentando desactivar Windows Hello para completar contraseñas.</translation>
@@ -799,6 +800,7 @@
 <translation id="2283340219607151381">Guardar y autocompletar direcciones</translation>
 <translation id="2283447177162560884">"<ph name="PAGE_TITLE" />" eliminado</translation>
 <translation id="2283599456633275070">Viajes</translation>
+<translation id="2285709459648658719">Pasaportes</translation>
 <translation id="2286383991450886080">34x44 pulgadas</translation>
 <translation id="2288422996159078444">Se está vigilando todo lo que escribes, las páginas que visitas y el resto de la actividad que realizas en Internet. Es posible que se modifique el contenido de los sitios sin que lo sepas.</translation>
 <translation id="2289385804009217824">Recortar</translation>
@@ -2551,6 +2553,7 @@
 <translation id="5137761395480718572">Esta aplicación solicita permiso para instalar credenciales de Wi‐Fi. Después, tu <ph name="DEVICE_TYPE" /> se conectará automáticamente a las redes Wi-Fi configuradas. Para quitar estas credenciales, desinstala la aplicación. <ph name="LEARN_MORE" /></translation>
 <translation id="5138014172396933048">La tarjeta virtual no está disponible en estos momentos, contacta con tu banco</translation>
 <translation id="5138227688689900538">Mostrar menos</translation>
+<translation id="5140155249377545621">Carnés de conducir</translation>
 <translation id="5144613843429436866">Has dado permiso de <ph name="PERMISSION" /> a este sitio</translation>
 <translation id="5145883236150621069">Código de error presente en respuesta de la política</translation>
 <translation id="5146995429444047494">Las notificaciones de <ph name="ORIGIN" /> están bloqueadas</translation>
@@ -4237,6 +4240,7 @@
 <translation id="7886897188117641322">Elige qué categorías amplias de temas se pueden usar para personalizar los anuncios</translation>
 <translation id="7887683347370398519">Comprueba el código CVC y vuelve a intentarlo</translation>
 <translation id="7887885240995164102">Activar el modo imagen en imagen</translation>
+<translation id="7888367499748383555">Sin comisiones, TAE del 0 % (sujeto a requisitos)</translation>
 <translation id="7888575728750733395">Imprimir intent de renderizado</translation>
 <translation id="7890748547282909375">Inicia sesión en Microsoft OneDrive para guardar la captura de pantalla</translation>
 <translation id="7890755620327858054">El pago aplazado no está disponible en este momento. Inténtalo de nuevo o selecciona otro método de pago.</translation>
diff --git a/components/strings/components_strings_eu.xtb b/components/strings/components_strings_eu.xtb
index 2ff213c..8c6d8f26 100644
--- a/components/strings/components_strings_eu.xtb
+++ b/components/strings/components_strings_eu.xtb
@@ -2945,6 +2945,7 @@
 <translation id="5813753398265398978">Fisika</translation>
 <translation id="5817918615728894473">Parekatu</translation>
 <translation id="5820625124144807242">Eskaera berrikusi ondoren, saioa hasi beharko duzu, edo <ph name="BNPL_ISSUER_NAME" /> zerbitzuan kontu bat sortu. Kontu hori automatikoki lotuko da Google Pay-rekin.</translation>
+<translation id="5820751560028604030">Blokeatu egin da gailuko deskarga</translation>
 <translation id="5826507051599432481">Izen arrunta (CN)</translation>
 <translation id="5830698870816298009">kameraren erabilera eta mugimendua</translation>
 <translation id="5831217499016131155">Google Diru-zorroa</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb
index 2d894a4..8f9119b 100644
--- a/components/strings/components_strings_fil.xtb
+++ b/components/strings/components_strings_fil.xtb
@@ -662,6 +662,7 @@
 <translation id="2085876078937250610">I-save…</translation>
 <translation id="2088913896151127116">Magdagdag ng text</translation>
 <translation id="2090451897496479509">Makipag-ugnayan sa provider para sa higit pang impormasyon</translation>
+<translation id="2090686487550343086">Mga IBAN</translation>
 <translation id="2091887806945687916">Tunog</translation>
 <translation id="2093184051799735948">Hanapin ang <ph name="ENGINE_NAME" /> o mag-type ng URL</translation>
 <translation id="2093982008204312032">Sinusubukan ng Google Chrome na i-off ang Windows Hello para sa paglalagay ng mga password.</translation>
@@ -799,6 +800,7 @@
 <translation id="2283340219607151381">I-save at punan ang mga address</translation>
 <translation id="2283447177162560884">Na-delete ang '<ph name="PAGE_TITLE" />'</translation>
 <translation id="2283599456633275070">Paglalakbay</translation>
+<translation id="2285709459648658719">Mga passport</translation>
 <translation id="2286383991450886080">34 x 44 in</translation>
 <translation id="2288422996159078444">Binabantayan ang anumang bagay na tina-type mo, ang anumang page na iyong tinitingnan, o ang anupamang aktibidad mo sa web. Puwedeng mabago ang content sa mga site nang hindi mo alam.</translation>
 <translation id="2289385804009217824">Paikliin</translation>
@@ -2551,6 +2553,7 @@
 <translation id="5137761395480718572">Nagre-request ang app na ito ng pahintulot na i-install ang mga kredensyal ng Wi-Fi. Pagkatapos ng pag-set up, awtomatikong makokonekta ang iyong <ph name="DEVICE_TYPE" /> sa mga kalahok na Wi-Fi network. Para alisin ang mga kredensyal na ito, i-uninstall ang app. <ph name="LEARN_MORE" /></translation>
 <translation id="5138014172396933048">Hindi available sa ngayon ang virtual card, makipag-ugnayan sa iyong bangko</translation>
 <translation id="5138227688689900538">Magpakita ng mas kaunti</translation>
+<translation id="5140155249377545621">Mga lisensya sa pagmamaneho</translation>
 <translation id="5144613843429436866">Pinayagan mo ang <ph name="PERMISSION" /> para sa site na ito</translation>
 <translation id="5145883236150621069">May code ng error sa tugon sa patakaran</translation>
 <translation id="5146995429444047494">Naka-block ang mga notification para sa <ph name="ORIGIN" /></translation>
diff --git a/components/strings/components_strings_fr-CA.xtb b/components/strings/components_strings_fr-CA.xtb
index 9423c06..a46e15e5 100644
--- a/components/strings/components_strings_fr-CA.xtb
+++ b/components/strings/components_strings_fr-CA.xtb
@@ -662,6 +662,7 @@
 <translation id="2085876078937250610">Enregistrer…</translation>
 <translation id="2088913896151127116">Ajouter du texte</translation>
 <translation id="2090451897496479509">Contactez le fournisseur pour plus d'informations</translation>
+<translation id="2090686487550343086">IBAN</translation>
 <translation id="2091887806945687916">Son</translation>
 <translation id="2093184051799735948">Recherchez sur <ph name="ENGINE_NAME" /> ou entrez une URL</translation>
 <translation id="2093982008204312032">Google Chrome essaie de désactiver Windows Hello pour remplir les mots de passe.</translation>
@@ -799,6 +800,7 @@
 <translation id="2283340219607151381">Enregistrer et remplir les adresses</translation>
 <translation id="2283447177162560884">« <ph name="PAGE_TITLE" /> » supprimé</translation>
 <translation id="2283599456633275070">Voyage</translation>
+<translation id="2285709459648658719">Passeports</translation>
 <translation id="2286383991450886080">34 po x 44 po</translation>
 <translation id="2288422996159078444">Tout ce que vous écrivez, toutes les pages que vous consultez ou toute autre activité sur le Web sont sous surveillance, et le contenu des sites peut être changé sans que vous le sachiez.</translation>
 <translation id="2289385804009217824">Découper</translation>
@@ -2551,6 +2553,7 @@
 <translation id="5137761395480718572">Cette application demande l'autorisation d'installer les authentifiants Wi-Fi. Après la configuration, votre <ph name="DEVICE_TYPE" /> se connectera automatiquement aux réseaux Wi-Fi participants. Pour supprimer ces authentifiants, désinstallez l'application. <ph name="LEARN_MORE" /></translation>
 <translation id="5138014172396933048">Votre carte virtuelle n'est pas accessible pour le moment, veuillez communiquer avec votre banque</translation>
 <translation id="5138227688689900538">Afficher moins</translation>
+<translation id="5140155249377545621">Permis de conduire</translation>
 <translation id="5144613843429436866">Vous avez autorisé <ph name="PERMISSION" /> pour ce site</translation>
 <translation id="5145883236150621069">Code d'erreur présent dans la réponse de la politique</translation>
 <translation id="5146995429444047494">Les notifications pour <ph name="ORIGIN" /> sont bloquées</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb
index 4da9741..e8c511a1 100644
--- a/components/strings/components_strings_fr.xtb
+++ b/components/strings/components_strings_fr.xtb
@@ -5065,7 +5065,7 @@
 <translation id="95676157383774931">Bouton du Mode IA, l'activer pour demander au Mode IA de Google</translation>
 <translation id="95721182352849470">Jaune 2</translation>
 <translation id="961663415146723894">Reliure en bas</translation>
-<translation id="961856697154696964">Supprimer les données de navigation</translation>
+<translation id="961856697154696964">Suppr. données navigation</translation>
 <translation id="961930410699694996">Accès à la position autorisé cette fois-ci</translation>
 <translation id="962484866189421427">Ce contenu peut essayer d'installer des applications trompeuses se faisant passer pour d'autres, ou de collecter des données afin de vous surveiller. <ph name="BEGIN_LINK" />Je souhaite y accéder malgré tout.<ph name="END_LINK" /></translation>
 <translation id="963734905955638680">Conformément à la législation en vigueur dans votre région, Chromium vous demande de sélectionner un moteur de recherche par défaut. Ces moteurs de recherche populaires dans votre région sont affichés dans un ordre aléatoire.</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb
index 63af89d..118eb5146 100644
--- a/components/strings/components_strings_gu.xtb
+++ b/components/strings/components_strings_gu.xtb
@@ -662,6 +662,7 @@
 <translation id="2085876078937250610">સાચવો…</translation>
 <translation id="2088913896151127116">ટેક્સ્ટ ઉમેરો</translation>
 <translation id="2090451897496479509">વધુ માહિતી માટે પ્રદાતાનો સંપર્ક કરો</translation>
+<translation id="2090686487550343086">IBANs</translation>
 <translation id="2091887806945687916">ધ્વનિ</translation>
 <translation id="2093184051799735948"><ph name="ENGINE_NAME" /> શોધો અથવા URL ટાઇપ કરો</translation>
 <translation id="2093982008204312032">Google Chrome પાસવર્ડ ભરવા માટે Windows Hello બંધ કરવાનો પ્રયાસ કરી રહ્યું છે.</translation>
@@ -799,6 +800,7 @@
 <translation id="2283340219607151381">સરનામાં સાચવો અને ભરો</translation>
 <translation id="2283447177162560884">'<ph name="PAGE_TITLE" />' ડિલીટ કર્યું</translation>
 <translation id="2283599456633275070">મુસાફરી</translation>
+<translation id="2285709459648658719">પાસપોર્ટ</translation>
 <translation id="2286383991450886080">34 x 44 ઇંચ</translation>
 <translation id="2288422996159078444">તમે જે કંઈપણ ટાઇપ કરશો તે, તમે જોશો તે કોઈપણ પેજ અથવા વેબ પરની અન્ય કોઈપણ પ્રવૃત્તિ પર નજર રાખવામાં આવી રહી છે. સાઇટ પરના કન્ટેન્ટમાં તમારી જાણ વિના ફેરફાર કરવામાં આવી શકે છે.</translation>
 <translation id="2289385804009217824">ટ્રિમ કરો</translation>
@@ -2551,6 +2553,7 @@
 <translation id="5137761395480718572">આ ઍપ વાઇ-ફાઇની લૉગ ઇન વિગતો ઇન્સ્ટૉલ કરવાની પરવાનગી માટે વિનંતી કરી રહી છે. સેટઅપ પછી, તમારું <ph name="DEVICE_TYPE" /> સહભાગી વાઇ-ફાઇ નેટવર્ક સાથે ઑટોમૅટિક રીતે કનેક્ટ થઈ જશે. લૉગ ઇનની આ વિગતો કાઢી નાખવા માટે, ઍપને અનઇન્સ્ટૉલ કરો. <ph name="LEARN_MORE" /></translation>
 <translation id="5138014172396933048">હમણાં વર્ચ્યુઅલ કાર્ડ ઉપલબ્ધ નથી, કૃપા કરીને તમારી બેંકનો સંપર્ક કરો</translation>
 <translation id="5138227688689900538">ઓછું બતાવો</translation>
+<translation id="5140155249377545621">ડ્રાઇવિંગ લાઇસન્સ</translation>
 <translation id="5144613843429436866">તમે આ સાઇટ માટે <ph name="PERMISSION" />ને મંજૂરી આપી છે</translation>
 <translation id="5145883236150621069">પૉલિસી પ્રતિક્રિયામાં ભૂલ કોડ હાજર</translation>
 <translation id="5146995429444047494"><ph name="ORIGIN" /> માટેના નોટિફિકેશન બ્લૉક કર્યા છે</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb
index 0afb9a0..67501b2b 100644
--- a/components/strings/components_strings_hi.xtb
+++ b/components/strings/components_strings_hi.xtb
@@ -663,6 +663,7 @@
 <translation id="2085876078937250610">सेव करें…</translation>
 <translation id="2088913896151127116">टेक्स्ट जोड़ें</translation>
 <translation id="2090451897496479509">ज़्यादा जानकारी के लिए, सेवा देने वाली कंपनी से संपर्क करें</translation>
+<translation id="2090686487550343086">आईबीएएन</translation>
 <translation id="2091887806945687916">आवाज़</translation>
 <translation id="2093184051799735948"><ph name="ENGINE_NAME" /> पर खोजें या यूआरएल टाइप करें</translation>
 <translation id="2093982008204312032">Google Chrome, Windows Hello को बंद करने की कोशिश कर रहा है, ताकि पासवर्ड डाला जा सके.</translation>
@@ -800,6 +801,7 @@
 <translation id="2283340219607151381">पतों की जानकारी सेव करें और फ़ॉर्म में भरें</translation>
 <translation id="2283447177162560884">'<ph name="PAGE_TITLE" />' मिटाया गया</translation>
 <translation id="2283599456633275070">यात्रा</translation>
+<translation id="2285709459648658719">पासपोर्ट</translation>
 <translation id="2286383991450886080">34 x 44 इंच</translation>
 <translation id="2288422996159078444">आप जो भी लिखते हैं, जो भी पेज देखते हैं या वेब पर जो भी गतिविधि करते हैं उस पर नज़र रखी जा रही है. साइटों की सामग्री में आपको बिना बताए बदलाव किया जा सकता है.</translation>
 <translation id="2289385804009217824">ट्रिम करें</translation>
@@ -2551,6 +2553,7 @@
 <translation id="5137761395480718572">यह ऐप्लिकेशन वाई-फ़ाई क्रेडेंशियल इंस्टॉल करने की अनुमति मांग रहा है. सेटअप हो जाने के बाद, आपका <ph name="DEVICE_TYPE" /> अपने-आप वाई-फ़ाई नेटवर्क से कनेक्ट हो जाएगा. इन क्रेडेंशियल को हटाने के लिए, ऐप्लिकेशन को अनइंस्टॉल करें. <ph name="LEARN_MORE" /></translation>
 <translation id="5138014172396933048">इस समय वर्चुअल कार्ड उपलब्ध नहीं है, कृपया अपने बैंक से संपर्क करें</translation>
 <translation id="5138227688689900538">कम दिखाएं</translation>
+<translation id="5140155249377545621">ड्राइविंग लाइसेंस</translation>
 <translation id="5144613843429436866">आपने इस साइट के लिए, <ph name="PERMISSION" /> इस्तेमाल करने की अनुमति दी है</translation>
 <translation id="5145883236150621069">नीति प्रतिसाद में गड़बड़ी कोड मौजूद है</translation>
 <translation id="5146995429444047494"><ph name="ORIGIN" /> के लिए सूचनाओं को ब्लॉक किया गया है</translation>
diff --git a/components/strings/components_strings_hy.xtb b/components/strings/components_strings_hy.xtb
index d435599..386ef03 100644
--- a/components/strings/components_strings_hy.xtb
+++ b/components/strings/components_strings_hy.xtb
@@ -4245,6 +4245,7 @@
 <translation id="7886897188117641322">Ընտրեք թեմաների լայն կատեգորիաները, որոնք կարող են օգտագործվել գովազդներն անհատականացնելու համար</translation>
 <translation id="7887683347370398519">Ստուգեք ձեր CVC կոդը և նորից փորձեք</translation>
 <translation id="7887885240995164102">Անցնել «նկար նկարի մեջ» ռեժիմի</translation>
+<translation id="7888367499748383555">Միջնորդավճարներ չեն գանձվում, տարեկան տոկոսադրույքը՝ 0% (պահանջներին համապատասխանելու դեպքում)</translation>
 <translation id="7888575728750733395">Գույները վերահաշվելու եղանակ տպման համար</translation>
 <translation id="7890748547282909375">Սքրինշոթը պահելու համար մուտք գործեք Microsoft OneDrive</translation>
 <translation id="7890755620327858054">Տարաժամկետ վճարումն անհասանելի է այս պահին։ Նորից փորձեք կամ ընտրեք վճարման այլ եղանակ։</translation>
diff --git a/components/strings/components_strings_is.xtb b/components/strings/components_strings_is.xtb
index c26829583..c6d1188 100644
--- a/components/strings/components_strings_is.xtb
+++ b/components/strings/components_strings_is.xtb
@@ -96,7 +96,7 @@
 <translation id="11635448457105324">Hnappurinn „Stjórna heimilisföngum“, virkjaðu til að bæta við og stjórna vefslóðum í stillingum Chrome</translation>
 <translation id="1165039591588034296">Villa</translation>
 <translation id="1165174597379888365">Síða var opnuð</translation>
-<translation id="1165813024716836071">{COUNT,plural, =0{Ekkert}=1{Af 1 vefsvæði (þú verður áfram skráð(ur) inn á Google-reikninginn þinn)}one{Af # vefsvæði (þú verður áfram skráð(ur) inn á Google-reikninginn þinn)}other{Af # vefsvæðum (þú verður áfram skráð(ur) inn á Google-reikninginn þinn)}}</translation>
+<translation id="1165813024716836071">{COUNT,plural, =0{Ekkert}=1{Af einu vefsvæði (þú verður áfram skráð(ur) inn á Google-reikninginn þinn)}one{Af # vefsvæði (þú verður áfram skráð(ur) inn á Google-reikninginn þinn)}other{Af # vefsvæðum (þú verður áfram skráð(ur) inn á Google-reikninginn þinn)}}</translation>
 <translation id="1167877250265821930">Ekki tókst að sækja „<ph name="LANGUAGE" />“</translation>
 <translation id="1173894706177603556">Endurnefna</translation>
 <translation id="1174644974616730562">Umslag: kínverskt #1</translation>
@@ -1514,7 +1514,7 @@
 <translation id="3474392552865647225">Hnappurinn „Sérsníða leturgerðir í Chrome“, virkjaðu til að sérsníða leturstærðir og leturgerðir í Chrome</translation>
 <translation id="3478033058537426179">Eftir hópi</translation>
 <translation id="3479552764303398839">Ekki núna</translation>
-<translation id="3484560055331845446">Þú gætir glatað aðganginum að Google reikningnum þínum. Chrome mælir með því að þú skiptir um aðgangsorð núna. Þú verður beðin(n) um að skrá þig inn.</translation>
+<translation id="3484560055331845446">Þú gætir glatað aðganginum að Google-reikningnum þínum. Chrome mælir með því að þú skiptir um aðgangsorð núna. Þú verður beðin(n) um að skrá þig inn.</translation>
 <translation id="3484861421501147767">Áminning: Vistaður kynningarkóði tiltækur</translation>
 <translation id="3485901585646640838">Til að nota aðgangsorðin og fleira sem er vistað á Google-reikningnum þínum skaltu staðfesta að þetta sért þú</translation>
 <translation id="3486406746948052912">Svitalyktareyðar og líkamsúði</translation>
@@ -3490,7 +3490,7 @@
 <translation id="6688775486821967877">Sýndarkort er ekki tiltækt eins og er, reyndu aftur síðar</translation>
 <translation id="6688851075017682769">Prufuheimilisföng eftir löndum</translation>
 <translation id="6689249931105087298">Háð með þjöppun svartra punkta</translation>
-<translation id="6689271823431384964">Chrome býður þér að vista kortin þín á Google reikningnum vegna þess að þú ert innskráð(ur). Þú getur breytt þessu í stillingunum. Nafn korthafa er sótt af reikningnum þínum.</translation>
+<translation id="6689271823431384964">Chrome býður þér að vista kortin þín á Google-reikningnum vegna þess að þú ert innskráð(ur). Þú getur breytt þessu í stillingunum. Nafn korthafa er sótt af reikningnum þínum.</translation>
 <translation id="6691397311652656001">Losaðu um meira en <ph name="REQUIRED_FREE_DISK_SPACE" /> af plássi</translation>
 <translation id="6694681292321232194"><ph name="FIND_MY_PHONE_FOCUSED_FRIENDLY_MATCH_TEXT" />, ýttu á Tab og svo Enter til að leita að tækinu þínu á Google reikningnum</translation>
 <translation id="6695428916538794739">Hasar- og ævintýramyndir</translation>
@@ -4992,7 +4992,7 @@
 <translation id="9161794544616754735">{0,plural, =1{<ph name="FILE_NAME" /> gæti innihaldið viðkvæmt efni}one{<ph name="FILE_COUNT" /> skrá gæti innihaldið viðkvæmt efni}other{<ph name="FILE_COUNT" /> skrár gætu innihaldið viðkvæmt efni}}</translation>
 <translation id="9162097962559874470"><ph name="ORIGIN" /> – Til að loka öllum skjánum skaltu ýta á |<ph name="ACCELERATOR" />|</translation>
 <translation id="9163287596625611517">Slack-skilaboð</translation>
-<translation id="9165305804774426672">Vefsvæði sem þú heimsækir geta einnig áætlað hvað höfðar til þín út frá virkni þinni á vefsvæðinu. Ef þú heimsækir til dæmis vefsvæði sem selur hlaupaskó fyrir langhlaup, gæti vefsvæðið áætlað að þú hafir áhuga á að hlaupa maraþon.</translation>
+<translation id="9165305804774426672">Vefsvæði sem þú heimsækir geta einnig áætlað hvað höfðar til þín út frá virkni þinni á vefsvæðinu. Ef þú heimsækir til dæmis vefsvæði sem selur hlaupaskó fyrir langhlaup gæti vefsvæðið áætlað að þú hafir áhuga á að hlaupa maraþon.</translation>
 <translation id="9166851138617700776">Nánar um auglýsingatillögur vefsvæða og auglýsingamælingar</translation>
 <translation id="9167054383925257837">Upplýsingar um vafra og stýrikerfi tækis (s.s. útgáfa vafra og stýrikerfis)</translation>
 <translation id="9167594211215946097">Fáðu beinan aðgang að prenturunum þínum</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb
index 6e98e4e4f..5745438 100644
--- a/components/strings/components_strings_iw.xtb
+++ b/components/strings/components_strings_iw.xtb
@@ -447,7 +447,7 @@
 <translation id="1717218214683051432">חיישני תנועה</translation>
 <translation id="1717494416764505390">תיבת דואר 3</translation>
 <translation id="1717688554309417925">שירותי חיוב ובדיקת אשראי</translation>
-<translation id="1717882880162336471">‏כדאי לנסות את מצב AI</translation>
+<translation id="1717882880162336471">‏רוצה לנסות את מצב AI?</translation>
 <translation id="1719434663396780149">ההתראות על הנחות מופעלות. אפשר לשנות זאת ב<ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />.</translation>
 <translation id="1719838434204287058">‏24x30 אינץ'</translation>
 <translation id="1720941539803966190">סגירת המדריך</translation>
@@ -521,7 +521,7 @@
 <translation id="1823768272150895732">גופן</translation>
 <translation id="1824402189105105503">גליל שמיני</translation>
 <translation id="1826516787628120939">מתבצעת בדיקה</translation>
-<translation id="1829026591231985685">‏המידע נשמר ב-Google Wallet בהגדרות</translation>
+<translation id="1829026591231985685">‏שמירת מידע ב-Google Wallet בהגדרות</translation>
 <translation id="1832730227369924598">סנכרון שולחן העבודה הווירטואלי</translation>
 <translation id="1834452765064623979">בניין ותחזוקה</translation>
 <translation id="1838374766361614909">ניקוי חיפוש</translation>
@@ -662,6 +662,7 @@
 <translation id="2085876078937250610">שמירה…</translation>
 <translation id="2088913896151127116">הוספת טקסט</translation>
 <translation id="2090451897496479509">כדי לקבל מידע נוסף, אפשר לפנות לספק</translation>
+<translation id="2090686487550343086">‏מספרי IBAN</translation>
 <translation id="2091887806945687916">צליל</translation>
 <translation id="2093184051799735948">‏אפשר לחפש ב-<ph name="ENGINE_NAME" /> או להזין כתובת URL</translation>
 <translation id="2093982008204312032">‏Google Chrome מנסה לכבות את Windows Hello כדי למלא סיסמאות.</translation>
@@ -799,6 +800,7 @@
 <translation id="2283340219607151381">שמירה ומילוי של כתובות</translation>
 <translation id="2283447177162560884">בוצעה מחיקה של '<ph name="PAGE_TITLE" />'</translation>
 <translation id="2283599456633275070">נסיעות</translation>
+<translation id="2285709459648658719">דרכונים</translation>
 <translation id="2286383991450886080">‏34x44 אינץ'</translation>
 <translation id="2288422996159078444">כל הקלדת טקסט, הצגת דף או פעילות אחרת באינטרנט נמצאת במעקב. בנוסף, התוכן באתרים עשוי להשתנות ללא ידיעתך.</translation>
 <translation id="2289385804009217824">חיתוך</translation>
@@ -1889,7 +1891,7 @@
 <translation id="4073797364926776829">הצגת הכרטיס</translation>
 <translation id="4075732493274867456">‏הלקוח והשרת אינם תומכים בגרסה נפוצה של פרוטוקול SSL או בחבילת הצפנה.</translation>
 <translation id="4079302484614802869">‏תצורת ה-Proxy מוגדרת להשתמש בכתובת אתר של סקריפט מסוג ‎.Pac ולא בשרתי Proxy קבועים.</translation>
-<translation id="4080668349181235831">‏כדי לקבל הצעות ולשפר את התכונה הזו, כתובת ה-URL ותוכן הדף המלא של האתר שבו ביקרת יישלחו אל Google. מידע נוסף על <ph name="IDS_WALLET_WALLETABLE_PASS_CONSENT_DIALOG_LEARN_MORE" />.</translation>
+<translation id="4080668349181235831">‏כדי לתת לך הצעות ולשפר את התכונה הזו, כתובת ה-URL ותוכן הדף המלא של האתר שבו ביקרת יישלחו אל Google. מידע נוסף על <ph name="IDS_WALLET_WALLETABLE_PASS_CONSENT_DIALOG_LEARN_MORE" />.</translation>
 <translation id="4080855220442581440">גלילה ושינוי מרחק התצוגה של הכרטיסיות המשותפות</translation>
 <translation id="4082333119419111506">Paper (Preprinted)</translation>
 <translation id="4082393374666368382">הגדרות - ניהול</translation>
@@ -2022,7 +2024,7 @@
 <translation id="4258748452823770588">חתימה שגויה</translation>
 <translation id="4265635050210404830">כרטיסי מועדון הלקוחות שלך</translation>
 <translation id="4265872034478892965">אושרה על-ידי מנהל המערכת</translation>
-<translation id="4267590181863312380">‏כדי לקבל את ההיסטוריה מהמכשירים האחרים שלך, צריך להיכנס לחשבון ולסנכרן את ההיסטוריה. סיסמאות ונתונים נוספים יופיעו בכל המכשירים שלך. בהגדרות אפשר תמיד להפסיק את הסנכרון. ‫Google עשויה להתאים אישית את החיפוש ושירותים נוספים על סמך ההיסטוריה שלך.</translation>
+<translation id="4267590181863312380">‏כדי לקבל את ההיסטוריה מהמכשירים האחרים שלך, צריך להיכנס לחשבון ולסנכרן את ההיסטוריה. סיסמאות ופריטים נוספים יופיעו בכל המכשירים שלך. בהגדרות אפשר תמיד להפסיק את הסנכרון. ‫Google עשויה להתאים אישית את החיפוש ושירותים נוספים על סמך ההיסטוריה שלך.</translation>
 <translation id="4269029136757623689">מאווררים לבית</translation>
 <translation id="4269264543938335308">בגדי ים</translation>
 <translation id="4269599248168651462">אישור השרת מונפק לשם לא ייחודי.</translation>
@@ -2555,6 +2557,7 @@
 <translation id="5137761395480718572">‏האפליקציה הזו מבקשת הרשאה להתקין פרטי כניסה ל-Wi-Fi. לאחר ההגדרה, <ph name="DEVICE_TYPE" /> יתחבר באופן אוטומטי לרשתות ה-Wi-Fi הקיימות. כדי להסיר את פרטי הכניסה האלה, צריך להסיר את האפליקציה. <ph name="LEARN_MORE" /></translation>
 <translation id="5138014172396933048">הכרטיס הווירטואלי לא זמין כרגע. עליך לפנות לבנק</translation>
 <translation id="5138227688689900538">פחות מידע</translation>
+<translation id="5140155249377545621">רישיונות נהיגה</translation>
 <translation id="5144613843429436866">נתת הרשאה של <ph name="PERMISSION" /> לאתר הזה</translation>
 <translation id="5145883236150621069">קיים קוד שגיאה בתגובת המדיניות</translation>
 <translation id="5146995429444047494">התראות של <ph name="ORIGIN" /> נחסמו</translation>
@@ -3471,7 +3474,7 @@
 <translation id="6652101503459149953">‏שימוש ב-Windows Hello</translation>
 <translation id="6654224358955673568">יצירת סגנון רשמי</translation>
 <translation id="6654244995031366386">Glass (Textured)</translation>
-<translation id="6655085656059574817">כדי לשלם מהר יותר עם <ph name="BNPL_ISSUER_NAME" />, כדאי להשאיר את החשבון מקושר. אבל אפשר גם לבטל את הקישור בכתובת <ph name="BEGIN_LINK" /><ph name="IDS_AUTOFILL_BNPL_TOS_LINK_TEXT_WALLET_LINK_TEXT" /><ph name="END_LINK" /></translation>
+<translation id="6655085656059574817">התשלום עם <ph name="BNPL_ISSUER_NAME" /> מהיר יותר כשהחשבון מקושר. אם רוצים, אפשר לבטל את הקישור בכתובת <ph name="BEGIN_LINK" /><ph name="IDS_AUTOFILL_BNPL_TOS_LINK_TEXT_WALLET_LINK_TEXT" /><ph name="END_LINK" /></translation>
 <translation id="6656935431494847393">כולל מידע כמו הזמנת טיסות ופרטי רכב</translation>
 <translation id="6657585470893396449">סיסמה</translation>
 <translation id="6659246032834639189">המחיר הזה נמוך</translation>
@@ -4242,6 +4245,7 @@
 <translation id="7886897188117641322">אפשר לבחור קטגוריות רחבות של נושאים שיוכלו לשמש להתאמה אישית של מודעות</translation>
 <translation id="7887683347370398519">‏יש לבדוק את ה-CVC ולנסות שוב</translation>
 <translation id="7887885240995164102">מעבר אל מצב 'תמונה בתוך תמונה'</translation>
+<translation id="7888367499748383555">ללא עמלות, ריבית שנתית בשיעור של 0% (בכפוף לזכאות)</translation>
 <translation id="7888575728750733395">‏Rendering Intent בהדפסה</translation>
 <translation id="7890748547282909375">‏צריך להיכנס לחשבון ב-Microsoft OneDrive כדי לשמור צילום מסך</translation>
 <translation id="7890755620327858054">האפשרות "תשלום אחר כך" לא זמינה כרגע. אפשר לנסות שוב או לבחור אמצעי תשלום אחר.</translation>
@@ -4259,7 +4263,7 @@
 <translation id="7916162853251942238">Flexo Base</translation>
 <translation id="791698251820376781">הארגון שלך לא מאפשר לך להיכנס</translation>
 <translation id="7926503317156566022">תעשייה אווירית</translation>
-<translation id="7927046851848613453">‏אפשר לשמור כרטיסים, אירועים ומידע אחר מדפים שצפית בהם – לא רק מטפסים שמילאת. כך ניתן לגשת במהירות לכרטיסים, כמו כרטיסים לאירועים וכרטיסי מועדון לקוחות. הפרטים השמורים שלך יכולים להופיע במכשירים שלך ובכל מוצרי Google.</translation>
+<translation id="7927046851848613453">‏אפשר לשמור כרטיסים, אירועים ומידע אחר מדפים שצופים בהם – ולא רק מטפסים שממלאים. כך ניתן לגשת במהירות לכרטיסים, כמו כרטיסים לאירועים וכרטיסי מועדון לקוחות. הפרטים השמורים יכולים להופיע במכשירים שלך ובמוצרים שונים של Google.</translation>
 <translation id="7930282586031445870">‏מסך התנאים וההגבלות של "קונים עכשיו, משלמים אחר כך (BNPL)" סגור.</translation>
 <translation id="7932035970207573919">כתובת בעבודה, <ph name="ADDRESS" /></translation>
 <translation id="793209273132572360">לעדכן את הכתובת?</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb
index d4fca5a1..6754b31 100644
--- a/components/strings/components_strings_ja.xtb
+++ b/components/strings/components_strings_ja.xtb
@@ -662,6 +662,7 @@
 <translation id="2085876078937250610">保存…</translation>
 <translation id="2088913896151127116">テキストを追加</translation>
 <translation id="2090451897496479509">詳しくはプロバイダにお問い合わせください</translation>
+<translation id="2090686487550343086">IBAN</translation>
 <translation id="2091887806945687916">音声</translation>
 <translation id="2093184051799735948"><ph name="ENGINE_NAME" /> で検索するか URL を入力してください</translation>
 <translation id="2093982008204312032">Google Chrome がパスワード入力で Windows Hello を無効にしようとしています。</translation>
@@ -799,6 +800,7 @@
 <translation id="2283340219607151381">住所の保存と入力</translation>
 <translation id="2283447177162560884">「<ph name="PAGE_TITLE" />」を削除しました</translation>
 <translation id="2283599456633275070">旅行</translation>
+<translation id="2285709459648658719">パスポート</translation>
 <translation id="2286383991450886080">34x44 インチ</translation>
 <translation id="2288422996159078444">ウェブで入力した情報やアクセスしたページ、その他のアクティビティがすべて監視され、知らない間にサイトのコンテンツが改変されるおそれがあります。</translation>
 <translation id="2289385804009217824">トリミング</translation>
@@ -2551,6 +2553,7 @@
 <translation id="5137761395480718572">このアプリは Wi-Fi 認証情報のインストール権限をリクエストしています。セットアップが完了すると、<ph name="DEVICE_TYPE" /> は登録されている Wi-Fi ネットワークに自動的に接続します。これらの認証情報を削除するには、アプリをアンインストールします。<ph name="LEARN_MORE" /></translation>
 <translation id="5138014172396933048">仮想カードは現在ご利用いただけません。銀行にお問い合わせください</translation>
 <translation id="5138227688689900538">一部を表示</translation>
+<translation id="5140155249377545621">運転免許証</translation>
 <translation id="5144613843429436866">このサイトに <ph name="PERMISSION" /> の使用を許可しています</translation>
 <translation id="5145883236150621069">ポリシー応答内にエラー コードがあります</translation>
 <translation id="5146995429444047494"><ph name="ORIGIN" /> の通知をブロックしました</translation>
@@ -4238,6 +4241,7 @@
 <translation id="7886897188117641322">広告のパーソナライズに使用できるトピックの大まかなカテゴリを選択します</translation>
 <translation id="7887683347370398519">CVC を確認してからもう一度お試しください</translation>
 <translation id="7887885240995164102">ピクチャー イン ピクチャーを開始</translation>
+<translation id="7888367499748383555">手数料なし、年利 0% の分割払い(利用条件があります)</translation>
 <translation id="7888575728750733395">印刷時のレンダリング インテント</translation>
 <translation id="7890748547282909375">スクリーンショットを保存するには、Microsoft OneDrive にログインしてください</translation>
 <translation id="7890755620327858054">後払いは現在ご利用いただけません。もう一度お試しいただくか、別のお支払い方法を選択してください。</translation>
diff --git a/components/strings/components_strings_km.xtb b/components/strings/components_strings_km.xtb
index 5431ed6..95e4fb9 100644
--- a/components/strings/components_strings_km.xtb
+++ b/components/strings/components_strings_km.xtb
@@ -4244,6 +4244,7 @@
 <translation id="7886897188117641322">ជ្រើសរើស​ប្រភេទ​ប្រធានបទ​ទូលំទូលាយ​ដែល​អាច​ត្រូវ​បាន​ប្រើ​ដើម្បី​ជួយ​កំណត់ការផ្សាយពាណិជ្ជកម្មឱ្យមានលក្ខណៈផ្ទាល់ខ្លួន</translation>
 <translation id="7887683347370398519">ពិនិត្យលេខកូដ CVC ហើយព្យាយាមម្តងទៀត</translation>
 <translation id="7887885240995164102">ចូលមុខងារ​រូបក្នុងរូប</translation>
+<translation id="7888367499748383555">គ្មានថ្លៃសេវា អត្រា​ការប្រាក់​ប្រចាំឆ្នាំចាប់ពី 0% (អាស្រ័យលើសិទ្ធិទទួលបាន)</translation>
 <translation id="7888575728750733395">ចេតនានៃ​ការបំប្លែង​ការបោះពុម្ព</translation>
 <translation id="7890748547282909375">សូម​ចូលគណនី Microsoft OneDrive ដើម្បី​រក្សាទុក​រូបថត​អេក្រង់</translation>
 <translation id="7890755620327858054">មិនអាច​ទូទាត់​ពេលក្រោយ​នៅពេលនេះ​បានទេ។ សូម​ព្យាយាម​ម្ដងទៀត ឬ​ជ្រើសរើស​វិធីបង់ប្រាក់​ផ្សេងទៀត។</translation>
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb
index 54433dd..5823fca6 100644
--- a/components/strings/components_strings_kn.xtb
+++ b/components/strings/components_strings_kn.xtb
@@ -661,6 +661,7 @@
 <translation id="2085876078937250610">ಸೇವ್ ಮಾಡಿ…</translation>
 <translation id="2088913896151127116">ಪಠ್ಯವನ್ನು ಸೇರಿಸಿ</translation>
 <translation id="2090451897496479509">ಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ ಪೂರೈಕೆದಾರರನ್ನು ಸಂಪರ್ಕಿಸಿ</translation>
+<translation id="2090686487550343086">IBAN ಗಳು</translation>
 <translation id="2091887806945687916">ಶಬ್ಧ</translation>
 <translation id="2093184051799735948"><ph name="ENGINE_NAME" /> ಅನ್ನು ಹುಡುಕಿ ಅಥವಾ URL ಅನ್ನು ಟೈಪ್‌ ಮಾಡಿ</translation>
 <translation id="2093982008204312032">Google Chrome, ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ಭರ್ತಿ ಮಾಡುವುದಕ್ಕಾಗಿ Windows Hello ಅನ್ನು ಆಫ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸುತ್ತಿದೆ.</translation>
@@ -798,6 +799,7 @@
 <translation id="2283340219607151381">ವಿಳಾಸಗಳನ್ನು ಉಳಿಸಿ ಮತ್ತು ಭರ್ತಿ ಮಾಡಿ</translation>
 <translation id="2283447177162560884">'<ph name="PAGE_TITLE" />' ಅಳಿಸಲಾಗಿದೆ</translation>
 <translation id="2283599456633275070">ಪ್ರಯಾಣ</translation>
+<translation id="2285709459648658719">ಪಾಸ್‌ಪೋರ್ಟ್‌ಗಳು</translation>
 <translation id="2286383991450886080">34 x 44 ಇಂಚು</translation>
 <translation id="2288422996159078444">ನೀವು ಟೈಪ್ ಮಾಡುವ ಯಾವುದೇ ವಿಷಯ, ವೀಕ್ಷಿಸುವ ಯಾವುದೇ ಪುಟಗಳು ಅಥವಾ ವೆಬ್‌ನಲ್ಲಿ ನಡೆಸುವ ಇತರ ಯಾವುದೇ ಚಟುವಟಿಕೆಯ ಮೇಲೆ ನಿಗಾ ಇರಿಸಲಾಗಿದೆ. ಸೈಟ್‌ಗಳಲ್ಲಿನ ಕಂಟೆಂಟ್‍ ಅನ್ನು ನಿಮ್ಮ ಗಮನಕ್ಕೆ ತರದೇ ಬದಲಾಯಿಸಬಹುದು.</translation>
 <translation id="2289385804009217824">ಟ್ರಿಮ್ ಮಾಡಿ</translation>
@@ -2548,6 +2550,7 @@
 <translation id="5137761395480718572">ಈ ಆ್ಯಪ್, ವೈಫೈ ರುಜುವಾತುಗಳನ್ನು ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಲು ಅನುಮತಿಯನ್ನು ವಿನಂತಿಸುತ್ತಿದೆ. ಸೆಟಪ್ ಮಾಡಿದ ನಂತರ, ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ಭಾಗವಹಿಸುತ್ತಿರುವ ವೈಫೈ ನೆಟ್‌ವರ್ಕ್‌ಗಳಿಗೆ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಕನೆಕ್ಟ್ ಆಗುತ್ತದೆ. ಈ ರುಜುವಾತುಗಳನ್ನು ತೆಗೆದುಹಾಕಲು, ಆ್ಯಪ್ ಅನ್ನು ಅನ್‌ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿ. <ph name="LEARN_MORE" /></translation>
 <translation id="5138014172396933048">ವರ್ಚುವಲ್ ಕಾರ್ಡ್ ಇದೀಗ ಲಭ್ಯವಿಲ್ಲ, ನಿಮ್ಮ ಬ್ಯಾಂಕ್ ಅನ್ನು ಸಂಪರ್ಕಿಸಿ</translation>
 <translation id="5138227688689900538">ಕಡಿಮೆ ತೋರಿಸಿ</translation>
+<translation id="5140155249377545621">ಡ್ರೈವಿಂಗ್ ಲೈಸೆನ್ಸ್‌ಗಳು</translation>
 <translation id="5144613843429436866">ನೀವು ಈ ಸೈಟ್‌ಗೆ <ph name="PERMISSION" /> ಅನ್ನು ಅನುಮತಿಸಿರುವಿರಿ</translation>
 <translation id="5145883236150621069">ನೀತಿ ಪ್ರತಿಕ್ರಿಯೆಯಲ್ಲಿ ದೋಷದ ಕೋಡ್ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ</translation>
 <translation id="5146995429444047494"><ph name="ORIGIN" /> ಗಾಗಿ ಅಧಿಸೂಚನೆಗಳನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ</translation>
@@ -4233,6 +4236,7 @@
 <translation id="7886897188117641322">ಆ್ಯಡ್‌ಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸಲು ಸಹಾಯ ಮಾಡಲು ಯಾವ ವಿಶಾಲವಾದ ವಿಷಯದ ವರ್ಗಗಳನ್ನು ಬಳಸಬೇಕೆಂದು ಆಯ್ಕೆಮಾಡಿ</translation>
 <translation id="7887683347370398519">ನಿಮ್ಮ CVC ಅನ್ನು ಪರಿಶೀಲಿಸಿ ಹಾಗೂ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ</translation>
 <translation id="7887885240995164102">ಚಿತ್ರದಲ್ಲಿ ಚಿತ್ರ ಮೋಡ್‌ಗೆ ಪ್ರವೇಶಿಸಿ</translation>
+<translation id="7888367499748383555">ಯಾವುದೇ ಶುಲ್ಕವಿಲ್ಲ, 0% APR ಗಿಂತ ಕಡಿಮೆ (ಅರ್ಹತೆಗೆ ಒಳಪಟ್ಟಿರುತ್ತದೆ)</translation>
 <translation id="7888575728750733395">ಪ್ರಿಂಟ್ ಸಲ್ಲಿಕೆ ಉದ್ದೇಶ</translation>
 <translation id="7890748547282909375">ಸ್ಕ್ರೀನ್‌ಶಾಟ್ ಅನ್ನು ಸೇವ್‌ ಮಾಡಲು Microsoft OneDrive ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ</translation>
 <translation id="7890755620327858054">ಈ ಸಮಯದಲ್ಲಿ ನಂತರ ಪಾವತಿಸುವ ಸೌಲಭ್ಯ ಲಭ್ಯವಿಲ್ಲ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ ಅಥವಾ ಬೇರೆ ಪಾವತಿ ವಿಧಾನವನ್ನು ಆಯ್ಕೆಮಾಡಿ.</translation>
diff --git a/components/strings/components_strings_lo.xtb b/components/strings/components_strings_lo.xtb
index 1e19a17..70ca9b9 100644
--- a/components/strings/components_strings_lo.xtb
+++ b/components/strings/components_strings_lo.xtb
@@ -1167,6 +1167,7 @@
 <translation id="2922792708490674">{0,plural, =1{ໄຟລ໌ຖືກບລັອກບໍ່ໃຫ້ດາວໂຫຼດ}other{<ph name="FILE_COUNT" /> ໄຟລ໌ຖືກບລັອກບໍ່ໃຫ້ດາວໂຫຼດ}}</translation>
 <translation id="2923275635648511531">ຜະລິດຕະພັນກັນແດດ ແລະ ສີແທນ</translation>
 <translation id="292371311537977079">ການຕັ້ງຄ່າ Chrome</translation>
+<translation id="2925032407415783182">ບັນທຶກປີ້ເຂົ້າງານໃສ່ Wallet</translation>
 <translation id="2925454999967523701">ປຸ່ມສ້າງເອກະສານ, ເປີດນຳໃຊ້ເພື່ອສ້າງ Google Doc ໃໝ່ຢ່າງວ່ອງໄວ</translation>
 <translation id="2925673989565098301">ວິທີການຈັດສົ່ງ</translation>
 <translation id="2928426578619531300">ຜູ້ໃຊ້ທີ່ກ່ຽວຂ້ອງ</translation>
@@ -4236,6 +4237,7 @@
 <translation id="7886897188117641322">ເລືອກໝວດໝູ່ກວ້າງໆຂອງຫົວຂໍ້ທີ່ສາມາດໃຊ້ໃນການຊ່ວຍປັບແຕ່ງໂຄສະນາໃຫ້ເປັນແບບສ່ວນຕົວ</translation>
 <translation id="7887683347370398519">ກວດ​ເບິ່ງ CVC ຂອງ​ທ່ານ ແລະ​ລອງ​ໃໝ່​ອີກ</translation>
 <translation id="7887885240995164102">ເຂົ້າໂໝດສະແດງຜົນຊ້ອນກັນ</translation>
+<translation id="7888367499748383555">ບໍ່ມີຄ່າບໍລິການ, ອັດຕາດອກເບ້ຍຕໍ່ປີຕ່ຳສຸດ 0% (ຂຶ້ນຢູ່ກັບການມີສິດ)</translation>
 <translation id="7888575728750733395">ກົນໄກປະສານການສະແດງພາບການພິມ</translation>
 <translation id="7890748547282909375">ເຂົ້າສູ່ລະບົບ Microsoft OneDrive ເພື່ອບັນທຶກຮູບໜ້າຈໍ</translation>
 <translation id="7890755620327858054">ຈ່າຍພາຍຫຼັງບໍ່ມີໃຫ້ໃຊ້ໃນເວລານີ້. ລອງໃໝ່ ຫຼື ເລືອກວິທີການຈ່າຍເງິນອື່ນ.</translation>
diff --git a/components/strings/components_strings_mk.xtb b/components/strings/components_strings_mk.xtb
index 2af1d5b..6dec69e 100644
--- a/components/strings/components_strings_mk.xtb
+++ b/components/strings/components_strings_mk.xtb
@@ -662,6 +662,7 @@
 <translation id="2085876078937250610">Зачувај…</translation>
 <translation id="2088913896151127116">Додајте текст</translation>
 <translation id="2090451897496479509">За повеќе детали, контактирајте со давателот на услугата</translation>
+<translation id="2090686487550343086">IBAN</translation>
 <translation id="2091887806945687916">Звук</translation>
 <translation id="2093184051799735948">Пребарајте <ph name="ENGINE_NAME" /> или внесете URL-адреса</translation>
 <translation id="2093982008204312032">Google Chrome се обидува да го исклучи Windows Hello за пополнување лозинки.</translation>
@@ -799,6 +800,7 @@
 <translation id="2283340219607151381">Зачувувај и пополнувај адреси</translation>
 <translation id="2283447177162560884">Избришано: „<ph name="PAGE_TITLE" />“</translation>
 <translation id="2283599456633275070">Патување</translation>
+<translation id="2285709459648658719">Пасоши</translation>
 <translation id="2286383991450886080">34 x 44 инчи</translation>
 <translation id="2288422996159078444">Сѐ што ќе напишете, сите страници што ќе ги прегледате или секоја друга активност на интернет се надгледува, а содржините на сајтовите може да се променат без ваше знаење.</translation>
 <translation id="2289385804009217824">Кратење</translation>
@@ -2551,6 +2553,7 @@
 <translation id="5137761395480718572">Апликацијава бара дозвола за инсталирање акредитиви за Wi-Fi. По поставувањето, вашиот уред <ph name="DEVICE_TYPE" /> ќе се поврзе автоматски на поставените Wi-Fi мрежи. За да ги отстраните акредитививе, деинсталирајте ја апликацијата. <ph name="LEARN_MORE" /></translation>
 <translation id="5138014172396933048">Виртуелната картичка не е достапна во моментов, контактирајте со банката</translation>
 <translation id="5138227688689900538">Прикажи помалку</translation>
+<translation id="5140155249377545621">Возачки дозволи</translation>
 <translation id="5144613843429436866">Дозволивте <ph name="PERMISSION" /> за сајтов</translation>
 <translation id="5145883236150621069">Присутен е код на грешка во одговорот на правилото</translation>
 <translation id="5146995429444047494">Известувањата за <ph name="ORIGIN" /> се блокирани</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb
index 07551a9..b6f595d 100644
--- a/components/strings/components_strings_ml.xtb
+++ b/components/strings/components_strings_ml.xtb
@@ -662,6 +662,7 @@
 <translation id="2085876078937250610">സംരക്ഷിക്കുക…</translation>
 <translation id="2088913896151127116">ടെക്‌സ്റ്റ് ചേർക്കുക</translation>
 <translation id="2090451897496479509">കൂടുതൽ വിവരങ്ങൾക്ക്, സേവനദാതാവിനെ ബന്ധപ്പെടുക</translation>
+<translation id="2090686487550343086">IBAN-കൾ</translation>
 <translation id="2091887806945687916">ശബ്‌ദം</translation>
 <translation id="2093184051799735948"><ph name="ENGINE_NAME" /> എന്നതിൽ തിരയുക അല്ലെങ്കിൽ URL ടൈപ്പ് ചെയ്യുക</translation>
 <translation id="2093982008204312032">പാസ്‌വേഡുകൾ പൂരിപ്പിക്കുന്നതിന് Windows Hello ഓഫാക്കാൻ Google Chrome ശ്രമിക്കുന്നു.</translation>
@@ -799,6 +800,7 @@
 <translation id="2283340219607151381">വിലാസങ്ങൾ സംരക്ഷിച്ച് സ്വയമേവ പൂരിപ്പിക്കുക</translation>
 <translation id="2283447177162560884">'<ph name="PAGE_TITLE" />' ഇല്ലാതാക്കി</translation>
 <translation id="2283599456633275070">യാത്ര</translation>
+<translation id="2285709459648658719">പാസ്‌പോർട്ടുകൾ</translation>
 <translation id="2286383991450886080">34 x 44 ഇഞ്ച്</translation>
 <translation id="2288422996159078444">നിങ്ങൾ ടൈപ്പ് ചെയ്യുന്നവയും കാണുന്ന പേജുകളും വെബിലെ മറ്റ് എല്ലാ ആക്റ്റിവിറ്റികളും നിരീക്ഷിക്കപ്പെടുന്നുണ്ട്. നിങ്ങളുടെ അറിവില്ലാതെ സൈറ്റുകളിലെ ഉള്ളടക്കം മാറുകയും ചെയ്തേക്കാം.</translation>
 <translation id="2289385804009217824">ട്രിം ചെയ്യുക</translation>
@@ -2550,6 +2552,7 @@
 <translation id="5137761395480718572">ഈ ആപ്പ്, വൈഫൈ ക്രെഡൻഷ്യലുകൾ ഇൻസ്റ്റാൾ ചെയ്യുന്നതിനുള്ള അനുമതി അഭ്യർത്ഥിക്കുന്നു. സജ്ജീകരിച്ചതിന് ശേഷം, ലഭ്യമായ വൈഫൈ നെറ്റ്‌വർക്കുകളിലേക്ക് നിങ്ങളുടെ <ph name="DEVICE_TYPE" /> സ്വയമേവ കണക്റ്റ് ചെയ്യും. ഈ ക്രെഡൻഷ്യലുകൾ നീക്കം ചെയ്യാൻ ആപ്പ് അൺഇൻസ്റ്റാൾ ചെയ്യുക. <ph name="LEARN_MORE" /></translation>
 <translation id="5138014172396933048">വെർച്വൽ കാർഡ് ഇപ്പോൾ ലഭ്യമല്ല, നിങ്ങളുടെ ബാങ്കുമായി ബന്ധപ്പെടുക</translation>
 <translation id="5138227688689900538">കുറച്ച് കാണിക്കുക</translation>
+<translation id="5140155249377545621">ഡ്രൈവിംഗ് ലൈസൻസുകൾ</translation>
 <translation id="5144613843429436866">ഈ സൈറ്റിനായി നിങ്ങൾ <ph name="PERMISSION" /> അനുവദിച്ചു</translation>
 <translation id="5145883236150621069">നയ പ്രതികരണത്തിൽ പിശക് കോഡ് ഉണ്ട്</translation>
 <translation id="5146995429444047494"><ph name="ORIGIN" /> എന്നതിന്റെ അറിയിപ്പുകൾ ബ്ലോക്ക് ചെയ്‌തിരിക്കുന്നു</translation>
@@ -4234,6 +4237,7 @@
 <translation id="7886897188117641322">പരസ്യങ്ങൾ വ്യക്തിപരമാക്കാൻ സഹായിക്കുന്നതിന്, ഏതൊക്കെ വിശാലമായ വിഷയ വിഭാഗങ്ങളാണ് ഉപയോഗിക്കേണ്ടതെന്ന് തിരഞ്ഞെടുക്കുക</translation>
 <translation id="7887683347370398519">നിങ്ങളുടെ CVC പരിശോധിച്ച് വീണ്ടും ശ്രമിക്കുക</translation>
 <translation id="7887885240995164102">ചിത്രത്തിനുള്ളിലെ ചിത്രത്തിലേക്ക് പ്രവേശിക്കുക</translation>
+<translation id="7888367499748383555">ഫീസില്ല, 0% APR വരെ (യോഗ്യതയ്ക്ക് വിധേയമാണ്)</translation>
 <translation id="7888575728750733395">പ്രിന്റ് റെൻഡറിംഗ് ഇന്റന്റ്</translation>
 <translation id="7890748547282909375">സ്ക്രീൻ‌ഷോട്ട് സംരക്ഷിക്കുന്നതിനായി Microsoft OneDrive-ലേക്ക് സൈൻ ഇൻ ചെയ്യുക</translation>
 <translation id="7890755620327858054">ഇപ്പോൾ 'പിന്നീട് പേ ചെയ്യുക' ലഭ്യമല്ല. വീണ്ടും ശ്രമിക്കുകയോ മറ്റൊരു പേയ്മെന്റ് രീതി തിരഞ്ഞെടുക്കുകയോ ചെയ്യുക.</translation>
diff --git a/components/strings/components_strings_mn.xtb b/components/strings/components_strings_mn.xtb
index b9656a64..a83b2da 100644
--- a/components/strings/components_strings_mn.xtb
+++ b/components/strings/components_strings_mn.xtb
@@ -662,6 +662,7 @@
 <translation id="2085876078937250610">Хадгалах…</translation>
 <translation id="2088913896151127116">Текст нэмэх</translation>
 <translation id="2090451897496479509">Үйлчилгээ үзүүлэгчтэй холбогдож нэмэлт мэдээлэл авна уу</translation>
+<translation id="2090686487550343086">IBAN</translation>
 <translation id="2091887806945687916">Дуу</translation>
 <translation id="2093184051799735948"><ph name="ENGINE_NAME" />-с хайх эсвэл URL-г бичих</translation>
 <translation id="2093982008204312032">Google Chrome нууц үгийг бөглөхөд Windows Hello-г унтраахаар оролдож байна.</translation>
@@ -799,6 +800,7 @@
 <translation id="2283340219607151381">Хаягийг хадгалах болон бөглөх</translation>
 <translation id="2283447177162560884">'<ph name="PAGE_TITLE" />'-г устгасан</translation>
 <translation id="2283599456633275070">Аялал</translation>
+<translation id="2285709459648658719">Паспорт</translation>
 <translation id="2286383991450886080">34 x 44 инч</translation>
 <translation id="2288422996159078444">Таны бичдэг дурын зүйл, таны үздэг дурын хуудас эсвэл веб дээрх бусад дурын үйл ажиллагааг хянан үзэж байна. Сайтуудын контентыг танд мэдэгдэлгүйгээр өөрчилж болзошгүй.</translation>
 <translation id="2289385804009217824">Тайрах</translation>
@@ -2552,6 +2554,7 @@
 <translation id="5137761395480718572">Энэ апп Wi-Fi-н мандат үнэмлэхүүдийг суулгах зөвшөөрөл хүсэж байна. Тохируулсны дараа таны <ph name="DEVICE_TYPE" /> оролцож буй Wi-Fi сүлжээнүүдэд автоматаар холбогдоно. Эдгээр мандат үнэмлэхийг хасахын тулд аппыг устгана уу. <ph name="LEARN_MORE" /></translation>
 <translation id="5138014172396933048">Виртуал карт яг одоо боломжгүй байна. Банктайгаа холбогдоно уу</translation>
 <translation id="5138227688689900538">Хураангуйлж харуулах</translation>
+<translation id="5140155249377545621">Жолооны үнэмлэх</translation>
 <translation id="5144613843429436866">Та энэ сайтад <ph name="PERMISSION" />-г зөвшөөрсөн</translation>
 <translation id="5145883236150621069">удирдамжийн хариулт дахь алдааны код</translation>
 <translation id="5146995429444047494"><ph name="ORIGIN" />-н мэдэгдлийг хориглосон</translation>
@@ -4236,6 +4239,7 @@
 <translation id="7886897188117641322">Зарыг хувийн болгоход туслахын тулд ямар сэдвүүдийн өргөн хүрээтэй ангиллыг ашиглаж болохыг сонгоно уу</translation>
 <translation id="7887683347370398519">CVC-гээ шалгаад дахин оролдоно уу</translation>
 <translation id="7887885240995164102">Дэлгэц доторх дэлгэц горимд орох</translation>
+<translation id="7888367499748383555">Ямар ч хураамжгүй, жилийн хүү 0%-иас эхэлнэ (зохих шаардлага хангасан байх)</translation>
 <translation id="7888575728750733395">Хэвлэхэд өнгө буулгах тодорхойлолт</translation>
 <translation id="7890748547282909375">Дэлгэцийн агшныг хадгалахын тулд Microsoft OneDrive-д нэвтэрнэ үү</translation>
 <translation id="7890755620327858054">Одоогоор дараа төлөхийг ашиглах боломжгүй байна. Дахин оролдох эсвэл өөр төлбөрийн хэрэгсэл сонгоно уу.</translation>
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb
index 98ab9ec..df6f923 100644
--- a/components/strings/components_strings_ms.xtb
+++ b/components/strings/components_strings_ms.xtb
@@ -4241,6 +4241,7 @@
 <translation id="7886897188117641322">Pilih kategori topik yang luas yang boleh digunakan untuk memeribadikan iklan</translation>
 <translation id="7887683347370398519">Semak CVC anda dan cuba lagi</translation>
 <translation id="7887885240995164102">Akses mod gambar dalam gambar</translation>
+<translation id="7888367499748383555">Tiada yuran, APR serendah 0% (tertakluk pada kelayakan)</translation>
 <translation id="7888575728750733395">Niat pemaparan cetakan</translation>
 <translation id="7890748547282909375">Log masuk ke Microsoft OneDrive untuk menyimpan tangkapan skrin</translation>
 <translation id="7890755620327858054">Bayar kemudian tidak tersedia pada masa ini. Sila cuba lagi atau pilih kaedah pembayaran lain.</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb
index c1f12841..55e940d 100644
--- a/components/strings/components_strings_no.xtb
+++ b/components/strings/components_strings_no.xtb
@@ -662,6 +662,7 @@
 <translation id="2085876078937250610">Lagre …</translation>
 <translation id="2088913896151127116">Legg til tekst</translation>
 <translation id="2090451897496479509">Kontakt leverandøren for å få mer informasjon</translation>
+<translation id="2090686487550343086">IBAN-numre</translation>
 <translation id="2091887806945687916">Lyd</translation>
 <translation id="2093184051799735948">Søk <ph name="ENGINE_NAME" /> eller skriv inn nettadresse</translation>
 <translation id="2093982008204312032">Google Chrome prøver å slå av Windows Hello for utfylling av passord.</translation>
@@ -799,6 +800,7 @@
 <translation id="2283340219607151381">Lagre og fyll inn adresser</translation>
 <translation id="2283447177162560884">«<ph name="PAGE_TITLE" />» er slettet</translation>
 <translation id="2283599456633275070">Reise</translation>
+<translation id="2285709459648658719">Pass</translation>
 <translation id="2286383991450886080">34 x 44 tommer</translation>
 <translation id="2288422996159078444">Alt du skriver, alle sider du besøker, og all annen aktivitet på nettet blir overvåket. Innholdet på nettsteder kan bli endret uten at du vet om det.</translation>
 <translation id="2289385804009217824">Beskjær</translation>
@@ -2551,6 +2553,7 @@
 <translation id="5137761395480718572">Denne appen ber om tillatelse til å installere wifi-legitimasjon. Etter konfigurering kobles <ph name="DEVICE_TYPE" /> automatisk til deltakende wifi-nettverk. For å fjerne denne legitimasjonen, avinstaller appen. <ph name="LEARN_MORE" /></translation>
 <translation id="5138014172396933048">Virtuelt kort er ikke tilgjengelig akkurat nå – kontakt banken</translation>
 <translation id="5138227688689900538">Vis færre</translation>
+<translation id="5140155249377545621">Førerkort</translation>
 <translation id="5144613843429436866">Du har gitt dette nettstedet tillatelse til å bruke <ph name="PERMISSION" /></translation>
 <translation id="5145883236150621069">Feilkode i responsen for enhetsinnstillinger</translation>
 <translation id="5146995429444047494">Varsler for <ph name="ORIGIN" /> er blokkert</translation>
@@ -4236,6 +4239,7 @@
 <translation id="7886897188117641322">Velg hvilke generelle emnekategorier som kan brukes til å tilpasse annonser personlig</translation>
 <translation id="7887683347370398519">Kontroller CVC-koden din, og prøv igjen.</translation>
 <translation id="7887885240995164102">Start bilde-i-bilde</translation>
+<translation id="7888367499748383555">Ingen gebyrer og en årlig rentesats på 0 % (forutsetter at du er kvalifisert)</translation>
 <translation id="7888575728750733395">Gjengivelsesintensjon for utskrift</translation>
 <translation id="7890748547282909375">Logg på Microsoft OneDrive for å lagre skjermbildet</translation>
 <translation id="7890755620327858054">Betal senere er ikke tilgjengelig akkurat nå. Prøv på nytt, eller velg en annen betalingsmåte.</translation>
diff --git a/components/strings/components_strings_pa.xtb b/components/strings/components_strings_pa.xtb
index ed25bd555..5b26f50 100644
--- a/components/strings/components_strings_pa.xtb
+++ b/components/strings/components_strings_pa.xtb
@@ -662,6 +662,7 @@
 <translation id="2085876078937250610">ਰੱਖਿਅਤ ਕਰੋ…</translation>
 <translation id="2088913896151127116">ਲਿਖਤ ਸ਼ਾਮਲ ਕਰੋ</translation>
 <translation id="2090451897496479509">ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ ਪ੍ਰਦਾਨਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ</translation>
+<translation id="2090686487550343086">IBANs</translation>
 <translation id="2091887806945687916">ਧੁਨੀ</translation>
 <translation id="2093184051799735948"><ph name="ENGINE_NAME" /> ਖੋਜੋ ਜਾਂ URL ਟਾਈਪ ਕਰੋ</translation>
 <translation id="2093982008204312032">Google Chrome ਪਾਸਵਰਡ ਭਰਨ ਲਈ Windows Hello ਨੂੰ ਬੰਦ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਰਿਹਾ ਹੈ।</translation>
@@ -799,6 +800,7 @@
 <translation id="2283340219607151381">ਪਤੇ ਰੱਖਿਅਤ ਕਰੋ ਅਤੇ ਭਰੋ</translation>
 <translation id="2283447177162560884">'<ph name="PAGE_TITLE" />' ਨੂੰ ਮਿਟਾਇਆ ਗਿਆ</translation>
 <translation id="2283599456633275070">ਯਾਤਰਾ</translation>
+<translation id="2285709459648658719">ਪਾਸਪੋਰਟ</translation>
 <translation id="2286383991450886080">34 x 44 ਇੰਚ</translation>
 <translation id="2288422996159078444">ਤੁਸੀਂ ਜੋ ਵੀ ਟਾਈਪ ਕਰਦੇ ਹੋ, ਤੁਸੀਂ ਜੋ ਵੀ ਪੰਨੇ ਦੇਖਦੇ ਹੋ ਜਾਂ ਵੈੱਬ 'ਤੇ ਕੋਈ ਵੀ ਹੋਰ ਸਰਗਰਮੀ ਕਰਦੇ ਹੋ, ਉਸ 'ਤੇ ਨਜ਼ਰ ਰੱਖੀ ਜਾਂਦੀ ਹੈ। ਸਾਈਟਾਂ 'ਤੇ ਸਮੱਗਰੀ ਨੂੰ ਤੁਹਾਡੀ ਜਾਣਕਾਰੀ ਤੋਂ ਬਿਨਾਂ ਬਦਲਿਆ ਜਾ ਸਕਦਾ ਹੈ।</translation>
 <translation id="2289385804009217824">ਕਟਾਈ</translation>
@@ -2548,6 +2550,7 @@
 <translation id="5137761395480718572">ਇਹ ਐਪ ਵਾਈ-ਫਾਈ ਕ੍ਰੀਡੈਂਸ਼ੀਅਲਾਂ ਨੂੰ ਸਥਾਪਤ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਲਈ ਬੇਨਤੀ ਕਰ ਰਹੀ ਹੈ। ਸੈੱਟਅੱਪ ਤੋਂ ਬਾਅਦ, ਤੁਹਾਡਾ <ph name="DEVICE_TYPE" /> ਆਪਣੇ ਆਪ ਭਾਗ ਲੈਣ ਵਾਲੇ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕਾਂ ਨਾਲ ਕਨੈਕਟ ਹੋ ਜਾਵੇਗਾ। ਇਨ੍ਹਾਂ ਕ੍ਰੀਡੈਂਸ਼ੀਅਲਾਂ ਨੂੰ ਹਟਾਉਣ ਲਈ, ਐਪ ਨੂੰ ਅਣਸਥਾਪਤ ਕਰੋ। <ph name="LEARN_MORE" /></translation>
 <translation id="5138014172396933048">ਇਸ ਸਮੇਂ ਆਭਾਸੀ ਕਾਰਡ ਉਪਲਬਧ ਨਹੀਂ ਹੈ, ਕਿਰਪਾ ਕਰਕੇ ਆਪਣੇ ਬੈਂਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ</translation>
 <translation id="5138227688689900538">ਘੱਟ ਦਿਖਾਓ</translation>
+<translation id="5140155249377545621">ਡਰਾਈਵਿੰਗ ਲਾਇਸੰਸ</translation>
 <translation id="5144613843429436866">ਤੁਸੀਂ ਇਸ ਸਾਈਟ ਲਈ <ph name="PERMISSION" /> ਸੰਬੰਧੀ ਆਗਿਆ ਦਿੱਤੀ ਹੈ</translation>
 <translation id="5145883236150621069">ਨੀਤੀ ਜਵਾਬ ਵਿੱਚ ਗੜਬੜ ਕੋਡ ਹੈ</translation>
 <translation id="5146995429444047494"><ph name="ORIGIN" /> ਦੀਆਂ ਸੂਚਨਾਵਾਂ ਬਲਾਕ ਹਨ</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb
index 1524d1f..de36ca6 100644
--- a/components/strings/components_strings_pl.xtb
+++ b/components/strings/components_strings_pl.xtb
@@ -4240,6 +4240,7 @@
 <translation id="7886897188117641322">Wybierz szerokie kategorie tematów, które mogą być używane do personalizacji reklam</translation>
 <translation id="7887683347370398519">Sprawdź kod CVC i spróbuj ponownie</translation>
 <translation id="7887885240995164102">Włącz obraz w obrazie</translation>
+<translation id="7888367499748383555">Bez opłat, RRSO od 0% (jeśli spełniasz wymagania)</translation>
 <translation id="7888575728750733395">Intencja renderowania wydruku</translation>
 <translation id="7890748547282909375">Aby zapisać zrzut ekranu, zaloguj się w Microsoft OneDrive</translation>
 <translation id="7890755620327858054">Płatność odroczona jest obecnie niedostępna. Spróbuj ponownie lub wybierz inną formę płatności.</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb
index aec1212..74d2e382 100644
--- a/components/strings/components_strings_pt-BR.xtb
+++ b/components/strings/components_strings_pt-BR.xtb
@@ -1167,7 +1167,7 @@
 <translation id="2922792708490674">{0,plural, =1{O download do arquivo está bloqueado}one{O download de <ph name="FILE_COUNT" /> arquivo está bloqueado}other{O download de <ph name="FILE_COUNT" /> arquivos está bloqueado}}</translation>
 <translation id="2923275635648511531">Produtos para bronzeamento e proteção solar</translation>
 <translation id="292371311537977079">Configurações do Chrome</translation>
-<translation id="2925454999967523701">Botão "Criar documento". Ative para criar rapidamente um novo arquivo do Documentos Google</translation>
+<translation id="2925454999967523701">Botão "Criar documento". Ative para criar rapidamente um novo arquivo do Google Docs</translation>
 <translation id="2925673989565098301">Método de envio</translation>
 <translation id="2928426578619531300">Afiliado do usuário</translation>
 <translation id="2928905813689894207">Endereço de cobrança</translation>
@@ -1762,7 +1762,7 @@
 <translation id="384315386171052386">Peixes e frutos do mar</translation>
 <translation id="3843447501960446468">Gerenciar cartões fidelidade…</translation>
 <translation id="3844725157150297127">RA1</translation>
-<translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />. Pressione Tab e depois Enter para criar rapidamente um novo arquivo do Documentos Google</translation>
+<translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />. Pressione Tab e depois Enter para criar rapidamente um novo arquivo do Google Docs</translation>
 <translation id="385051799172605136">Voltar</translation>
 <translation id="3851830401766703401">Ensino de direito</translation>
 <translation id="385489333361351399">Equipamento de foto e vídeo</translation>
@@ -3596,7 +3596,7 @@
 <translation id="6874604403660855544">&amp;Refazer adicionar</translation>
 <translation id="6875894866901426843">Em <ph name="DATE_TIME" />, o administrador vai excluir seus arquivos locais, incluindo os que estão na lixeira.</translation>
 <translation id="6880941331070119097">Opção com preço alto</translation>
-<translation id="6881240511396774766">Criar um novo arquivo do Documentos Google rapidamente</translation>
+<translation id="6881240511396774766">Criar um novo arquivo do Google Docs rapidamente</translation>
 <translation id="6882210908253838664">Se um site não estiver funcionando, tente conceder uma permissão temporária para usar cookies de terceiros. <ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></translation>
 <translation id="6883221904761970440">A página de autenticação de credenciais para pagamento seguro está fechada</translation>
 <translation id="6883745783646124431">endereço de trabalho</translation>
@@ -5012,7 +5012,7 @@
 <translation id="9179703756951298733">Gerencie seus pagamentos e suas informações de cartão de crédito nas configurações do Chrome</translation>
 <translation id="9179766227052716237">Sua organização diz: "<ph name="CUSTOM_MESSAGE" />"</translation>
 <translation id="9179907736442194268">Receba alertas por e-mail se houver uma redução no preço em algum site</translation>
-<translation id="9183302530794969518">Documentos Google</translation>
+<translation id="9183302530794969518">Google Docs</translation>
 <translation id="9183425211371246419"><ph name="HOST_NAME" /> usa um protocolo incompatível.</translation>
 <translation id="918454845714257218">Confira o código na <ph name="SIDE_OF_CARD" /> e tente de novo</translation>
 <translation id="9186203289258525843">Botão "Definir o Chrome como navegador padrão". Ative para definir o Chrome como o navegador padrão do sistema</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb
index 090772d..e63c576 100644
--- a/components/strings/components_strings_ru.xtb
+++ b/components/strings/components_strings_ru.xtb
@@ -4239,6 +4239,7 @@
 <translation id="7886897188117641322">Выбирайте, какие категории тем могут использоваться для персонализации рекламы</translation>
 <translation id="7887683347370398519">Проверьте CVC-код и повторите попытку</translation>
 <translation id="7887885240995164102">Включить режим "Картинка в картинке"</translation>
+<translation id="7888367499748383555">Без комиссий, годовая процентная ставка до 0 % (есть условия)</translation>
 <translation id="7888575728750733395">Способ цветового пересчета для печати</translation>
 <translation id="7890748547282909375">Чтобы сохранить скриншот, войдите в Microsoft OneDrive.</translation>
 <translation id="7890755620327858054">Оплата в рассрочку сейчас недоступна. Повторите попытку или выберите другой способ оплаты.</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb
index 14375e64..34194690 100644
--- a/components/strings/components_strings_sk.xtb
+++ b/components/strings/components_strings_sk.xtb
@@ -662,6 +662,7 @@
 <translation id="2085876078937250610">Uložiť…</translation>
 <translation id="2088913896151127116">Pridať text</translation>
 <translation id="2090451897496479509">Ak sa chcete dozvedieť viac, kontaktujte poskytovateľa</translation>
+<translation id="2090686487550343086">Čísla IBAN</translation>
 <translation id="2091887806945687916">Zvuk</translation>
 <translation id="2093184051799735948">Použite vyhľadávač <ph name="ENGINE_NAME" /> alebo zadajte webovú adresu</translation>
 <translation id="2093982008204312032">Google Chrome sa pokúša vypnúť Windows Hello na vypĺňanie hesiel.</translation>
@@ -799,6 +800,7 @@
 <translation id="2283340219607151381">Ukladať a dopĺňať adresy</translation>
 <translation id="2283447177162560884">Položka <ph name="PAGE_TITLE" /> bola odstránená</translation>
 <translation id="2283599456633275070">Cestovanie</translation>
+<translation id="2285709459648658719">Pasy</translation>
 <translation id="2286383991450886080">34 × 44 palcov</translation>
 <translation id="2288422996159078444">Akýkoľvek zadaný text, zobrazené stránky aj všetka ďalšia aktivita na webe sú sledované. Obsah na weboch môže byť bez vášho vedomia zmenený.</translation>
 <translation id="2289385804009217824">Orezať</translation>
@@ -2547,6 +2549,7 @@
 <translation id="5137761395480718572">Táto aplikácia vyžaduje povolenie inštalovať prihlasovacie údaje sietí Wi‑Fi. Po nastavení sa bude <ph name="DEVICE_TYPE" /> automaticky pripájať k zúčastneným sieťam Wi‑Fi. Ak chcete tieto prihlasovacie údaje odstrániť, odinštalujte aplikáciu. <ph name="LEARN_MORE" /></translation>
 <translation id="5138014172396933048">Virtuálna karta nie je momentálne k dispozícii, kontaktujte svoju banku</translation>
 <translation id="5138227688689900538">Zobraziť menej</translation>
+<translation id="5140155249377545621">Vodičské preukazy</translation>
 <translation id="5144613843429436866">Tomuto webu ste udelili povolenie <ph name="PERMISSION" /></translation>
 <translation id="5145883236150621069">V odpovedi na pravidlo sa nachádza kód chyby</translation>
 <translation id="5146995429444047494">Upozornenia webu <ph name="ORIGIN" /> sú blokované</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb
index 7a683cd1..6bf46b05 100644
--- a/components/strings/components_strings_sl.xtb
+++ b/components/strings/components_strings_sl.xtb
@@ -4237,6 +4237,7 @@
 <translation id="7886897188117641322">Izberite, katere širše kategorije tem se lahko uporabljajo za lažje osebno prilagajanje oglasov</translation>
 <translation id="7887683347370398519">Preverite CVC in poskusite znova</translation>
 <translation id="7887885240995164102">Odpri način slike v sliki</translation>
+<translation id="7888367499748383555">Brez stroškov, 0-odstotna EOM (odvisno od primernosti)</translation>
 <translation id="7888575728750733395">Namen upodabljanja tiskanja</translation>
 <translation id="7890748547282909375">Če želite shraniti posnetek zaslona, se prijavite v Microsoft OneDrive</translation>
 <translation id="7890755620327858054">Poznejše plačilo trenutno ni na voljo. Poskusite znova ali izberite drugo plačilno sredstvo.</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb
index 31297e0..3c0a2ca 100644
--- a/components/strings/components_strings_ta.xtb
+++ b/components/strings/components_strings_ta.xtb
@@ -4235,6 +4235,7 @@
 <translation id="7886897188117641322">விளம்பரங்களைப் பிரத்தியேகமாக்க உதவுவதற்குப் பயன்படுத்தக்கூடிய பரவலான தலைப்பு வகைகளைத் தேர்வுசெய்யலாம்</translation>
 <translation id="7887683347370398519">CVCஐச் சோதித்து, மீண்டும் முயற்சிக்கவும்</translation>
 <translation id="7887885240995164102">பிக்ச்சர்-இன்-பிக்ச்சர் பயன்முறைக்கு செல்</translation>
+<translation id="7888367499748383555">கட்டணங்கள் இல்லை, 0% APR அளவிற்குக் குறைவானது (தகுதிநிலைக்கு உட்பட்டது)</translation>
 <translation id="7888575728750733395">அச்சு ரென்டரிங் இன்டென்ட்</translation>
 <translation id="7890748547282909375">ஸ்கிரீன்ஷாட்டைச் சேமிக்க Microsoft OneDriveவில் உள்நுழையுங்கள்</translation>
 <translation id="7890755620327858054">பிறகு பணம் செலுத்தக்கூடிய வசதி தற்போது கிடைக்கவில்லை. மீண்டும் முயலவும் அல்லது வேறொரு பேமெண்ட் முறையைத் தேர்வுசெய்யவும்.</translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb
index 157c39e..e196310d 100644
--- a/components/strings/components_strings_te.xtb
+++ b/components/strings/components_strings_te.xtb
@@ -657,6 +657,7 @@
 <translation id="2085876078937250610">సేవ్ చేయండి…</translation>
 <translation id="2088913896151127116">టెక్స్ట్‌ను జోడించండి</translation>
 <translation id="2090451897496479509">మరిన్ని వివరాల కోసం ప్రొవైడర్‌ను సంప్రదించండి</translation>
+<translation id="2090686487550343086">IBANలు</translation>
 <translation id="2091887806945687916">ధ్వని</translation>
 <translation id="2093184051799735948"><ph name="ENGINE_NAME" />‌లో సెర్చ్ చేయండి లేదా URLను టైప్ చేయండి</translation>
 <translation id="2093982008204312032">పాస్‌వర్డ్‌లను పూరించడం కోసం Windows Helloను ఆఫ్ చేయడానికి Google Chrome ట్రై చేస్తోంది.</translation>
@@ -794,6 +795,7 @@
 <translation id="2283340219607151381">అడ్రస్‌లను సేవ్ చేసి, పూరించండి</translation>
 <translation id="2283447177162560884">'<ph name="PAGE_TITLE" />' తొలగించబడింది</translation>
 <translation id="2283599456633275070">ప్రయాణం</translation>
+<translation id="2285709459648658719">పాస్‌పోర్ట్‌లు</translation>
 <translation id="2286383991450886080">34 x 44 అంగుళాలు</translation>
 <translation id="2288422996159078444">మీరు ఏదైనా టైప్ చేసినా, ఏవైనా పేజీలు వీక్షించినా లేదా వెబ్‌లో ఇతర యాక్టివిటీ ఏదైనా చూసినా. సైట్‌లలోని కంటెంట్ మీకు తెలియకుండానే మారిపోవచ్చు.</translation>
 <translation id="2289385804009217824">కత్తిరించండి</translation>
@@ -2546,6 +2548,7 @@
 <translation id="5137761395480718572">ఈ యాప్ Wi-Fi ఆధారాలను ఇన్‌స్టాల్ చేయడానికి అనుమతిని రిక్వెస్ట్ చేస్తోంది. సెటప్ చేసిన తర్వాత, మీ <ph name="DEVICE_TYPE" /> ఆటోమేటిక్‌గా పాల్గొనే Wi-Fi నెట్‌వర్క్‌లకు కనెక్ట్ అవుతుంది. ఈ ఆధారాలను తీసివేయడానికి, యాప్‌ను అన్‌ఇన్‌స్టాల్ చేయండి. <ph name="LEARN_MORE" /></translation>
 <translation id="5138014172396933048">ప్రస్తుతానికి వర్చువల్ కార్డ్ అందుబాటులో లేదు, దయచేసి మీ బ్యాంకును సంప్రదించండి</translation>
 <translation id="5138227688689900538">తక్కువ చూపు</translation>
+<translation id="5140155249377545621">డ్రైవర్ లైసెన్స్‌లు</translation>
 <translation id="5144613843429436866">మీరు ఈ సైట్‌కు <ph name="PERMISSION" />‌ను అనుమతించారు</translation>
 <translation id="5145883236150621069">విధాన ప్రతిస్పందనలో ఎర్రర్ కోడ్ ఉంది</translation>
 <translation id="5146995429444047494"><ph name="ORIGIN" /> కోసం నోటిఫికేషన్‌లు బ్లాక్ చేయబడ్డాయి</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb
index 291f595..7a9b97bb 100644
--- a/components/strings/components_strings_th.xtb
+++ b/components/strings/components_strings_th.xtb
@@ -662,6 +662,7 @@
 <translation id="2085876078937250610">บันทึก…</translation>
 <translation id="2088913896151127116">เพิ่มข้อความ</translation>
 <translation id="2090451897496479509">โปรดติดต่อผู้ให้บริการเพื่อขอข้อมูลเพิ่มเติม</translation>
+<translation id="2090686487550343086">IBAN</translation>
 <translation id="2091887806945687916">เสียง</translation>
 <translation id="2093184051799735948">ค้นหา <ph name="ENGINE_NAME" /> หรือพิมพ์ URL</translation>
 <translation id="2093982008204312032">Google Chrome กำลังพยายามปิด Windows Hello เพื่อป้อนรหัสผ่าน</translation>
@@ -799,6 +800,7 @@
 <translation id="2283340219607151381">บันทึกและกรอกที่อยู่</translation>
 <translation id="2283447177162560884">ลบ "<ph name="PAGE_TITLE" />" แล้ว</translation>
 <translation id="2283599456633275070">การเดินทาง</translation>
+<translation id="2285709459648658719">หนังสือเดินทาง</translation>
 <translation id="2286383991450886080">34 x 44 นิ้ว</translation>
 <translation id="2288422996159078444">มีการสอดแนมทุกอย่างที่คุณพิมพ์ หน้าที่คุณเข้าชม หรือกิจกรรมอื่นใดที่คุณทำในหน้าเว็บ อาจมีการเปลี่ยนแปลงเนื้อหาในเว็บไซต์โดยไม่แจ้งให้คุณทราบ</translation>
 <translation id="2289385804009217824">ตัด</translation>
@@ -2550,6 +2552,7 @@
 <translation id="5137761395480718572">แอปนี้กำลังขอสิทธิ์ในการติดตั้งข้อมูลเข้าสู่ระบบ Wi-Fi หลังตั้งค่าแล้ว <ph name="DEVICE_TYPE" /> จะเชื่อมต่อกับเครือข่าย Wi-Fi ที่เข้าร่วมโดยอัตโนมัติ หากต้องการนำข้อมูลเข้าสู่ระบบเหล่านี้ออก ให้ถอนการติดตั้งแอป <ph name="LEARN_MORE" /></translation>
 <translation id="5138014172396933048">บัตรเสมือนไม่พร้อมใช้งานในขณะนี้ โปรดติดต่อธนาคาร</translation>
 <translation id="5138227688689900538">แสดงน้อยลง</translation>
+<translation id="5140155249377545621">ใบขับขี่</translation>
 <translation id="5144613843429436866">คุณอนุญาตให้ใช้<ph name="PERMISSION" />ในเว็บไซต์นี้</translation>
 <translation id="5145883236150621069">มีรหัสข้อผิดพลาดในการตอบกลับนโยบาย</translation>
 <translation id="5146995429444047494">บล็อกการแจ้งเตือนของ <ph name="ORIGIN" /> ไว้</translation>
@@ -3232,7 +3235,7 @@
 <translation id="6284449872909111707">การส่ง SMS และการรับส่งข้อความโต้ตอบแบบทันที</translation>
 <translation id="6284517535531159884">ประเภท Seed ของรูปแบบ</translation>
 <translation id="6287197303017372967">ขอเส้นทางไปยังจุดหมายของคุณพร้อมคำแนะนำแบบเลี้ยวต่อเลี้ยวโดยใช้ฟีเจอร์การนำทาง</translation>
-<translation id="6288559570252410796">ถามโหมด AI ของ Google</translation>
+<translation id="6288559570252410796">ถามโหมด Google AI</translation>
 <translation id="628877850550444614">พบส่วนลด</translation>
 <translation id="6289939620939689042">สีของหน้าเว็บ</translation>
 <translation id="6292819926564202163">เครื่องมือค้นหาใน Chrome</translation>
@@ -4045,7 +4048,7 @@
 <translation id="7569490014721427265">กอล์ฟ</translation>
 <translation id="7569952961197462199">นำบัตรเครดิตออกจาก Chrome ไหม</translation>
 <translation id="7569983096843329377">สีดำ</translation>
-<translation id="7571813784389228510">โหมด AI ของ Google</translation>
+<translation id="7571813784389228510">โหมด Google AI</translation>
 <translation id="7574998639136359461">อุปกรณ์กีฬาฤดูหนาว</translation>
 <translation id="7575207903026901870">ปุ่ม "นำคำแนะนำออก" กด Enter เพื่อนำคำแนะนำนี้ออก</translation>
 <translation id="7575800019233204241">"การเชื่อมต่อของคุณไม่เป็นส่วนตัว" หรือ "&lt;span class="error-code"&gt;NET::ERR_CERT_AUTHORITY_INVALID&lt;/span&gt;" หรือ "&lt;span class="error-code"&gt;ERR_CERT_COMMON_NAME_INVALID&lt;/span&gt;" หรือ "&lt;span class="error-code"&gt;NET::ERR_CERT_WEAK_SIGNATURE_ALGORITHM&lt;/span&gt;" หรือ "ข้อผิดพลาดของใบรับรอง SSL"</translation>
@@ -4236,6 +4239,7 @@
 <translation id="7886897188117641322">เลือกหมวดหมู่กว้างๆ ของหัวข้อที่สามารถใช้ในการปรับโฆษณาตามโปรไฟล์ของผู้ใช้</translation>
 <translation id="7887683347370398519">ตรวจสอบ CVC และลองอีกครั้ง</translation>
 <translation id="7887885240995164102">เข้าสู่การแสดงภาพซ้อนภาพ</translation>
+<translation id="7888367499748383555">ไม่มีค่าธรรมเนียม อัตราดอกเบี้ยต่อปี (APR) ต่ำสุด 0% (ขึ้นอยู่กับการมีสิทธิ์)</translation>
 <translation id="7888575728750733395">การปรับค่าสีการพิมพ์</translation>
 <translation id="7890748547282909375">ลงชื่อเข้าใช้ Microsoft OneDrive เพื่อบันทึกภาพหน้าจอ</translation>
 <translation id="7890755620327858054">ฟีเจอร์จ่ายทีหลังไม่พร้อมให้บริการในขณะนี้ โปรดลองอีกครั้งหรือเลือกวิธีการชำระเงินอื่น</translation>
@@ -4499,7 +4503,7 @@
 <translation id="831997045666694187">ตอนเย็น</translation>
 <translation id="8321448084834652864">คุณเปลี่ยนเครื่องมือค้นหาได้ตลอดเวลาในการตั้งค่าของ Chromium</translation>
 <translation id="8321476692217554900">การแจ้งเตือน</translation>
-<translation id="8322230666450346681"><ph name="STARTER_PACK_AI_MODE_FOCUSED_FRIENDLY_MATCH_TEXT" /> กด Enter เพื่อถามโหมด AI ของ Google</translation>
+<translation id="8322230666450346681"><ph name="STARTER_PACK_AI_MODE_FOCUSED_FRIENDLY_MATCH_TEXT" /> กด Enter เพื่อถามโหมด Google AI</translation>
 <translation id="8322402665880479974">เตียงและหัวเตียง</translation>
 <translation id="8323505966575306467">เพิ่มการปกป้องให้รหัสผ่านของคุณ</translation>
 <translation id="832547548543012337">ลบหนังสือเดินทาง</translation>
@@ -5061,7 +5065,7 @@
 <translation id="950926967802086924">พาสคีย์ • เครื่องมือจัดการรหัสผ่านบน Google</translation>
 <translation id="955429569736351433">อนุญาต VR</translation>
 <translation id="955627189349169688">คุณเลือกไม่รับนโยบายนี้ได้ใน<ph name="BEGIN_LINK" />การตั้งค่าการซิงค์ของ Chrome<ph name="END_LINK" /></translation>
-<translation id="95676157383774931">ปุ่มโหมด AI เปิดใช้งานเพื่อถามโหมด AI ของ Google</translation>
+<translation id="95676157383774931">ปุ่มโหมด AI เปิดใช้งานเพื่อถามโหมด Google AI</translation>
 <translation id="95721182352849470">เหลือง 2</translation>
 <translation id="961663415146723894">เย็บเล่มด้านล่าง</translation>
 <translation id="961856697154696964">ลบข้อมูลการท่องเว็บ</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb
index 541599aa..52435823 100644
--- a/components/strings/components_strings_vi.xtb
+++ b/components/strings/components_strings_vi.xtb
@@ -4240,6 +4240,7 @@
 <translation id="7886897188117641322">Chọn những loại chủ đề chính mà các trang web có thể dùng để cá nhân hoá quảng cáo</translation>
 <translation id="7887683347370398519">Kiểm tra CVC của bạn và thử lại</translation>
 <translation id="7887885240995164102">Vào chế độ hình trong hình</translation>
+<translation id="7888367499748383555">Không tính phí, lãi suất hằng năm có thể bằng 0% (phải đủ điều kiện)</translation>
 <translation id="7888575728750733395">In theo mục đích tái tạo</translation>
 <translation id="7890748547282909375">Đăng nhập vào Microsoft OneDrive để lưu ảnh chụp màn hình</translation>
 <translation id="7890755620327858054">Tính năng trả sau hiện không dùng được. Hãy thử lại hoặc chọn một phương thức thanh toán khác.</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb
index db231a6c..82b08d2 100644
--- a/components/strings/components_strings_zh-CN.xtb
+++ b/components/strings/components_strings_zh-CN.xtb
@@ -1051,7 +1051,7 @@
 <translation id="2691385045260836588">型号</translation>
 <translation id="2691924980723297736">安全警告</translation>
 <translation id="2696385693639654606">借助 Chrome 企业核心版,您可以从云端管理浏览器政策、应用和扩展程序</translation>
-<translation id="2697248912349197812">向 <ph name="KEYWORD_SHORT_NAME" /> 提问</translation>
+<translation id="2697248912349197812">问问 <ph name="KEYWORD_SHORT_NAME" /></translation>
 <translation id="2699273987028089219">子菜单可用,使用<ph name="SHORTCUT" />可找到其他选项。</translation>
 <translation id="2701514975700770343">正面朝下</translation>
 <translation id="2702592986366989640">低价选项</translation>
diff --git a/components/strings/components_strings_zh-HK.xtb b/components/strings/components_strings_zh-HK.xtb
index 54391a7..6c0f4ac 100644
--- a/components/strings/components_strings_zh-HK.xtb
+++ b/components/strings/components_strings_zh-HK.xtb
@@ -662,6 +662,7 @@
 <translation id="2085876078937250610">儲存…</translation>
 <translation id="2088913896151127116">新增文字</translation>
 <translation id="2090451897496479509">詳情請聯絡供應商</translation>
+<translation id="2090686487550343086">IBAN</translation>
 <translation id="2091887806945687916">音效</translation>
 <translation id="2093184051799735948">搜尋 <ph name="ENGINE_NAME" /> 或輸入網址</translation>
 <translation id="2093982008204312032">Google Chrome 正在嘗試關閉 Windows Hello,以便填入密碼。</translation>
@@ -799,6 +800,7 @@
 <translation id="2283340219607151381">儲存和填入地址</translation>
 <translation id="2283447177162560884">刪除咗「<ph name="PAGE_TITLE" />」</translation>
 <translation id="2283599456633275070">旅遊</translation>
+<translation id="2285709459648658719">護照</translation>
 <translation id="2286383991450886080">34 x 44 吋</translation>
 <translation id="2288422996159078444">您輸入的內容、瀏覽的網頁或其他網絡活動都會被監視,且網站內容可能會在您不知情的情況下變更。</translation>
 <translation id="2289385804009217824">修剪</translation>
@@ -2550,6 +2552,7 @@
 <translation id="5137761395480718572">此應用程式現要求您授權安裝 Wi-Fi 憑證。設定完成後,您的 <ph name="DEVICE_TYPE" /> 將會自動連線至參與的 Wi-Fi 網絡。如要移除這些憑證,請解除安裝該應用程式。<ph name="LEARN_MORE" /></translation>
 <translation id="5138014172396933048">目前無法使用虛擬卡,請聯絡您的銀行</translation>
 <translation id="5138227688689900538">顯示較少</translation>
+<translation id="5140155249377545621">駕駛執照</translation>
 <translation id="5144613843429436866">你已向此網站授予<ph name="PERMISSION" />存取權</translation>
 <translation id="5145883236150621069">政策回應中存在錯誤代碼</translation>
 <translation id="5146995429444047494">已封鎖 <ph name="ORIGIN" /> 的通知</translation>
@@ -4236,6 +4239,7 @@
 <translation id="7886897188117641322">選擇系統可根據哪些廣泛的主題類別放送個人化廣告</translation>
 <translation id="7887683347370398519">請檢查您的 CVC,然後再試一次</translation>
 <translation id="7887885240995164102">進入畫中畫</translation>
+<translation id="7888367499748383555">免手續費,年利率低至 0% (須符合資格)</translation>
 <translation id="7888575728750733395">列印輸出意圖</translation>
 <translation id="7890748547282909375">登入 Microsoft OneDrive 即可儲存螢幕截圖</translation>
 <translation id="7890755620327858054">稍後付款暫時不適用。請再試一次,或改選其他付款方法。</translation>
diff --git a/components/sync/base/features.cc b/components/sync/base/features.cc
index ef2bff7..6e472ff 100644
--- a/components/sync/base/features.cc
+++ b/components/sync/base/features.cc
@@ -56,6 +56,11 @@
 
 BASE_FEATURE(kSyncBookmarksLimit, base::FEATURE_DISABLED_BY_DEFAULT);
 
+// If enabled, shows a user-actionable error when the bookmarks count limit is
+// exceeded.
+BASE_FEATURE(kSyncShowBookmarksLimitExceededError,
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 BASE_FEATURE(kSyncResetBookmarksInitialMergeLimitExceededError,
              base::FEATURE_ENABLED_BY_DEFAULT);
 
diff --git a/components/sync/base/features.h b/components/sync/base/features.h
index 587bd6d..489e9550 100644
--- a/components/sync/base/features.h
+++ b/components/sync/base/features.h
@@ -75,6 +75,10 @@
 // last initial merge is reset after a certain period.
 BASE_DECLARE_FEATURE(kSyncResetBookmarksInitialMergeLimitExceededError);
 
+// If enabled, shows a user-actionable error when the bookmarks count limit is
+// exceeded.
+BASE_DECLARE_FEATURE(kSyncShowBookmarksLimitExceededError);
+
 BASE_DECLARE_FEATURE(kSyncEnableContactInfoDataTypeForCustomPassphraseUsers);
 BASE_DECLARE_FEATURE(kSyncEnableContactInfoDataTypeForDasherUsers);
 
diff --git a/components/sync/service/BUILD.gn b/components/sync/service/BUILD.gn
index 80d54cf7..2592f81f 100644
--- a/components/sync/service/BUILD.gn
+++ b/components/sync/service/BUILD.gn
@@ -7,6 +7,8 @@
     "active_devices_provider.h",
     "backend_migrator.cc",
     "backend_migrator.h",
+    "bookmark_sync_error_state.cc",
+    "bookmark_sync_error_state.h",
     "configure_context.cc",
     "configure_context.h",
     "data_type_controller.cc",
diff --git a/components/sync/service/bookmark_sync_error_state.cc b/components/sync/service/bookmark_sync_error_state.cc
new file mode 100644
index 0000000..3d2ed467
--- /dev/null
+++ b/components/sync/service/bookmark_sync_error_state.cc
@@ -0,0 +1,42 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/sync/service/bookmark_sync_error_state.h"
+
+#include "components/sync/model/model_error.h"
+#include "components/sync/service/sync_error.h"
+
+namespace syncer {
+
+// Returns true if the error is a bookmark limit exceeded error.
+bool IsBookmarksLimitExceededError(const SyncError& error) {
+  if (error.error_type() != SyncError::MODEL_ERROR ||
+      !error.model_error_type().has_value()) {
+    return false;
+  }
+
+  switch (error.model_error_type().value()) {
+    case ModelError::Type::kBookmarksRemoteCountExceededLimitInitialMerge:
+    case ModelError::Type::kBookmarksRemoteCountExceededLimitLastInitialMerge:
+    case ModelError::Type::kBookmarksLocalCountExceededLimitOnSyncStart:
+    case ModelError::Type::kBookmarksLocalCountExceededLimitOnUpdateReceived:
+    case ModelError::Type::kBookmarksLocalCountExceededLimitNudgeForCommit:
+      return true;
+    default:
+      return false;
+  }
+}
+
+BookmarkSyncErrorState::BookmarkSyncErrorState() = default;
+BookmarkSyncErrorState::~BookmarkSyncErrorState() = default;
+
+bool BookmarkSyncErrorState::IsActionableError(const SyncError& error) const {
+  return IsBookmarksLimitExceededError(error) && !error_acknowledged_;
+}
+
+void BookmarkSyncErrorState::AcknowledgeError() {
+  error_acknowledged_ = true;
+}
+
+}  // namespace syncer
diff --git a/components/sync/service/bookmark_sync_error_state.h b/components/sync/service/bookmark_sync_error_state.h
new file mode 100644
index 0000000..b7edb9a
--- /dev/null
+++ b/components/sync/service/bookmark_sync_error_state.h
@@ -0,0 +1,31 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_SYNC_SERVICE_BOOKMARK_SYNC_ERROR_STATE_H_
+#define COMPONENTS_SYNC_SERVICE_BOOKMARK_SYNC_ERROR_STATE_H_
+
+namespace syncer {
+
+class SyncError;
+
+class BookmarkSyncErrorState {
+ public:
+  BookmarkSyncErrorState();
+  ~BookmarkSyncErrorState();
+
+  // Returns true if the error is a bookmark limit exceeded error and it hasn't
+  // been acknowledged by the user yet.
+  bool IsActionableError(const SyncError& error) const;
+
+  // Acknowledges the bookmarks limit exceeded error, so it will not be
+  // considered actionable again until the next browser restart.
+  void AcknowledgeError();
+
+ private:
+  bool error_acknowledged_ = false;
+};
+
+}  // namespace syncer
+
+#endif  // COMPONENTS_SYNC_SERVICE_BOOKMARK_SYNC_ERROR_STATE_H_
diff --git a/components/sync/service/data_type_manager.h b/components/sync/service/data_type_manager.h
index e6da93c3..7053990 100644
--- a/components/sync/service/data_type_manager.h
+++ b/components/sync/service/data_type_manager.h
@@ -14,6 +14,7 @@
 #include "components/sync/base/sync_stop_metadata_fate.h"
 #include "components/sync/engine/configure_reason.h"
 #include "components/sync/model/type_entities_count.h"
+#include "components/sync/service/data_type_status_table.h"
 #include "components/sync/service/local_data_description.h"
 #include "components/sync/service/sync_error.h"
 #include "components/sync/service/type_status_map_for_debugging.h"
@@ -123,6 +124,9 @@
   // the disk).
   virtual DataTypeSet GetDataTypesWithPermanentErrors() const = 0;
 
+  // Returns the map of data types with errors.
+  virtual DataTypeStatusTable::TypeErrorMap GetDataTypeErrors() const = 0;
+
   // Returns the datatypes which have local changes that have not yet been
   // synced with the server.
   // Note: This only queries the datatypes in `requested_types`.
diff --git a/components/sync/service/data_type_manager_impl.cc b/components/sync/service/data_type_manager_impl.cc
index 617f5d6..f4a3c50 100644
--- a/components/sync/service/data_type_manager_impl.cc
+++ b/components/sync/service/data_type_manager_impl.cc
@@ -891,6 +891,11 @@
   return data_type_status_table_.GetFatalErrorTypes();
 }
 
+DataTypeStatusTable::TypeErrorMap DataTypeManagerImpl::GetDataTypeErrors()
+    const {
+  return data_type_status_table_.GetAllErrors();
+}
+
 DataTypeSet DataTypeManagerImpl::GetStoppedDataTypesExcludingNigori() const {
   DataTypeSet stopped_types;
 
diff --git a/components/sync/service/data_type_manager_impl.h b/components/sync/service/data_type_manager_impl.h
index 67eda4d..29113377 100644
--- a/components/sync/service/data_type_manager_impl.h
+++ b/components/sync/service/data_type_manager_impl.h
@@ -54,6 +54,7 @@
   DataTypeSet GetActiveProxyDataTypes() const override;
   DataTypeSet GetTypesWithPendingDownloadForInitialSync() const override;
   DataTypeSet GetDataTypesWithPermanentErrors() const override;
+  DataTypeStatusTable::TypeErrorMap GetDataTypeErrors() const override;
   void GetTypesWithUnsyncedData(
       DataTypeSet requested_types,
       base::OnceCallback<void(absl::flat_hash_map<DataType, size_t>)> callback)
diff --git a/components/sync/service/sync_internals_util.cc b/components/sync/service/sync_internals_util.cc
index e7047070..d3bb95c 100644
--- a/components/sync/service/sync_internals_util.cc
+++ b/components/sync/service/sync_internals_util.cc
@@ -215,6 +215,8 @@
 #endif  // BUILDFLAG(IS_ANDROID)
     case SyncService::UserActionableError::kNeedsClientUpgrade:
       return "Client version is too old and needs upgrade";
+    case SyncService::UserActionableError::kBookmarksLimitExceeded:
+      return "Bookmarks limit exceeded";
   }
 
   NOTREACHED();
diff --git a/components/sync/service/sync_service.h b/components/sync/service/sync_service.h
index 983a05f..18513f7 100644
--- a/components/sync/service/sync_service.h
+++ b/components/sync/service/sync_service.h
@@ -239,7 +239,9 @@
     // Indicates that the version of the client/browser is too old and needs to
     // be upgraded to a more recent version.
     kNeedsClientUpgrade = 10,
-    kMaxValue = kNeedsClientUpgrade,
+    // The number of bookmarks has exceeded the limit.
+    kBookmarksLimitExceeded = 11,
+    kMaxValue = kBookmarksLimitExceeded,
   };
   // LINT.ThenChange(/tools/metrics/histograms/metadata/sync/enums.xml:UserActionableError)
 
@@ -477,6 +479,12 @@
   virtual void TriggerLocalDataMigrationForItems(
       std::map<DataType, std::vector<LocalDataItemModel::DataId>> items) = 0;
 
+  // Acknowledges the `kBookmarksLimitExceeded` user-actionable error. Once
+  // acknowledged, `GetUserActionableError()` will no longer report this error
+  // until the next browser restart. This is used to hide the error UI
+  // after the user has interacted with it.
+  virtual void AcknowledgeBookmarksLimitExceededError() = 0;
+
   // Requests sync service to first enable account storage for the `data_type`
   // and then asynchronously move the specified local data `items` to account.
   // This means that a user selection is mutated - if they had opted out of
diff --git a/components/sync/service/sync_service_impl.cc b/components/sync/service/sync_service_impl.cc
index b1924ce..805f853 100644
--- a/components/sync/service/sync_service_impl.cc
+++ b/components/sync/service/sync_service_impl.cc
@@ -51,8 +51,10 @@
 #include "components/sync/engine/sync_encryption_handler.h"
 #include "components/sync/invalidations/sync_invalidations_service.h"
 #include "components/sync/service/backend_migrator.h"
+#include "components/sync/service/bookmark_sync_error_state.h"
 #include "components/sync/service/configure_context.h"
 #include "components/sync/service/data_type_manager_impl.h"
+#include "components/sync/service/data_type_status_table.h"
 #include "components/sync/service/local_data_description.h"
 #include "components/sync/service/local_data_migration_item_queue.h"
 #include "components/sync/service/sync_auth_manager.h"
@@ -941,6 +943,18 @@
   }
 #endif  // BUILDFLAG(IS_ANDROID)
 
+  // This error should ideally be the last one to be checked. Any new identity
+  // errors should be handled before this.
+  if (base::FeatureList::IsEnabled(kSyncShowBookmarksLimitExceededError)) {
+    const DataTypeStatusTable::TypeErrorMap data_type_errors =
+        data_type_manager_->GetDataTypeErrors();
+    auto it = data_type_errors.find(BOOKMARKS);
+    if (it != data_type_errors.end() &&
+        bookmark_sync_error_state_.IsActionableError(it->second)) {
+      return UserActionableError::kBookmarksLimitExceeded;
+    }
+  }
+
   return UserActionableError::kNone;
 }
 
@@ -2467,4 +2481,9 @@
           data_type, std::move(items));
 }
 
+void SyncServiceImpl::AcknowledgeBookmarksLimitExceededError() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  bookmark_sync_error_state_.AcknowledgeError();
+}
+
 }  // namespace syncer
diff --git a/components/sync/service/sync_service_impl.h b/components/sync/service/sync_service_impl.h
index 903a3910..851fb40 100644
--- a/components/sync/service/sync_service_impl.h
+++ b/components/sync/service/sync_service_impl.h
@@ -32,6 +32,7 @@
 #include "components/sync/engine/shutdown_reason.h"
 #include "components/sync/engine/sync_engine.h"
 #include "components/sync/engine/sync_engine_host.h"
+#include "components/sync/service/bookmark_sync_error_state.h"
 #include "components/sync/service/data_type_controller.h"
 #include "components/sync/service/data_type_manager.h"
 #include "components/sync/service/data_type_manager_observer.h"
@@ -175,6 +176,7 @@
   void SelectTypeAndMigrateLocalDataItemsWhenActive(
       DataType data_type,
       std::vector<LocalDataItemModel::DataId> items) override;
+  void AcknowledgeBookmarksLimitExceededError() override;
 
   // SyncEngineHost implementation.
   void OnEngineInitialized(bool success,
@@ -409,6 +411,8 @@
   // This profile's SyncClient.
   const std::unique_ptr<SyncClient> sync_client_;
 
+  BookmarkSyncErrorState bookmark_sync_error_state_;
+
   // Callback used to create network connections.
   const CreateHttpPostProviderFactory create_http_post_provider_factory_;
 
diff --git a/components/sync/service/sync_service_impl_unittest.cc b/components/sync/service/sync_service_impl_unittest.cc
index 137e154..e9c51df 100644
--- a/components/sync/service/sync_service_impl_unittest.cc
+++ b/components/sync/service/sync_service_impl_unittest.cc
@@ -19,6 +19,7 @@
 #include "base/test/mock_callback.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
+#include "base/test/run_until.h"
 #include "base/test/test_future.h"
 #include "base/time/time.h"
 #include "base/values.h"
@@ -38,6 +39,7 @@
 #include "components/sync/base/user_selectable_type.h"
 #include "components/sync/engine/nigori/key_derivation_params.h"
 #include "components/sync/engine/sync_status.h"
+#include "components/sync/service/bookmark_sync_error_state.h"
 #include "components/sync/service/sync_service_observer.h"
 #include "components/sync/service/sync_token_status.h"
 #include "components/sync/service/trusted_vault_synthetic_field_trial.h"
@@ -260,6 +262,17 @@
         KeyDerivationParams::CreateForPbkdf2(), sync_pb::EncryptedData());
   }
 
+  void RunUntilSyncTransportState(SyncService::TransportState expected_state) {
+    ASSERT_TRUE(base::test::RunUntil(
+        [&] { return service()->GetTransportState() == expected_state; }));
+  }
+
+  void RunUntilUserActionableError(
+      SyncService::UserActionableError expected_error) {
+    ASSERT_TRUE(base::test::RunUntil(
+        [&] { return service()->GetUserActionableError() == expected_error; }));
+  }
+
   signin::IdentityManager* identity_manager() {
     return sync_service_impl_bundle_.identity_manager();
   }
@@ -892,6 +905,81 @@
 }
 #endif  // !BUILDFLAG(IS_CHROMEOS)
 
+class SyncServiceImplBookmarksLimitExceededErrorTest
+    : public SyncServiceImplTest {
+ private:
+  base::test::ScopedFeatureList feature_list_{
+      kSyncShowBookmarksLimitExceededError};
+};
+
+TEST_F(SyncServiceImplBookmarksLimitExceededErrorTest,
+       ShouldShowBookmarksLimitExceededError) {
+  PopulatePrefsForInitialSyncFeatureSetupComplete();
+  SignInWithSyncConsent();
+  InitializeService();
+  RunUntilSyncTransportState(SyncService::TransportState::ACTIVE);
+  ASSERT_EQ(SyncService::UserActionableError::kNone,
+            service()->GetUserActionableError());
+
+  // Induce a bookmark limit exceeded error.
+  get_controller(BOOKMARKS)->model()->SimulateModelError(ModelError(
+      FROM_HERE,
+      ModelError::Type::kBookmarksLocalCountExceededLimitOnSyncStart));
+  RunUntilUserActionableError(
+      SyncService::UserActionableError::kBookmarksLimitExceeded);
+
+  EXPECT_EQ(SyncService::UserActionableError::kBookmarksLimitExceeded,
+            service()->GetUserActionableError());
+
+  // Acknowledge the error.
+  service()->AcknowledgeBookmarksLimitExceededError();
+  EXPECT_EQ(SyncService::UserActionableError::kNone,
+            service()->GetUserActionableError());
+}
+
+TEST_F(SyncServiceImplBookmarksLimitExceededErrorTest,
+       ShouldPrioritizeAuthErrorOverBookmarkError) {
+  PopulatePrefsForInitialSyncFeatureSetupComplete();
+  SignInWithSyncConsent();
+  InitializeService();
+  RunUntilSyncTransportState(SyncService::TransportState::ACTIVE);
+
+  ASSERT_EQ(SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
+  ASSERT_EQ(SyncService::UserActionableError::kNone,
+            service()->GetUserActionableError());
+
+  // Induce a bookmark limit exceeded error.
+  get_controller(BOOKMARKS)->model()->SimulateModelError(ModelError(
+      FROM_HERE,
+      ModelError::Type::kBookmarksLocalCountExceededLimitOnSyncStart));
+  RunUntilUserActionableError(
+      SyncService::UserActionableError::kBookmarksLimitExceeded);
+
+  // The bookmark error should be visible.
+  EXPECT_EQ(SyncService::UserActionableError::kBookmarksLimitExceeded,
+            service()->GetUserActionableError());
+
+  // Mimic entering Sync paused state.
+  identity_test_env()->SetInvalidRefreshTokenForPrimaryAccount();
+  RunUntilSyncTransportState(SyncService::TransportState::PAUSED);
+  ASSERT_EQ(SyncService::TransportState::PAUSED,
+            service()->GetTransportState());
+  // The auth error should have priority over the bookmark error.
+  ASSERT_EQ(SyncService::UserActionableError::kSignInNeedsUpdate,
+            service()->GetUserActionableError());
+
+  // Resolve the auth error. This will restart the sync engine, which clears
+  // any existing data type errors.
+  identity_test_env()->SetRefreshTokenForPrimaryAccount();
+  RunUntilSyncTransportState(SyncService::TransportState::ACTIVE);
+  ASSERT_EQ(SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
+  // After the restart, no error should be reported initially.
+  ASSERT_EQ(SyncService::UserActionableError::kNone,
+            service()->GetUserActionableError());
+}
+
 TEST_F(SyncServiceImplTest, GetSyncTokenStatus) {
   PopulatePrefsForInitialSyncFeatureSetupComplete();
   SignInWithSyncConsent();
diff --git a/components/sync/test/data_type_manager_mock.h b/components/sync/test/data_type_manager_mock.h
index 4c7e72a6..e455b8a 100644
--- a/components/sync/test/data_type_manager_mock.h
+++ b/components/sync/test/data_type_manager_mock.h
@@ -7,6 +7,7 @@
 
 #include "base/functional/callback.h"
 #include "components/sync/service/data_type_manager.h"
+#include "components/sync/service/data_type_status_table.h"
 #include "components/sync/service/local_data_description.h"
 #include "components/sync/service/sync_error.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -28,6 +29,10 @@
               (DataTypeSet, const ConfigureContext&),
               (override));
   MOCK_METHOD(void, DataTypePreconditionChanged, (DataType), (override));
+  MOCK_METHOD(DataTypeStatusTable::TypeErrorMap,
+              GetDataTypeErrors,
+              (),
+              (const, override));
   MOCK_METHOD(void, PurgeForMigration, (DataTypeSet), (override));
   MOCK_METHOD(void, Stop, (SyncStopMetadataFate), (override));
   MOCK_METHOD(DataTypeSet, GetRegisteredDataTypes, (), (const override));
diff --git a/components/sync/test/mock_sync_service.h b/components/sync/test/mock_sync_service.h
index 4d59a09..29e7dae 100644
--- a/components/sync/test/mock_sync_service.h
+++ b/components/sync/test/mock_sync_service.h
@@ -47,6 +47,7 @@
               (),
               (override));
 #endif  // BUILDFLAG(IS_ANDROID)
+  MOCK_METHOD(void, AcknowledgeBookmarksLimitExceededError, (), (override));
   MOCK_METHOD(DisableReasonSet, GetDisableReasons, (), (const override));
   MOCK_METHOD(TransportState, GetTransportState, (), (const override));
   MOCK_METHOD(UserActionableError,
diff --git a/components/sync/test/test_sync_service.cc b/components/sync/test/test_sync_service.cc
index 516bc919..f809370a 100644
--- a/components/sync/test/test_sync_service.cc
+++ b/components/sync/test/test_sync_service.cc
@@ -11,10 +11,11 @@
 #include "base/time/time.h"
 #include "base/values.h"
 #include "build/build_config.h"
+#include "components/sync/base/features.h"
 #include "components/sync/base/progress_marker_map.h"
 #include "components/sync/engine/cycle/model_neutral_state.h"
-#include "components/sync/model/type_entities_count.h"
 #include "components/sync/protocol/sync_enums.pb.h"
+#include "components/sync/service/sync_error.h"
 #include "components/sync/service/sync_token_status.h"
 #include "google_apis/gaia/gaia_id.h"
 #include "google_apis/gaia/google_service_auth_error.h"
@@ -133,6 +134,10 @@
   failed_data_types_ = types;
 }
 
+void TestSyncService::SetBookmarksLimitExceeded(bool exceeded) {
+  bookmarks_limit_exceeded_ = exceeded;
+}
+
 void TestSyncService::SetLastCycleSnapshot(const SyncCycleSnapshot& snapshot) {
   last_cycle_snapshot_ = snapshot;
 }
@@ -263,6 +268,10 @@
                      kTrustedVaultRecoverabilityDegradedForPasswords;
   }
 
+  if (bookmarks_limit_exceeded_) {
+    return UserActionableError::kBookmarksLimitExceeded;
+  }
+
   return UserActionableError::kNone;
 }
 
@@ -483,6 +492,10 @@
     DataType data_type,
     std::vector<LocalDataItemModel::DataId> items) {}
 
+void TestSyncService::AcknowledgeBookmarksLimitExceededError() {
+  bookmarks_limit_exceeded_ = false;
+}
+
 void TestSyncService::SetTriggerRefreshCallback(
     const base::RepeatingCallback<
         void(TriggerRefreshSource, const DataTypeSet&)>& trigger_refresh_cb) {
diff --git a/components/sync/test/test_sync_service.h b/components/sync/test/test_sync_service.h
index a822e5a5b..760c721 100644
--- a/components/sync/test/test_sync_service.h
+++ b/components/sync/test/test_sync_service.h
@@ -80,6 +80,7 @@
   void SetInitialSyncFeatureSetupComplete(
       bool initial_sync_feature_setup_complete);
   void SetFailedDataTypes(const DataTypeSet& types);
+  void SetBookmarksLimitExceeded(bool exceeded);
 
   void SetLastCycleSnapshot(const SyncCycleSnapshot& snapshot);
   // Convenience versions of the above, for when the caller doesn't care about
@@ -183,6 +184,7 @@
   void SelectTypeAndMigrateLocalDataItemsWhenActive(
       DataType data_type,
       std::vector<LocalDataItemModel::DataId> items) override;
+  void AcknowledgeBookmarksLimitExceededError() override;
 
   // KeyedService implementation.
   void Shutdown() override;
@@ -201,6 +203,8 @@
 
   DataTypeSet failed_data_types_;
 
+  bool bookmarks_limit_exceeded_ = false;
+
   std::map<DataType, DataTypeDownloadStatus> download_statuses_;
 
   bool detailed_sync_status_engine_available_ = false;
diff --git a/components/unexportable_keys/background_task_type.cc b/components/unexportable_keys/background_task_type.cc
index 79869ba..c3e28bb 100644
--- a/components/unexportable_keys/background_task_type.cc
+++ b/components/unexportable_keys/background_task_type.cc
@@ -13,6 +13,8 @@
 std::string_view GetBackgroundTaskTypeSuffixForHistograms(
     BackgroundTaskType type) {
   switch (type) {
+    case BackgroundTaskType::kGetAllKeys:
+      return ".GetAllKeys";
     case BackgroundTaskType::kGenerateKey:
       return ".GenerateKey";
     case BackgroundTaskType::kFromWrappedKey:
diff --git a/components/unexportable_keys/background_task_type.h b/components/unexportable_keys/background_task_type.h
index 5d22fab2..54279dc 100644
--- a/components/unexportable_keys/background_task_type.h
+++ b/components/unexportable_keys/background_task_type.h
@@ -11,15 +11,18 @@
 
 namespace unexportable_keys {
 
+// LINT.IfChange(BackgroundTaskType)
 // Enum containing all supported types of background TPM operations.
 // These values are primarily used for histograms together with
 // `GetBackgroundTaskTypeSuffixForHistograms()` below.
 enum class BackgroundTaskType {
+  kGetAllKeys,
   kGenerateKey,
   kFromWrappedKey,
   kSign,
   kDeleteKey,
 };
+// LINT.ThenChange(//tools/metrics/histograms/metadata/net/histograms.xml:UnexportableKeysBackgroundTaskType)
 
 // Converts `BackgroundTaskType` to a histogram suffix string. The string is
 // prepended with "." symbol so it can be directly concatenated with a base
diff --git a/components/unexportable_keys/mock_unexportable_key_provider.cc b/components/unexportable_keys/mock_unexportable_key_provider.cc
index e80a0fe..719d88c5 100644
--- a/components/unexportable_keys/mock_unexportable_key_provider.cc
+++ b/components/unexportable_keys/mock_unexportable_key_provider.cc
@@ -4,9 +4,15 @@
 
 #include "components/unexportable_keys/mock_unexportable_key_provider.h"
 
+#include "testing/gmock/include/gmock/gmock.h"
+
 namespace unexportable_keys {
 
-MockUnexportableKeyProvider::MockUnexportableKeyProvider() = default;
+using ::testing::Return;
+
+MockUnexportableKeyProvider::MockUnexportableKeyProvider() {
+  ON_CALL(*this, AsStatefulUnexportableKeyProvider).WillByDefault(Return(this));
+}
 MockUnexportableKeyProvider::~MockUnexportableKeyProvider() = default;
 
 }  // namespace unexportable_keys
diff --git a/components/unexportable_keys/mock_unexportable_key_provider.h b/components/unexportable_keys/mock_unexportable_key_provider.h
index f650f40..a3d4b4b 100644
--- a/components/unexportable_keys/mock_unexportable_key_provider.h
+++ b/components/unexportable_keys/mock_unexportable_key_provider.h
@@ -5,13 +5,21 @@
 #ifndef COMPONENTS_UNEXPORTABLE_KEYS_MOCK_UNEXPORTABLE_KEY_PROVIDER_H_
 #define COMPONENTS_UNEXPORTABLE_KEYS_MOCK_UNEXPORTABLE_KEY_PROVIDER_H_
 
+#include <cstddef>
+#include <cstdint>
+#include <memory>
+#include <optional>
+#include <vector>
+
+#include "base/containers/span.h"
 #include "crypto/signature_verifier.h"
 #include "crypto/unexportable_key.h"
 #include "testing/gmock/include/gmock/gmock.h"
 
 namespace unexportable_keys {
 
-class MockUnexportableKeyProvider : public crypto::UnexportableKeyProvider {
+class MockUnexportableKeyProvider
+    : public crypto::StatefulUnexportableKeyProvider {
  public:
   MockUnexportableKeyProvider();
   ~MockUnexportableKeyProvider() override;
@@ -31,10 +39,25 @@
               FromWrappedSigningKeySlowly,
               (base::span<const uint8_t> wrapped_key),
               (override));
+  MOCK_METHOD(crypto::StatefulUnexportableKeyProvider*,
+              AsStatefulUnexportableKeyProvider,
+              (),
+              (override));
+
+  // crypto::StatefulUnexportableKeyProvider:
+  MOCK_METHOD(std::optional<
+                  std::vector<std::unique_ptr<crypto::UnexportableSigningKey>>>,
+              GetAllSigningKeysSlowly,
+              (),
+              (override));
   MOCK_METHOD(bool,
               DeleteSigningKeySlowly,
               (base::span<const uint8_t> wrapped_key),
               (override));
+  MOCK_METHOD(std::optional<size_t>,
+              DeleteAllSigningKeysSlowly,
+              (),
+              (override));
 };
 
 }  // namespace unexportable_keys
diff --git a/components/unexportable_keys/scoped_mock_unexportable_key_provider.cc b/components/unexportable_keys/scoped_mock_unexportable_key_provider.cc
index 19d3adfe..e477ee3 100644
--- a/components/unexportable_keys/scoped_mock_unexportable_key_provider.cc
+++ b/components/unexportable_keys/scoped_mock_unexportable_key_provider.cc
@@ -45,8 +45,9 @@
     return provider_->FromWrappedSigningKeySlowly(wrapped_key);
   }
 
-  bool DeleteSigningKeySlowly(base::span<const uint8_t> wrapped_key) override {
-    return provider_->DeleteSigningKeySlowly(wrapped_key);
+  crypto::StatefulUnexportableKeyProvider* AsStatefulUnexportableKeyProvider()
+      override {
+    return provider_->AsStatefulUnexportableKeyProvider();
   }
 
  private:
diff --git a/components/unexportable_keys/unexportable_key_service_impl.cc b/components/unexportable_keys/unexportable_key_service_impl.cc
index 706b3c7c..b63edcee 100644
--- a/components/unexportable_keys/unexportable_key_service_impl.cc
+++ b/components/unexportable_keys/unexportable_key_service_impl.cc
@@ -13,6 +13,7 @@
 #include "base/logging.h"
 #include "base/memory/weak_ptr.h"
 #include "base/types/expected.h"
+#include "base/types/expected_macros.h"
 #include "components/unexportable_keys/service_error.h"
 #include "components/unexportable_keys/unexportable_key_id.h"
 #include "components/unexportable_keys/unexportable_key_task_manager.h"
@@ -142,8 +143,12 @@
         BackgroundTaskPriority priority,
         base::OnceCallback<void(ServiceErrorOr<std::vector<UnexportableKeyId>>)>
             callback) {
-  // TODO: crbug.com/455538141 - Implement key retrieval in the task manager.
-  std::move(callback).Run(std::vector<UnexportableKeyId>());
+  task_manager_->GetAllSigningKeysForGarbageCollectionSlowlyAsync(
+      config_, priority,
+      base::BindOnce(&UnexportableKeyServiceImpl::
+                         OnGetAllSigningKeysForGarbageCollectionSlowly,
+                     get_all_keys_weak_ptr_factory_.GetWeakPtr(),
+                     std::move(callback)));
 }
 
 void UnexportableKeyServiceImpl::SignSlowlyAsync(
@@ -213,7 +218,8 @@
     }
   }
 
-  // Invalidate weak pointers to cancel pending from wrapped key requests.
+  // Invalidate weak pointers to cancel pending key lookup requests.
+  get_all_keys_weak_ptr_factory_.InvalidateWeakPtrs();
   from_wrapped_key_weak_ptr_factory_.InvalidateWeakPtrs();
 
   // TODO: crbug.com/455538141 - Implement deletion in the task manager.
@@ -248,30 +254,88 @@
   return it->second->key().Algorithm();
 }
 
+void UnexportableKeyServiceImpl::OnGetAllSigningKeysForGarbageCollectionSlowly(
+    base::OnceCallback<void(ServiceErrorOr<std::vector<UnexportableKeyId>>)>
+        client_callback,
+    ServiceErrorOr<std::vector<scoped_refptr<RefCountedUnexportableSigningKey>>>
+        keys_or_error) {
+  std::move(client_callback)
+      .Run(OnGetAllSigningKeysForGarbageCollectionSlowlyImpl(
+          std::move(keys_or_error)));
+}
+
+ServiceErrorOr<std::vector<UnexportableKeyId>>
+UnexportableKeyServiceImpl::OnGetAllSigningKeysForGarbageCollectionSlowlyImpl(
+    ServiceErrorOr<std::vector<scoped_refptr<RefCountedUnexportableSigningKey>>>
+        keys_or_error) {
+  ASSIGN_OR_RETURN(
+      std::vector<scoped_refptr<RefCountedUnexportableSigningKey>> keys,
+      std::move(keys_or_error));
+
+  std::vector<UnexportableKeyId> key_ids;
+  key_ids.reserve(keys.size());
+  for (scoped_refptr<RefCountedUnexportableSigningKey>& key : keys) {
+    CHECK(key);
+    UnexportableKeyId key_id = key->id();
+    auto [it, inserted] =
+        key_id_by_wrapped_key_.try_emplace(key->key().GetWrappedKey(), key_id);
+
+    if (!inserted) {
+      // If insertion failed, it means that there were pending callbacks
+      // waiting for the key to be created from the wrapped key.
+      MaybePendingUnexportableKeyId& maybe_pending_key_id = it->second;
+
+      if (!maybe_pending_key_id.HasKeyId()) {
+        // If there is no key ID yet, it means there are still
+        // `FromWrappedKey` requests in flight. In this case, we need set
+        // the key ID and run callbacks.
+        maybe_pending_key_id.SetKeyIdAndRunCallbacks(key_id);
+      } else {
+        // Otherwise, this wrapped key has already been assigned to a key
+        // ID, and we need to use the existing key ID.
+        key_id = maybe_pending_key_id.GetKeyId();
+      }
+    }
+
+    if (key_id == key->id()) {
+      // A newly generated key ID must be unique.
+      CHECK(key_by_key_id_.try_emplace(key_id, std::move(key)).second);
+    }
+
+    key_ids.push_back(key_id);
+  }
+
+  return key_ids;
+}
+
 void UnexportableKeyServiceImpl::OnKeyGenerated(
     base::OnceCallback<void(ServiceErrorOr<UnexportableKeyId>)> client_callback,
     ServiceErrorOr<scoped_refptr<RefCountedUnexportableSigningKey>>
         key_or_error) {
-  std::move(client_callback).Run([&]() -> ServiceErrorOr<UnexportableKeyId> {
-    if (!key_or_error.has_value()) {
-      return base::unexpected(key_or_error.error());
-    }
-    scoped_refptr<RefCountedUnexportableSigningKey>& key = key_or_error.value();
-    // `key` must be non-null if `key_or_error` holds a value.
-    CHECK(key);
-    UnexportableKeyId key_id = key->id();
-    if (!key_id_by_wrapped_key_.try_emplace(key->key().GetWrappedKey(), key_id)
-             .second) {
-      // Drop a newly generated key in the case of a key collision. This should
-      // be extremely rare.
-      DVLOG(1) << "Collision between an existing and a newly generated key "
-                  "detected.";
-      return base::unexpected(ServiceError::kKeyCollision);
-    }
-    // A newly generated key ID must be unique.
-    CHECK(key_by_key_id_.try_emplace(key_id, std::move(key)).second);
-    return key_id;
-  }());
+  return std::move(client_callback)
+      .Run(OnKeyGeneratedImpl(std::move(key_or_error)));
+}
+
+ServiceErrorOr<UnexportableKeyId>
+UnexportableKeyServiceImpl::OnKeyGeneratedImpl(
+    ServiceErrorOr<scoped_refptr<RefCountedUnexportableSigningKey>>
+        key_or_error) {
+  ASSIGN_OR_RETURN(scoped_refptr<RefCountedUnexportableSigningKey> key,
+                   std::move(key_or_error));
+  // `key` must be non-null if `key_or_error` holds a value.
+  CHECK(key);
+  UnexportableKeyId key_id = key->id();
+  if (!key_id_by_wrapped_key_.try_emplace(key->key().GetWrappedKey(), key_id)
+           .second) {
+    // Drop a newly generated key in the case of a key collision. This should
+    // be extremely rare.
+    DVLOG(1) << "Collision between an existing and a newly generated key "
+                "detected.";
+    return base::unexpected(ServiceError::kKeyCollision);
+  }
+  // A newly generated key ID must be unique.
+  CHECK(key_by_key_id_.try_emplace(key_id, std::move(key)).second);
+  return key_id;
 }
 
 void UnexportableKeyServiceImpl::OnKeyCreatedFromWrappedKey(
@@ -279,17 +343,25 @@
     ServiceErrorOr<scoped_refptr<RefCountedUnexportableSigningKey>>
         key_or_error) {
   auto it = key_id_by_wrapped_key_.find(wrapped_key);
-  CHECK(it != key_id_by_wrapped_key_.end());
-
-  auto& [_, pending_callbacks] = *it;
-  CHECK(!pending_callbacks.HasKeyId());
-
-  if (!key_or_error.has_value()) {
-    auto node = key_id_by_wrapped_key_.extract(it);
-    node.mapped().RunCallbacksWithFailure(key_or_error.error());
+  if (it == key_id_by_wrapped_key_.end()) {
+    DVLOG(1) << "`wrapped_key` is unknown, did the key get deleted?";
     return;
   }
-  scoped_refptr<RefCountedUnexportableSigningKey>& key = key_or_error.value();
+
+  MaybePendingUnexportableKeyId& maybe_pending_callbacks = it->second;
+  if (maybe_pending_callbacks.HasKeyId()) {
+    // If there is already a key ID for this wrapped key, it means that the key
+    // id has been resolved in the meantime, for example through
+    // `GetAllSigningKeys...`. In this case, there is nothing to do and we can
+    // return immediately.
+    return;
+  }
+
+  ASSIGN_OR_RETURN(scoped_refptr<RefCountedUnexportableSigningKey> key,
+                   std::move(key_or_error), [&](ServiceError error) {
+                     auto node = key_id_by_wrapped_key_.extract(it);
+                     node.mapped().RunCallbacksWithFailure(error);
+                   });
   // `key` must be non-null if `key_or_error` holds a value.
   CHECK(key);
   DCHECK(wrapped_key == key->key().GetWrappedKey());
@@ -297,7 +369,7 @@
   UnexportableKeyId key_id = key->id();
   // A newly created key ID must be unique.
   CHECK(key_by_key_id_.try_emplace(key_id, std::move(key)).second);
-  pending_callbacks.SetKeyIdAndRunCallbacks(key_id);
+  maybe_pending_callbacks.SetKeyIdAndRunCallbacks(key_id);
 }
 
 }  // namespace unexportable_keys
diff --git a/components/unexportable_keys/unexportable_key_service_impl.h b/components/unexportable_keys/unexportable_key_service_impl.h
index 934fcb69..15a2cca 100644
--- a/components/unexportable_keys/unexportable_key_service_impl.h
+++ b/components/unexportable_keys/unexportable_key_service_impl.h
@@ -103,12 +103,28 @@
       absl::flat_hash_map<UnexportableKeyId,
                           scoped_refptr<RefCountedUnexportableSigningKey>>;
 
+  // Callback for `GetAllSigningKeysForGarbageCollectionSlowlyAsync()`.
+  void OnGetAllSigningKeysForGarbageCollectionSlowly(
+      base::OnceCallback<void(ServiceErrorOr<std::vector<UnexportableKeyId>>)>
+          client_callback,
+      ServiceErrorOr<
+          std::vector<scoped_refptr<RefCountedUnexportableSigningKey>>>
+          keys_or_error);
+  ServiceErrorOr<std::vector<UnexportableKeyId>>
+  OnGetAllSigningKeysForGarbageCollectionSlowlyImpl(
+      ServiceErrorOr<
+          std::vector<scoped_refptr<RefCountedUnexportableSigningKey>>>
+          keys_or_error);
+
   // Callback for `GenerateSigningKeySlowlyAsync()`.
   void OnKeyGenerated(
       base::OnceCallback<void(ServiceErrorOr<UnexportableKeyId>)>
           client_callback,
       ServiceErrorOr<scoped_refptr<RefCountedUnexportableSigningKey>>
           key_or_error);
+  ServiceErrorOr<UnexportableKeyId> OnKeyGeneratedImpl(
+      ServiceErrorOr<scoped_refptr<RefCountedUnexportableSigningKey>>
+          key_or_error);
 
   // Callback for `FromWrappedSigningKeySlowlyAsync()`.
   void OnKeyCreatedFromWrappedKey(
@@ -129,6 +145,8 @@
   KeyIdMap key_by_key_id_;
 
   base::WeakPtrFactory<UnexportableKeyServiceImpl>
+      get_all_keys_weak_ptr_factory_{this};
+  base::WeakPtrFactory<UnexportableKeyServiceImpl>
       generate_key_weak_ptr_factory_{this};
   base::WeakPtrFactory<UnexportableKeyServiceImpl>
       from_wrapped_key_weak_ptr_factory_{this};
diff --git a/components/unexportable_keys/unexportable_key_service_impl_unittest.cc b/components/unexportable_keys/unexportable_key_service_impl_unittest.cc
index e3013d1c..79be0c8 100644
--- a/components/unexportable_keys/unexportable_key_service_impl_unittest.cc
+++ b/components/unexportable_keys/unexportable_key_service_impl_unittest.cc
@@ -8,6 +8,7 @@
 #include <variant>
 
 #include "base/containers/span.h"
+#include "base/containers/to_vector.h"
 #include "base/functional/callback.h"
 #include "base/memory/ref_counted.h"
 #include "base/test/bind.h"
@@ -32,12 +33,14 @@
 using ::base::test::ErrorIs;
 using ::base::test::ValueIs;
 using ::testing::AtLeast;
+using ::testing::ElementsAre;
 using ::testing::ElementsAreArray;
 using ::testing::Eq;
 using ::testing::Invoke;
 using ::testing::IsEmpty;
 using ::testing::NiceMock;
 using ::testing::Return;
+using ::testing::SizeIs;
 
 namespace {
 
@@ -291,15 +294,218 @@
 }
 
 TEST_F(UnexportableKeyServiceImplTest,
-       GetAllSigningKeysForGarbageCollectionSlowlyAsync) {
+       GetAllSigningKeysForGarbageCollectionSlowlyAsyncStatelessProvider) {
   base::test::TestFuture<ServiceErrorOr<std::vector<UnexportableKeyId>>>
       get_all_keys_future;
   service().GetAllSigningKeysForGarbageCollectionSlowlyAsync(
       kTaskPriority, get_all_keys_future.GetCallback());
   RunBackgroundTasks();
-  // TODO: crbug.com/455538141 - Update the test when the retrieval is
-  // implemented.
-  EXPECT_THAT(get_all_keys_future.Get(), ValueIs(IsEmpty()));
+  EXPECT_THAT(get_all_keys_future.Get(), ErrorIs(ServiceError::kNoKeyProvider));
+}
+
+TEST_F(UnexportableKeyServiceImplTest,
+       GetAllSigningKeysForGarbageCollectionSlowlyAsyncAddsKeysToService) {
+  const std::vector<uint8_t> kWrappedKey = {1, 2, 3};
+  auto provider_key = std::make_unique<NiceMock<MockUnexportableKey>>();
+  ON_CALL(*provider_key, GetWrappedKey).WillByDefault(Return(kWrappedKey));
+
+  EXPECT_CALL(SwitchToMockKeyProvider().mock(), GetAllSigningKeysSlowly())
+      .WillOnce(Return(
+          base::ToVector<std::unique_ptr<crypto::UnexportableSigningKey>>({
+              std::move(provider_key),
+          })));
+
+  base::test::TestFuture<ServiceErrorOr<std::vector<UnexportableKeyId>>>
+      get_all_keys_future;
+  service().GetAllSigningKeysForGarbageCollectionSlowlyAsync(
+      kTaskPriority, get_all_keys_future.GetCallback());
+  RunBackgroundTasks();
+
+  ASSERT_OK_AND_ASSIGN(const auto& key_ids, get_all_keys_future.Get());
+  ASSERT_THAT(key_ids, SizeIs(1));
+  UnexportableKeyId key_id = key_ids[0];
+
+  // The key should be available in the service.
+  EXPECT_THAT(service().GetWrappedKey(key_id), ValueIs(kWrappedKey));
+
+  // A subsequent `FromWrappedKey` call should return the same ID immediately.
+  base::test::TestFuture<ServiceErrorOr<UnexportableKeyId>> from_wrapped_future;
+  service().FromWrappedSigningKeySlowlyAsync(kWrappedKey, kTaskPriority,
+                                             from_wrapped_future.GetCallback());
+  EXPECT_TRUE(from_wrapped_future.IsReady());
+  EXPECT_THAT(from_wrapped_future.Get(), ValueIs(key_id));
+}
+
+TEST_F(UnexportableKeyServiceImplTest,
+       FromWrappedSigningKeyBeforeGetAllSigningKeys) {
+  const std::vector<uint8_t> kWrappedKey = {1, 2, 3};
+  MockUnexportableKeyProvider& mock_provider = SwitchToMockKeyProvider().mock();
+
+  // First, `FromWrappedSigningKeySlowly` will be called.
+  auto key_for_from_wrapped = std::make_unique<NiceMock<MockUnexportableKey>>();
+  ON_CALL(*key_for_from_wrapped, GetWrappedKey)
+      .WillByDefault(Return(kWrappedKey));
+  EXPECT_CALL(mock_provider, FromWrappedSigningKeySlowly(Eq(kWrappedKey)))
+      .WillOnce(Return(std::move(key_for_from_wrapped)));
+  base::test::TestFuture<ServiceErrorOr<UnexportableKeyId>> from_wrapped_future;
+  service().FromWrappedSigningKeySlowlyAsync(kWrappedKey, kTaskPriority,
+                                             from_wrapped_future.GetCallback());
+
+  // Then, `GetAllSigningKeysSlowly` will be called.
+  auto key_for_get_all = std::make_unique<NiceMock<MockUnexportableKey>>();
+  ON_CALL(*key_for_get_all, GetWrappedKey).WillByDefault(Return(kWrappedKey));
+  EXPECT_CALL(mock_provider, GetAllSigningKeysSlowly())
+      .WillOnce(Return(
+          base::ToVector<std::unique_ptr<crypto::UnexportableSigningKey>>({
+              std::move(key_for_get_all),
+          })));
+  base::test::TestFuture<ServiceErrorOr<std::vector<UnexportableKeyId>>>
+      get_all_keys_future;
+  service().GetAllSigningKeysForGarbageCollectionSlowlyAsync(
+      kTaskPriority, get_all_keys_future.GetCallback());
+
+  RunBackgroundTasks();
+
+  ASSERT_OK_AND_ASSIGN(UnexportableKeyId key_id, from_wrapped_future.Get());
+  ASSERT_OK_AND_ASSIGN(std::vector<UnexportableKeyId> key_ids,
+                       get_all_keys_future.Get());
+  ASSERT_THAT(key_ids, ElementsAre(key_id));
+}
+
+TEST_F(UnexportableKeyServiceImplTest,
+       GetAllSigningKeysBeforeFromWrappedSigningKey) {
+  const std::vector<uint8_t> kWrappedKey = {1, 2, 3};
+  MockUnexportableKeyProvider& mock_provider = SwitchToMockKeyProvider().mock();
+
+  // First, `GetAllSigningKeysSlowly` will be called.
+  auto key_for_get_all = std::make_unique<NiceMock<MockUnexportableKey>>();
+  ON_CALL(*key_for_get_all, GetWrappedKey).WillByDefault(Return(kWrappedKey));
+  EXPECT_CALL(mock_provider, GetAllSigningKeysSlowly())
+      .WillOnce(Return(
+          base::ToVector<std::unique_ptr<crypto::UnexportableSigningKey>>({
+              std::move(key_for_get_all),
+          })));
+  base::test::TestFuture<ServiceErrorOr<std::vector<UnexportableKeyId>>>
+      get_all_keys_future;
+  service().GetAllSigningKeysForGarbageCollectionSlowlyAsync(
+      kTaskPriority, get_all_keys_future.GetCallback());
+
+  // Then, `FromWrappedSigningKeySlowlyAsync` will be called.
+  auto key_for_from_wrapped = std::make_unique<NiceMock<MockUnexportableKey>>();
+  ON_CALL(*key_for_from_wrapped, GetWrappedKey)
+      .WillByDefault(Return(kWrappedKey));
+  EXPECT_CALL(mock_provider, FromWrappedSigningKeySlowly(Eq(kWrappedKey)))
+      .WillOnce(Return(std::move(key_for_from_wrapped)));
+  base::test::TestFuture<ServiceErrorOr<UnexportableKeyId>> from_wrapped_future;
+  service().FromWrappedSigningKeySlowlyAsync(kWrappedKey, kTaskPriority,
+                                             from_wrapped_future.GetCallback());
+
+  RunBackgroundTasks();
+
+  ASSERT_OK_AND_ASSIGN(std::vector<UnexportableKeyId> key_ids,
+                       get_all_keys_future.Get());
+  ASSERT_OK_AND_ASSIGN(UnexportableKeyId key_id, from_wrapped_future.Get());
+  ASSERT_THAT(key_ids, ElementsAre(key_id));
+}
+
+TEST_F(UnexportableKeyServiceImplTest,
+       GetAllSigningKeysBeforeFromWrappedSigningKeyWithDeletion) {
+  const std::vector<uint8_t> kWrappedKey = {1, 2, 3};
+  MockUnexportableKeyProvider& mock_provider = SwitchToMockKeyProvider().mock();
+
+  // First, `GetAllSigningKeysSlowly` will be called.
+  auto key_for_get_all = std::make_unique<NiceMock<MockUnexportableKey>>();
+  ON_CALL(*key_for_get_all, GetWrappedKey).WillByDefault(Return(kWrappedKey));
+  EXPECT_CALL(mock_provider, GetAllSigningKeysSlowly())
+      .WillOnce(Return(
+          base::ToVector<std::unique_ptr<crypto::UnexportableSigningKey>>({
+              std::move(key_for_get_all),
+          })));
+  base::test::TestFuture<ServiceErrorOr<std::vector<UnexportableKeyId>>>
+      get_all_keys_future;
+
+  // Simulate a scenario where the key is deleted after it's returned by
+  // `GetAllSigningKeysSlowly`, but before `FromWrappedSigningKeySlowly`'s
+  // handling logic is executed. This should be handled gracefully.
+  // It is important that the GetAllSigningKeys task is scheduled before the
+  // FromWrappedSigningKey task below.
+  service().GetAllSigningKeysForGarbageCollectionSlowlyAsync(
+      kTaskPriority,
+      base::BindLambdaForTesting(
+          [&](ServiceErrorOr<std::vector<UnexportableKeyId>> result) {
+            service().DeleteKeySlowlyAsync(result->front(), kTaskPriority,
+                                           base::DoNothing());
+            get_all_keys_future.SetValue(std::move(result));
+          }));
+
+  // Then, `FromWrappedSigningKeySlowlyAsync` will be called.
+  auto key_for_from_wrapped = std::make_unique<NiceMock<MockUnexportableKey>>();
+  ON_CALL(*key_for_from_wrapped, GetWrappedKey)
+      .WillByDefault(Return(kWrappedKey));
+  EXPECT_CALL(mock_provider, FromWrappedSigningKeySlowly(Eq(kWrappedKey)))
+      .WillOnce(Return(std::move(key_for_from_wrapped)));
+  base::test::TestFuture<ServiceErrorOr<UnexportableKeyId>> from_wrapped_future;
+  service().FromWrappedSigningKeySlowlyAsync(kWrappedKey, kTaskPriority,
+                                             from_wrapped_future.GetCallback());
+
+  RunBackgroundTasks();
+
+  // The promises will still be resolved with the key id, but it is no longer
+  // known to the service.
+  ASSERT_OK_AND_ASSIGN(std::vector<UnexportableKeyId> key_ids,
+                       get_all_keys_future.Get());
+  ASSERT_OK_AND_ASSIGN(UnexportableKeyId key_id, from_wrapped_future.Get());
+  ASSERT_THAT(key_ids, ElementsAre(key_id));
+  EXPECT_THAT(service().GetWrappedKey(key_id),
+              ErrorIs(ServiceError::kKeyNotFound));
+}
+
+TEST_F(UnexportableKeyServiceImplTest,
+       GetAllSigningKeysForGarbageCollectionSlowlyAsyncKeyAlreadyExists) {
+  // Generate a key to have it in the service.
+  base::test::TestFuture<ServiceErrorOr<UnexportableKeyId>> generate_future;
+  service().GenerateSigningKeySlowlyAsync(kAcceptableAlgorithms, kTaskPriority,
+                                          generate_future.GetCallback());
+  RunBackgroundTasks();
+  ASSERT_OK_AND_ASSIGN(UnexportableKeyId existing_key_id,
+                       generate_future.Get());
+  ASSERT_OK_AND_ASSIGN(std::vector<uint8_t> wrapped_key,
+                       service().GetWrappedKey(existing_key_id));
+
+  // Mock the provider to return the same key.
+  auto provider_key = std::make_unique<NiceMock<MockUnexportableKey>>();
+  ON_CALL(*provider_key, GetWrappedKey).WillByDefault(Return(wrapped_key));
+
+  EXPECT_CALL(SwitchToMockKeyProvider().mock(), GetAllSigningKeysSlowly())
+      .WillOnce(Return(
+          base::ToVector<std::unique_ptr<crypto::UnexportableSigningKey>>({
+              std::move(provider_key),
+          })));
+
+  base::test::TestFuture<ServiceErrorOr<std::vector<UnexportableKeyId>>>
+      get_all_keys_future;
+  service().GetAllSigningKeysForGarbageCollectionSlowlyAsync(
+      kTaskPriority, get_all_keys_future.GetCallback());
+  RunBackgroundTasks();
+
+  // `GetAllSigningKeys` should return the existing key ID.
+  ASSERT_OK_AND_ASSIGN(const auto& key_ids, get_all_keys_future.Get());
+  ASSERT_THAT(key_ids, ElementsAre(existing_key_id));
+}
+
+TEST_F(UnexportableKeyServiceImplTest,
+       GetAllSigningKeysForGarbageCollectionSlowlyAsyncProviderFails) {
+  EXPECT_CALL(SwitchToMockKeyProvider().mock(), GetAllSigningKeysSlowly())
+      .WillOnce(Return(std::nullopt));
+
+  base::test::TestFuture<ServiceErrorOr<std::vector<UnexportableKeyId>>>
+      get_all_keys_future;
+  service().GetAllSigningKeysForGarbageCollectionSlowlyAsync(
+      kTaskPriority, get_all_keys_future.GetCallback());
+  RunBackgroundTasks();
+
+  EXPECT_THAT(get_all_keys_future.Get(),
+              ErrorIs(ServiceError::kCryptoApiFailed));
 }
 
 TEST_F(UnexportableKeyServiceImplTest, Sign) {
@@ -408,6 +614,8 @@
   ASSERT_OK(service().GetWrappedKey(key_id));
 
   base::test::TestFuture<ServiceErrorOr<void>> delete_future;
+  EXPECT_CALL(SwitchToMockKeyProvider().mock(), DeleteSigningKeySlowly)
+      .WillOnce(Return(true));
   service().DeleteKeySlowlyAsync(key_id, kTaskPriority,
                                  delete_future.GetCallback());
   RunBackgroundTasks();
@@ -459,6 +667,8 @@
   ASSERT_OK_AND_ASSIGN(UnexportableKeyId key_id, generate_future.Get());
 
   base::test::TestFuture<ServiceErrorOr<void>> delete_future;
+  EXPECT_CALL(SwitchToMockKeyProvider().mock(), DeleteSigningKeySlowly)
+      .WillOnce(Return(true));
   service().DeleteKeySlowlyAsync(key_id, kTaskPriority,
                                  delete_future.GetCallback());
   RunBackgroundTasks();
@@ -485,7 +695,7 @@
   service().DeleteKeySlowlyAsync(key_id, kTaskPriority,
                                  delete_future.GetCallback());
   RunBackgroundTasks();
-  ASSERT_OK(delete_future.Get());
+  ASSERT_TRUE(delete_future.IsReady());
 
   // Do NOT reset the service. The key should be gone from the service's maps.
 
@@ -510,6 +720,8 @@
 
   // The first deletion should succeed.
   base::test::TestFuture<ServiceErrorOr<void>> delete_future;
+  EXPECT_CALL(SwitchToMockKeyProvider().mock(), DeleteSigningKeySlowly)
+      .WillOnce(Return(true));
   service().DeleteKeySlowlyAsync(key_id, kTaskPriority,
                                  delete_future.GetCallback());
   RunBackgroundTasks();
diff --git a/components/unexportable_keys/unexportable_key_task_manager.cc b/components/unexportable_keys/unexportable_key_task_manager.cc
index ecf75c4..4473e21b 100644
--- a/components/unexportable_keys/unexportable_key_task_manager.cc
+++ b/components/unexportable_keys/unexportable_key_task_manager.cc
@@ -89,6 +89,32 @@
   return crypto::GetUnexportableKeyProvider(std::move(config));
 }
 
+void UnexportableKeyTaskManager::
+    GetAllSigningKeysForGarbageCollectionSlowlyAsync(
+        crypto::UnexportableKeyProvider::Config config,
+        BackgroundTaskPriority priority,
+        base::OnceCallback<
+            void(ServiceErrorOr<
+                 std::vector<scoped_refptr<RefCountedUnexportableSigningKey>>>)>
+            callback) {
+  auto callback_wrapper = WrapCallbackWithMetrics(
+      BackgroundTaskType::kGetAllKeys, std::move(callback));
+
+  std::unique_ptr<crypto::UnexportableKeyProvider> key_provider =
+      GetUnexportableKeyProvider(std::move(config));
+
+  if (!key_provider || !key_provider->AsStatefulUnexportableKeyProvider()) {
+    std::move(callback_wrapper)
+        .Run(base::unexpected(ServiceError::kNoKeyProvider),
+             /*retry_count=*/0);
+    return;
+  }
+
+  auto task = std::make_unique<GetAllKeysTask>(
+      std::move(key_provider), priority, std::move(callback_wrapper));
+  task_scheduler_.PostTask(std::move(task));
+}
+
 void UnexportableKeyTaskManager::GenerateSigningKeySlowlyAsync(
     crypto::UnexportableKeyProvider::Config config,
     base::span<const crypto::SignatureVerifier::SignatureAlgorithm>
@@ -181,7 +207,7 @@
   std::unique_ptr<crypto::UnexportableKeyProvider> key_provider =
       GetUnexportableKeyProvider(std::move(config));
 
-  if (!key_provider) {
+  if (!key_provider || !key_provider->AsStatefulUnexportableKeyProvider()) {
     std::move(callback_wrapper)
         .Run(base::unexpected(ServiceError::kNoKeyProvider), /*retry_count=*/0);
     return;
diff --git a/components/unexportable_keys/unexportable_key_task_manager.h b/components/unexportable_keys/unexportable_key_task_manager.h
index 2fae05c..12e2702b 100644
--- a/components/unexportable_keys/unexportable_key_task_manager.h
+++ b/components/unexportable_keys/unexportable_key_task_manager.h
@@ -54,6 +54,17 @@
   static std::unique_ptr<crypto::UnexportableKeyProvider>
   GetUnexportableKeyProvider(crypto::UnexportableKeyProvider::Config config);
 
+  // Retrieves all signing keys that are currently stored on the platform.
+  // Invokes `callback` with a list of all keys, or `ServiceError` if an error
+  // occurs during retrieval.
+  void GetAllSigningKeysForGarbageCollectionSlowlyAsync(
+      crypto::UnexportableKeyProvider::Config config,
+      BackgroundTaskPriority priority,
+      base::OnceCallback<
+          void(ServiceErrorOr<
+               std::vector<scoped_refptr<RefCountedUnexportableSigningKey>>>)>
+          callback);
+
   // Generates a new signing key asynchronously.
   // The first supported value of `acceptable_algorithms` determines the type of
   // the key.
diff --git a/components/unexportable_keys/unexportable_key_task_manager_unittest.cc b/components/unexportable_keys/unexportable_key_task_manager_unittest.cc
index b259536..de4f1685 100644
--- a/components/unexportable_keys/unexportable_key_task_manager_unittest.cc
+++ b/components/unexportable_keys/unexportable_key_task_manager_unittest.cc
@@ -6,6 +6,7 @@
 
 #include <variant>
 
+#include "base/containers/to_vector.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/test/gmock_expected_support.h"
 #include "base/test/metrics/histogram_tester.h"
@@ -46,6 +47,8 @@
     "Crypto.UnexportableKeys.BackgroundTaskResult.Sign";
 constexpr std::string_view kDeleteKeyTaskResultHistogramName =
     "Crypto.UnexportableKeys.BackgroundTaskResult.DeleteKey";
+constexpr std::string_view kGetAllKeysTaskResultHistogramName =
+    "Crypto.UnexportableKeys.BackgroundTaskResult.GetAllKeys";
 // Retries histograms:
 constexpr std::string_view kGenerateKeyTaskRetriesSuccessHistogramName =
     "Crypto.UnexportableKeys.BackgroundTaskRetries.GenerateKey.Success";
@@ -63,6 +66,10 @@
     "Crypto.UnexportableKeys.BackgroundTaskRetries.Sign.Failure";
 constexpr std::string_view kDeleteKeyTaskRetriesFailureHistogramName =
     "Crypto.UnexportableKeys.BackgroundTaskRetries.DeleteKey.Failure";
+constexpr std::string_view kGetAllKeysTaskRetriesSuccessHistogramName =
+    "Crypto.UnexportableKeys.BackgroundTaskRetries.GetAllKeys.Success";
+constexpr std::string_view kGetAllKeysTaskRetriesFailureHistogramName =
+    "Crypto.UnexportableKeys.BackgroundTaskRetries.GetAllKeys.Failure";
 }  // namespace
 
 class UnexportableKeyTaskManagerTest : public testing::Test {
@@ -482,6 +489,8 @@
   // Second, delete the key.
   base::HistogramTester histogram_tester;
   base::test::TestFuture<ServiceErrorOr<void>> delete_future;
+  EXPECT_CALL(SwitchToMockKeyProvider().mock(), DeleteSigningKeySlowly)
+      .WillOnce(Return(true));
   task_manager().DeleteSigningKeySlowlyAsync(
       crypto::UnexportableKeyProvider::Config(), std::move(wrapped_key),
       BackgroundTaskPriority::kBestEffort, delete_future.GetCallback());
@@ -539,4 +548,100 @@
       ElementsAre(base::Bucket(0, 1)));
 }
 
+TEST_F(UnexportableKeyTaskManagerTest,
+       GetAllSigningKeysForGarbageCollectionAsyncNoKeys) {
+  base::HistogramTester histogram_tester;
+  base::test::TestFuture<ServiceErrorOr<
+      std::vector<scoped_refptr<RefCountedUnexportableSigningKey>>>>
+      future;
+
+  EXPECT_CALL(SwitchToMockKeyProvider().mock(), GetAllSigningKeysSlowly())
+      .WillOnce(Return(
+          std::vector<std::unique_ptr<crypto::UnexportableSigningKey>>()));
+
+  task_manager().GetAllSigningKeysForGarbageCollectionSlowlyAsync(
+      crypto::UnexportableKeyProvider::Config(),
+      BackgroundTaskPriority::kBestEffort, future.GetCallback());
+  RunBackgroundTasks();
+
+  ASSERT_OK_AND_ASSIGN(auto keys, future.Get());
+  EXPECT_TRUE(keys.empty());
+
+  EXPECT_THAT(
+      histogram_tester.GetAllSamples(kGetAllKeysTaskResultHistogramName),
+      ElementsAre(base::Bucket(kNoServiceErrorForMetrics, 1)));
+  EXPECT_THAT(histogram_tester.GetAllSamples(
+                  kGetAllKeysTaskRetriesSuccessHistogramName),
+              ElementsAre(base::Bucket(0, 1)));
+}
+
+TEST_F(UnexportableKeyTaskManagerTest,
+       GetAllSigningKeysForGarbageCollectionAsyncOneKey) {
+  base::HistogramTester histogram_tester;
+  base::test::TestFuture<ServiceErrorOr<
+      std::vector<scoped_refptr<RefCountedUnexportableSigningKey>>>>
+      future;
+
+  EXPECT_CALL(SwitchToMockKeyProvider().mock(), GetAllSigningKeysSlowly())
+      .WillOnce(Return(
+          base::ToVector<std::unique_ptr<crypto::UnexportableSigningKey>>({
+              std::make_unique<MockUnexportableKey>(),
+          })));
+
+  task_manager().GetAllSigningKeysForGarbageCollectionSlowlyAsync(
+      crypto::UnexportableKeyProvider::Config(),
+      BackgroundTaskPriority::kBestEffort, future.GetCallback());
+  RunBackgroundTasks();
+
+  ASSERT_OK_AND_ASSIGN(auto keys, future.Get());
+  EXPECT_EQ(keys.size(), 1u);
+}
+
+TEST_F(UnexportableKeyTaskManagerTest,
+       GetAllSigningKeysForGarbageCollectionAsyncProviderFails) {
+  base::HistogramTester histogram_tester;
+  base::test::TestFuture<ServiceErrorOr<
+      std::vector<scoped_refptr<RefCountedUnexportableSigningKey>>>>
+      future;
+
+  EXPECT_CALL(SwitchToMockKeyProvider().mock(), GetAllSigningKeysSlowly())
+      .WillOnce(Return(std::nullopt));
+
+  task_manager().GetAllSigningKeysForGarbageCollectionSlowlyAsync(
+      crypto::UnexportableKeyProvider::Config(),
+      BackgroundTaskPriority::kBestEffort, future.GetCallback());
+  RunBackgroundTasks();
+
+  EXPECT_THAT(future.Get(), ErrorIs(ServiceError::kCryptoApiFailed));
+  EXPECT_THAT(
+      histogram_tester.GetAllSamples(kGetAllKeysTaskResultHistogramName),
+      ElementsAre(base::Bucket(ServiceError::kCryptoApiFailed, 1)));
+  EXPECT_THAT(histogram_tester.GetAllSamples(
+                  kGetAllKeysTaskRetriesFailureHistogramName),
+              ElementsAre(base::Bucket(0, 1)));
+}
+
+TEST_F(UnexportableKeyTaskManagerTest,
+       GetAllSigningKeysForGarbageCollectionAsyncNoProvider) {
+  base::HistogramTester histogram_tester;
+  base::test::TestFuture<ServiceErrorOr<
+      std::vector<scoped_refptr<RefCountedUnexportableSigningKey>>>>
+      future;
+
+  DisableKeyProvider();
+
+  task_manager().GetAllSigningKeysForGarbageCollectionSlowlyAsync(
+      crypto::UnexportableKeyProvider::Config(),
+      BackgroundTaskPriority::kBestEffort, future.GetCallback());
+  RunBackgroundTasks();
+
+  EXPECT_THAT(future.Get(), ErrorIs(ServiceError::kNoKeyProvider));
+  EXPECT_THAT(
+      histogram_tester.GetAllSamples(kGetAllKeysTaskResultHistogramName),
+      ElementsAre(base::Bucket(ServiceError::kNoKeyProvider, 1)));
+  EXPECT_THAT(histogram_tester.GetAllSamples(
+                  kGetAllKeysTaskRetriesFailureHistogramName),
+              ElementsAre(base::Bucket(0, 1)));
+}
+
 }  // namespace unexportable_keys
diff --git a/components/unexportable_keys/unexportable_key_tasks.cc b/components/unexportable_keys/unexportable_key_tasks.cc
index 2843fcf..4f30c041 100644
--- a/components/unexportable_keys/unexportable_key_tasks.cc
+++ b/components/unexportable_keys/unexportable_key_tasks.cc
@@ -7,9 +7,12 @@
 #include <memory>
 #include <optional>
 
+#include "base/check_deref.h"
+#include "base/containers/to_vector.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/trace_event/typed_macros.h"
 #include "base/types/expected.h"
+#include "base/types/expected_macros.h"
 #include "base/types/optional_util.h"
 #include "components/unexportable_keys/background_task_type.h"
 #include "components/unexportable_keys/ref_counted_unexportable_signing_key.h"
@@ -31,6 +34,24 @@
       std::move(key), UnexportableKeyId());
 }
 
+ServiceErrorOr<std::vector<scoped_refptr<RefCountedUnexportableSigningKey>>>
+GetAllSigningKeysSlowly(crypto::UnexportableKeyProvider* key_provider,
+                        void* task_ptr_for_tracing) {
+  TRACE_EVENT("browser", "unexportable_keys::GetAllSigningKeysSlowly",
+              perfetto::Flow::FromPointer(task_ptr_for_tracing));
+  CHECK(key_provider);
+
+  ASSIGN_OR_RETURN(
+      std::vector<std::unique_ptr<crypto::UnexportableSigningKey>> keys,
+      CHECK_DEREF(key_provider->AsStatefulUnexportableKeyProvider())
+          .GetAllSigningKeysSlowly(),
+      [] { return ServiceError::kCryptoApiFailed; });
+
+  return base::ToVector(keys, [](auto& key) {
+    return MakeSigningKeyRefCounted(std::move(key)).value();
+  });
+}
+
 ServiceErrorOr<scoped_refptr<RefCountedUnexportableSigningKey>>
 GenerateSigningKeySlowly(
     crypto::UnexportableKeyProvider* key_provider,
@@ -89,7 +110,8 @@
     void* task_ptr_for_tracing) {
   TRACE_EVENT("browser", "unexportable_keys::DeleteSigningKeySlowly",
               perfetto::Flow::FromPointer(task_ptr_for_tracing));
-  if (!key_provider->DeleteSigningKeySlowly(wrapped_key)) {
+  if (!CHECK_DEREF(key_provider->AsStatefulUnexportableKeyProvider())
+           .DeleteSigningKeySlowly(wrapped_key)) {
     return base::unexpected(ServiceError::kCryptoApiFailed);
   }
 
@@ -98,6 +120,19 @@
 
 }  // namespace
 
+GetAllKeysTask::GetAllKeysTask(
+    std::unique_ptr<crypto::UnexportableKeyProvider> key_provider,
+    BackgroundTaskPriority priority,
+    base::OnceCallback<void(GetAllKeysTask::ReturnType, size_t)> callback)
+    : internal::BackgroundTaskImpl<GetAllKeysTask::ReturnType>(
+          base::BindRepeating(&GetAllSigningKeysSlowly,
+                              base::Owned(std::move(key_provider)),
+                              this),
+          std::move(callback),
+          priority,
+          BackgroundTaskType::kGetAllKeys,
+          /*max_retries=*/0) {}
+
 GenerateKeyTask::GenerateKeyTask(
     std::unique_ptr<crypto::UnexportableKeyProvider> key_provider,
     base::span<const crypto::SignatureVerifier::SignatureAlgorithm>
diff --git a/components/unexportable_keys/unexportable_key_tasks.h b/components/unexportable_keys/unexportable_key_tasks.h
index bfa25aef..521b10b 100644
--- a/components/unexportable_keys/unexportable_key_tasks.h
+++ b/components/unexportable_keys/unexportable_key_tasks.h
@@ -26,6 +26,18 @@
 
 class RefCountedUnexportableSigningKey;
 
+// A `BackgroundTask` to retrieve all `crypto::UnexportableSigningKey`s from the
+// key provider.
+class GetAllKeysTask
+    : public internal::BackgroundTaskImpl<ServiceErrorOr<
+          std::vector<scoped_refptr<RefCountedUnexportableSigningKey>>>> {
+ public:
+  GetAllKeysTask(
+      std::unique_ptr<crypto::UnexportableKeyProvider> key_provider,
+      BackgroundTaskPriority priority,
+      base::OnceCallback<void(GetAllKeysTask::ReturnType, size_t)> callback);
+};
+
 // A `BackgroundTask` to generate a new `crypto::UnexportableSigningKey`.
 class GenerateKeyTask
     : public internal::BackgroundTaskImpl<
diff --git a/content/browser/accessibility/dump_accessibility_events_browsertest.cc b/content/browser/accessibility/dump_accessibility_events_browsertest.cc
index a1b4659..28f7e51c 100644
--- a/content/browser/accessibility/dump_accessibility_events_browsertest.cc
+++ b/content/browser/accessibility/dump_accessibility_events_browsertest.cc
@@ -604,6 +604,16 @@
 }
 
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityEventsTest,
+                       AccessibilityEventsAlertShadowDomIgnoredReparented) {
+  RunEventTest(FILE_PATH_LITERAL("alert-shadow-dom-ignored-reparented.html"));
+}
+
+IN_PROC_BROWSER_TEST_P(DumpAccessibilityEventsTest,
+                       AccessibilityEventsAlertShadowDomIgnoredChanged) {
+  RunEventTest(FILE_PATH_LITERAL("alert-shadow-dom-ignored-changed.html"));
+}
+
+IN_PROC_BROWSER_TEST_P(DumpAccessibilityEventsTest,
                        AccessibilityEventsAddChild) {
   RunEventTest(FILE_PATH_LITERAL("add-child.html"));
 }
diff --git a/content/browser/indexed_db/indexed_db_reporting.h b/content/browser/indexed_db/indexed_db_reporting.h
index ea9256d..62ec244 100644
--- a/content/browser/indexed_db/indexed_db_reporting.h
+++ b/content/browser/indexed_db/indexed_db_reporting.h
@@ -119,10 +119,11 @@
 
 // Logs `status` to `histogram_name` suffixed with a variant indicating whether
 // the backing store is `in_memory` or on-disk.
-inline void LogStatus(const Status& status,
-                      std::string_view histogram_name,
-                      bool in_memory) {
+inline Status LogStatus(Status status,
+                        std::string_view histogram_name,
+                        bool in_memory) {
   status.Log(base::StrCat({histogram_name, ToVariantSuffix(in_memory)}));
+  return status;
 }
 
 // Performs `action` and logs its result (expected to be a `StatusOr<>`) to
diff --git a/content/browser/indexed_db/indexed_db_unittest.cc b/content/browser/indexed_db/indexed_db_unittest.cc
index 5cb19f0..b3d2c38 100644
--- a/content/browser/indexed_db/indexed_db_unittest.cc
+++ b/content/browser/indexed_db/indexed_db_unittest.cc
@@ -35,9 +35,11 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/task/single_thread_task_runner.h"
+#include "base/test/bind.h"
 #include "base/test/gmock_callback_support.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/mock_callback.h"
+#include "base/test/run_until.h"
 #include "base/test/task_environment.h"
 #include "base/test/test_file_util.h"
 #include "base/test/test_future.h"
@@ -2186,6 +2188,9 @@
     histogram_tester.ExpectUniqueSample(
         "IndexedDB.BackingStore.CreateOrOpenDatabase.OnDisk",
         0 /*Status::Type::kOk*/, 1);
+    histogram_tester.ExpectUniqueSample(
+        "IndexedDB.BackingStore.DeleteDatabase.OnDisk", 0 /*Status::Type::kOk*/,
+        1);
   }
 }
 
@@ -2298,6 +2303,141 @@
   // Not crashing indicates success.
 }
 
+TEST_P(IndexedDBTest, TransactionHistograms) {
+  constexpr int64_t kObjectStoreId = 1;
+  int64_t transaction_id = 0;
+
+  const blink::StorageKey storage_key =
+      blink::StorageKey::CreateFromStringForTesting("http://localhost:81");
+  BucketLocator bucket_locator = BucketLocator();
+  bucket_locator.storage_key = storage_key;
+
+  // Bind the IDBFactory.
+  mojo::Remote<blink::mojom::IDBFactory> factory_remote;
+  mojo::PendingRemote<storage::mojom::IndexedDBClientStateChecker>
+      checker_remote;
+  BindFactory(std::move(checker_remote),
+              factory_remote.BindNewPipeAndPassReceiver(),
+              ToBucketInfo(bucket_locator));
+
+  // Create a database with a valid version so that a version change transaction
+  // is created.
+  MockMojoFactoryClient client;
+  MockMojoDatabaseCallbacks database_callbacks;
+  mojo::AssociatedRemote<blink::mojom::IDBDatabase> connection;
+  {
+    base::HistogramTester histogram_tester;
+    mojo::PendingAssociatedRemote<blink::mojom::IDBDatabase> pending_database;
+    base::RunLoop upgrade_run_loop;
+    EXPECT_CALL(client, MockedUpgradeNeeded)
+        .WillOnce(testing::DoAll(
+            MoveArgPointee<0>(&pending_database),
+            ::base::test::RunClosure(upgrade_run_loop.QuitClosure())));
+    mojo::AssociatedRemote<blink::mojom::IDBTransaction> transaction;
+    factory_remote->Open(client.CreateInterfacePtrAndBind(),
+                         database_callbacks.CreateInterfacePtrAndBind(), u"db",
+                         /*version=*/1,
+                         transaction.BindNewEndpointAndPassReceiver(),
+                         ++transaction_id, /*priority=*/0);
+    upgrade_run_loop.Run();
+    connection.Bind(std::move(pending_database));
+
+    // Create an object store and commit the version change transaction.
+    transaction->CreateObjectStore(kObjectStoreId, u"store",
+                                   blink::IndexedDBKeyPath(),
+                                   /*auto_increment=*/true);
+    transaction->Commit(0);
+
+    // Wait for the transaction to complete.
+    base::RunLoop loop;
+    EXPECT_CALL(database_callbacks, Complete(transaction_id))
+        .WillOnce(base::test::RunClosure(loop.QuitClosure()));
+    loop.Run();
+    EXPECT_CALL(client, MockedOpenSuccess);
+
+    histogram_tester.ExpectUniqueSample(
+        "IndexedDB.BackingStore.BeginTransaction.OnDisk",
+        0 /*Status::Type::kOk*/, 1);
+    histogram_tester.ExpectUniqueSample(
+        "IndexedDB.BackingStore.ChangeDatabaseVersion.OnDisk",
+        0 /*Status::Type::kOk*/, 1);
+    histogram_tester.ExpectUniqueSample(
+        "IndexedDB.BackingStore.CreateObjectStore.OnDisk",
+        0 /*Status::Type::kOk*/, 1);
+    histogram_tester.ExpectUniqueSample(
+        "IndexedDB.BackingStore.CommitPhaseOne.OnDisk", 0 /*Status::Type::kOk*/,
+        1);
+    histogram_tester.ExpectUniqueSample(
+        "IndexedDB.BackingStore.CommitPhaseTwo.OnDisk", 0 /*Status::Type::kOk*/,
+        1);
+  }
+
+  // Create a transaction and commit it without issuing any request.
+  {
+    base::HistogramTester histogram_tester;
+    mojo::AssociatedRemote<blink::mojom::IDBTransaction> transaction;
+    connection->CreateTransaction(
+        transaction.BindNewEndpointAndPassReceiver(), ++transaction_id,
+        {kObjectStoreId}, blink::mojom::IDBTransactionMode::ReadWrite,
+        blink::mojom::IDBTransactionDurability::Relaxed);
+    transaction->Commit(0);
+
+    // Wait for the transaction to complete.
+    base::RunLoop loop;
+    EXPECT_CALL(database_callbacks, Complete(transaction_id))
+        .WillOnce(base::test::RunClosure(loop.QuitClosure()));
+    loop.Run();
+
+    histogram_tester.ExpectUniqueSample(
+        "IndexedDB.BackingStore.BeginTransaction.OnDisk",
+        0 /*Status::Type::kOk*/, 1);
+    // The commit does not propagate to the BackingStore since no requests were
+    // issued to the transaction.
+    histogram_tester.ExpectTotalCount(
+        "IndexedDB.BackingStore.CommitPhaseOne.OnDisk", 0);
+    histogram_tester.ExpectTotalCount(
+        "IndexedDB.BackingStore.CommitPhaseTwo.OnDisk", 0);
+  }
+
+  // Create another transaction and issue some requests.
+  {
+    base::HistogramTester histogram_tester;
+    mojo::AssociatedRemote<blink::mojom::IDBTransaction> transaction;
+    connection->CreateTransaction(
+        transaction.BindNewEndpointAndPassReceiver(), ++transaction_id,
+        {kObjectStoreId}, blink::mojom::IDBTransactionMode::ReadWrite,
+        blink::mojom::IDBTransactionDurability::Relaxed);
+
+    transaction->Put(kObjectStoreId,
+                     blink::mojom::IDBValuePtr(blink::mojom::IDBValue::New()),
+                     blink::IndexedDBKey(), blink::mojom::IDBPutMode::AddOnly,
+                     /*index_keys=*/{},
+                     base::BindLambdaForTesting(
+                         [&](blink::mojom::IDBTransactionPutResultPtr result) {
+                           EXPECT_FALSE(result->is_error_result());
+                         }));
+    transaction->Commit(0);
+
+    // Wait for the transaction to complete.
+    base::RunLoop loop;
+    EXPECT_CALL(database_callbacks, Complete(transaction_id))
+        .WillOnce(base::test::RunClosure(loop.QuitClosure()));
+    loop.Run();
+
+    histogram_tester.ExpectUniqueSample(
+        "IndexedDB.BackingStore.BeginTransaction.OnDisk",
+        0 /*Status::Type::kOk*/, 1);
+    histogram_tester.ExpectUniqueSample(
+        "IndexedDB.BackingStore.PutRecord.OnDisk", 0 /*Status::Type::kOk*/, 1);
+    histogram_tester.ExpectUniqueSample(
+        "IndexedDB.BackingStore.CommitPhaseOne.OnDisk", 0 /*Status::Type::kOk*/,
+        1);
+    histogram_tester.ExpectUniqueSample(
+        "IndexedDB.BackingStore.CommitPhaseTwo.OnDisk", 0 /*Status::Type::kOk*/,
+        1);
+  }
+}
+
 TEST_P(IndexedDBTest, QuotaErrorOnDbOpenError) {
   base::HistogramTester histograms;
   if (IsSqliteBackingStoreEnabled()) {
diff --git a/content/browser/indexed_db/instance/connection.cc b/content/browser/indexed_db/instance/connection.cc
index 3311edb..c75a729 100644
--- a/content/browser/indexed_db/instance/connection.cc
+++ b/content/browser/indexed_db/instance/connection.cc
@@ -291,7 +291,7 @@
 
   (*transaction)
       ->ScheduleTask(
-          blink::mojom::IDBTaskType::Preemptive,
+          blink::mojom::IDBTaskType::Preemptive, "RenameObjectStore",
           base::BindOnce(
               [](int64_t object_store_id, const std::u16string& new_name,
                  Transaction* transaction) {
@@ -385,6 +385,7 @@
 
   (*transaction)
       ->ScheduleTask(
+          "GetRecord",
           BindWeakOperation(&Database::GetOperation, database_, object_store_id,
                             index_id, std::move(key_range),
                             key_only ? indexed_db::CursorType::kKeyOnly
@@ -418,6 +419,7 @@
 
   (*transaction)
       ->ScheduleTask(
+          "GetAllRecords",
           database_->CreateGetAllOperation(
               object_store_id, index_id, std::move(key_range), result_type,
               max_count, direction, std::move(callback), *transaction),
@@ -473,6 +475,7 @@
   params->callback = std::move(aborting_callback);
   (*transaction)
       ->ScheduleTask(
+          "OpenCursor",
           BindWeakOperation(&Database::OpenCursorOperation, database_,
                             std::move(params), GetBucketLocator()),
           Transaction::ObjectStoreAndIndexMustExist(object_store_id,
@@ -497,6 +500,7 @@
 
   (*transaction)
       ->ScheduleTask(
+          "CountRecords",
           BindWeakOperation(&Database::CountOperation, database_,
                             object_store_id, index_id, std::move(key_range),
                             std::move(wrapped_callback)),
@@ -521,6 +525,7 @@
 
   (*transaction)
       ->ScheduleTask(
+          "DeleteRecordRange",
           BindWeakOperation(&Database::DeleteRangeOperation, database_,
                             object_store_id, std::move(key_range),
                             std::move(wrapped_callback)),
@@ -550,6 +555,7 @@
 
   (*transaction)
       ->ScheduleTask(
+          "GetKeyGeneratorCurrentNumber",
           BindWeakOperation(&Database::GetKeyGeneratorCurrentNumberOperation,
                             database_, object_store_id,
                             std::move(wrapped_callback)),
@@ -571,6 +577,7 @@
 
   (*transaction)
       ->ScheduleTask(
+          "ClearObjectStore",
           BindWeakOperation(&Database::ClearOperation, database_,
                             object_store_id, std::move(wrapped_callback)),
           Transaction::ObjectStoreMustExist(object_store_id));
@@ -590,7 +597,7 @@
 
   (*transaction)
       ->ScheduleTask(
-          blink::mojom::IDBTaskType::Preemptive,
+          blink::mojom::IDBTaskType::Preemptive, "CreateIndex",
           base::BindOnce(
               [](int64_t object_store_id, IndexedDBIndexMetadata index,
                  Transaction* transaction) {
@@ -638,6 +645,7 @@
 
   (*transaction)
       ->ScheduleTask(
+          "DeleteIndex",
           base::BindOnce(
               [](int64_t object_store_id, int64_t index_id,
                  Transaction* transaction) {
@@ -663,6 +671,7 @@
 
   (*transaction)
       ->ScheduleTask(
+          "RenameIndex",
           base::BindOnce(
               [](int64_t object_store_id, int64_t index_id,
                  std::u16string new_name, Transaction* transaction) {
diff --git a/content/browser/indexed_db/instance/connection_coordinator.cc b/content/browser/indexed_db/instance/connection_coordinator.cc
index 146b2bd8..80b01547 100644
--- a/content/browser/indexed_db/instance/connection_coordinator.cc
+++ b/content/browser/indexed_db/instance/connection_coordinator.cc
@@ -376,6 +376,7 @@
     pending_->transaction = transaction->AsWeakPtr();
 
     transaction->ScheduleTask(
+        "ChangeDatabaseVersion",
         BindWeakOperation(&Database::VersionChangeOperation, db_->AsWeakPtr(),
                           pending_->version));
     transaction->mutable_locks_receiver()->locks =
diff --git a/content/browser/indexed_db/instance/cursor.cc b/content/browser/indexed_db/instance/cursor.cc
index c2a80a0..f5865ff 100644
--- a/content/browser/indexed_db/instance/cursor.cc
+++ b/content/browser/indexed_db/instance/cursor.cc
@@ -108,9 +108,10 @@
           std::move(callback), transaction_);
 
   transaction_->ScheduleTask(
-      task_type_, BindWeakOperation<Cursor>(&Cursor::AdvanceOperation,
-                                            ptr_factory_.GetWeakPtr(), count,
-                                            std::move(aborting_callback)));
+      task_type_, "AdvanceCursor",
+      BindWeakOperation<Cursor>(&Cursor::AdvanceOperation,
+                                ptr_factory_.GetWeakPtr(), count,
+                                std::move(aborting_callback)));
 }
 
 Status Cursor::AdvanceOperation(
@@ -183,7 +184,7 @@
           std::move(callback), transaction_);
 
   transaction_->ScheduleTask(
-      task_type_,
+      task_type_, "ContinueCursor",
       BindWeakOperation<Cursor>(
           &Cursor::ContinueOperation, ptr_factory_.GetWeakPtr(), std::move(key),
           std::move(primary_key), std::move(aborting_callback)));
@@ -260,7 +261,7 @@
           std::move(callback), transaction_);
 
   transaction_->ScheduleTask(
-      task_type_,
+      task_type_, "PrefetchCursor",
       BindWeakOperation<Cursor>(&Cursor::PrefetchIterationOperation,
                                 ptr_factory_.GetWeakPtr(), number_to_fetch,
                                 std::move(aborting_callback)));
diff --git a/content/browser/indexed_db/instance/database.cc b/content/browser/indexed_db/instance/database.cc
index 6c80f4a..6b6f62c 100644
--- a/content/browser/indexed_db/instance/database.cc
+++ b/content/browser/indexed_db/instance/database.cc
@@ -234,8 +234,10 @@
   }
 
   const int64_t old_version = version();
-  Status s = backing_store_db_->DeleteDatabase(std::move(locks),
-                                               std::move(on_complete));
+  Status s = LogStatus(backing_store_db_->DeleteDatabase(
+                           std::move(locks), std::move(on_complete)),
+                       "IndexedDB.BackingStore.DeleteDatabase",
+                       bucket_context_->in_memory());
   backing_store_db_.reset();
   if (!s.ok()) {
     return base::unexpected(s);
diff --git a/content/browser/indexed_db/instance/transaction.cc b/content/browser/indexed_db/instance/transaction.cc
index bb46766..65c6aef 100644
--- a/content/browser/indexed_db/instance/transaction.cc
+++ b/content/browser/indexed_db/instance/transaction.cc
@@ -25,6 +25,7 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/not_fatal_until.h"
 #include "base/notreached.h"
+#include "base/strings/strcat.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/time/time.h"
@@ -37,6 +38,7 @@
 #include "components/services/storage/public/mojom/blob_storage_context.mojom-shared.h"
 #include "content/browser/indexed_db/indexed_db_external_object.h"
 #include "content/browser/indexed_db/indexed_db_external_object_storage.h"
+#include "content/browser/indexed_db/indexed_db_reporting.h"
 #include "content/browser/indexed_db/instance/bucket_context.h"
 #include "content/browser/indexed_db/instance/bucket_context_handle.h"
 #include "content/browser/indexed_db/instance/callback_helpers.h"
@@ -121,21 +123,16 @@
 
 }  // namespace
 
-Transaction::TaskQueue::TaskQueue() = default;
-Transaction::TaskQueue::~TaskQueue() = default;
+Transaction::Task::Task(std::string operation_name_for_metrics,
+                        Operation operation,
+                        VerificationCallback verify)
+    : operation_name_for_metrics(std::move(operation_name_for_metrics)),
+      operation(std::move(operation)),
+      verify(std::move(verify)) {}
 
-void Transaction::TaskQueue::clear() {
-  while (!queue_.empty()) {
-    queue_.pop();
-  }
-}
-
-Transaction::TaskQueue::Task Transaction::TaskQueue::pop() {
-  DCHECK(!queue_.empty());
-  Task task = std::move(queue_.front());
-  queue_.pop();
-  return task;
-}
+Transaction::Task::Task(Task&&) = default;
+Transaction::Task& Transaction::Task::operator=(Task&&) = default;
+Transaction::Task::~Task() = default;
 
 Transaction::Transaction(
     int64_t id,
@@ -211,7 +208,8 @@
 }
 
 void Transaction::ScheduleTask(blink::mojom::IDBTaskType type,
-                               Operation task,
+                               std::string operation_name_for_metrics,
+                               Operation operation,
                                VerificationCallback verify) {
   TRACE_EVENT0("IndexedDB", "Transaction::ScheduleTask");
 
@@ -223,11 +221,13 @@
   ResetTimeoutTimer();
   used_ = true;
   if (type == blink::mojom::IDBTaskType::Normal) {
-    task_queue_.push(std::move(task), std::move(verify));
+    task_queue_.emplace(std::move(operation_name_for_metrics),
+                        std::move(operation), std::move(verify));
     ++diagnostics_.tasks_scheduled;
     NotifyOfIdbInternalsRelevantChange();
   } else {
-    preemptive_task_queue_.push(std::move(task), std::move(verify));
+    preemptive_task_queue_.emplace(std::move(operation_name_for_metrics),
+                                   std::move(operation), std::move(verify));
   }
   if (state() == STARTED) {
     bucket_context_->QueueRunTasks();
@@ -254,10 +254,9 @@
     backing_store_transaction_->Rollback();
   }
 
-  preemptive_task_queue_.clear();
+  preemptive_task_queue_ = {};
   pending_preemptive_events_ = 0;
-
-  task_queue_.clear();
+  task_queue_ = {};
 
   // Backing store resources (held via cursors) must be released
   // before script callbacks are fired, as the script callbacks may
@@ -432,7 +431,7 @@
   }
 
   ScheduleTask(
-      blink::mojom::IDBTaskType::Preemptive,
+      blink::mojom::IDBTaskType::Preemptive, "CreateObjectStore",
       base::BindOnce(
           [](int64_t object_store_id, const std::u16string& name,
              const IndexedDBKeyPath& key_path, bool auto_increment,
@@ -471,6 +470,7 @@
   }
 
   ScheduleTask(
+      "DeleteObjectStore",
       base::BindOnce(
           [](int64_t object_store_id, Transaction* transaction) {
             return transaction->BackingStoreTransaction()->DeleteObjectStore(
@@ -532,6 +532,7 @@
   // This is decremented in DoPut.
   in_flight_memory_ += value.SizeEstimate();
   ScheduleTask(
+      "PutRecord",
       base::BindOnce(&Transaction::DoPut, base::Unretained(this),
                      object_store_id, std::move(value), std::move(key), mode,
                      std::move(index_keys), std::move(wrapped_callback)),
@@ -677,7 +678,7 @@
     return;
   }
 
-  ScheduleTask(blink::mojom::IDBTaskType::Preemptive,
+  ScheduleTask(blink::mojom::IDBTaskType::Preemptive, "SetIndexKeys",
                base::BindOnce(&Transaction::DoSetIndexKeys,
                               base::Unretained(this), object_store_id,
                               std::move(primary_key), std::move(index_keys)),
@@ -742,6 +743,7 @@
   }
 
   ScheduleTask(blink::mojom::IDBTaskType::Preemptive,
+               /*operation_name_for_metrics=*/{},
                base::BindOnce([](Transaction* transaction) {
                  transaction->DidCompletePreemptiveEvent();
                  return Status::OK();
@@ -843,7 +845,8 @@
       return Status::OK();
     }
     case BlobWriteResult::kRunPhaseTwoAsync:
-      ScheduleTask(base::BindOnce(&CommitPhaseTwoProxy));
+      ScheduleTask(/*operation_name_for_metrics=*/{},
+                   base::BindOnce(&CommitPhaseTwoProxy));
       bucket_context_->QueueRunTasks();
       return Status::OK();
     case BlobWriteResult::kRunPhaseTwoAndReturnResult: {
@@ -892,50 +895,50 @@
 
   SetState(COMMITTING);
 
-  Status s;
   if (!used_) {
-    s = CommitPhaseTwo();
-  } else {
-    // CommitPhaseOne will call the callback synchronously if there are no blobs
-    // to write.
-    s = backing_store_transaction_->CommitPhaseOne(
-        /*blob_write_callback=*/
-        base::BindOnce(
-            [](base::WeakPtr<Transaction> transaction, BlobWriteResult result,
-               storage::mojom::WriteBlobToFileResult error) {
-              if (!transaction) {
-                return Status::OK();
-              }
-              return transaction->BlobWriteComplete(result, error);
-            },
-            ptr_factory_.GetWeakPtr()),
-        // This callback is only used by SQLite. The LevelDB version of this
-        // code lives in `BackingStore::Transaction::WriteNewBlobs`.
-        /*serialize_fsa_callback=*/
-        base::BindRepeating(
-            [](base::WeakPtr<Transaction> transaction,
-               blink::mojom::FileSystemAccessTransferToken& token_remote,
-               base::OnceCallback<void(const std::vector<uint8_t>&)>
-                   deliver_serialized_token) {
-              if (!transaction) {
-                return;
-              }
-
-              // TODO(dmurph): Refactor IndexedDBExternalObject to not use a
-              // SharedRemote, so this code can just move the remote, instead of
-              // cloning.
-              mojo::PendingRemote<blink::mojom::FileSystemAccessTransferToken>
-                  token_clone;
-              token_remote.Clone(token_clone.InitWithNewPipeAndPassReceiver());
-              transaction->bucket_context()
-                  ->file_system_access_context()
-                  ->SerializeHandle(std::move(token_clone),
-                                    std::move(deliver_serialized_token));
-            },
-            ptr_factory_.GetWeakPtr()));
+    return CommitPhaseTwo();
   }
 
-  return s;
+  // CommitPhaseOne will call the callback synchronously if there are no blobs
+  // to write.
+  return LogStatus(
+      backing_store_transaction_->CommitPhaseOne(
+          /*blob_write_callback=*/
+          base::BindOnce(
+              [](base::WeakPtr<Transaction> transaction, BlobWriteResult result,
+                 storage::mojom::WriteBlobToFileResult error) {
+                if (!transaction) {
+                  return Status::OK();
+                }
+                return transaction->BlobWriteComplete(result, error);
+              },
+              ptr_factory_.GetWeakPtr()),
+          // This callback is only used by SQLite. The LevelDB version of this
+          // code lives in `BackingStore::Transaction::WriteNewBlobs`.
+          /*serialize_fsa_handle=*/
+          base::BindRepeating(
+              [](base::WeakPtr<Transaction> transaction,
+                 blink::mojom::FileSystemAccessTransferToken& token_remote,
+                 base::OnceCallback<void(const std::vector<uint8_t>&)>
+                     deliver_serialized_token) {
+                if (!transaction) {
+                  return;
+                }
+
+                // TODO(dmurph): Refactor IndexedDBExternalObject to not use a
+                // SharedRemote, so this code can just move the remote, instead
+                // of cloning.
+                mojo::PendingRemote<blink::mojom::FileSystemAccessTransferToken>
+                    token_clone;
+                token_remote.Clone(
+                    token_clone.InitWithNewPipeAndPassReceiver());
+                transaction->bucket_context()
+                    ->file_system_access_context()
+                    ->SerializeHandle(std::move(token_clone),
+                                      std::move(deliver_serialized_token));
+              },
+              ptr_factory_.GetWeakPtr())),
+      "IndexedDB.BackingStore.CommitPhaseOne", bucket_context_->in_memory());
 }
 
 Status Transaction::CommitPhaseTwo() {
@@ -955,7 +958,9 @@
   if (!used_) {
     committed = true;
   } else {
-    s = backing_store_transaction_->CommitPhaseTwo();
+    s = LogStatus(backing_store_transaction_->CommitPhaseTwo(),
+                  "IndexedDB.BackingStore.CommitPhaseTwo",
+                  bucket_context_->in_memory());
 
     // This measurement includes the time it takes to commit to the backing
     // store (i.e. LevelDB), not just the blobs.
@@ -1055,8 +1060,10 @@
   }
 
   if (!backing_store_transaction_begun_) {
-    IDB_RETURN_IF_ERROR(
-        backing_store_transaction_->Begin(std::move(locks_receiver_.locks)));
+    IDB_RETURN_IF_ERROR(LogStatus(
+        backing_store_transaction_->Begin(std::move(locks_receiver_.locks)),
+        "IndexedDB.BackingStore.BeginTransaction",
+        bucket_context_->in_memory()));
     backing_store_transaction_begun_ = true;
   }
 
@@ -1068,10 +1075,20 @@
       run_preemptive_queue ? &preemptive_task_queue_ : &task_queue_;
   while (!task_queue->empty() && state_ != FINISHED) {
     CHECK(state_ == STARTED || state_ == COMMITTING) << state_;
-    auto [operation, verify] = task_queue->pop();
-    Status result = verify ? std::move(verify).Run(*this) : Status::OK();
+    Task task = std::move(task_queue->front());
+    task_queue->pop();
+    Status result =
+        task.verify ? std::move(task.verify).Run(*this) : Status::OK();
     if (result.ok()) {
-      result = std::move(operation).Run(this);
+      // The operation may invalidate the bucket context handle.
+      bool in_memory = bucket_context_->in_memory();
+      result = std::move(task.operation).Run(this);
+      if (!task.operation_name_for_metrics.empty()) {
+        LogStatus(result,
+                  base::StrCat({"IndexedDB.BackingStore.",
+                                task.operation_name_for_metrics}),
+                  in_memory);
+      }
     }
     if (!run_preemptive_queue) {
       CHECK(diagnostics_.tasks_completed < diagnostics_.tasks_scheduled);
diff --git a/content/browser/indexed_db/instance/transaction.h b/content/browser/indexed_db/instance/transaction.h
index 8592c2e..b6f0063 100644
--- a/content/browser/indexed_db/instance/transaction.h
+++ b/content/browser/indexed_db/instance/transaction.h
@@ -119,15 +119,22 @@
   // detected at the point of running the operation. For example, a Mojo message
   // that specifies an object store ID may arrive before the task that created
   // that object store actually runs.
+  // If `operation_name_for_metrics` is non-empty, the result of the operation
+  // (if run) is logged to the histogram
+  // "IndexedDB.BackingStore.`operation_name_for_metrics`".
   using Operation = base::OnceCallback<Status(Transaction*)>;
   using VerificationCallback = base::OnceCallback<Status(Transaction&)>;
 
-  void ScheduleTask(Operation task, VerificationCallback verify = {}) {
-    ScheduleTask(blink::mojom::IDBTaskType::Normal, std::move(task),
+  void ScheduleTask(std::string operation_name_for_metrics,
+                    Operation operation,
+                    VerificationCallback verify = {}) {
+    ScheduleTask(blink::mojom::IDBTaskType::Normal,
+                 std::move(operation_name_for_metrics), std::move(operation),
                  std::move(verify));
   }
-  void ScheduleTask(blink::mojom::IDBTaskType,
-                    Operation task,
+  void ScheduleTask(blink::mojom::IDBTaskType type,
+                    std::string operation_name_for_metrics,
+                    Operation operation,
                     VerificationCallback verify = {});
   void RegisterOpenCursor(Cursor* cursor);
   void UnregisterOpenCursor(Cursor* cursor);
@@ -304,27 +311,22 @@
 
   base::CheckedNumeric<size_t> in_flight_memory_ = 0;
 
-  class TaskQueue {
-   public:
-    typedef std::tuple<Operation, VerificationCallback> Task;
+  struct Task {
+    Task(std::string operation_name_for_metrics,
+         Operation operation,
+         VerificationCallback verify);
+    Task(const Task&) = delete;
+    Task& operator=(const Task&) = delete;
+    Task(Task&&);
+    Task& operator=(Task&&);
 
-    TaskQueue();
+    ~Task();
 
-    TaskQueue(const TaskQueue&) = delete;
-    TaskQueue& operator=(const TaskQueue&) = delete;
-
-    ~TaskQueue();
-    bool empty() const { return queue_.empty(); }
-    void push(Operation task, VerificationCallback verify) {
-      queue_.push(std::make_tuple(std::move(task), std::move(verify)));
-    }
-    Task pop();
-    void clear();
-    size_t size() const { return queue_.size(); }
-
-   private:
-    base::queue<Task> queue_;
+    std::string operation_name_for_metrics;
+    Operation operation;
+    VerificationCallback verify;
   };
+  typedef base::queue<Task> TaskQueue;
 
   TaskQueue task_queue_;
   TaskQueue preemptive_task_queue_;
diff --git a/content/browser/indexed_db/instance/transaction_unittest.cc b/content/browser/indexed_db/instance/transaction_unittest.cc
index 4ba2e26..6e842f18 100644
--- a/content/browser/indexed_db/instance/transaction_unittest.cc
+++ b/content/browser/indexed_db/instance/transaction_unittest.cc
@@ -239,8 +239,10 @@
   EXPECT_EQ(0, transaction->diagnostics().tasks_completed);
 
   // Schedule a task - timer won't be started until it's processed.
-  transaction->ScheduleTask(base::BindOnce(
-      &TransactionTest::DummyOperation, base::Unretained(this), Status::OK()));
+  transaction->ScheduleTask(
+      /*operation_name_for_metrics=*/{},
+      base::BindOnce(&TransactionTest::DummyOperation, base::Unretained(this),
+                     Status::OK()));
   EXPECT_FALSE(transaction->IsTimeoutTimerRunning());
   EXPECT_EQ(1, transaction->diagnostics().tasks_scheduled);
   EXPECT_EQ(0, transaction->diagnostics().tasks_completed);
@@ -275,8 +277,10 @@
   EXPECT_EQ(1, transaction->diagnostics().tasks_completed);
 
   // This task will be ignored.
-  transaction->ScheduleTask(base::BindOnce(
-      &TransactionTest::DummyOperation, base::Unretained(this), Status::OK()));
+  transaction->ScheduleTask(
+      /*operation_name_for_metrics=*/{},
+      base::BindOnce(&TransactionTest::DummyOperation, base::Unretained(this),
+                     Status::OK()));
   EXPECT_EQ(Transaction::FINISHED, transaction->state());
   EXPECT_FALSE(transaction->IsTimeoutTimerRunning());
   EXPECT_EQ(1, transaction->diagnostics().tasks_scheduled);
@@ -297,7 +301,7 @@
 
   // Add a preemptive task.
   transaction->ScheduleTask(
-      blink::mojom::IDBTaskType::Preemptive,
+      blink::mojom::IDBTaskType::Preemptive, /*operation_name_for_metrics=*/{},
       base::BindOnce(&TransactionTest::DummyOperation, base::Unretained(this),
                      Status::OK()));
   transaction->AddPreemptiveEvent();
@@ -316,8 +320,10 @@
   EXPECT_TRUE(transaction->preemptive_task_queue_.empty());
 
   // Schedule a task - timer won't be started until preemptive tasks are done.
-  transaction->ScheduleTask(base::BindOnce(
-      &TransactionTest::DummyOperation, base::Unretained(this), Status::OK()));
+  transaction->ScheduleTask(
+      /*operation_name_for_metrics=*/{},
+      base::BindOnce(&TransactionTest::DummyOperation, base::Unretained(this),
+                     Status::OK()));
   EXPECT_FALSE(transaction->IsTimeoutTimerRunning());
   EXPECT_EQ(1, transaction->diagnostics().tasks_scheduled);
   EXPECT_EQ(0, transaction->diagnostics().tasks_completed);
@@ -366,9 +372,10 @@
     EXPECT_EQ(Transaction::STARTED, transaction->state());
     EXPECT_FALSE(transaction->IsTimeoutTimerRunning());
     // Schedule a task - timer won't be started until it's processed.
-    transaction->ScheduleTask(base::BindOnce(&TransactionTest::DummyOperation,
-                                             base::Unretained(this),
-                                             Status::OK()));
+    transaction->ScheduleTask(
+        /*operation_name_for_metrics=*/{},
+        base::BindOnce(&TransactionTest::DummyOperation, base::Unretained(this),
+                       Status::OK()));
     EXPECT_TRUE(base::test::RunUntil(
         [&]() { return transaction->IsTimeoutTimerRunning(); }));
 
@@ -505,7 +512,7 @@
   EXPECT_EQ(0, transaction->diagnostics().tasks_completed);
 
   transaction->ScheduleTask(
-      blink::mojom::IDBTaskType::Normal,
+      blink::mojom::IDBTaskType::Normal, /*operation_name_for_metrics=*/{},
       base::BindOnce(&TransactionTest::DummyOperation, base::Unretained(this),
                      Status::OK()));
 
@@ -548,7 +555,7 @@
   db_ = nullptr;
 
   transaction->ScheduleTask(
-      blink::mojom::IDBTaskType::Normal,
+      blink::mojom::IDBTaskType::Normal, /*operation_name_for_metrics=*/{},
       base::BindOnce(&TransactionTest::DummyOperation, base::Unretained(this),
                      Status::IOError("error")));
 
@@ -600,7 +607,7 @@
   EXPECT_EQ(0, transaction->diagnostics().tasks_completed);
 
   transaction->ScheduleTask(
-      blink::mojom::IDBTaskType::Preemptive,
+      blink::mojom::IDBTaskType::Preemptive, /*operation_name_for_metrics=*/{},
       base::BindOnce(&TransactionTest::DummyOperation, base::Unretained(this),
                      Status::OK()));
   transaction->AddPreemptiveEvent();
@@ -647,7 +654,7 @@
   EXPECT_FALSE(transaction->IsTimeoutTimerRunning());
 
   transaction->ScheduleTask(
-      blink::mojom::IDBTaskType::Preemptive,
+      blink::mojom::IDBTaskType::Preemptive, /*operation_name_for_metrics=*/{},
       base::BindOnce(&TransactionTest::DummyOperation, base::Unretained(this),
                      Status::OK()));
   EXPECT_EQ(0, transaction->pending_preemptive_events_);
@@ -671,8 +678,10 @@
   EXPECT_FALSE(transaction->is_commit_pending_);
 
   // This task will be ignored.
-  transaction->ScheduleTask(base::BindOnce(
-      &TransactionTest::DummyOperation, base::Unretained(this), Status::OK()));
+  transaction->ScheduleTask(
+      /*operation_name_for_metrics=*/{},
+      base::BindOnce(&TransactionTest::DummyOperation, base::Unretained(this),
+                     Status::OK()));
   EXPECT_EQ(Transaction::FINISHED, transaction->state());
   EXPECT_FALSE(transaction->IsTimeoutTimerRunning());
   EXPECT_FALSE(transaction->HasPendingTasks());
diff --git a/content/browser/indexed_db/status.cc b/content/browser/indexed_db/status.cc
index 35986fd..67f592e 100644
--- a/content/browser/indexed_db/status.cc
+++ b/content/browser/indexed_db/status.cc
@@ -21,7 +21,8 @@
 Status::Status(Status&& rhs) noexcept = default;
 
 Status::Status(leveldb::Status&& status) noexcept
-    : type_(Type::kDatabaseEngine), leveldb_status_(std::move(status)) {}
+    : type_(status.ok() ? Type::kOk : Type::kDatabaseEngine),
+      leveldb_status_(std::move(status)) {}
 
 Status::Status(sql::Database& db) noexcept
     : type_(Type::kDatabaseEngine),
diff --git a/content/browser/renderer_host/render_widget_host_view_android_unittest.cc b/content/browser/renderer_host/render_widget_host_view_android_unittest.cc
index f53031d..bc3e4e7b 100644
--- a/content/browser/renderer_host/render_widget_host_view_android_unittest.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android_unittest.cc
@@ -25,6 +25,7 @@
 #include "content/test/test_web_contents.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/common/features.h"
 #include "ui/android/test_view_android_delegate.h"
 #include "ui/android/view_android.h"
 #include "ui/android/window_android.h"
@@ -1774,4 +1775,32 @@
   GetLocalSurfaceIdAndConfirmNewerThan(initial_local_surface_id);
 }
 
+TEST_F(RenderWidgetHostViewAndroidTest, LockUnlockPointer) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeature(blink::features::kPointerLockOnAndroid);
+  RenderWidgetHostViewAndroid* rwhva = render_widget_host_view_android();
+
+  // Create a window and attach, so that GetWindowAndroid() doesn't return
+  // null.
+  auto window = ui::WindowAndroid::CreateForTesting();
+  window->get()->AddChild(GetParentView());
+
+  ui::TestViewAndroidDelegate test_view_android_delegate;
+  test_view_android_delegate.SetupTestDelegate(rwhva->GetNativeView());
+  rwhva->Focus();
+
+  EXPECT_FALSE(rwhva->IsPointerLocked());
+
+  EXPECT_EQ(rwhva->LockPointer(false),
+            blink::mojom::PointerLockResult::kSuccess);
+  EXPECT_TRUE(rwhva->IsPointerLocked());
+
+  EXPECT_EQ(rwhva->ChangePointerLock(false),
+            blink::mojom::PointerLockResult::kSuccess);
+  EXPECT_TRUE(rwhva->IsPointerLocked());
+
+  rwhva->UnlockPointer();
+  EXPECT_FALSE(rwhva->IsPointerLocked());
+}
+
 }  // namespace content
diff --git a/content/browser/service_host/utility_sandbox_delegate.cc b/content/browser/service_host/utility_sandbox_delegate.cc
index ffa2378..125d7bd 100644
--- a/content/browser/service_host/utility_sandbox_delegate.cc
+++ b/content/browser/service_host/utility_sandbox_delegate.cc
@@ -60,7 +60,7 @@
       sandbox_type_ == sandbox::mojom::Sandbox::kPdfConversion ||
       sandbox_type_ == sandbox::mojom::Sandbox::kIconReader ||
       sandbox_type_ == sandbox::mojom::Sandbox::kMediaFoundationCdm ||
-      sandbox_type_ == sandbox::mojom::Sandbox::kWindowsSystemProxyResolver ||
+      sandbox_type_ == sandbox::mojom::Sandbox::kProxyResolver ||
 #endif
 #if BUILDFLAG(IS_MAC)
       sandbox_type_ == sandbox::mojom::Sandbox::kMirroring ||
diff --git a/content/browser/service_host/utility_sandbox_delegate_win.cc b/content/browser/service_host/utility_sandbox_delegate_win.cc
index bf9dac4..2282a59 100644
--- a/content/browser/service_host/utility_sandbox_delegate_win.cc
+++ b/content/browser/service_host/utility_sandbox_delegate_win.cc
@@ -246,7 +246,7 @@
     case sandbox::mojom::Sandbox::kMediaFoundationCdm:
     case sandbox::mojom::Sandbox::kNetwork:
     case sandbox::mojom::Sandbox::kOnDeviceModelExecution:
-    case sandbox::mojom::Sandbox::kWindowsSystemProxyResolver:
+    case sandbox::mojom::Sandbox::kProxyResolver:
     case sandbox::mojom::Sandbox::kXrCompositing:
       *appcontainer_id = UtilityAppContainerId(cmd_line_);
       return true;
@@ -342,7 +342,7 @@
     }
   }
 
-  if (sandbox_type_ == sandbox::mojom::Sandbox::kWindowsSystemProxyResolver) {
+  if (sandbox_type_ == sandbox::mojom::Sandbox::kProxyResolver) {
     // LPAC sandbox is enabled, so do not use a restricted token.
     auto result = config->SetTokenLevel(sandbox::USER_UNPROTECTED,
                                         sandbox::USER_UNPROTECTED);
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityEventsTest.java b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityEventsTest.java
index 8dceb47..ed3ec01e 100644
--- a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityEventsTest.java
+++ b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityEventsTest.java
@@ -177,6 +177,48 @@
 
     @Test
     @SmallTest
+    @DisableFeatures({
+        ContentFeatureList.ACCESSIBILITY_DEPRECATE_TYPE_ANNOUNCE,
+        ContentFeatureList.ACCESSIBILITY_IMPROVE_LIVE_REGION_ANNOUNCE
+    })
+    public void test_alertShadowDomIgnoredChanged() {
+        performTest(
+                "alert-shadow-dom-ignored-changed.html",
+                "alert-shadow-dom-ignored-changed-expected-android.txt");
+    }
+
+    @Test
+    @SmallTest
+    @EnableFeatures(ContentFeatureList.ACCESSIBILITY_IMPROVE_LIVE_REGION_ANNOUNCE)
+    public void test_alertShadowDomIgnoredChanged_exp() {
+        performTest(
+                "alert-shadow-dom-ignored-changed.html",
+                "alert-shadow-dom-ignored-changed-expected-android-exp.txt");
+    }
+
+    @Test
+    @SmallTest
+    @DisableFeatures({
+        ContentFeatureList.ACCESSIBILITY_DEPRECATE_TYPE_ANNOUNCE,
+        ContentFeatureList.ACCESSIBILITY_IMPROVE_LIVE_REGION_ANNOUNCE
+    })
+    public void test_alertShadowDomIgnoredReparented() {
+        performTest(
+                "alert-shadow-dom-ignored-reparented.html",
+                "alert-shadow-dom-ignored-reparented-expected-android.txt");
+    }
+
+    @Test
+    @SmallTest
+    @EnableFeatures(ContentFeatureList.ACCESSIBILITY_IMPROVE_LIVE_REGION_ANNOUNCE)
+    public void test_alertShadowDomIgnoredReparented_exp() {
+        performTest(
+                "alert-shadow-dom-ignored-reparented.html",
+                "alert-shadow-dom-ignored-reparented-expected-android-exp.txt");
+    }
+
+    @Test
+    @SmallTest
     public void test_addChild() {
         performTest("add-child.html", "add-child-expected-android.txt");
     }
diff --git a/content/test/content_test_bundle_data.filelist b/content/test/content_test_bundle_data.filelist
index a9ffcb5..027ef57b 100644
--- a/content/test/content_test_bundle_data.filelist
+++ b/content/test/content_test_bundle_data.filelist
@@ -2313,6 +2313,20 @@
 data/accessibility/event/add-subtree-expected-uia-win.txt
 data/accessibility/event/add-subtree-expected-win.txt
 data/accessibility/event/add-subtree.html
+data/accessibility/event/alert-shadow-dom-ignored-changed-expected-android.txt
+data/accessibility/event/alert-shadow-dom-ignored-changed-expected-android-exp.txt
+data/accessibility/event/alert-shadow-dom-ignored-changed-expected-auralinux.txt
+data/accessibility/event/alert-shadow-dom-ignored-changed-expected-mac.txt
+data/accessibility/event/alert-shadow-dom-ignored-changed-expected-uia-win.txt
+data/accessibility/event/alert-shadow-dom-ignored-changed-expected-win.txt
+data/accessibility/event/alert-shadow-dom-ignored-changed.html
+data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-android.txt
+data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-android-exp.txt
+data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-auralinux.txt
+data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-mac.txt
+data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-uia-win.txt
+data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-win.txt
+data/accessibility/event/alert-shadow-dom-ignored-reparented.html
 data/accessibility/event/anonymous-block-children-changed-expected-android.txt
 data/accessibility/event/anonymous-block-children-changed-expected-auralinux.txt
 data/accessibility/event/anonymous-block-children-changed.html
diff --git a/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed-expected-android-exp.txt b/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed-expected-android-exp.txt
new file mode 100644
index 0000000..6ff2116d
--- /dev/null
+++ b/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed-expected-android-exp.txt
@@ -0,0 +1,2 @@
+TYPE_WINDOW_STATE_CHANGED - [contentTypes=16]
+TYPE_WINDOW_CONTENT_CHANGED - [contentTypes=1]
diff --git a/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed-expected-android.txt b/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed-expected-android.txt
new file mode 100644
index 0000000..80101b3
--- /dev/null
+++ b/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed-expected-android.txt
@@ -0,0 +1,2 @@
+TYPE_WINDOW_STATE_CHANGED - [contentTypes=16]
+TYPE_ANNOUNCEMENT - [Settings saved successfully!]
diff --git a/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed-expected-auralinux.txt b/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed-expected-auralinux.txt
new file mode 100644
index 0000000..a50d177
--- /dev/null
+++ b/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed-expected-auralinux.txt
@@ -0,0 +1,4 @@
+CHILDREN-CHANGED:ADD index:0 CHILD:(role=ROLE_NOTIFICATION) role=ROLE_SECTION ENABLED,SENSITIVE,SHOWING,VISIBLE
+CHILDREN-CHANGED:ADD index:0 CHILD:(role=ROLE_NOTIFICATION) role=ROLE_SECTION ENABLED,SENSITIVE,SHOWING,VISIBLE
+CHILDREN-CHANGED:REMOVE index:0 CHILD:(role=ROLE_NOTIFICATION) role=ROLE_SECTION ENABLED,SENSITIVE,SHOWING,VISIBLE
+TEXT-INSERT (start=0 length=28 'Settings saved successfully!') role=ROLE_NOTIFICATION name='(null)' ENABLED,SENSITIVE,SHOWING,VISIBLE
diff --git a/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed-expected-mac.txt b/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed-expected-mac.txt
new file mode 100644
index 0000000..950afdb1
--- /dev/null
+++ b/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed-expected-mac.txt
@@ -0,0 +1,2 @@
+AXLiveRegionChanged on AXGroup AXSubrole=AXApplicationAlert
+AXLiveRegionCreated on AXGroup AXSubrole=AXApplicationAlert
diff --git a/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed-expected-uia-win.txt b/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed-expected-uia-win.txt
new file mode 100644
index 0000000..cb12386a
--- /dev/null
+++ b/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed-expected-uia-win.txt
@@ -0,0 +1 @@
+LiveRegionChanged on role=alert
diff --git a/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed-expected-win.txt b/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed-expected-win.txt
new file mode 100644
index 0000000..1238c0b
--- /dev/null
+++ b/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed-expected-win.txt
@@ -0,0 +1,3 @@
+EVENT_OBJECT_REORDER on <test-alert#alert> role=ROLE_SYSTEM_GROUPING
+EVENT_OBJECT_SHOW on <div#container.visible> role=ROLE_SYSTEM_ALERT
+IA2_EVENT_TEXT_INSERTED on <test-alert#alert> role=ROLE_SYSTEM_GROUPING new_text={'<obj>' start=0 end=1}
diff --git a/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed.html b/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed.html
new file mode 100644
index 0000000..1fa8d31
--- /dev/null
+++ b/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed.html
@@ -0,0 +1,63 @@
+<!--
+Tests alert events when a shadow DOM element's own visibility and role change simultaneously.
+
+Key steps:
+- Shadow content element exists as IGNORED (visibility:hidden on itself)
+- Element's visibility changes to visible AND gains role="alert" (same element, same update)
+- Change type: NODE_CHANGED (element updates in place)
+- NotifyNodeAttributesHaveBeenChanged returns early for ignored transitions
+- OnIgnoredChanged fires Event::ALERT
+
+@UIA-WIN-DENY:*
+@UIA-WIN-ALLOW:SystemAlert*
+@UIA-WIN-ALLOW:LiveRegion*
+-->
+<!DOCTYPE html>
+<html>
+<head>
+  <title>Alert on Property Change Test</title>
+</head>
+<body>
+  <!-- Custom element with shadow DOM, mimicking cr-toast -->
+  <test-alert id="alert"></test-alert>
+
+  <script>
+    class TestAlert extends HTMLElement {
+      constructor() {
+        super();
+        // Create shadow DOM with content that's initially hidden
+        this.attachShadow({ mode: 'open' });
+        this.shadowRoot.innerHTML = `
+          <style>
+            #container {
+              visibility: hidden;
+            }
+            #container.visible {
+              visibility: visible;
+            }
+          </style>
+          <div id="container">
+            Settings saved successfully!
+          </div>
+        `;
+      }
+
+      show() {
+        const container = this.shadowRoot.getElementById('container');
+        // Simultaneously make visible and add alert role
+        // This triggers NODE_CHANGED with ignored→unignored transition
+        container.classList.add('visible');
+        container.setAttribute('role', 'alert');
+      }
+    }
+
+    customElements.define('test-alert', TestAlert);
+
+    function go() {
+      const alert = document.getElementById('alert');
+      alert.show();
+      return false;
+    }
+  </script>
+</body>
+</html>
diff --git a/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-android-exp.txt b/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-android-exp.txt
new file mode 100644
index 0000000..6ff2116d
--- /dev/null
+++ b/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-android-exp.txt
@@ -0,0 +1,2 @@
+TYPE_WINDOW_STATE_CHANGED - [contentTypes=16]
+TYPE_WINDOW_CONTENT_CHANGED - [contentTypes=1]
diff --git a/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-android.txt b/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-android.txt
new file mode 100644
index 0000000..80101b3
--- /dev/null
+++ b/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-android.txt
@@ -0,0 +1,2 @@
+TYPE_WINDOW_STATE_CHANGED - [contentTypes=16]
+TYPE_ANNOUNCEMENT - [Settings saved successfully!]
diff --git a/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-auralinux.txt b/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-auralinux.txt
new file mode 100644
index 0000000..fe509d5
--- /dev/null
+++ b/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-auralinux.txt
@@ -0,0 +1,4 @@
+CHILDREN-CHANGED:ADD index:0 CHILD:(role=ROLE_NOTIFICATION) role=ROLE_SECTION ENABLED,SENSITIVE,SHOWING,VISIBLE
+CHILDREN-CHANGED:ADD index:0 CHILD:(role=ROLE_SECTION) role=ROLE_DOCUMENT_WEB ENABLED,FOCUSABLE,FOCUSED,SENSITIVE,SHOWING,VISIBLE
+CHILDREN-CHANGED:REMOVE index:0 CHILD:(role=ROLE_NOTIFICATION) role=ROLE_SECTION ENABLED,SENSITIVE,SHOWING,VISIBLE
+TEXT-INSERT (start=0 length=28 'Settings saved successfully!') role=ROLE_NOTIFICATION name='(null)' ENABLED,SENSITIVE,SHOWING,VISIBLE
diff --git a/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-mac.txt b/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-mac.txt
new file mode 100644
index 0000000..950afdb1
--- /dev/null
+++ b/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-mac.txt
@@ -0,0 +1,2 @@
+AXLiveRegionChanged on AXGroup AXSubrole=AXApplicationAlert
+AXLiveRegionCreated on AXGroup AXSubrole=AXApplicationAlert
diff --git a/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-uia-win.txt b/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-uia-win.txt
new file mode 100644
index 0000000..cb12386a
--- /dev/null
+++ b/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-uia-win.txt
@@ -0,0 +1 @@
+LiveRegionChanged on role=alert
diff --git a/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-win.txt b/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-win.txt
new file mode 100644
index 0000000..10ef0c3f
--- /dev/null
+++ b/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-win.txt
@@ -0,0 +1,4 @@
+EVENT_OBJECT_REORDER on <#document> role=ROLE_SYSTEM_DOCUMENT name="Add Alert with Shadow DOM Test" value~=[doc-url] FOCUSED,FOCUSABLE
+EVENT_OBJECT_REORDER on <test-alert#alert> role=ROLE_SYSTEM_GROUPING
+EVENT_OBJECT_SHOW on <test-alert#alert> role=ROLE_SYSTEM_GROUPING
+IA2_EVENT_TEXT_INSERTED on <#document> role=ROLE_SYSTEM_DOCUMENT name="Add Alert with Shadow DOM Test" value~=[doc-url] FOCUSED,FOCUSABLE new_text={'<obj>' start=0 end=1}
diff --git a/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented.html b/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented.html
new file mode 100644
index 0000000..effe992
--- /dev/null
+++ b/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented.html
@@ -0,0 +1,68 @@
+<!--
+Tests alert events when host visibility change causes shadow content to be
+reparented (ignored subtree becomes accessible) while gaining role="alert".
+
+Key steps:
+- Host element visibility:hidden → entire shadow subtree IGNORED/omitted
+- Host becomes visible (via :host([open]) CSS) → shadow subtree reparented into tree
+- Shadow content gains role="alert" simultaneously
+- OnIgnoredChanged (or subtree creation) fires Event::ALERT
+
+@UIA-WIN-DENY:*
+@UIA-WIN-ALLOW:SystemAlert*
+@UIA-WIN-ALLOW:LiveRegion*
+-->
+<!DOCTYPE html>
+<html>
+<head>
+  <title>Add Alert with Shadow DOM Test</title>
+  <style>
+    /* No CSS rules - element manages its own shadow DOM styles */
+  </style>
+</head>
+<body>
+  <!-- Custom element mimicking cr-toast with shadow DOM -->
+  <test-alert id="alert"></test-alert>
+
+  <script>
+    class TestAlert extends HTMLElement {
+      constructor() {
+        super();
+        this.attachShadow({ mode: 'open' });
+        this.shadowRoot.innerHTML = `
+          <style>
+            :host {
+              display: block;
+              visibility: hidden;
+            }
+            :host([open]) {
+              visibility: visible;
+            }
+          </style>
+          <div id="container">
+            <slot></slot>
+            Settings saved successfully!
+          </div>
+        `;
+      }
+
+      show() {
+        // Mimic cr-toast.show() sequence:
+        // 1. Set open attribute (triggers visibility via CSS on host)
+        this.setAttribute('open', '');
+        // 2. Set role="alert" on the shadow container that's transitioning
+        const container = this.shadowRoot.getElementById('container');
+        container.setAttribute('role', 'alert');
+      }
+    }
+
+    customElements.define('test-alert', TestAlert);
+
+    function go() {
+      const alert = document.getElementById('alert');
+      alert.show();
+      return false;
+    }
+  </script>
+</body>
+</html>
diff --git a/crypto/apple/unexportable_key_mac.h b/crypto/apple/unexportable_key_mac.h
index f8577ba..5c3d988c 100644
--- a/crypto/apple/unexportable_key_mac.h
+++ b/crypto/apple/unexportable_key_mac.h
@@ -25,7 +25,7 @@
 //
 // Unlike Windows keys, macOS will store key metadata locally. Callers are
 // responsible for deleting keys when they are no longer needed.
-class UnexportableKeyProviderMac : public UnexportableKeyProvider {
+class UnexportableKeyProviderMac : public StatefulUnexportableKeyProvider {
  public:
   explicit UnexportableKeyProviderMac(Config config);
   ~UnexportableKeyProviderMac() override;
@@ -56,7 +56,13 @@
           acceptable_algorithms) override;
   std::unique_ptr<UnexportableSigningKey> FromWrappedSigningKeySlowly(
       base::span<const uint8_t> wrapped_key) override;
+  StatefulUnexportableKeyProvider* AsStatefulUnexportableKeyProvider() override;
+
+  // StatefulUnexportableKeyProvider:
+  std::optional<std::vector<std::unique_ptr<UnexportableSigningKey>>>
+  GetAllSigningKeysSlowly() override;
   bool DeleteSigningKeySlowly(base::span<const uint8_t> wrapped_key) override;
+  std::optional<size_t> DeleteAllSigningKeysSlowly() override;
 
  private:
   struct ObjCStorage;
diff --git a/crypto/apple/unexportable_key_mac.mm b/crypto/apple/unexportable_key_mac.mm
index 8433818c..bf4d580 100644
--- a/crypto/apple/unexportable_key_mac.mm
+++ b/crypto/apple/unexportable_key_mac.mm
@@ -26,6 +26,7 @@
 #include "base/logging.h"
 #include "base/memory/scoped_policy.h"
 #include "base/metrics/histogram_functions.h"
+#include "base/notimplemented.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/sys_string_conversions.h"
@@ -311,6 +312,18 @@
                                                      key_attributes);
 }
 
+StatefulUnexportableKeyProvider*
+UnexportableKeyProviderMac::AsStatefulUnexportableKeyProvider() {
+  return this;
+}
+
+std::optional<std::vector<std::unique_ptr<UnexportableSigningKey>>>
+UnexportableKeyProviderMac::GetAllSigningKeysSlowly() {
+  // TODO(crbug.com/455539044): Implement this.
+  NOTIMPLEMENTED();
+  return std::nullopt;
+}
+
 bool UnexportableKeyProviderMac::DeleteSigningKeySlowly(
     base::span<const uint8_t> wrapped_key) {
   base::ScopedBlockingCall scoped_blocking_call(FROM_HERE,
@@ -349,4 +362,10 @@
   return std::make_unique<UnexportableKeyProviderMac>(std::move(config));
 }
 
+std::optional<size_t> UnexportableKeyProviderMac::DeleteAllSigningKeysSlowly() {
+  // TODO(crbug.com/455539044): Implement this.
+  NOTIMPLEMENTED();
+  return std::nullopt;
+}
+
 }  // namespace crypto::apple
diff --git a/crypto/apple/unexportable_key_mac_unittest.mm b/crypto/apple/unexportable_key_mac_unittest.mm
index 2de4eec..da039f8a 100644
--- a/crypto/apple/unexportable_key_mac_unittest.mm
+++ b/crypto/apple/unexportable_key_mac_unittest.mm
@@ -48,14 +48,17 @@
       provider_->GenerateSigningKeySlowly(kAcceptableAlgos);
   ASSERT_TRUE(key);
   ASSERT_TRUE(provider_->FromWrappedSigningKeySlowly(key->GetWrappedKey()));
-  EXPECT_TRUE(provider_->DeleteSigningKeySlowly(key->GetWrappedKey()));
+  EXPECT_TRUE(
+      provider_->AsStatefulUnexportableKeyProvider()->DeleteSigningKeySlowly(
+          key->GetWrappedKey()));
   EXPECT_FALSE(provider_->FromWrappedSigningKeySlowly(key->GetWrappedKey()));
   EXPECT_TRUE(scoped_fake_keychain_.keychain()->items().empty());
 }
 
 TEST_F(UnexportableKeyMacTest, DeleteUnknownSigningKey) {
   EXPECT_FALSE(
-      provider_->DeleteSigningKeySlowly(std::vector<uint8_t>{1, 2, 3}));
+      provider_->AsStatefulUnexportableKeyProvider()->DeleteSigningKeySlowly(
+          std::vector<uint8_t>{1, 2, 3}));
 }
 
 TEST_F(UnexportableKeyMacTest, DeleteSigningKeyWithWrongApplicationTag) {
@@ -75,14 +78,18 @@
   ASSERT_TRUE(new_provider);
 
   // Deleting with the wrong provider should fail.
-  EXPECT_FALSE(new_provider->DeleteSigningKeySlowly(key->GetWrappedKey()));
+  EXPECT_FALSE(
+      new_provider->AsStatefulUnexportableKeyProvider()->DeleteSigningKeySlowly(
+          key->GetWrappedKey()));
 
   // The key should still exist and be loadable by the original provider.
   EXPECT_TRUE(provider_->FromWrappedSigningKeySlowly(key->GetWrappedKey()));
   EXPECT_FALSE(scoped_fake_keychain_.keychain()->items().empty());
 
   // Deleting with the correct provider should succeed.
-  EXPECT_TRUE(provider_->DeleteSigningKeySlowly(key->GetWrappedKey()));
+  EXPECT_TRUE(
+      provider_->AsStatefulUnexportableKeyProvider()->DeleteSigningKeySlowly(
+          key->GetWrappedKey()));
   EXPECT_FALSE(provider_->FromWrappedSigningKeySlowly(key->GetWrappedKey()));
   EXPECT_TRUE(scoped_fake_keychain_.keychain()->items().empty());
 }
diff --git a/crypto/unexportable_key.h b/crypto/unexportable_key.h
index 9aa00d4..2a343ee 100644
--- a/crypto/unexportable_key.h
+++ b/crypto/unexportable_key.h
@@ -7,7 +7,9 @@
 
 #include <memory>
 #include <optional>
+#include <vector>
 
+#include "base/compiler_specific.h"
 #include "build/build_config.h"
 #include "crypto/crypto_export.h"
 #include "crypto/signature_verifier.h"
@@ -75,6 +77,8 @@
 #endif  // BUILDFLAG(IS_MAC)
 };
 
+class StatefulUnexportableKeyProvider;
+
 // UnexportableKeyProvider creates |UnexportableSigningKey|s.
 class CRYPTO_EXPORT UnexportableKeyProvider {
  public:
@@ -146,15 +150,42 @@
   virtual std::unique_ptr<UnexportableSigningKey> FromWrappedSigningKeySlowly(
       base::span<const uint8_t> wrapped_key) = 0;
 
-  // Unexportable key implementations may be stateful. This is the case for
-  // macOS. |DeleteSigningKey| deletes all state associated with a given signing
-  // key on such implementations. For stateless implementations, this is a
-  // no-op.
-  // Returns true on successful deletion, false otherwise.
+  // Typesafe downcast to `StatefulUnexportableKeyProvider`. Returns nullptr if
+  // the provider is not stateful.
+  virtual StatefulUnexportableKeyProvider* AsStatefulUnexportableKeyProvider()
+      LIFETIME_BOUND = 0;
+};
+
+// StatefulUnexportableKeyProvider provides an interface for managing keys that
+// are backed by some permanent state, such as the keychain on macOS.
+class CRYPTO_EXPORT StatefulUnexportableKeyProvider
+    : public UnexportableKeyProvider {
+ public:
+  // `GetAllSigningKeysSlowly()` returns all previously stored keys matching
+  // `Config` or nullopt in case of failures.
+  //
   // This can sometimes block, and therefore must not be called from the UI
   // thread.
+  virtual std::optional<std::vector<std::unique_ptr<UnexportableSigningKey>>>
+  GetAllSigningKeysSlowly() = 0;
+
+  // Deletes all state associated with a given signing key. Returns true on
+  // successful deletion, false otherwise. This can sometimes block, and
+  // therefore must not be called from the UI thread.
   virtual bool DeleteSigningKeySlowly(
       base::span<const uint8_t> wrapped_key) = 0;
+
+  // `DeleteAllSigningKeysSlowly()` deletes all state associated with all
+  // signing keys matching `UnexportableKeyProvider::Config`.
+  //
+  // NOTE: For macOS, this will perform prefix matching iff
+  // `Config::application_tag` is set. That is, if `Config::application_tag` is
+  // "com.example.foo", this will delete keys with application tags like
+  // "com.example.foo.1", "com.example.foo.1234", etc.
+  //
+  // Returns the number of keys deleted, or nullopt if unsuccessful. This can
+  // sometimes block, and therefore must not be called from the UI thread.
+  virtual std::optional<size_t> DeleteAllSigningKeysSlowly() = 0;
 };
 
 // This is an experimental API as it uses an unofficial Windows API.
diff --git a/crypto/unexportable_key_metrics.cc b/crypto/unexportable_key_metrics.cc
index 842547f..a0b93557 100644
--- a/crypto/unexportable_key_metrics.cc
+++ b/crypto/unexportable_key_metrics.cc
@@ -220,7 +220,10 @@
   }
 
   auto delete_key = [&provider](UnexportableSigningKey* key) {
-    provider->DeleteSigningKeySlowly(key->GetWrappedKey());
+    if (StatefulUnexportableKeyProvider* stateful_provider =
+            provider->AsStatefulUnexportableKeyProvider()) {
+      stateful_provider->DeleteSigningKeySlowly(key->GetWrappedKey());
+    }
     delete key;
   };
   base::ElapsedTimer key_creation_timer;
diff --git a/crypto/unexportable_key_metrics_unittest.cc b/crypto/unexportable_key_metrics_unittest.cc
index 27929d9..d0cf6f8 100644
--- a/crypto/unexportable_key_metrics_unittest.cc
+++ b/crypto/unexportable_key_metrics_unittest.cc
@@ -5,7 +5,13 @@
 #include "crypto/unexportable_key_metrics.h"
 
 #include <memory>
+#include <optional>
+#include <set>
+#include <utility>
+#include <vector>
 
+#include "base/containers/span.h"
+#include "base/containers/to_vector.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "crypto/signature_verifier.h"
 #include "crypto/unexportable_key.h"
@@ -18,7 +24,8 @@
 // Mock that wraps the stateless software unexportable key provider while
 // tracking key creation and removal. CHECKs if there are keys left that have
 // not been removed when destroyed.
-class MockTrackingUnexportableKeyProvider : public UnexportableKeyProvider {
+class MockTrackingUnexportableKeyProvider
+    : public StatefulUnexportableKeyProvider {
  public:
   MockTrackingUnexportableKeyProvider()
       : key_provider_(GetSoftwareUnsecureUnexportableKeyProvider()) {}
@@ -50,11 +57,30 @@
         << "Attempted to delete non existing key";
     return key_provider_->FromWrappedSigningKeySlowly(wrapped_key);
   }
+
+  StatefulUnexportableKeyProvider* AsStatefulUnexportableKeyProvider()
+      override {
+    return this;
+  }
+
+  // StatefulUnexportableKeyProvider:
+  std::optional<std::vector<std::unique_ptr<UnexportableSigningKey>>>
+  GetAllSigningKeysSlowly() override {
+    return base::ToVector(keys_, [&](const std::vector<uint8_t>& key) {
+      return FromWrappedSigningKeySlowly(key);
+    });
+  }
   bool DeleteSigningKeySlowly(base::span<const uint8_t> wrapped_key) override {
-    key_provider_->DeleteSigningKeySlowly(wrapped_key);
+    if (StatefulUnexportableKeyProvider* stateful_key_provider =
+            key_provider_->AsStatefulUnexportableKeyProvider()) {
+      stateful_key_provider->DeleteSigningKeySlowly(wrapped_key);
+    }
     return keys_.erase(
         std::vector<uint8_t>(wrapped_key.begin(), wrapped_key.end()));
   }
+  std::optional<size_t> DeleteAllSigningKeysSlowly() override {
+    return std::exchange(keys_, {}).size();
+  }
 
  private:
   std::unique_ptr<UnexportableKeyProvider> key_provider_;
diff --git a/crypto/unexportable_key_software_unsecure.cc b/crypto/unexportable_key_software_unsecure.cc
index 1a0ac248f..f3f2257 100644
--- a/crypto/unexportable_key_software_unsecure.cc
+++ b/crypto/unexportable_key_software_unsecure.cc
@@ -200,9 +200,10 @@
     return nullptr;
   }
 
-  bool DeleteSigningKeySlowly(base::span<const uint8_t> wrapped_key) override {
+  StatefulUnexportableKeyProvider* AsStatefulUnexportableKeyProvider()
+      override {
     // Unexportable software keys are stateless.
-    return true;
+    return nullptr;
   }
 };
 
diff --git a/crypto/unexportable_key_unittest.cc b/crypto/unexportable_key_unittest.cc
index 5f6c9c6..b0f3cd3f 100644
--- a/crypto/unexportable_key_unittest.cc
+++ b/crypto/unexportable_key_unittest.cc
@@ -190,7 +190,10 @@
   verifier2.VerifyUpdate(msg);
   ASSERT_TRUE(verifier2.VerifyFinal());
 
-  EXPECT_TRUE(provider->DeleteSigningKeySlowly(wrapped));
+  crypto::StatefulUnexportableKeyProvider* stateful_provider =
+      provider->AsStatefulUnexportableKeyProvider();
+  EXPECT_TRUE(stateful_provider == nullptr ||
+              stateful_provider->DeleteSigningKeySlowly(wrapped));
 }
 
 #if BUILDFLAG(IS_WIN)
diff --git a/crypto/unexportable_key_win.cc b/crypto/unexportable_key_win.cc
index 3d5de98..a68a7106 100644
--- a/crypto/unexportable_key_win.cc
+++ b/crypto/unexportable_key_win.cc
@@ -669,9 +669,10 @@
     return nullptr;
   }
 
-  bool DeleteSigningKeySlowly(base::span<const uint8_t> wrapped) override {
+  StatefulUnexportableKeyProvider* AsStatefulUnexportableKeyProvider()
+      override {
     // Unexportable keys are stateless on Windows.
-    return true;
+    return nullptr;
   }
 
  private:
diff --git a/crypto/user_verifying_key_mac.mm b/crypto/user_verifying_key_mac.mm
index ffb263be..bea0a99 100644
--- a/crypto/user_verifying_key_mac.mm
+++ b/crypto/user_verifying_key_mac.mm
@@ -151,7 +151,10 @@
   if (!key_provider) {
     return false;
   }
-  return key_provider->DeleteSigningKeySlowly(wrapped_key);
+  StatefulUnexportableKeyProvider* stateful_key_provider =
+      key_provider->AsStatefulUnexportableKeyProvider();
+  return !stateful_key_provider ||
+         stateful_key_provider->DeleteSigningKeySlowly(wrapped_key);
 }
 
 class UserVerifyingKeyProviderMac : public UserVerifyingKeyProvider {
diff --git a/docs/security/process-sandboxes-by-platform.md b/docs/security/process-sandboxes-by-platform.md
index 7d2ce3a..65cf27a0 100644
--- a/docs/security/process-sandboxes-by-platform.md
+++ b/docs/security/process-sandboxes-by-platform.md
@@ -53,7 +53,7 @@
 * kMediaFoundationCdm (Windows only)
 * kPdfConversion (Windows only)
 * kXrCompositing (Windows only)
-* kWindowsSystemProxyResolver (Windows only)
+* kProxyResolver (Windows only)
 * kHardwareVideoDecoding (Linux & Ash)
 * kHardwareVideoEncoding (Linux & Ash)
 * kIme (Ash only)
diff --git a/docs/website b/docs/website
index 53291bf..77b138b 160000
--- a/docs/website
+++ b/docs/website
@@ -1 +1 @@
-Subproject commit 53291bf0602ed24ddf60848c6dd4423e8d129617
+Subproject commit 77b138bace45efd371ab1096fb98e96c34f908ec
diff --git a/extensions/browser/BUILD.gn b/extensions/browser/BUILD.gn
index 27ec5b5..5e3d03d 100644
--- a/extensions/browser/BUILD.gn
+++ b/extensions/browser/BUILD.gn
@@ -838,6 +838,8 @@
     "mock_display_info_provider.h",
     "mock_screen.cc",
     "mock_screen.h",
+    "permissions/permissions_test_util.cc",
+    "permissions/permissions_test_util.h",
     "preload_check_test_util.cc",
     "preload_check_test_util.h",
     "scoped_database_manager_for_test.cc",
@@ -997,6 +999,7 @@
     "message_tracker_unittest.cc",
     "mojo/keep_alive_impl_unittest.cc",
     "path_util_unittest.cc",
+    "permissions/site_permissions_helper_unittest.cc",
     "permissions_manager_unittest.cc",
     "policy_check_unittest.cc",
     "preload_check_group_unittest.cc",
diff --git a/chrome/browser/extensions/permissions/permissions_test_util.cc b/extensions/browser/permissions/permissions_test_util.cc
similarity index 92%
rename from chrome/browser/extensions/permissions/permissions_test_util.cc
rename to extensions/browser/permissions/permissions_test_util.cc
index 8a3eb64..80ee43b2 100644
--- a/chrome/browser/extensions/permissions/permissions_test_util.cc
+++ b/extensions/browser/permissions/permissions_test_util.cc
@@ -2,11 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/extensions/permissions/permissions_test_util.h"
+#include "extensions/browser/permissions/permissions_test_util.h"
 
 #include "base/logging.h"
 #include "base/run_loop.h"
-#include "chrome/common/webui_url_constants.h"
 #include "content/public/browser/browser_context.h"
 #include "extensions/buildflags/buildflags.h"
 #include "extensions/common/extension.h"
@@ -15,6 +14,11 @@
 static_assert(BUILDFLAG(ENABLE_EXTENSIONS_CORE));
 
 namespace extensions {
+
+namespace {
+constexpr char kChromeUIFaviconURL[] = "chrome://favicon/";
+}
+
 namespace permissions_test_util {
 
 std::vector<std::string> GetPatternsAsStrings(const URLPatternSet& patterns) {
@@ -26,7 +30,7 @@
     // the extension to retrieve a favicon for a given URL). Just ignore it when
     // generating host sets.
     std::string pattern_string = pattern.GetAsString();
-    if (pattern_string != std::string(chrome::kChromeUIFaviconURL) + "*") {
+    if (pattern_string != std::string(kChromeUIFaviconURL) + "*") {
       pattern_strings.push_back(pattern_string);
     }
   }
diff --git a/chrome/browser/extensions/permissions/permissions_test_util.h b/extensions/browser/permissions/permissions_test_util.h
similarity index 88%
rename from chrome/browser/extensions/permissions/permissions_test_util.h
rename to extensions/browser/permissions/permissions_test_util.h
index 53acebf..897f3879 100644
--- a/chrome/browser/extensions/permissions/permissions_test_util.h
+++ b/extensions/browser/permissions/permissions_test_util.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_EXTENSIONS_PERMISSIONS_PERMISSIONS_TEST_UTIL_H_
-#define CHROME_BROWSER_EXTENSIONS_PERMISSIONS_PERMISSIONS_TEST_UTIL_H_
+#ifndef EXTENSIONS_BROWSER_PERMISSIONS_PERMISSIONS_TEST_UTIL_H_
+#define EXTENSIONS_BROWSER_PERMISSIONS_PERMISSIONS_TEST_UTIL_H_
 
 #include <string>
 #include <vector>
@@ -53,4 +53,4 @@
 }  // namespace permissions_test_util
 }  // namespace extensions
 
-#endif  // CHROME_BROWSER_EXTENSIONS_PERMISSIONS_PERMISSIONS_TEST_UTIL_H_
+#endif  // EXTENSIONS_BROWSER_PERMISSIONS_PERMISSIONS_TEST_UTIL_H_
diff --git a/chrome/browser/extensions/permissions/site_permissions_helper_unittest.cc b/extensions/browser/permissions/site_permissions_helper_unittest.cc
similarity index 82%
rename from chrome/browser/extensions/permissions/site_permissions_helper_unittest.cc
rename to extensions/browser/permissions/site_permissions_helper_unittest.cc
index cbf8597..33fe5301 100644
--- a/chrome/browser/extensions/permissions/site_permissions_helper_unittest.cc
+++ b/extensions/browser/permissions/site_permissions_helper_unittest.cc
@@ -7,16 +7,15 @@
 #include <memory>
 #include <vector>
 
+#include "base/command_line.h"
 #include "base/test/scoped_feature_list.h"
-#include "chrome/browser/extensions/extension_action_runner.h"
-#include "chrome/browser/extensions/extension_service_test_with_install.h"
-#include "chrome/browser/extensions/tab_helper.h"
-#include "chrome/browser/profiles/profile.h"
 #include "components/crx_file/id_util.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/navigation_simulator.h"
 #include "content/public/test/web_contents_tester.h"
 #include "extensions/browser/extension_registrar.h"
+#include "extensions/browser/extensions_test.h"
+#include "extensions/browser/permissions/active_tab_permission_granter.h"
 #include "extensions/browser/permissions/permissions_updater.h"
 #include "extensions/browser/permissions/scripting_permissions_modifier.h"
 #include "extensions/browser/permissions_manager.h"
@@ -25,6 +24,7 @@
 #include "extensions/common/extension_features.h"
 #include "extensions/common/permissions/permissions_data.h"
 #include "extensions/test/permissions_manager_waiter.h"
+#include "testing/gmock/include/gmock/gmock.h"
 
 static_assert(BUILDFLAG(ENABLE_EXTENSIONS_CORE));
 
@@ -33,7 +33,63 @@
 using UserSiteAccess = PermissionsManager::UserSiteAccess;
 using SiteInteraction = SitePermissionsHelper::SiteInteraction;
 
-class SitePermissionsHelperUnitTest : public ExtensionServiceTestWithInstall {
+namespace {
+class TestExtensionRegistrarDelegate : public ExtensionRegistrar::Delegate {
+ public:
+  explicit TestExtensionRegistrarDelegate(
+      content::BrowserContext* browser_context)
+      : browser_context_(browser_context) {}
+
+  TestExtensionRegistrarDelegate(const TestExtensionRegistrarDelegate&) =
+      delete;
+  TestExtensionRegistrarDelegate& operator=(
+      const TestExtensionRegistrarDelegate&) = delete;
+
+  ~TestExtensionRegistrarDelegate() override = default;
+
+  // ExtensionRegistrar::Delegate:
+  void PreAddExtension(const Extension* extension,
+                       const Extension* old_extension) override {
+    PermissionsUpdater(browser_context_).GrantActivePermissions(extension);
+  }
+
+  void ShutDown() { browser_context_ = nullptr; }
+
+  MOCK_METHOD1(OnAddNewOrUpdatedExtension, void(const Extension* extension));
+  MOCK_METHOD1(PostActivateExtension,
+               void(scoped_refptr<const Extension> extension));
+  MOCK_METHOD1(PostDeactivateExtension,
+               void(scoped_refptr<const Extension> extension));
+  MOCK_METHOD1(PreUninstallExtension,
+               void(scoped_refptr<const Extension> extension));
+  MOCK_METHOD2(PostUninstallExtension,
+               void(scoped_refptr<const Extension> extension,
+                    base::OnceClosure done_callback));
+  MOCK_METHOD2(LoadExtensionForReload,
+               void(const ExtensionId& extension_id,
+                    const base::FilePath& path));
+  MOCK_METHOD2(LoadExtensionForReloadWithQuietFailure,
+               void(const ExtensionId& extension_id,
+                    const base::FilePath& path));
+  MOCK_METHOD2(ShowExtensionDisabledError, void(const Extension*, bool));
+  MOCK_METHOD1(CanEnableExtension, bool(const Extension* extension));
+  MOCK_METHOD1(CanDisableExtension, bool(const Extension* extension));
+  MOCK_METHOD1(ShouldBlockExtension, bool(const Extension* extension));
+  MOCK_METHOD1(GrantActivePermissions, void(const Extension* extension));
+  MOCK_METHOD0(UpdateExternalExtensionAlert, void());
+  MOCK_METHOD4(OnExtensionInstalled,
+               void(const Extension* extension,
+                    const syncer::StringOrdinal& page_ordinal,
+                    int install_flags,
+                    base::Value::Dict ruleset_install_prefs));
+
+ private:
+  raw_ptr<content::BrowserContext> browser_context_;
+};
+
+}  // namespace
+
+class SitePermissionsHelperUnitTest : public ExtensionsTest {
  public:
   scoped_refptr<const Extension> InstallExtension(const std::string& name);
 
@@ -50,6 +106,7 @@
     return permissions_helper_.get();
   }
   PermissionsManager* permissions_manager() { return permissions_manager_; }
+  TestExtensionRegistrarDelegate* delegate() { return delegate_.get(); }
 
   // ExtensionServiceTestBase:
   void SetUp() override;
@@ -63,6 +120,8 @@
   std::unique_ptr<SitePermissionsHelper> permissions_helper_;
 
   raw_ptr<PermissionsManager> permissions_manager_;
+
+  std::unique_ptr<testing::NiceMock<TestExtensionRegistrarDelegate>> delegate_;
 };
 
 scoped_refptr<const Extension> SitePermissionsHelperUnitTest::InstallExtension(
@@ -80,17 +139,19 @@
                        .AddAPIPermissions(permissions)
                        .SetID(crx_file::id_util::GenerateId(name))
                        .Build();
-  registrar()->AddExtension(extension);
+  ExtensionRegistrar::Get(browser_context())->AddExtension(extension);
 
   return extension;
 }
 
 content::WebContents* SitePermissionsHelperUnitTest::AddTab(const GURL& url) {
   std::unique_ptr<content::WebContents> web_contents(
-      content::WebContentsTester::CreateTestWebContents(profile(), nullptr));
+      content::WebContentsTester::CreateTestWebContents(browser_context(),
+                                                        nullptr));
   content::WebContents* raw_contents = web_contents.get();
-  TabHelper::CreateForWebContents(raw_contents);
 
+  ActiveTabPermissionGranter::CreateForWebContents(
+      raw_contents, tabs_.size() + 1, browser_context());
   tabs_.push_back(std::move(web_contents));
 
   content::NavigationSimulator::NavigateAndCommitFromBrowser(raw_contents, url);
@@ -100,11 +161,19 @@
 }
 
 void SitePermissionsHelperUnitTest::SetUp() {
-  ExtensionServiceTestBase::SetUp();
-  InitializeEmptyExtensionService();
+  ExtensionsTest::SetUp();
 
-  permissions_helper_ = std::make_unique<SitePermissionsHelper>(profile());
-  permissions_manager_ = PermissionsManager::Get(profile());
+  permissions_helper_ =
+      std::make_unique<SitePermissionsHelper>(browser_context());
+  permissions_manager_ = PermissionsManager::Get(browser_context());
+  delegate_ =
+      std::make_unique<testing::NiceMock<TestExtensionRegistrarDelegate>>(
+          browser_context());
+
+  ExtensionRegistrar::Get(browser_context())
+      ->Init(delegate(), /*extensions_enabled=*/true,
+             base::CommandLine::ForCurrentProcess(), base::FilePath(),
+             base::FilePath());
 }
 
 void SitePermissionsHelperUnitTest::TearDown() {
@@ -112,8 +181,9 @@
   tabs_.clear();
   permissions_manager_ = nullptr;
   permissions_helper_.reset();
+  delegate_->ShutDown();
 
-  ExtensionServiceTestBase::TearDown();
+  ExtensionsTest::TearDown();
 }
 
 // TODO(crbug.com/40817514): Move test that verify SiteAccess and
@@ -239,7 +309,7 @@
         SiteInteraction::kGranted);
   }
 
-  ScriptingPermissionsModifier(profile(), extension.get())
+  ScriptingPermissionsModifier(browser_context(), extension.get())
       .RemoveAllGrantedHostPermissions();
 
   {
@@ -282,8 +352,6 @@
 
   // Open a site requested by both extensions.
   content::WebContents* site_contents = AddTab(requested_site);
-  auto reload_page_dialog_reset =
-      ReloadPageDialogController::AcceptDialogForTesting(true);
 
   // Extension A should have 'on site' access for the site it requested and 'on
   // click' for a site it didn't request. Extension A should have 'on all sites'
@@ -404,8 +472,6 @@
 
   {
     // Switch the extension from on all sites to on-click.
-    auto reload_page_dialog_reset =
-        ReloadPageDialogController::AcceptDialogForTesting(true);
     PermissionsManagerWaiter waiter(permissions_manager());
     permissions_helper()->UpdateSiteAccess(
         *extension, non_user_permitted_contents, UserSiteAccess::kOnClick);
diff --git a/gpu/command_buffer/client/test_shared_image_interface.cc b/gpu/command_buffer/client/test_shared_image_interface.cc
index 07739fd..a3e2be4 100644
--- a/gpu/command_buffer/client/test_shared_image_interface.cc
+++ b/gpu/command_buffer/client/test_shared_image_interface.cc
@@ -56,27 +56,6 @@
 #endif
 }
 
-// Creates a shared memory region and returns a handle to it.
-gfx::GpuMemoryBufferHandle CreateGMBHandle(const viz::SharedImageFormat& format,
-                                           const gfx::Size& size,
-                                           gfx::BufferUsage buffer_usage) {
-  size_t buffer_size =
-      viz::SharedMemorySizeForSharedImageFormat(format, size).value();
-  CHECK(buffer_size);
-  auto shared_memory_region =
-      base::UnsafeSharedMemoryRegion::Create(buffer_size);
-  CHECK(shared_memory_region.IsValid());
-
-  gfx::GpuMemoryBufferHandle handle(std::move(shared_memory_region));
-  handle.offset = 0;
-  handle.stride =
-      static_cast<uint32_t>(viz::SharedMemoryRowSizeForSharedImageFormat(
-                                format, /*plane*/ 0, size.width())
-                                .value());
-
-  return handle;
-}
-
 }  // namespace
 
 #if BUILDFLAG(IS_FUCHSIA)
@@ -154,6 +133,27 @@
 TestSharedImageInterface::~TestSharedImageInterface() = default;
 
 // static
+gfx::GpuMemoryBufferHandle TestSharedImageInterface::CreateGMBHandle(
+    const viz::SharedImageFormat& format,
+    const gfx::Size& size) {
+  size_t buffer_size =
+      viz::SharedMemorySizeForSharedImageFormat(format, size).value();
+  CHECK(buffer_size);
+  auto shared_memory_region =
+      base::UnsafeSharedMemoryRegion::Create(buffer_size);
+  CHECK(shared_memory_region.IsValid());
+
+  gfx::GpuMemoryBufferHandle handle(std::move(shared_memory_region));
+  handle.offset = 0;
+  handle.stride =
+      static_cast<uint32_t>(viz::SharedMemoryRowSizeForSharedImageFormat(
+                                format, /*plane*/ 0, size.width())
+                                .value());
+
+  return handle;
+}
+
+// static
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
 gfx::GpuMemoryBufferHandle TestSharedImageInterface::CreatePixmapHandle(
     const gfx::Size& size,
@@ -232,8 +232,8 @@
     si_info_copy.meta.format.ClearPrefersExternalSampler();
   }
 
-  auto gmb_handle = CreateGMBHandle(si_info.meta.format, si_info_copy.meta.size,
-                                    buffer_usage);
+  auto gmb_handle =
+      CreateGMBHandle(si_info.meta.format, si_info_copy.meta.size);
 
   auto client_si = base::MakeRefCounted<ClientSharedImage>(
       mailbox, si_info_copy, sync_token,
@@ -263,6 +263,15 @@
         mailbox, si_info_copy.meta, sync_token, buffer_usage, holder_);
   }
 
+  // If the GMB handle passed here is shared memory (e.g. because it was created
+  // by a unittest that is simulating a production flow with native handles),
+  // clear the external sampler prefs to avoid a CHECK within ClientSI that
+  // external sampling is set only with a native GMB handle.
+  if (buffer_handle.type == gfx::SHARED_MEMORY_BUFFER &&
+      si_info_copy.meta.format.PrefersExternalSampler()) {
+    si_info_copy.meta.format.ClearPrefersExternalSampler();
+  }
+
   return base::MakeRefCounted<ClientSharedImage>(
       mailbox, si_info_copy, sync_token,
       GpuMemoryBufferHandleInfo(std::move(buffer_handle), buffer_usage),
diff --git a/gpu/command_buffer/client/test_shared_image_interface.h b/gpu/command_buffer/client/test_shared_image_interface.h
index 2c5bc506..9b4788e 100644
--- a/gpu/command_buffer/client/test_shared_image_interface.h
+++ b/gpu/command_buffer/client/test_shared_image_interface.h
@@ -37,6 +37,11 @@
  public:
   TestSharedImageInterface();
 
+  // Creates a shared memory region and returns a handle to it.
+  static gfx::GpuMemoryBufferHandle CreateGMBHandle(
+      const viz::SharedImageFormat& format,
+      const gfx::Size& size);
+
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
   // TODO(blundell): Fold this inside of a TestSII::CreateSI() variant and have
   // test clients that need the handle grab it from the created SI.
diff --git a/infra/config/generated/builders/ci/ToTAndroidCoverage x86/gn-args.json b/infra/config/generated/builders/ci/ToTAndroidCoverage x86/gn-args.json
index 47d9b74c..6b9d25c7 100644
--- a/infra/config/generated/builders/ci/ToTAndroidCoverage x86/gn-args.json
+++ b/infra/config/generated/builders/ci/ToTAndroidCoverage x86/gn-args.json
@@ -12,6 +12,7 @@
     "treat_warnings_as_errors": false,
     "use_clang_coverage": true,
     "use_reclient": false,
+    "use_remoteexec": true,
     "use_siso": true
   }
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/ToTAndroidCoverage x86/properties.json b/infra/config/generated/builders/ci/ToTAndroidCoverage x86/properties.json
index a8f11cf..184638a 100644
--- a/infra/config/generated/builders/ci/ToTAndroidCoverage x86/properties.json
+++ b/infra/config/generated/builders/ci/ToTAndroidCoverage x86/properties.json
@@ -61,7 +61,8 @@
     "enable_cloud_trace": true,
     "experiments": [],
     "metrics_project": "chromium-reclient-metrics",
-    "project": "rbe-chromium-trusted"
+    "project": "rbe-chromium-trusted",
+    "remote_jobs": 400
   },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
diff --git a/infra/config/generated/builders/ci/ToTAndroidCoverage x86/shadow-properties.json b/infra/config/generated/builders/ci/ToTAndroidCoverage x86/shadow-properties.json
index 54c02663..155ae71 100644
--- a/infra/config/generated/builders/ci/ToTAndroidCoverage x86/shadow-properties.json
+++ b/infra/config/generated/builders/ci/ToTAndroidCoverage x86/shadow-properties.json
@@ -8,6 +8,7 @@
     "enable_cloud_trace": true,
     "experiments": [],
     "metrics_project": "chromium-reclient-metrics",
-    "project": "rbe-chromium-untrusted"
+    "project": "rbe-chromium-untrusted",
+    "remote_jobs": 400
   }
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/ToTLinuxCoverage/gn-args.json b/infra/config/generated/builders/ci/ToTLinuxCoverage/gn-args.json
index f0dd6202..dfdb0696 100644
--- a/infra/config/generated/builders/ci/ToTLinuxCoverage/gn-args.json
+++ b/infra/config/generated/builders/ci/ToTLinuxCoverage/gn-args.json
@@ -10,6 +10,7 @@
     "treat_warnings_as_errors": false,
     "use_clang_coverage": true,
     "use_reclient": false,
+    "use_remoteexec": true,
     "use_siso": true
   }
 }
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/ToTRustLinux\050dbg\051/gn-args.json" "b/infra/config/generated/builders/ci/ToTRustLinux\050dbg\051/gn-args.json"
index 86143e7..49553489 100644
--- "a/infra/config/generated/builders/ci/ToTRustLinux\050dbg\051/gn-args.json"
+++ "b/infra/config/generated/builders/ci/ToTRustLinux\050dbg\051/gn-args.json"
@@ -8,6 +8,7 @@
     "target_os": "linux",
     "treat_warnings_as_errors": false,
     "use_reclient": false,
+    "use_remoteexec": true,
     "use_siso": true
   }
 }
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/ToTRustLinux\050dbg\051/properties.json" "b/infra/config/generated/builders/ci/ToTRustLinux\050dbg\051/properties.json"
index ed4ac25..ad04c0f 100644
--- "a/infra/config/generated/builders/ci/ToTRustLinux\050dbg\051/properties.json"
+++ "b/infra/config/generated/builders/ci/ToTRustLinux\050dbg\051/properties.json"
@@ -57,7 +57,8 @@
     "enable_cloud_trace": true,
     "experiments": [],
     "metrics_project": "chromium-reclient-metrics",
-    "project": "rbe-chromium-trusted"
+    "project": "rbe-chromium-trusted",
+    "remote_jobs": 400
   },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
diff --git "a/infra/config/generated/builders/ci/ToTRustLinux\050dbg\051/shadow-properties.json" "b/infra/config/generated/builders/ci/ToTRustLinux\050dbg\051/shadow-properties.json"
index 54c02663..155ae71 100644
--- "a/infra/config/generated/builders/ci/ToTRustLinux\050dbg\051/shadow-properties.json"
+++ "b/infra/config/generated/builders/ci/ToTRustLinux\050dbg\051/shadow-properties.json"
@@ -8,6 +8,7 @@
     "enable_cloud_trace": true,
     "experiments": [],
     "metrics_project": "chromium-reclient-metrics",
-    "project": "rbe-chromium-untrusted"
+    "project": "rbe-chromium-untrusted",
+    "remote_jobs": 400
   }
 }
\ No newline at end of file
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index 0fd661f4..a61f704 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -29013,7 +29013,8 @@
         '    "enable_cloud_trace": true,'
         '    "experiments": [],'
         '    "metrics_project": "chromium-reclient-metrics",'
-        '    "project": "rbe-chromium-trusted"'
+        '    "project": "rbe-chromium-trusted",'
+        '    "remote_jobs": 400'
         '  },'
         '  "$recipe_engine/resultdb/test_presentation": {'
         '    "column_keys": [],'
@@ -29091,7 +29092,8 @@
           '    "enable_cloud_trace": true,'
           '    "experiments": [],'
           '    "metrics_project": "chromium-reclient-metrics",'
-          '    "project": "rbe-chromium-untrusted"'
+          '    "project": "rbe-chromium-untrusted",'
+          '    "remote_jobs": 400'
           '  }'
           '}'
         dimensions: "free_space:"
diff --git a/infra/config/subprojects/chromium/ci/chromium.clang.star b/infra/config/subprojects/chromium/ci/chromium.clang.star
index 7264a5e..c419d066 100644
--- a/infra/config/subprojects/chromium/ci/chromium.clang.star
+++ b/infra/config/subprojects/chromium/ci/chromium.clang.star
@@ -567,6 +567,7 @@
             "x86",
             "dcheck_always_on",
             "use_clang_coverage",
+            "remoteexec",
         ],
     ),
     targets = targets.bundle(
@@ -579,6 +580,7 @@
         short_name = "and",
     ),
     contact_team_email = "lexan@google.com",
+    siso_remote_jobs = min(siso.remote_jobs.HIGH_JOBS_FOR_CI, 400),
 )
 
 ci.builder(
@@ -1101,10 +1103,12 @@
             "minimal_symbols",
             "release",
             "x64",
+            "remoteexec",
         ],
     ),
     category = "ToT Code Coverage",
     short_name = "linux",
+    siso_remote_jobs = min(siso.remote_jobs.HIGH_JOBS_FOR_CI, 400),
 )
 
 clang_tot_linux_builder(
@@ -2235,6 +2239,7 @@
             "debug",
             "x64",
             "linux",
+            "remoteexec",
         ],
     ),
     targets = targets.bundle(
@@ -2252,6 +2257,7 @@
         short_name = "lin",
     ),
     contact_team_email = "lexan@google.com",
+    siso_remote_jobs = min(siso.remote_jobs.HIGH_JOBS_FOR_CI, 400),
 )
 
 ci.builder(
diff --git a/ios/chrome/app/profile/application_storage_metrics.mm b/ios/chrome/app/profile/application_storage_metrics.mm
index e9ac4238..287008ed 100644
--- a/ios/chrome/app/profile/application_storage_metrics.mm
+++ b/ios/chrome/app/profile/application_storage_metrics.mm
@@ -23,8 +23,6 @@
 
 // The etension used for all snapshot images.
 constexpr std::string_view kSnapshotImageExtension = ".jpg";
-// The label appended to the snapshot filename for grey snapshot images.
-constexpr std::string_view kGreySnapshotImageIdentifier = "Grey";
 
 // The path, relative to the application's Library directory, to WebKit's
 // storage location for website local data .
@@ -44,8 +42,7 @@
   int64_t total_size_bytes;
 };
 
-DirectorySnapshotDetails CalculateImageMetricsInRoot(bool grey_only,
-                                                     base::FilePath root) {
+DirectorySnapshotDetails CalculateImageMetricsInRoot(base::FilePath root) {
   DirectorySnapshotDetails details;
 
   if (!base::PathExists(root)) {
@@ -60,15 +57,9 @@
 
   if (!info.is_directory) {
     if (root.MatchesExtension(kSnapshotImageExtension)) {
-      // Add this snapshot to the total if search for all snapshots or searching
-      // for grey snapshots only and the filename contains
-      // `kGreySnapshotImageIdentifier`.
-      if (!grey_only ||
-          root.BaseName().MaybeAsASCII().find(kGreySnapshotImageIdentifier) !=
-              std::string::npos) {
-        details.snapshot_count += 1;
-        details.total_size_bytes += info.size;
-      }
+      // Add this snapshot to the total.
+      details.snapshot_count += 1;
+      details.total_size_bytes += info.size;
     }
     return details;
   }
@@ -79,7 +70,7 @@
   for (base::FilePath path = enumerator.Next(); !path.empty();
        path = enumerator.Next()) {
     DirectorySnapshotDetails child_details =
-        CalculateImageMetricsInRoot(grey_only, root.Append(path.BaseName()));
+        CalculateImageMetricsInRoot(root.Append(path.BaseName()));
     details.snapshot_count += child_details.snapshot_count;
     details.total_size_bytes += child_details.total_size_bytes;
   }
@@ -236,28 +227,15 @@
                              scoped_refptr<base::SequencedTaskRunner>) {
   base::FilePath snapshots_storage_dir = profile_path.Append(kSnapshotsDirName);
 
-  DirectorySnapshotDetails grey_snapshot_details =
-      CalculateImageMetricsInRoot(/*grey_only=*/true, snapshots_storage_dir);
-  int64_t grey_average_bytes_size = 0;
-  if (grey_snapshot_details.snapshot_count > 0) {
-    grey_average_bytes_size = grey_snapshot_details.total_size_bytes /
-                              grey_snapshot_details.snapshot_count;
-  }
-  UMA_HISTOGRAM_MEMORY_KB("IOS.SandboxMetrics.AverageGreySnapshotSize",
-                          grey_average_bytes_size / 1024);
-
-  DirectorySnapshotDetails all_snapshot_details =
-      CalculateImageMetricsInRoot(/*grey_only=*/false, snapshots_storage_dir);
-  int64_t color_total_size_bytes = all_snapshot_details.total_size_bytes -
-                                   grey_snapshot_details.total_size_bytes;
-  int color_snapshot_count = all_snapshot_details.snapshot_count -
-                             grey_snapshot_details.snapshot_count;
-  int64_t color_average_bytes_size = 0;
-  if (color_snapshot_count > 0) {
-    color_average_bytes_size = color_total_size_bytes / color_snapshot_count;
+  DirectorySnapshotDetails snapshot_details =
+      CalculateImageMetricsInRoot(snapshots_storage_dir);
+  int64_t average_bytes_size = 0;
+  if (snapshot_details.snapshot_count > 0) {
+    average_bytes_size =
+        snapshot_details.total_size_bytes / snapshot_details.snapshot_count;
   }
   UMA_HISTOGRAM_MEMORY_KB("IOS.SandboxMetrics.AverageColorSnapshotSize",
-                          color_average_bytes_size / 1024);
+                          average_bytes_size / 1024);
 }
 
 // Logs the WebKit tmp directory size and the size of the tmp directory
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_is.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_is.xtb
index ffeb6380..4c7b18ef 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_is.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_is.xtb
@@ -42,7 +42,7 @@
 <translation id="1811860791247653035">Hafðu Chromium með í <ph name="FEATURE_NAME_1" /> og <ph name="FEATURE_NAME_2" /> til að fá aðgang að sérsniði og öðrum eiginleikum</translation>
 <translation id="1838412507805038478">Chromium staðfesti að <ph name="ISSUER" /> gaf út vottorð þessa vefsvæðis.</translation>
 <translation id="1839447949248872139">Opnaðu tengla sjálfkrafa í Chromium</translation>
-<translation id="1843424232666537147">Í Chromium eru eiginleikar sem aðstoða þig við að hafa umsjón með gögnum á netinu og hversu fljótlega þú hleður vefsíðum niður.
+<translation id="1843424232666537147">Í Chromium eru eiginleikar sem aðstoða þig við að hafa umsjón með gögnum á netinu og hversu hratt þú hleður vefsíðum niður.
 <ph name="BEGIN_LINK" />Frekari upplýsingar<ph name="END_LINK" /></translation>
 <translation id="1847960401032164406">Kort í Chromium</translation>
 <translation id="1867772173333403444">4. Veldu Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_af.xtb b/ios/chrome/app/strings/resources/ios_strings_af.xtb
index 4439224..6aca4d74 100644
--- a/ios/chrome/app/strings/resources/ios_strings_af.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_af.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Werfadres is gekopieer</translation>
 <translation id="3280562213547448728">Stemsoektog</translation>
 <translation id="3289505634533552500">Stemsoektog</translation>
+<translation id="3293080634164207409">Voeg oortjies by</translation>
 <translation id="3295904109373959849">Oortjiegroeprooster</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, nuwe aktiwiteit</translation>
 <translation id="3305294846493618482">meer</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_am.xtb b/ios/chrome/app/strings/resources/ios_strings_am.xtb
index b38564e..5da3426 100644
--- a/ios/chrome/app/strings/resources/ios_strings_am.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_am.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">የድር ጣቢያ አድራሻ ተቀድቷል</translation>
 <translation id="3280562213547448728">የድምፅ ፍለጋ</translation>
 <translation id="3289505634533552500">የድምፅ ፍለጋ</translation>
+<translation id="3293080634164207409">ትሮችን ያክሉ</translation>
 <translation id="3295904109373959849">የትር ቡድኖች ፍርግርግ</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />፣ አዲስ እንቅስቃሴ</translation>
 <translation id="3305294846493618482">ተጨማሪ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
index a7744a31..2bf0c49 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">تم نسخ عنوان الموقع</translation>
 <translation id="3280562213547448728">بحث صوتي</translation>
 <translation id="3289505634533552500">البحث الصوتي</translation>
+<translation id="3293080634164207409">إضافة علامات تبويب</translation>
 <translation id="3295904109373959849">شبكة مجموعة علامات التبويب</translation>
 <translation id="3302837541200840455">علامة التبويب "<ph name="TAB_TITLE" />" بها نشاط جديد</translation>
 <translation id="3305294846493618482">عرض المزيد</translation>
@@ -1101,7 +1102,7 @@
 <translation id="5225388483876575107">A</translation>
 <translation id="5233638681132016545">علامة تبويب جديدة</translation>
 <translation id="5234094073825090254">{count,plural, =1{‏تم حفظ الإشارة المرجعية في حسابك على Google‏ ({email}).}zero{‏تم حفظ الإشارات المرجعية في حسابك على Google‏ ({email}).}two{‏تم حفظ الإشارتَين المرجعيّتَين في حسابك على Google‏ ({email}).}few{‏تم حفظ الإشارات المرجعية في حسابك على Google‏ ({email}).}many{‏تم حفظ الإشارات المرجعية في حسابك على Google‏ ({email}).}other{‏تم حفظ الإشارات المرجعية في حسابك على Google‏ ({email}).}}</translation>
-<translation id="5234764350956374838">تجاهل</translation>
+<translation id="5234764350956374838">إغلاق</translation>
 <translation id="5238596603078743134">‏بإمكان "<ph name="BEGIN_BOLD" /><ph name="USERNAME" /><ph name="END_BOLD" />" حاليًا استخدام اسم المستخدم وكلمة المرور عند استخدام "مدير كلمات المرور في Google" لتسجيل الدخول إلى <ph name="BEGIN_BOLD" /><ph name="WEBSITE" /><ph name="END_BOLD" />.</translation>
 <translation id="5241106044372754566">حساب "<ph name="NAME" />" (<ph name="EMAIL" />) الذي تديره مؤسستك هو الذي تم اختياره حاليًا. يُرجى اختيار حساب.</translation>
 <translation id="5242899254250321823">تغيير كلمة المرور على الموقع الإلكتروني</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_as.xtb b/ios/chrome/app/strings/resources/ios_strings_as.xtb
index dc9340b..da6d4ee 100644
--- a/ios/chrome/app/strings/resources/ios_strings_as.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_as.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">ছাইটৰ ঠিকনা প্ৰতিলিপি কৰা হৈছে</translation>
 <translation id="3280562213547448728">কণ্ঠধ্বনিৰ দ্বাৰা সন্ধান</translation>
 <translation id="3289505634533552500">ভইচৰ দ্বাৰা সন্ধান</translation>
+<translation id="3293080634164207409">টেব যোগ দিয়ক</translation>
 <translation id="3295904109373959849">টেবৰ গোটৰ গ্ৰিড</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, নতুন কাৰ্যকলাপ</translation>
 <translation id="3305294846493618482">অধিক</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_az.xtb b/ios/chrome/app/strings/resources/ios_strings_az.xtb
index 8133d299..14358a55 100644
--- a/ios/chrome/app/strings/resources/ios_strings_az.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_az.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Sayt ünvanı kopyalandı</translation>
 <translation id="3280562213547448728">Səsli axtarış</translation>
 <translation id="3289505634533552500">Səsli Axtarış</translation>
+<translation id="3293080634164207409">Tab əlavə edin</translation>
 <translation id="3295904109373959849">Tab qrupları şəbəkəsi</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, yeni fəaliyyət</translation>
 <translation id="3305294846493618482">ardı</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_be.xtb b/ios/chrome/app/strings/resources/ios_strings_be.xtb
index 6f66dcf..26197d5b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_be.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_be.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Адрас сайта скапіраваны</translation>
 <translation id="3280562213547448728">Галасавы пошук</translation>
 <translation id="3289505634533552500">Галасавы пошук</translation>
+<translation id="3293080634164207409">Дадайце ўкладкі</translation>
 <translation id="3295904109373959849">Групы ўкладак у выглядзе сеткі</translation>
 <translation id="3302837541200840455">Укладка "<ph name="TAB_TITLE" />", новае дзеянне</translation>
 <translation id="3305294846493618482">яшчэ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
index 5f7c0e3..1e5988c9 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bg.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Адресът на сайта бе копиран</translation>
 <translation id="3280562213547448728">Гласово търсене</translation>
 <translation id="3289505634533552500">Гласово търсене</translation>
+<translation id="3293080634164207409">Добавяне на раздели</translation>
 <translation id="3295904109373959849">Табличен изглед с групи раздели</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, нова активност</translation>
 <translation id="3305294846493618482">още</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bn.xtb b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
index 9232c5f..eeed0f7 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">সাইটের ঠিকানা কপি করা হয়েছে</translation>
 <translation id="3280562213547448728">ভয়েস সার্চ</translation>
 <translation id="3289505634533552500">ভয়েস সার্চ</translation>
+<translation id="3293080634164207409">ট্যাব যোগ করুন</translation>
 <translation id="3295904109373959849">ট্যাব গ্রুপ গ্রিড</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, নতুন অ্যাক্টিভিটি</translation>
 <translation id="3305294846493618482">আরও</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bs.xtb b/ios/chrome/app/strings/resources/ios_strings_bs.xtb
index 9d978f0..47c66d0 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bs.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bs.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Adresa web lokacije je kopirana</translation>
 <translation id="3280562213547448728">Glasovno pretraživanje</translation>
 <translation id="3289505634533552500">Glasovno pretraživanje</translation>
+<translation id="3293080634164207409">Dodajte kartice</translation>
 <translation id="3295904109373959849">Mreža grupa kartica</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, nova aktivnost</translation>
 <translation id="3305294846493618482">više</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
index 4353ff2..91734ec 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">S'ha copiat l'adreça del lloc web</translation>
 <translation id="3280562213547448728">Cerca per veu</translation>
 <translation id="3289505634533552500">Cerca per veu</translation>
+<translation id="3293080634164207409">Afegeix pestanyes</translation>
 <translation id="3295904109373959849">Quadrícula de grups de pestanyes</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, activitat nova</translation>
 <translation id="3305294846493618482">més</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
index 8bc1e2b..2e0e344 100644
--- a/ios/chrome/app/strings/resources/ios_strings_cs.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Adresa webu byla zkopírována</translation>
 <translation id="3280562213547448728">Hlasové vyhledávání</translation>
 <translation id="3289505634533552500">Hlasové vyhledávání</translation>
+<translation id="3293080634164207409">Přidání karet</translation>
 <translation id="3295904109373959849">Mřížka skupin karet</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, nová aktivita</translation>
 <translation id="3305294846493618482">více</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cy.xtb b/ios/chrome/app/strings/resources/ios_strings_cy.xtb
index 84200ac0..7f05628 100644
--- a/ios/chrome/app/strings/resources/ios_strings_cy.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_cy.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Copïwyd cyfeiriad y wefan</translation>
 <translation id="3280562213547448728">Chwilio â llais</translation>
 <translation id="3289505634533552500">Chwilio â Llais</translation>
+<translation id="3293080634164207409">Ychwanegu tabiau</translation>
 <translation id="3295904109373959849">Grid Grwpiau Tab</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, gweithgaredd newydd</translation>
 <translation id="3305294846493618482">rhagor</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb
index e71dbad..b1e3a8e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_da.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Webadressen er kopieret</translation>
 <translation id="3280562213547448728">Stemmesøgning</translation>
 <translation id="3289505634533552500">Stemmesøgning</translation>
+<translation id="3293080634164207409">Tilføj faner</translation>
 <translation id="3295904109373959849">Gitter med fanegrupper</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, ny aktivitet</translation>
 <translation id="3305294846493618482">mere</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_de.xtb b/ios/chrome/app/strings/resources/ios_strings_de.xtb
index 6b0e6f1..75586a4 100644
--- a/ios/chrome/app/strings/resources/ios_strings_de.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_de.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Websiteadresse kopiert</translation>
 <translation id="3280562213547448728">Sprachsuche</translation>
 <translation id="3289505634533552500">Sprachsuche</translation>
+<translation id="3293080634164207409">Tabs hinzufügen</translation>
 <translation id="3295904109373959849">Tabgruppenraster</translation>
 <translation id="3302837541200840455">„<ph name="TAB_TITLE" />“, neue Aktivität</translation>
 <translation id="3305294846493618482">mehr</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_el.xtb b/ios/chrome/app/strings/resources/ios_strings_el.xtb
index 07cd015..8966f77 100644
--- a/ios/chrome/app/strings/resources/ios_strings_el.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_el.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Η διεύθυνση ιστοτόπου αντιγράφηκε</translation>
 <translation id="3280562213547448728">Φωνητική αναζήτηση</translation>
 <translation id="3289505634533552500">Φωνητική αναζήτηση</translation>
+<translation id="3293080634164207409">Προσθήκη καρτελών</translation>
 <translation id="3295904109373959849">Πλέγμα ομάδων καρτελών</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, νέα δραστηριότητα</translation>
 <translation id="3305294846493618482">περισσότερα</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
index 5158528..664ae6e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Site address copied</translation>
 <translation id="3280562213547448728">Voice search</translation>
 <translation id="3289505634533552500">Voice search</translation>
+<translation id="3293080634164207409">Add tabs</translation>
 <translation id="3295904109373959849">Tab groups grid</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, new activity</translation>
 <translation id="3305294846493618482">more</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
index 2f39e8c..cc1776a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Se copió la dirección del sitio</translation>
 <translation id="3280562213547448728">Búsqueda por voz</translation>
 <translation id="3289505634533552500">Búsqueda por voz</translation>
+<translation id="3293080634164207409">Agregar pestañas</translation>
 <translation id="3295904109373959849">Cuadrícula de grupos de pestañas</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, actividad nueva</translation>
 <translation id="3305294846493618482">más</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es.xtb b/ios/chrome/app/strings/resources/ios_strings_es.xtb
index 92e2b8df..08e5458 100644
--- a/ios/chrome/app/strings/resources/ios_strings_es.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_es.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Se ha copiado la dirección del sitio web</translation>
 <translation id="3280562213547448728">Búsqueda por voz</translation>
 <translation id="3289505634533552500">Búsqueda por voz</translation>
+<translation id="3293080634164207409">Añadir pestañas</translation>
 <translation id="3295904109373959849">Cuadrícula de grupos de pestañas</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, actividad nueva</translation>
 <translation id="3305294846493618482">más</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb
index ba739a8f..8ad1a73 100644
--- a/ios/chrome/app/strings/resources/ios_strings_et.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Saidi aadress on kopeeritud</translation>
 <translation id="3280562213547448728">Häälotsing</translation>
 <translation id="3289505634533552500">Häälotsing</translation>
+<translation id="3293080634164207409">Lisage vahelehti</translation>
 <translation id="3295904109373959849">Vahelehegruppide ruudustik</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, uus tegevus</translation>
 <translation id="3305294846493618482">rohkem</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_eu.xtb b/ios/chrome/app/strings/resources/ios_strings_eu.xtb
index a146303..8fdc104 100644
--- a/ios/chrome/app/strings/resources/ios_strings_eu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_eu.xtb
@@ -1,6 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="eu">
+<translation id="1004825134262590729">{count,plural, =1{{count} sarbide-gako}other{{count} sarbide-gako}}</translation>
 <translation id="1005023885865154304">Ireki pasahitzak automatikoki betetzeko ezarpenak</translation>
 <translation id="1005230401424685968">UUUU</translation>
 <translation id="1013952917065545813">Itzuli hona duela gutxi itxi dituzun fitxak berriro irekitzeko</translation>
@@ -595,6 +596,7 @@
 <translation id="3277021493514034324">Kopiatu da webgunearen helbidea</translation>
 <translation id="3280562213547448728">Ahozko bilaketa</translation>
 <translation id="3289505634533552500">Ahozko bilaketa</translation>
+<translation id="3293080634164207409">Gehitu fitxak</translation>
 <translation id="3295904109373959849">Fitxa taldeen sareta</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, jarduera berria</translation>
 <translation id="3305294846493618482">gehiago</translation>
@@ -2218,5 +2220,6 @@
 <translation id="984275831282074731">Ordainketa-metodoak</translation>
 <translation id="985379595344853742">Itxi ezkutuko moduko fitxa guztiak</translation>
 <translation id="988141524645182168">Bestelakoak</translation>
+<translation id="995174784802614337">{count,plural, =1{{count} sarbide-gako inportatu da}other{{count} sarbide-gako inportatu dira}}</translation>
 <translation id="999768147936949692">Oraingoz, familiako kideekin soilik parteka ditzakezu pasahitzak. <ph name="BEGIN_LINK" />Gonbidatu familiako kideak<ph name="END_LINK" /> taldera eta atera etekin handiagoa Google-ren produktu eta harpidetzei.</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
index e5d98158..4ea49fe 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fa.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
@@ -549,7 +549,7 @@
 <translation id="3087734570205094154">پایین</translation>
 <translation id="309710370695886264">۱ گذرواژه دوباره‌استفاده‌شده دارید. همین‌حالا مشکل را برطرف کنید تا ایمن بمانید.</translation>
 <translation id="3099402981545350675">‏این کار نشانی‌های ذخیره‌شده در این دستگاه را حذف می‌کند. این کار همچنین اطلاعات انتخاب‌شده را از Chrome برمی‌دارد اما این اطلاعات از «حساب Google» شما حذف نمی‌شود.</translation>
-<translation id="3106258548858559536">خاموش کردن «حالت مطالعه»</translation>
+<translation id="3106258548858559536">خاموش کردن «حالت خواندن»</translation>
 <translation id="3106690631878101882">‏پنهان کردن «ترجمه Google»</translation>
 <translation id="310900540163454140">گذرواژه مربوط به <ph name="WEBSITE" /> حذف شود؟</translation>
 <translation id="3112556859945124369">علامت‌گذاری...</translation>
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">نشانی سایت کپی شد</translation>
 <translation id="3280562213547448728">جستجوی گفتاری</translation>
 <translation id="3289505634533552500">جستجوی گفتاری</translation>
+<translation id="3293080634164207409">افزودن زبانه</translation>
 <translation id="3295904109373959849">جدول گروه زبانه‌ها</translation>
 <translation id="3302837541200840455">‫<ph name="TAB_TITLE" />، فعالیت جدید</translation>
 <translation id="3305294846493618482">بیشتر</translation>
@@ -1386,7 +1387,7 @@
 <translation id="6247557882553405851">‏مدیر گذرواژه Google</translation>
 <translation id="6251835855431997163">تکمیل خودکار <ph name="VALUE" /></translation>
 <translation id="6254066287920239840">پیوندها به‌جای مرورگر در برنامه باز شوند.</translation>
-<translation id="6259928806013786178">«حالت مطالعه» فعال نشد</translation>
+<translation id="6259928806013786178">«حالت خواندن» فعال نشد</translation>
 <translation id="6268773951964630964">جستجوی تصویر کپی‌شده</translation>
 <translation id="6271462272606946663">پنهان کردن «درخواست سایت ویژه تلفن همراه»</translation>
 <translation id="6271824294945464304">هم‌رسانی گذرواژه</translation>
@@ -1542,7 +1543,7 @@
 <translation id="6791425686608802741">روی «افزودن زبانه به گروه جدید» تک‌ضرب بزنید</translation>
 <translation id="6794476726485507147">تاریخ و ساعتی برای دریافت اعلان یادآور جهت بازدید مجدد از این صفحه انتخاب کنید.</translation>
 <translation id="6795481620482106033">داده‌های نامعتبر</translation>
-<translation id="6797543908718012274">روشن کردن «حالت مطالعه»</translation>
+<translation id="6797543908718012274">روشن کردن «حالت خواندن»</translation>
 <translation id="6806550742467879742">ابزارهای صفحه</translation>
 <translation id="6807287147325542056">گذرواژه‌ها در برنامه‌های دیگر</translation>
 <translation id="681368974849482173">مورد ایجاد شد</translation>
@@ -2081,7 +2082,7 @@
 <translation id="8786100550345425552">ویرایش کردن اجازه‌ها</translation>
 <translation id="878871978861915380">پنهان کردن «ردگیری قیمت»</translation>
 <translation id="8792626944327216835">میکروفون</translation>
-<translation id="8796634520835503150">حالت مطالعه دردسترس است</translation>
+<translation id="8796634520835503150">«حالت خواندن» دردسترس است</translation>
 <translation id="8803526663383843427">وقتی روشن است</translation>
 <translation id="8803639129939845298">ایمن</translation>
 <translation id="8813277370772331957">بعداً به من یادآوری شود</translation>
@@ -2173,7 +2174,7 @@
 <translation id="913036870884277353">پیوندها را به‌سادگی در برنامه‌های دیگر باز کنید.</translation>
 <translation id="9137013805542155359">نمایش مورد اصلی</translation>
 <translation id="9140888637198815199">A</translation>
-<translation id="9144152097013965297">روشن کردن «حالت مطالعه»</translation>
+<translation id="9144152097013965297">روشن کردن «حالت خواندن»</translation>
 <translation id="9144230693397287797">برای یادآورهایی که تنظیم کرده‌اید و برگه‌های سایر دستگاه‌ها به‌روزرسانی دریافت کنید</translation>
 <translation id="914781932147356857">علامت‌گذاری همه…</translation>
 <translation id="9148126808321036104">ورود مجدد به سیستم</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
index dbf35ac..fa855f9 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Sivuston osoite kopioitu</translation>
 <translation id="3280562213547448728">Puhehaku</translation>
 <translation id="3289505634533552500">Puhehaku</translation>
+<translation id="3293080634164207409">Lisää välilehtiä</translation>
 <translation id="3295904109373959849">Välilehtiryhmien ruudukko</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, uusi toiminta</translation>
 <translation id="3305294846493618482">lisää</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
index a797757e..6a2fab5 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fil.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Nakopya ang address ng site</translation>
 <translation id="3280562213547448728">Paghahanap gamit ang boses</translation>
 <translation id="3289505634533552500">Voice Search</translation>
+<translation id="3293080634164207409">Magdagdag ng mga tab</translation>
 <translation id="3295904109373959849">Grid ng Mga Grupo ng Tab</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, bagong aktibidad</translation>
 <translation id="3305294846493618482">higit pa</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
index 3b7b334..3e02189b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Adresse du site copiée</translation>
 <translation id="3280562213547448728">Recherche vocale</translation>
 <translation id="3289505634533552500">Recherche vocale</translation>
+<translation id="3293080634164207409">Ajouter des onglets</translation>
 <translation id="3295904109373959849">Grille des groupes d'onglets</translation>
 <translation id="3302837541200840455">Nouvelle activité dans l'onglet <ph name="TAB_TITLE" /></translation>
 <translation id="3305294846493618482">plus</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
index 2d2621e..04f9d58 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Adresse du site copiée</translation>
 <translation id="3280562213547448728">Recherche vocale</translation>
 <translation id="3289505634533552500">Recherche vocale</translation>
+<translation id="3293080634164207409">Ajouter des onglets</translation>
 <translation id="3295904109373959849">Grille des groupes d'onglets</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, nouvelle activité</translation>
 <translation id="3305294846493618482">plus</translation>
@@ -2209,7 +2210,7 @@
 <translation id="954667170699278022">Liste de lecture</translation>
 <translation id="956066588046842680">L'importation de ces données n'est pas autorisée par la règle de votre organisation.</translation>
 <translation id="956218893102219091">Utilisez votre position exacte pour obtenir les résultats Gemini les plus précis, au lieu d'une position estimée en fonction de votre adresse IP. <ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /></translation>
-<translation id="961856697154696964">Supprimer les données de navigation</translation>
+<translation id="961856697154696964">Suppr. données navigation</translation>
 <translation id="963102227019621224">Activité sur le Web et les applications</translation>
 <translation id="966593914872420832">Recherche vocale</translation>
 <translation id="972084300091883657">{COUNT,plural, =0{Rejoindre le groupe d'onglets avec <ph name="OWNER_NAME" />}=1{Rejoindre le groupe d'onglets avec <ph name="OWNER_NAME" /> et {COUNT} autre personne}one{Rejoindre le groupe d'onglets avec <ph name="OWNER_NAME" /> et {COUNT} autre personne}other{Rejoindre le groupe d'onglets avec <ph name="OWNER_NAME" /> et {COUNT} autres personnes}}</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gl.xtb b/ios/chrome/app/strings/resources/ios_strings_gl.xtb
index dde4943..a3c3b57 100644
--- a/ios/chrome/app/strings/resources/ios_strings_gl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_gl.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Copiouse o enderezo do sitio</translation>
 <translation id="3280562213547448728">Busca por voz</translation>
 <translation id="3289505634533552500">Busca por voz</translation>
+<translation id="3293080634164207409">Engadir pestanas</translation>
 <translation id="3295904109373959849">Grade de grupos de pestanas</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, actividade nova</translation>
 <translation id="3305294846493618482">máis</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
index b99e5485..1b7f61fc 100644
--- a/ios/chrome/app/strings/resources/ios_strings_gu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">સાઇટનું ઍડ્રેસ કૉપિ કર્યું</translation>
 <translation id="3280562213547448728">વૉઇસ શોધ</translation>
 <translation id="3289505634533552500">વૉઇસ શોધ</translation>
+<translation id="3293080634164207409">ટૅબ ઉમેરો</translation>
 <translation id="3295904109373959849">ટૅબના ગ્રૂપની ગ્રિડ</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, નવી ઍક્ટિવિટી</translation>
 <translation id="3305294846493618482">વધુ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
index ed8e11f..17433d7 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">साइट का पता कॉपी किया गया</translation>
 <translation id="3280562213547448728">वॉइस सर्च</translation>
 <translation id="3289505634533552500">वॉइस सर्च</translation>
+<translation id="3293080634164207409">टैब जोड़ें</translation>
 <translation id="3295904109373959849">टैब ग्रुप का ग्रिड</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, नई गतिविधि</translation>
 <translation id="3305294846493618482">पूरा यूआरएल देखें</translation>
@@ -2005,7 +2006,7 @@
 <translation id="8545276357312221485">अपने डिफ़ॉल्ट ब्राउज़र की सेटिंग देखें</translation>
 <translation id="854938212724803178">आपका एक पासवर्ड या तो हैक हुआ है या चोरी हुआ है. सुरक्षित रहने के लिए इस समस्या को अभी ठीक करें.</translation>
 <translation id="8551311254462607218">पता बार में मौजूद, Google Lens के कैमरा आइकॉन पर टैप करें</translation>
-<translation id="8556590991644167667">{count,plural, =1{आपने {count} चेतावनी खारिज की}one{आपने {count} चेतावनी खारिज की}other{आपने {count} चेतावनियां खारिज कीं}}</translation>
+<translation id="8556590991644167667">{count,plural, =1{आपने {count} चेतावनी खारिज कर दी है}one{आपने {count} चेतावनी खारिज कर दी है}other{आपने {count} चेतावनियां खारिज कर दी हैं}}</translation>
 <translation id="8558046478684552694">ग्रुप बंद करें.</translation>
 <translation id="8559858985063901027">पासवर्ड</translation>
 <translation id="8560253818350321773">अक्सर इस्तेमाल किए जाने वाले आइटम पहले दिखाएं.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
index 75e80ff..86e2e739 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Adresa web-lokacije kopirana</translation>
 <translation id="3280562213547448728">Glasovno pretraživanje</translation>
 <translation id="3289505634533552500">Glasovno pretraživanje</translation>
+<translation id="3293080634164207409">Dodajte kartice</translation>
 <translation id="3295904109373959849">Rešetka grupa kartica</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, nova aktivnost</translation>
 <translation id="3305294846493618482">više</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
index e9ff322..b0101c5d 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Webhely címe másolva</translation>
 <translation id="3280562213547448728">Hangalapú keresés</translation>
 <translation id="3289505634533552500">Hangalapú keresés</translation>
+<translation id="3293080634164207409">Lapok hozzáadása</translation>
 <translation id="3295904109373959849">Lapcsoportok rács</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, új tevékenység</translation>
 <translation id="3305294846493618482">több</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hy.xtb b/ios/chrome/app/strings/resources/ios_strings_hy.xtb
index 72660db..c515308 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hy.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hy.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Կայքի հասցեն պատճենվել է</translation>
 <translation id="3280562213547448728">Ձայնային որոնում</translation>
 <translation id="3289505634533552500">Ձայնային որոնում</translation>
+<translation id="3293080634164207409">Ավելացրեք ներդիրներ</translation>
 <translation id="3295904109373959849">Ներդիրների խմբերի ցանց</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, նոր գործողություններ</translation>
 <translation id="3305294846493618482">ավելին</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb
index 2696caf..be36c478 100644
--- a/ios/chrome/app/strings/resources/ios_strings_id.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Alamat situs disalin</translation>
 <translation id="3280562213547448728">Penelusuran suara</translation>
 <translation id="3289505634533552500">Penelusuran Suara</translation>
+<translation id="3293080634164207409">Tambahkan tab</translation>
 <translation id="3295904109373959849">Petak Grup Tab</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, aktivitas baru</translation>
 <translation id="3305294846493618482">lainnya</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_is.xtb b/ios/chrome/app/strings/resources/ios_strings_is.xtb
index f542c291..29ed028 100644
--- a/ios/chrome/app/strings/resources/ios_strings_is.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_is.xtb
@@ -547,7 +547,7 @@
 <translation id="3080525922482950719">Þú getur vistað síður til að lesa þær síðar eða án nettengingar</translation>
 <translation id="3081338492074632642">Gakktu úr skugga um að aðgangsorðið sem þú ert að vista passi við aðgangsorðið fyrir <ph name="WEBSITE" />.</translation>
 <translation id="3087734570205094154">Neðst</translation>
-<translation id="309710370695886264">Þú ert með 1 endurnýtt aðgangsorð. Lagfærðu það núna til að gæta öryggis.</translation>
+<translation id="309710370695886264">Þú ert með eitt endurnýtt aðgangsorð. Lagfærðu það núna til að gæta öryggis.</translation>
 <translation id="3099402981545350675">Þetta eyðir vistuðum heimilisföngum í þessu tæki. Þetta fjarlægir einnig valdar upplýsingar úr Chrome, en eyðir þessum upplýsingum ekki af Google-reikningnum þínum.</translation>
 <translation id="3106258548858559536">Slökkva á lesstillingu</translation>
 <translation id="3106690631878101882">Fela „Þýða“</translation>
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Veffang afritað</translation>
 <translation id="3280562213547448728">Raddleit</translation>
 <translation id="3289505634533552500">Raddleit</translation>
+<translation id="3293080634164207409">Bæta við flipum</translation>
 <translation id="3295904109373959849">Töfluyfirlit yfir flipahópa</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, ný virkni</translation>
 <translation id="3305294846493618482">meira</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_it.xtb b/ios/chrome/app/strings/resources/ios_strings_it.xtb
index c0a75c8..8df5884c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_it.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_it.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Indirizzo del sito copiato</translation>
 <translation id="3280562213547448728">Ricerca vocale</translation>
 <translation id="3289505634533552500">Ricerca vocale</translation>
+<translation id="3293080634164207409">Aggiungi schede</translation>
 <translation id="3295904109373959849">Griglia dei gruppi di schede</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, nuova attività</translation>
 <translation id="3305294846493618482">altro</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
index fe919351..8bc46b6 100644
--- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">כתובת האתר הועתקה</translation>
 <translation id="3280562213547448728">חיפוש קולי</translation>
 <translation id="3289505634533552500">חיפוש קולי</translation>
+<translation id="3293080634164207409">הוספת כרטיסיות</translation>
 <translation id="3295904109373959849">תצוגה של קבוצות כרטיסיות</translation>
 <translation id="3302837541200840455">‫<ph name="TAB_TITLE" />, פעילות חדשה</translation>
 <translation id="3305294846493618482">עוד</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
index d2fbdcc..4c60208 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ja.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">サイトのアドレスがコピーされました</translation>
 <translation id="3280562213547448728">音声検索</translation>
 <translation id="3289505634533552500">音声検索</translation>
+<translation id="3293080634164207409">タブを追加</translation>
 <translation id="3295904109373959849">タブグループのグリッド</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />、新しいアクティビティ</translation>
 <translation id="3305294846493618482">続き</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ka.xtb b/ios/chrome/app/strings/resources/ios_strings_ka.xtb
index bca4c269..e088375f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ka.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ka.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">გვერდის მისამართი დაკოპირდა</translation>
 <translation id="3280562213547448728">ხმოვანი ძიება</translation>
 <translation id="3289505634533552500">ხმოვანი ძიება</translation>
+<translation id="3293080634164207409">ჩანართების დამატება</translation>
 <translation id="3295904109373959849">ჩანართების ჯგუფის ბადე</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, ახალი აქტივობა</translation>
 <translation id="3305294846493618482">მეტი</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kk.xtb b/ios/chrome/app/strings/resources/ios_strings_kk.xtb
index b2ee800..60357ea 100644
--- a/ios/chrome/app/strings/resources/ios_strings_kk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_kk.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Сайт мекенжайы көшірілді</translation>
 <translation id="3280562213547448728">Дауыспен іздеу</translation>
 <translation id="3289505634533552500">Дауыспен іздеу</translation>
+<translation id="3293080634164207409">Қойындылар қосу</translation>
 <translation id="3295904109373959849">Қойындылар топтарының торы</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, жаңа әрекет</translation>
 <translation id="3305294846493618482">тағы</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_km.xtb b/ios/chrome/app/strings/resources/ios_strings_km.xtb
index 4827a40..a3278fa 100644
--- a/ios/chrome/app/strings/resources/ios_strings_km.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_km.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">បានចម្លង​អាសយដ្ឋាន​ទំព័រ</translation>
 <translation id="3280562213547448728">ស្វែងរក​តាម​សំឡេង</translation>
 <translation id="3289505634533552500">ស្វែងរក​តាម​សំឡេង</translation>
+<translation id="3293080634164207409">បញ្ចូល​ផ្ទាំង</translation>
 <translation id="3295904109373959849">ក្រឡា​ក្រុមផ្ទាំង</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, សកម្មភាព​ថ្មី</translation>
 <translation id="3305294846493618482">ច្រើន​ទៀត</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
index 6db73cff..c3b0192 100644
--- a/ios/chrome/app/strings/resources/ios_strings_kn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">ಸೈಟ್‌ ವಿಳಾಸವನ್ನು ಕಾಪಿ ಮಾಡಲಾಗಿದೆ</translation>
 <translation id="3280562213547448728">ಧ್ವನಿ ಹುಡುಕಾಟ</translation>
 <translation id="3289505634533552500">ಧ್ವನಿ ಹುಡುಕಾಟ</translation>
+<translation id="3293080634164207409">ಟ್ಯಾಬ್‌ಗಳನ್ನು ಸೇರಿಸಿ</translation>
 <translation id="3295904109373959849">ಟ್ಯಾಬ್ ಗುಂಪುಗಳ ಗ್ರಿಡ್</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, ಹೊಸ ಚಟುವಟಿಕೆ</translation>
 <translation id="3305294846493618482">ಇನ್ನಷ್ಟು</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
index 786629bb..d2781d5 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ko.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">사이트 주소가 복사되었습니다.</translation>
 <translation id="3280562213547448728">음성 검색</translation>
 <translation id="3289505634533552500">음성 검색</translation>
+<translation id="3293080634164207409">탭 추가</translation>
 <translation id="3295904109373959849">탭 그룹 그리드</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, 새 활동</translation>
 <translation id="3305294846493618482">더보기</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ky.xtb b/ios/chrome/app/strings/resources/ios_strings_ky.xtb
index d5d15bd..403211cd 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ky.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ky.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Сайттын дареги көчүрүлдү</translation>
 <translation id="3280562213547448728">Айтып издөө</translation>
 <translation id="3289505634533552500">Айтып издөө</translation>
+<translation id="3293080634164207409">Өтмөктөрдү кошуу</translation>
 <translation id="3295904109373959849">Өтмөк топторунун торчосу</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, жаңы аракет</translation>
 <translation id="3305294846493618482">дагы</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lo.xtb b/ios/chrome/app/strings/resources/ios_strings_lo.xtb
index f34f340..d35d37c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_lo.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_lo.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">ສຳເນົາທີ່ຢູ່ເວັບໄຊແລ້ວ</translation>
 <translation id="3280562213547448728">ຊອກຫາດ້ວຍສຽງ</translation>
 <translation id="3289505634533552500">ຊອກຫາດ້ວຍສຽງ</translation>
+<translation id="3293080634164207409">ເພີ່ມແຖບ</translation>
 <translation id="3295904109373959849">ຕາຕະລາງຂອງກຸ່ມແຖບ</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, ການເຄື່ອນໄຫວໃໝ່</translation>
 <translation id="3305294846493618482">ເພີ່ມເຕີມ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
index 32b276fe..685392ef 100644
--- a/ios/chrome/app/strings/resources/ios_strings_lt.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Svetainės adresas nukopijuotas</translation>
 <translation id="3280562213547448728">Paieška balsu</translation>
 <translation id="3289505634533552500">Paieška balsu</translation>
+<translation id="3293080634164207409">Pridėkite skirtukų</translation>
 <translation id="3295904109373959849">Skirtukų grupių tinklelis</translation>
 <translation id="3302837541200840455">„<ph name="TAB_TITLE" />“, nauja veikla</translation>
 <translation id="3305294846493618482">daugiau</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
index 4e5b65a..afae291b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_lv.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Vietnes adrese ir nokopēta</translation>
 <translation id="3280562213547448728">Meklēšana ar balsi</translation>
 <translation id="3289505634533552500">Meklēšana ar balsi</translation>
+<translation id="3293080634164207409">Pievienot cilnes</translation>
 <translation id="3295904109373959849">Ciļņu grupu režģis</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, jaunas darbības</translation>
 <translation id="3305294846493618482">vēl</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mk.xtb b/ios/chrome/app/strings/resources/ios_strings_mk.xtb
index 1e92899..fee1a14f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_mk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_mk.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Адресата на сајтот е копирана</translation>
 <translation id="3280562213547448728">Гласовно пребарување</translation>
 <translation id="3289505634533552500">Гласовно пребарување</translation>
+<translation id="3293080634164207409">Додајте картички</translation>
 <translation id="3295904109373959849">Мрежа со групи картички</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, нова активност</translation>
 <translation id="3305294846493618482">повеќе</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
index 4e585a7b..91dbb09 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ml.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">സൈറ്റ് വിലാസം പകർത്തി</translation>
 <translation id="3280562213547448728">ശബ്ദ തിരയൽ</translation>
 <translation id="3289505634533552500">ശബ്ദ തിരയൽ</translation>
+<translation id="3293080634164207409">ടാബുകൾ ചേർക്കുക</translation>
 <translation id="3295904109373959849">ടാബ് ഗ്രൂപ്പുകളുടെ ഗ്രിഡ്</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, പുതിയ ആക്റ്റിവിറ്റി</translation>
 <translation id="3305294846493618482">കൂടുതൽ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mn.xtb b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
index c29a0d2..b67cf4a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_mn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Сайтын хаягийг хуулсан</translation>
 <translation id="3280562213547448728">Дуут хайлт</translation>
 <translation id="3289505634533552500">Дуут хайлт</translation>
+<translation id="3293080634164207409">Таб нэмэх</translation>
 <translation id="3295904109373959849">Табын бүлгийн хүснэгт</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, шинэ үйл ажиллагаа</translation>
 <translation id="3305294846493618482">бусад</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
index 642a861d..f5bce917 100644
--- a/ios/chrome/app/strings/resources/ios_strings_mr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">साइट अ‍ॅड्रेस कॉपी केला</translation>
 <translation id="3280562213547448728">व्हॉइस शोध</translation>
 <translation id="3289505634533552500">व्हॉइस शोध</translation>
+<translation id="3293080634164207409">टॅब जोडा</translation>
 <translation id="3295904109373959849">टॅब गट ग्रिड</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, नवीन अ‍ॅक्टिव्हिटी</translation>
 <translation id="3305294846493618482">आणखी</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
index bbb2e5d..77454faf 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ms.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Alamat tapak disalin</translation>
 <translation id="3280562213547448728">Carian suara</translation>
 <translation id="3289505634533552500">Carian Suara</translation>
+<translation id="3293080634164207409">Tambahkan tab</translation>
 <translation id="3295904109373959849">Grid Kumpulan Tab</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, aktiviti baharu</translation>
 <translation id="3305294846493618482">lagi</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_my.xtb b/ios/chrome/app/strings/resources/ios_strings_my.xtb
index 93a181a..3ff7746 100644
--- a/ios/chrome/app/strings/resources/ios_strings_my.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_my.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">ဝဘ်ဆိုက်လိပ်စာကို မိတ္တူကူးယူထားသည်</translation>
 <translation id="3280562213547448728">အသံဖြင့် ရှာဖွေခြင်း</translation>
 <translation id="3289505634533552500">အသံဖြင့်ရှာဖွေရန်</translation>
+<translation id="3293080634164207409">တဘ်များထည့်ရန်</translation>
 <translation id="3295904109373959849">တဘ်အုပ်စု ဇယားကွက်</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />၊ လုပ်ဆောင်ချက်အသစ်</translation>
 <translation id="3305294846493618482">နောက်ထပ်</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ne.xtb b/ios/chrome/app/strings/resources/ios_strings_ne.xtb
index 99a25f1..ac75d447 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ne.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ne.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">साइटको ठेगाना कपी गरियो</translation>
 <translation id="3280562213547448728">भ्वाइस सर्च</translation>
 <translation id="3289505634533552500">भ्वाइस सर्च</translation>
+<translation id="3293080634164207409">ट्याबहरू हाल्नुहोस्</translation>
 <translation id="3295904109373959849">ट्याब समूहको ग्रिड</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, नयाँ गतिविधि</translation>
 <translation id="3305294846493618482">थप</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
index 7bed8bf8..eb98bf1 100644
--- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Siteadres gekopieerd</translation>
 <translation id="3280562213547448728">Gesproken zoekopdracht</translation>
 <translation id="3289505634533552500">Gesproken zoekopdracht</translation>
+<translation id="3293080634164207409">Tabbladen toevoegen</translation>
 <translation id="3295904109373959849">Raster met tabbladgroepen</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, nieuwe activiteit</translation>
 <translation id="3305294846493618482">meer</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb
index 7064914..fe01043 100644
--- a/ios/chrome/app/strings/resources/ios_strings_no.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Nettstedsadressen er kopiert</translation>
 <translation id="3280562213547448728">Talesøk</translation>
 <translation id="3289505634533552500">Talesøk</translation>
+<translation id="3293080634164207409">Legg til faner</translation>
 <translation id="3295904109373959849">Rutenett for fanegrupper</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, ny aktivitet</translation>
 <translation id="3305294846493618482">mer</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_or.xtb b/ios/chrome/app/strings/resources/ios_strings_or.xtb
index 8369161..d1a98a11 100644
--- a/ios/chrome/app/strings/resources/ios_strings_or.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_or.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">ସାଇଟ୍ ଠିକଣା କପି କରାଯାଇଛି</translation>
 <translation id="3280562213547448728">ଭଏସ୍ ସନ୍ଧାନ</translation>
 <translation id="3289505634533552500">ଭଏସ ସର୍ଚ୍ଚ</translation>
+<translation id="3293080634164207409">ଟାବଗୁଡ଼ିକ ଯୋଗ କରନ୍ତୁ</translation>
 <translation id="3295904109373959849">ଟାବ ଗ୍ରୁପର ଗ୍ରିଡ</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, ନୂଆ କାର୍ଯ୍ୟକଳାପ</translation>
 <translation id="3305294846493618482">ଅଧିକ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pa.xtb b/ios/chrome/app/strings/resources/ios_strings_pa.xtb
index 6fb55590..2ed1331 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pa.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pa.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">ਸਾਈਟ ਦਾ ਪਤਾ ਕਾਪੀ ਕੀਤਾ ਗਿਆ</translation>
 <translation id="3280562213547448728">ਅਵਾਜ਼ੀ ਖੋਜ</translation>
 <translation id="3289505634533552500">ਅਵਾਜ਼ੀ ਖੋਜ</translation>
+<translation id="3293080634164207409">ਟੈਬਾਂ ਸ਼ਾਮਲ ਕਰੋ</translation>
 <translation id="3295904109373959849">ਟੈਬ ਗਰੁੱਪ ਗਰਿੱਡ</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, ਨਵੀਂ ਸਰਗਰਮੀ</translation>
 <translation id="3305294846493618482">ਹੋਰ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
index d0a39d0..3f7fd49 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Skopiowano adres strony</translation>
 <translation id="3280562213547448728">Wyszukiwanie głosowe</translation>
 <translation id="3289505634533552500">Wyszukiwanie głosowe</translation>
+<translation id="3293080634164207409">Dodaj karty</translation>
 <translation id="3295904109373959849">Siatka grup kart</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, nowa aktywność</translation>
 <translation id="3305294846493618482">więcej</translation>
@@ -2005,7 +2006,7 @@
 <translation id="8545276357312221485">Sprawdź ustawienia przeglądarki domyślnej</translation>
 <translation id="854938212724803178">Masz 1 przejęte hasło. Dla bezpieczeństwa zmień je jak najszybciej.</translation>
 <translation id="8551311254462607218">Na pasku adresu kliknij ikonę aparatu Obiektywu Google</translation>
-<translation id="8556590991644167667">{count,plural, =1{Odrzuciłeś(-aś) {count} ostrzeżenie}few{Odrzuciłeś(-aś) {count} ostrzeżenia}many{Odrzuciłeś(-aś) {count} ostrzeżeń}other{Odrzuciłeś(-aś) {count} ostrzeżenia}}</translation>
+<translation id="8556590991644167667">{count,plural, =1{Odrzucono {count} ostrzeżenie}few{Odrzucono {count} ostrzeżenia}many{Odrzucono {count} ostrzeżeń}other{Odrzucono {count} ostrzeżenia}}</translation>
 <translation id="8558046478684552694">Zamknij grupę.</translation>
 <translation id="8559858985063901027">Klucze dostępu</translation>
 <translation id="8560253818350321773">Najpierw pokazuj elementy często używane.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
index e24dd431..7374a3c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Endereço do site copiado</translation>
 <translation id="3280562213547448728">Pesquisa por voz</translation>
 <translation id="3289505634533552500">Pesquisa por voz</translation>
+<translation id="3293080634164207409">Adicionar guias</translation>
 <translation id="3295904109373959849">Grade de grupos de guias</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, nova atividade</translation>
 <translation id="3305294846493618482">mais</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
index bc9ba2c..e1d625b0 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Endereço do site copiado</translation>
 <translation id="3280562213547448728">Pesquisa por voz</translation>
 <translation id="3289505634533552500">Pesquisa por voz</translation>
+<translation id="3293080634164207409">Adicionar separadores</translation>
 <translation id="3295904109373959849">Grelha de grupos de separadores</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, nova atividade</translation>
 <translation id="3305294846493618482">mais</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
index a448a0cd..f1a97ff 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Adresa site-ului a fost copiată</translation>
 <translation id="3280562213547448728">Căutare vocală</translation>
 <translation id="3289505634533552500">Căutare vocală</translation>
+<translation id="3293080634164207409">Adaugă file</translation>
 <translation id="3295904109373959849">Grila cu grupuri de file</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, activitate nouă</translation>
 <translation id="3305294846493618482">mai multe</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
index 3d3aca6..ab40a69 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ru.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Адрес сайта скопирован</translation>
 <translation id="3280562213547448728">Голосовой поиск</translation>
 <translation id="3289505634533552500">Голосовой поиск</translation>
+<translation id="3293080634164207409">Добавить вкладки</translation>
 <translation id="3295904109373959849">Страница групп вкладок</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, новые действия</translation>
 <translation id="3305294846493618482">ещё</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_si.xtb b/ios/chrome/app/strings/resources/ios_strings_si.xtb
index d55b78e8..b639b5b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_si.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_si.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">අඩවි ලිපිනය පිටපත් කරන ලදී</translation>
 <translation id="3280562213547448728">හඬ සෙවීම</translation>
 <translation id="3289505634533552500">හඬ සෙවීම</translation>
+<translation id="3293080634164207409">පටිති එක් කරන්න</translation>
 <translation id="3295904109373959849">පටිති සමූහ ජාලකය</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, නව ක්‍රියාකාරකම</translation>
 <translation id="3305294846493618482">තවත්</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
index 8b7f5337b..8a52fbf 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Adresa webu bola skopírovaná</translation>
 <translation id="3280562213547448728">Hlasové vyhľadávanie</translation>
 <translation id="3289505634533552500">Hlasové vyhľadávanie</translation>
+<translation id="3293080634164207409">Pridajte karty</translation>
 <translation id="3295904109373959849">Mriežka skupín kariet</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, nová aktivita</translation>
 <translation id="3305294846493618482">viac</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
index 77d8596..d31b488 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Kopiran naslov spletnega mesta</translation>
 <translation id="3280562213547448728">Glasovno iskanje</translation>
 <translation id="3289505634533552500">Glasovno iskanje</translation>
+<translation id="3293080634164207409">Dodaj zavihke</translation>
 <translation id="3295904109373959849">Mreža skupin zavihkov</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, nova dejavnost</translation>
 <translation id="3305294846493618482">več</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sq.xtb b/ios/chrome/app/strings/resources/ios_strings_sq.xtb
index 05d7a0f..f61329c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sq.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sq.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Adresa e sajtit u kopjua</translation>
 <translation id="3280562213547448728">Kërkimi me zë</translation>
 <translation id="3289505634533552500">Kërkimi me zë</translation>
+<translation id="3293080634164207409">Shto skedat</translation>
 <translation id="3295904109373959849">Rrjeta e grupeve të skedave</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, aktivitet i ri</translation>
 <translation id="3305294846493618482">më shumë</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
index 8fb3a8d..0a53620f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Adresa sajta je kopirana</translation>
 <translation id="3280562213547448728">Glasovna pretraga</translation>
 <translation id="3289505634533552500">Glasovna pretraga</translation>
+<translation id="3293080634164207409">Dodajte kartice</translation>
 <translation id="3295904109373959849">Mreža grupa kartica</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, nova aktivnost</translation>
 <translation id="3305294846493618482">još</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
index 18045880..d17f4e62 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Адреса сајта је копирана</translation>
 <translation id="3280562213547448728">Гласовна претрага</translation>
 <translation id="3289505634533552500">Гласовна претрага</translation>
+<translation id="3293080634164207409">Додајте картице</translation>
 <translation id="3295904109373959849">Мрежа група картица</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, нова активност</translation>
 <translation id="3305294846493618482">још</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
index 0eda8e7e..8411a1a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sv.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Webbplatsens webbadress har kopierats</translation>
 <translation id="3280562213547448728">Röstsökning</translation>
 <translation id="3289505634533552500">Röstsökning</translation>
+<translation id="3293080634164207409">Lägg till flikar</translation>
 <translation id="3295904109373959849">Rutnät med flikgrupper</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, ny aktivitet</translation>
 <translation id="3305294846493618482">mer</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
index caff98e..907545b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sw.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Anwani ya tovuti imenakiliwa</translation>
 <translation id="3280562213547448728">Kutafuta kwa kutamka</translation>
 <translation id="3289505634533552500">Tafuta kwa Kutamka</translation>
+<translation id="3293080634164207409">Weka vichupo</translation>
 <translation id="3295904109373959849">Gridi ya Vikundi vya Vichupo</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, shughuli mpya</translation>
 <translation id="3305294846493618482">zaidi</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
index 769d7973..1e381ec 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ta.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">தள முகவரி நகலெடுக்கப்பட்டது</translation>
 <translation id="3280562213547448728">குரல் தேடல்</translation>
 <translation id="3289505634533552500">குரல் தேடல்</translation>
+<translation id="3293080634164207409">பக்கங்களைச் சேருங்கள்</translation>
 <translation id="3295904109373959849">பக்கக் குழுக்கள் கட்டம்</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, புதிய செயல்பாடு</translation>
 <translation id="3305294846493618482">மேலும்</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_te.xtb b/ios/chrome/app/strings/resources/ios_strings_te.xtb
index dc4df57..76a5c16 100644
--- a/ios/chrome/app/strings/resources/ios_strings_te.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_te.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">సైట్ అడ్రస్‌ కాపీ చేయబడింది</translation>
 <translation id="3280562213547448728">వాయిస్ సెర్చ్</translation>
 <translation id="3289505634533552500">వాయిస్ సెర్చ్</translation>
+<translation id="3293080634164207409">ట్యాబ్‌లను జోడించండి</translation>
 <translation id="3295904109373959849">ట్యాబ్ గ్రూప్‌ల గ్రిడ్</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, కొత్త యాక్టివిటీ</translation>
 <translation id="3305294846493618482">మరిన్ని</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb
index 214eb96..bb03e017 100644
--- a/ios/chrome/app/strings/resources/ios_strings_th.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">คัดลอกที่อยู่เว็บไซต์แล้ว</translation>
 <translation id="3280562213547448728">ค้นหาด้วยเสียง</translation>
 <translation id="3289505634533552500">ค้นหาด้วยเสียง</translation>
+<translation id="3293080634164207409">เพิ่มแท็บ</translation>
 <translation id="3295904109373959849">ตารางกริดของกลุ่มแท็บ</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, กิจกรรมใหม่</translation>
 <translation id="3305294846493618482">เพิ่มเติม</translation>
@@ -1255,7 +1256,7 @@
 <translation id="5791632441210678828">ปุ่มจัดเรียงสำหรับฟีดที่กำลังติดตาม</translation>
 <translation id="5803566855766646066">คุณแน่ใจไหมว่าต้องการทิ้งบัตรใบใหม่นี้</translation>
 <translation id="5804241973901381774">สิทธิ์</translation>
-<translation id="58081802114142635">กิจกรรมของคุณจะปรับปรุง AI ของ Google</translation>
+<translation id="58081802114142635">กิจกรรมของคุณจะปรับปรุง Google AI</translation>
 <translation id="5813223718099710537">เมื่อคุณใช้ฟีเจอร์นี้ ระบบจะส่งเนื้อหาและ URL ของหน้าเว็บไปยัง Google คุณปิดได้ทุกเมื่อในการตั้งค่า</translation>
 <translation id="5817176759448082654">การตรวจสอบรหัสผ่าน</translation>
 <translation id="5818161931099046557">แก้ไขในบัญชี Google</translation>
@@ -2152,7 +2153,7 @@
 <translation id="9066097352053395362">ซ่อน "แก้ไขบุ๊กมาร์ก"</translation>
 <translation id="9070824521421603770">คุณจะออกจากระบบ และแท็บจะปิดไป</translation>
 <translation id="9072837124205571418">กลุ่มแท็บจากอุปกรณ์ทั้งหมด</translation>
-<translation id="9075970015528364598">แชทจะได้รับการตรวจสอบและนำไปใช้เพื่อปรับปรุง AI ของ Google <ph name="LEARN_ABOUT_CHOICES" /> ระบบจะจัดเก็บ<ph name="INFO_ABOUT_LOCATION" />ไว้กับกิจกรรมของคุณด้วย</translation>
+<translation id="9075970015528364598">แชทจะได้รับการตรวจสอบและนำไปใช้เพื่อปรับปรุง Google AI <ph name="LEARN_ABOUT_CHOICES" /> ระบบจะจัดเก็บ<ph name="INFO_ABOUT_LOCATION" />ไว้กับกิจกรรมของคุณด้วย</translation>
 <translation id="9081058212938299310">อัปเดตรหัสผ่านของ <ph name="USERNAME" /> ไหม</translation>
 <translation id="9083838294503912307">เปิดการซิงค์เพื่อซิงค์และปรับเปลี่ยนข้อมูลตามความต้องการในอุปกรณ์ทุกเครื่อง</translation>
 <translation id="9084367296493549256">{count,plural, =1{คุณมี {count} รหัสผ่านที่ไม่รัดกุมที่อาจทําให้การรักษาความปลอดภัยตกอยู่ในความเสี่ยง แก้ไขเลยเพื่อความปลอดภัย}other{คุณมี {count} รหัสผ่านที่ไม่รัดกุมที่อาจทําให้การรักษาความปลอดภัยตกอยู่ในความเสี่ยง แก้ไขเลยเพื่อความปลอดภัย}}</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
index a35069b..6b7f38b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_tr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Site adresi kopyalandı</translation>
 <translation id="3280562213547448728">Sesli arama</translation>
 <translation id="3289505634533552500">Sesli Arama</translation>
+<translation id="3293080634164207409">Sekme ekleyin</translation>
 <translation id="3295904109373959849">Sekme grupları ızgarası</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, yeni etkinlik</translation>
 <translation id="3305294846493618482">daha fazla</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
index 3806003..e2f2275 100644
--- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Адресу сайту скопійовано</translation>
 <translation id="3280562213547448728">Голосовий пошук</translation>
 <translation id="3289505634533552500">Голосовий пошук</translation>
+<translation id="3293080634164207409">Додайте вкладки</translation>
 <translation id="3295904109373959849">Сітка груп вкладок</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, нові дії</translation>
 <translation id="3305294846493618482">більше</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ur.xtb b/ios/chrome/app/strings/resources/ios_strings_ur.xtb
index d7ab21e..696d302b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ur.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ur.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">سائٹ کا پتہ کاپی ہو گیا</translation>
 <translation id="3280562213547448728">صوتی تلاش</translation>
 <translation id="3289505634533552500">صوتی تلاش</translation>
+<translation id="3293080634164207409">ٹیبز شامل کریں</translation>
 <translation id="3295904109373959849">ٹیب گروپس گرڈ</translation>
 <translation id="3302837541200840455">‫<ph name="TAB_TITLE" />، نئی سرگرمی</translation>
 <translation id="3305294846493618482">مزید</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uz.xtb b/ios/chrome/app/strings/resources/ios_strings_uz.xtb
index 6bf8611c..33fd4d745 100644
--- a/ios/chrome/app/strings/resources/ios_strings_uz.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_uz.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Sayt manzilidan nusxa olindi</translation>
 <translation id="3280562213547448728">Ovozli qidiruv</translation>
 <translation id="3289505634533552500">Ovozli qidiruv</translation>
+<translation id="3293080634164207409">Varaqlarni kiriting</translation>
 <translation id="3295904109373959849">Varaqlar guruhi katagi</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, yangi harakat</translation>
 <translation id="3305294846493618482">yana</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
index 4d1e986..e3ae366 100644
--- a/ios/chrome/app/strings/resources/ios_strings_vi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Đã sao chép địa chỉ trang web</translation>
 <translation id="3280562213547448728">Tìm kiếm bằng giọng nói</translation>
 <translation id="3289505634533552500">Tìm kiếm bằng giọng nói</translation>
+<translation id="3293080634164207409">Thêm thẻ</translation>
 <translation id="3295904109373959849">Lưới nhóm thẻ</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, hoạt động mới</translation>
 <translation id="3305294846493618482">xem thêm</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
index 6ad70298..2f63f96 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">已复制网站地址</translation>
 <translation id="3280562213547448728">语音搜索</translation>
 <translation id="3289505634533552500">语音搜索</translation>
+<translation id="3293080634164207409">添加标签页</translation>
 <translation id="3295904109373959849">标签页分组网格</translation>
 <translation id="3302837541200840455">“<ph name="TAB_TITLE" />”,有新活动</translation>
 <translation id="3305294846493618482">更多</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
index 6ef2b87f..9a37baf7 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">已複製網站網址</translation>
 <translation id="3280562213547448728">語音搜尋</translation>
 <translation id="3289505634533552500">語音搜尋</translation>
+<translation id="3293080634164207409">新增分頁</translation>
 <translation id="3295904109373959849">分頁群組網格</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />,新活動</translation>
 <translation id="3305294846493618482">更多</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
index 3c38319..63f5f83 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">已複製網站網址</translation>
 <translation id="3280562213547448728">語音搜尋</translation>
 <translation id="3289505634533552500">語音搜尋</translation>
+<translation id="3293080634164207409">新增分頁</translation>
 <translation id="3295904109373959849">分頁群組方格</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />分頁有新活動</translation>
 <translation id="3305294846493618482">更多</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zu.xtb b/ios/chrome/app/strings/resources/ios_strings_zu.xtb
index 8b71221..13ac519 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zu.xtb
@@ -596,6 +596,7 @@
 <translation id="3277021493514034324">Ikheli lesayithi likopishiwe</translation>
 <translation id="3280562213547448728">Ukusesha ngezwi</translation>
 <translation id="3289505634533552500">Ukusesha Ngezwi</translation>
+<translation id="3293080634164207409">Faka amathebhu</translation>
 <translation id="3295904109373959849">Igridi Yamaqembu Ethebhu</translation>
 <translation id="3302837541200840455"><ph name="TAB_TITLE" />, umsebenzi omusha</translation>
 <translation id="3305294846493618482">okuningi</translation>
diff --git a/ios/chrome/browser/authentication/account_menu/coordinator/account_menu_mediator.mm b/ios/chrome/browser/authentication/account_menu/coordinator/account_menu_mediator.mm
index 1ee9826..0870f05f7 100644
--- a/ios/chrome/browser/authentication/account_menu/coordinator/account_menu_mediator.mm
+++ b/ios/chrome/browser/authentication/account_menu/coordinator/account_menu_mediator.mm
@@ -362,6 +362,10 @@
       [self.syncErrorSettingsCommandHandler
               openTrustedVaultReauthForDegradedRecoverability];
       break;
+    case syncer::SyncService::UserActionableError::kBookmarksLimitExceeded:
+      // TODO(crbug.com/452968646): Navigate to the concrete help center
+      // article.
+      break;
     case syncer::SyncService::UserActionableError::kNone:
     // TODO(crbug.com/370026230): Update this case once GetAccountErrorUIInfo()
     // returns a non-nil value for it.
diff --git a/ios/chrome/browser/composebox/ui/composebox_view_controller.mm b/ios/chrome/browser/composebox/ui/composebox_view_controller.mm
index d66d425..19f24ae 100644
--- a/ios/chrome/browser/composebox/ui/composebox_view_controller.mm
+++ b/ios/chrome/browser/composebox/ui/composebox_view_controller.mm
@@ -107,8 +107,10 @@
   [_inputViewController.view
       setContentHuggingPriority:UILayoutPriorityRequired
                         forAxis:UILayoutConstraintAxisVertical];
+  // Allow compression on the input view to limit it's height in the available
+  // space (between the keyboard and the top of the view).
   [_inputViewController.view
-      setContentCompressionResistancePriority:UILayoutPriorityRequired
+      setContentCompressionResistancePriority:UILayoutPriorityDefaultHigh
                                       forAxis:UILayoutConstraintAxisVertical];
 
   [self setupConstraints];
@@ -159,6 +161,9 @@
         [_inputViewController.view.bottomAnchor
             constraintEqualToAnchor:self.view.keyboardLayoutGuide.topAnchor
                            constant:-kInputPlatePadding],
+        [_inputViewController.view.topAnchor
+            constraintGreaterThanOrEqualToAnchor:_closeButton.bottomAnchor
+                                        constant:kInputPlatePadding],
       ]];
       break;
     case ComposeboxInputPlatePosition::kTop:
@@ -183,6 +188,10 @@
         [_inputViewController.view.topAnchor
             constraintEqualToAnchor:safeAreaGuide.topAnchor
                            constant:kInputPlatePadding],
+        [_inputViewController.view.bottomAnchor
+            constraintLessThanOrEqualToAnchor:self.view.keyboardLayoutGuide
+                                                  .topAnchor
+                                     constant:-kInputPlatePadding],
       ]];
       break;
     case ComposeboxInputPlatePosition::kMissing:
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/tips/coordinator/BUILD.gn b/ios/chrome/browser/content_suggestions/ui_bundled/tips/coordinator/BUILD.gn
index a0c0d77..bc2d376e 100644
--- a/ios/chrome/browser/content_suggestions/ui_bundled/tips/coordinator/BUILD.gn
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/tips/coordinator/BUILD.gn
@@ -20,12 +20,15 @@
     "//components/prefs",
     "//components/prefs/ios",
     "//components/segmentation_platform/embedder/home_modules/tips_manager:constants",
+    "//ios/chrome/app/strings",
     "//ios/chrome/browser/content_suggestions/ui_bundled:public",
     "//ios/chrome/browser/content_suggestions/ui_bundled/tips/ui",
+    "//ios/chrome/browser/instructions_bottom_sheet/ui",
     "//ios/chrome/browser/shared/model/prefs:pref_names",
     "//ios/chrome/browser/shared/public/features",
     "//ios/chrome/common/ui/confirmation_alert",
     "//net/traffic_annotation",
+    "//ui/base",
     "//url",
   ]
   frameworks = [ "Foundation.framework" ]
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/tips/coordinator/tips_passwords_coordinator.mm b/ios/chrome/browser/content_suggestions/ui_bundled/tips/coordinator/tips_passwords_coordinator.mm
index ebb5a4a9..42da7b0 100644
--- a/ios/chrome/browser/content_suggestions/ui_bundled/tips/coordinator/tips_passwords_coordinator.mm
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/tips/coordinator/tips_passwords_coordinator.mm
@@ -6,10 +6,12 @@
 
 #import "base/check.h"
 #import "components/segmentation_platform/embedder/home_modules/tips_manager/constants.h"
-#import "ios/chrome/browser/content_suggestions/ui_bundled/tips/ui/save_passwords_instructional_overlay_view_controller.h"
 #import "ios/chrome/browser/content_suggestions/ui_bundled/tips/ui/save_passwords_instructional_view_controller.h"
-#import "ios/chrome/browser/content_suggestions/ui_bundled/tips/ui/use_autofill_instructional_overlay_view_controller.h"
 #import "ios/chrome/browser/content_suggestions/ui_bundled/tips/ui/use_autofill_instructional_view_controller.h"
+#import "ios/chrome/browser/instructions_bottom_sheet/ui/instructions_bottom_sheet_view_controller.h"
+#import "ios/chrome/grit/ios_branded_strings.h"
+#import "ios/chrome/grit/ios_strings.h"
+#import "ui/base/l10n/l10n_util_mac.h"
 
 using segmentation_platform::TipIdentifier;
 
@@ -23,6 +25,9 @@
   // The view controller responsible for displaying the instructional overlay.
   InstructionsBottomSheetViewController*
       _tipsInstructionalOverlayViewController;
+
+  // Navigation controller for the instructions.
+  UINavigationController* _instructionsNavigationController;
 }
 
 - (instancetype)initWithBaseViewController:(UIViewController*)viewController
@@ -66,6 +71,7 @@
                                                        completion:nil];
   _tipsInstructionalOverlayViewController.actionHandler = nil;
   _tipsInstructionalOverlayViewController = nil;
+  _instructionsNavigationController = nil;
   _tipsInstructionalViewController.actionHandler = nil;
   _tipsInstructionalViewController = nil;
   _delegate = nil;
@@ -92,30 +98,63 @@
 
   if (_tipsInstructionalViewController) {
     _tipsInstructionalOverlayViewController =
-        _identifier == TipIdentifier::kSavePasswords
-            ? [[SavePasswordsInstructionalOverlayViewController alloc] init]
-            : [[UseAutofillInstructionalOverlayViewController alloc] init];
+        [[InstructionsBottomSheetViewController alloc]
+            initWithTitle:l10n_util::GetNSString(
+                              IDS_IOS_MAGIC_STACK_TIP_TUTORIAL_TITLE)
+             instructions:[self instructionsSteps]];
 
     _tipsInstructionalOverlayViewController.actionHandler = self;
 
+    _instructionsNavigationController = [[UINavigationController alloc]
+        initWithRootViewController:_tipsInstructionalOverlayViewController];
+    _tipsInstructionalOverlayViewController.navigationItem.rightBarButtonItem =
+        [[UIBarButtonItem alloc]
+            initWithBarButtonSystemItem:UIBarButtonSystemItemCancel
+                                 target:self
+                                 action:@selector(dismissInstructions)];
+
     [_tipsInstructionalViewController
-        presentViewController:_tipsInstructionalOverlayViewController
+        presentViewController:_instructionsNavigationController
                      animated:YES
                    completion:nil];
   }
 }
 
 - (void)confirmationAlertDismissAction {
-  if (_tipsInstructionalOverlayViewController) {
-    [_tipsInstructionalOverlayViewController.presentingViewController
-        dismissViewControllerAnimated:YES
-                           completion:nil];
-    _tipsInstructionalOverlayViewController = nil;
-
-    return;
-  }
-
   [_delegate tipsPasswordsCoordinatorDidFinish:self];
 }
 
+#pragma mark - Private
+
+// Dismisses the instructions.
+- (void)dismissInstructions {
+  [_instructionsNavigationController.presentingViewController
+      dismissViewControllerAnimated:YES
+                         completion:nil];
+  _instructionsNavigationController = nil;
+  _tipsInstructionalOverlayViewController = nil;
+}
+
+// Returns the instruction steps.
+- (NSArray<NSString*>*)instructionsSteps {
+  if (_identifier == TipIdentifier::kSavePasswords) {
+    return @[
+      l10n_util::GetNSString(
+          IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORDS_TUTORIAL_STEP_1),
+      l10n_util::GetNSString(
+          IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORDS_TUTORIAL_STEP_2),
+      l10n_util::GetNSString(
+          IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORDS_TUTORIAL_STEP_1),
+    ];
+  }
+  return @[
+    l10n_util::GetNSString(
+        IDS_IOS_MAGIC_STACK_TIP_AUTOFILL_PASSWORDS_TUTORIAL_STEP_1),
+    l10n_util::GetNSString(
+        IDS_IOS_MAGIC_STACK_TIP_AUTOFILL_PASSWORDS_TUTORIAL_STEP_2),
+    l10n_util::GetNSString(
+        IDS_IOS_MAGIC_STACK_TIP_AUTOFILL_PASSWORDS_TUTORIAL_STEP_3),
+  ];
+}
+
 @end
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/tips/test/BUILD.gn b/ios/chrome/browser/content_suggestions/ui_bundled/tips/test/BUILD.gn
index f986a0c..1306cb2 100644
--- a/ios/chrome/browser/content_suggestions/ui_bundled/tips/test/BUILD.gn
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/tips/test/BUILD.gn
@@ -5,10 +5,8 @@
 source_set("unit_tests") {
   testonly = true
   sources = [
-    "save_passwords_instructional_overlay_view_controller_unittest.mm",
     "save_passwords_instructional_view_controller_unittest.mm",
     "tips_module_view_unittest.mm",
-    "use_autofill_instructional_overlay_view_controller_unittest.mm",
     "use_autofill_instructional_view_controller_unittest.mm",
   ]
   deps = [
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/tips/test/save_passwords_instructional_overlay_view_controller_unittest.mm b/ios/chrome/browser/content_suggestions/ui_bundled/tips/test/save_passwords_instructional_overlay_view_controller_unittest.mm
deleted file mode 100644
index fd19044..0000000
--- a/ios/chrome/browser/content_suggestions/ui_bundled/tips/test/save_passwords_instructional_overlay_view_controller_unittest.mm
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2024 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "ios/chrome/browser/content_suggestions/ui_bundled/tips/ui/save_passwords_instructional_overlay_view_controller.h"
-
-#import "ios/chrome/grit/ios_branded_strings.h"
-#import "ios/chrome/grit/ios_strings.h"
-#import "testing/gtest_mac.h"
-#import "testing/platform_test.h"
-#import "ui/base/l10n/l10n_util_mac.h"
-
-// Tests for the `SavePasswordsInstructionalOverlayViewControllerTest` class.
-class SavePasswordsInstructionalOverlayViewControllerTest
-    : public PlatformTest {
- protected:
-  void SetUp() override {
-    PlatformTest::SetUp();
-
-    view_controller_ =
-        [[SavePasswordsInstructionalOverlayViewController alloc] init];
-
-    [view_controller_ view];
-  }
-
- protected:
-  SavePasswordsInstructionalOverlayViewController* view_controller_ = nil;
-};
-
-// Tests that the strings and accessibility identifier are correctly set.
-TEST_F(SavePasswordsInstructionalOverlayViewControllerTest,
-       ShouldSetCorrectStringsAndAccessibilityIdentifier) {
-  NSString* title = [view_controller_ valueForKey:@"_titleString"];
-  EXPECT_NSEQ(title,
-              l10n_util::GetNSString(IDS_IOS_MAGIC_STACK_TIP_TUTORIAL_TITLE));
-
-  NSArray<NSString*>* steps = [view_controller_ valueForKey:@"_steps"];
-  EXPECT_EQ(steps.count, 3u);
-  EXPECT_NSEQ(steps[0],
-              l10n_util::GetNSString(
-                  IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORDS_TUTORIAL_STEP_1));
-  EXPECT_NSEQ(steps[1],
-              l10n_util::GetNSString(
-                  IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORDS_TUTORIAL_STEP_2));
-  EXPECT_NSEQ(steps[2],
-              l10n_util::GetNSString(
-                  IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORDS_TUTORIAL_STEP_1));
-
-  EXPECT_NSEQ([[view_controller_ view] accessibilityIdentifier],
-              @"kSavePasswordsInstructionalOverlayAXID");
-}
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/tips/test/use_autofill_instructional_overlay_view_controller_unittest.mm b/ios/chrome/browser/content_suggestions/ui_bundled/tips/test/use_autofill_instructional_overlay_view_controller_unittest.mm
deleted file mode 100644
index 3064fc60..0000000
--- a/ios/chrome/browser/content_suggestions/ui_bundled/tips/test/use_autofill_instructional_overlay_view_controller_unittest.mm
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2024 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "ios/chrome/browser/content_suggestions/ui_bundled/tips/ui/use_autofill_instructional_overlay_view_controller.h"
-
-#import "ios/chrome/grit/ios_branded_strings.h"
-#import "ios/chrome/grit/ios_strings.h"
-#import "testing/gtest_mac.h"
-#import "testing/platform_test.h"
-#import "ui/base/l10n/l10n_util_mac.h"
-
-// Tests for the `UseAutofillInstructionalOverlayViewControllerTest` class.
-class UseAutofillInstructionalOverlayViewControllerTest : public PlatformTest {
- protected:
-  void SetUp() override {
-    PlatformTest::SetUp();
-
-    view_controller_ =
-        [[UseAutofillInstructionalOverlayViewController alloc] init];
-
-    [view_controller_ view];
-  }
-
- protected:
-  UseAutofillInstructionalOverlayViewController* view_controller_ = nil;
-};
-
-// Tests that the strings and accessibility identifier are correctly set.
-TEST_F(UseAutofillInstructionalOverlayViewControllerTest,
-       ShouldSetCorrectStringsAndAccessibilityIdentifier) {
-  NSString* title = [view_controller_ valueForKey:@"_titleString"];
-  EXPECT_NSEQ(title,
-              l10n_util::GetNSString(IDS_IOS_MAGIC_STACK_TIP_TUTORIAL_TITLE));
-
-  NSArray<NSString*>* steps = [view_controller_ valueForKey:@"_steps"];
-  EXPECT_EQ(steps.count, 3u);
-  EXPECT_NSEQ(steps[0],
-              l10n_util::GetNSString(
-                  IDS_IOS_MAGIC_STACK_TIP_AUTOFILL_PASSWORDS_TUTORIAL_STEP_1));
-  EXPECT_NSEQ(steps[1],
-              l10n_util::GetNSString(
-                  IDS_IOS_MAGIC_STACK_TIP_AUTOFILL_PASSWORDS_TUTORIAL_STEP_2));
-  EXPECT_NSEQ(steps[2],
-              l10n_util::GetNSString(
-                  IDS_IOS_MAGIC_STACK_TIP_AUTOFILL_PASSWORDS_TUTORIAL_STEP_3));
-
-  EXPECT_NSEQ([[view_controller_ view] accessibilityIdentifier],
-              @"kUseAutofillInstructionalOverlayAXID");
-}
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/tips/ui/BUILD.gn b/ios/chrome/browser/content_suggestions/ui_bundled/tips/ui/BUILD.gn
index f562882..d12a8cf 100644
--- a/ios/chrome/browser/content_suggestions/ui_bundled/tips/ui/BUILD.gn
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/tips/ui/BUILD.gn
@@ -4,8 +4,6 @@
 
 source_set("ui") {
   sources = [
-    "save_passwords_instructional_overlay_view_controller.h",
-    "save_passwords_instructional_overlay_view_controller.mm",
     "save_passwords_instructional_view_controller.h",
     "save_passwords_instructional_view_controller.mm",
     "tips_magic_stack_consumer.h",
@@ -15,8 +13,6 @@
     "tips_module_state.mm",
     "tips_module_view.h",
     "tips_module_view.mm",
-    "use_autofill_instructional_overlay_view_controller.h",
-    "use_autofill_instructional_overlay_view_controller.mm",
     "use_autofill_instructional_view_controller.h",
     "use_autofill_instructional_view_controller.mm",
   ]
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/tips/ui/save_passwords_instructional_overlay_view_controller.h b/ios/chrome/browser/content_suggestions/ui_bundled/tips/ui/save_passwords_instructional_overlay_view_controller.h
deleted file mode 100644
index 6f74716..0000000
--- a/ios/chrome/browser/content_suggestions/ui_bundled/tips/ui/save_passwords_instructional_overlay_view_controller.h
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2024 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_CONTENT_SUGGESTIONS_UI_BUNDLED_TIPS_UI_SAVE_PASSWORDS_INSTRUCTIONAL_OVERLAY_VIEW_CONTROLLER_H_
-#define IOS_CHROME_BROWSER_CONTENT_SUGGESTIONS_UI_BUNDLED_TIPS_UI_SAVE_PASSWORDS_INSTRUCTIONAL_OVERLAY_VIEW_CONTROLLER_H_
-
-#import "ios/chrome/browser/instructions_bottom_sheet/ui/instructions_bottom_sheet_view_controller.h"
-
-// A view controller to display a set of instructions for using Save Passwords.
-@interface SavePasswordsInstructionalOverlayViewController
-    : InstructionsBottomSheetViewController
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_CONTENT_SUGGESTIONS_UI_BUNDLED_TIPS_UI_SAVE_PASSWORDS_INSTRUCTIONAL_OVERLAY_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/tips/ui/save_passwords_instructional_overlay_view_controller.mm b/ios/chrome/browser/content_suggestions/ui_bundled/tips/ui/save_passwords_instructional_overlay_view_controller.mm
deleted file mode 100644
index df3eda93..0000000
--- a/ios/chrome/browser/content_suggestions/ui_bundled/tips/ui/save_passwords_instructional_overlay_view_controller.mm
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2024 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "ios/chrome/browser/content_suggestions/ui_bundled/tips/ui/save_passwords_instructional_overlay_view_controller.h"
-
-#import "ios/chrome/grit/ios_branded_strings.h"
-#import "ios/chrome/grit/ios_strings.h"
-#import "ui/base/l10n/l10n_util_mac.h"
-
-namespace {
-
-// Accessibility identifier for the Save Passwords instructions view.
-NSString* const kSavePasswordsInstructionalOverlayAXID =
-    @"kSavePasswordsInstructionalOverlayAXID";
-
-}  // namespace
-
-@implementation SavePasswordsInstructionalOverlayViewController
-
-- (instancetype)init {
-  self = [super initWithTitle:l10n_util::GetNSString(
-                                  IDS_IOS_MAGIC_STACK_TIP_TUTORIAL_TITLE)
-                 instructions:@[
-                   l10n_util::GetNSString(
-                       IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORDS_TUTORIAL_STEP_1),
-                   l10n_util::GetNSString(
-                       IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORDS_TUTORIAL_STEP_2),
-                   l10n_util::GetNSString(
-                       IDS_IOS_MAGIC_STACK_TIP_SAVE_PASSWORDS_TUTORIAL_STEP_1),
-                 ]];
-  return self;
-}
-
-#pragma mark - UIViewController
-
-- (void)viewDidLoad {
-  [super viewDidLoad];
-
-  self.view.accessibilityIdentifier = kSavePasswordsInstructionalOverlayAXID;
-}
-
-#pragma mark - BottomSheetViewController
-
-- (void)expandBottomSheet {
-  UISheetPresentationController* presentationController =
-      self.sheetPresentationController;
-  // Expand to medium detent.
-  [presentationController animateChanges:^{
-    presentationController.selectedDetentIdentifier =
-        UISheetPresentationControllerDetentIdentifierMedium;
-  }];
-}
-
-- (void)setUpBottomSheetPresentationController {
-  UISheetPresentationController* presentationController =
-      self.sheetPresentationController;
-  presentationController.prefersEdgeAttachedInCompactHeight = YES;
-  presentationController.widthFollowsPreferredContentSizeWhenEdgeAttached = YES;
-}
-
-- (void)setUpBottomSheetDetents {
-  UISheetPresentationController* presentationController =
-      self.sheetPresentationController;
-  presentationController.detents = @[
-    [UISheetPresentationControllerDetent mediumDetent],
-    [UISheetPresentationControllerDetent largeDetent]
-  ];
-}
-
-@end
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/tips/ui/use_autofill_instructional_overlay_view_controller.h b/ios/chrome/browser/content_suggestions/ui_bundled/tips/ui/use_autofill_instructional_overlay_view_controller.h
deleted file mode 100644
index b8e3b7d7..0000000
--- a/ios/chrome/browser/content_suggestions/ui_bundled/tips/ui/use_autofill_instructional_overlay_view_controller.h
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2024 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_CONTENT_SUGGESTIONS_UI_BUNDLED_TIPS_UI_USE_AUTOFILL_INSTRUCTIONAL_OVERLAY_VIEW_CONTROLLER_H_
-#define IOS_CHROME_BROWSER_CONTENT_SUGGESTIONS_UI_BUNDLED_TIPS_UI_USE_AUTOFILL_INSTRUCTIONAL_OVERLAY_VIEW_CONTROLLER_H_
-
-#import "ios/chrome/browser/instructions_bottom_sheet/ui/instructions_bottom_sheet_view_controller.h"
-
-// A view controller to display a set of instructions for using Autofill Saved
-// Passwords.
-@interface UseAutofillInstructionalOverlayViewController
-    : InstructionsBottomSheetViewController
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_CONTENT_SUGGESTIONS_UI_BUNDLED_TIPS_UI_USE_AUTOFILL_INSTRUCTIONAL_OVERLAY_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/tips/ui/use_autofill_instructional_overlay_view_controller.mm b/ios/chrome/browser/content_suggestions/ui_bundled/tips/ui/use_autofill_instructional_overlay_view_controller.mm
deleted file mode 100644
index a2eab6d..0000000
--- a/ios/chrome/browser/content_suggestions/ui_bundled/tips/ui/use_autofill_instructional_overlay_view_controller.mm
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2024 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "ios/chrome/browser/content_suggestions/ui_bundled/tips/ui/use_autofill_instructional_overlay_view_controller.h"
-
-#import "ios/chrome/grit/ios_branded_strings.h"
-#import "ios/chrome/grit/ios_strings.h"
-#import "ui/base/l10n/l10n_util_mac.h"
-
-namespace {
-
-// Accessibility identifier for the Autofill Saved Passwords instructions view.
-NSString* const kUseAutofillInstructionalOverlayAXID =
-    @"kUseAutofillInstructionalOverlayAXID";
-
-}  // namespace
-
-@implementation UseAutofillInstructionalOverlayViewController
-
-- (instancetype)init {
-  self =
-      [super initWithTitle:l10n_util::GetNSString(
-                               IDS_IOS_MAGIC_STACK_TIP_TUTORIAL_TITLE)
-              instructions:@[
-                l10n_util::GetNSString(
-                    IDS_IOS_MAGIC_STACK_TIP_AUTOFILL_PASSWORDS_TUTORIAL_STEP_1),
-                l10n_util::GetNSString(
-                    IDS_IOS_MAGIC_STACK_TIP_AUTOFILL_PASSWORDS_TUTORIAL_STEP_2),
-                l10n_util::GetNSString(
-                    IDS_IOS_MAGIC_STACK_TIP_AUTOFILL_PASSWORDS_TUTORIAL_STEP_3),
-              ]];
-  return self;
-}
-
-#pragma mark - UIViewController
-
-- (void)viewDidLoad {
-  [super viewDidLoad];
-
-  self.view.accessibilityIdentifier = kUseAutofillInstructionalOverlayAXID;
-}
-
-#pragma mark - BottomSheetViewController
-
-- (void)expandBottomSheet {
-  UISheetPresentationController* presentationController =
-      self.sheetPresentationController;
-  // Expand to medium detent.
-  [presentationController animateChanges:^{
-    presentationController.selectedDetentIdentifier =
-        UISheetPresentationControllerDetentIdentifierMedium;
-  }];
-}
-
-- (void)setUpBottomSheetPresentationController {
-  UISheetPresentationController* presentationController =
-      self.sheetPresentationController;
-  presentationController.prefersEdgeAttachedInCompactHeight = YES;
-  presentationController.widthFollowsPreferredContentSizeWhenEdgeAttached = YES;
-}
-
-- (void)setUpBottomSheetDetents {
-  UISheetPresentationController* presentationController =
-      self.sheetPresentationController;
-  presentationController.detents = @[
-    [UISheetPresentationControllerDetent mediumDetent],
-    [UISheetPresentationControllerDetent largeDetent]
-  ];
-}
-
-@end
diff --git a/ios/chrome/browser/credential_exchange/model/credential_export_manager.swift b/ios/chrome/browser/credential_exchange/model/credential_export_manager.swift
index a0e6b9b6..57ce22ff 100644
--- a/ios/chrome/browser/credential_exchange/model/credential_export_manager.swift
+++ b/ios/chrome/browser/credential_exchange/model/credential_export_manager.swift
@@ -7,6 +7,7 @@
 import UIKit
 
 /// Handles exporting user credentials through ASCredentialExportManager.
+@MainActor
 @objc public class CredentialExportManager: NSObject {
   private struct ExportablePassword {
     let url: URL
@@ -144,12 +145,14 @@
     passwords: [CredentialExchangePassword], passkeys: [CredentialExchangePasskey],
     window: UIWindow
   ) {
-    let exportManager = ASCredentialExportManager(presentationAnchor: window)
-    let exportablePasswords = passwords.compactMap(ExportablePassword.init)
-    let exportablePasskeys = passkeys.compactMap(ExportablePasskey.init)
-
     Task { @MainActor in
       do {
+        // Initialize an export manager within the scope of Task to prevent an instance from
+        // crossing boundaries.
+        let exportManager = ASCredentialExportManager(presentationAnchor: window)
+        let exportablePasswords = passwords.compactMap(ExportablePassword.init)
+        let exportablePasskeys = passkeys.compactMap(ExportablePasskey.init)
+
         let _ = try await exportManager.requestExport(for: nil)
 
         let exportedData = await CredentialExportManager.buildExportData(
diff --git a/ios/chrome/browser/credential_exchange/model/credential_import_manager.swift b/ios/chrome/browser/credential_exchange/model/credential_import_manager.swift
index a5c370c..bc75a2c 100644
--- a/ios/chrome/browser/credential_exchange/model/credential_import_manager.swift
+++ b/ios/chrome/browser/credential_exchange/model/credential_import_manager.swift
@@ -34,8 +34,11 @@
   /// app launch.
   @available(iOS 26, *)
   @objc public func prepareImport(_ uuid: NSUUID) {
-    let importManager = ASCredentialImportManager()
     Task {
+      // Initialize an import manager within the scope of Task to prevent an instance from crossing
+      // boundaries.
+      let importManager = ASCredentialImportManager()
+
       do {
         let credentialData = try await importManager.importCredentials(token: uuid as UUID)
         let translatedData = translateCredentialData(credentialData)
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm
index 8409b1f40..072742e 100644
--- a/ios/chrome/browser/flags/about_flags.mm
+++ b/ios/chrome/browser/flags/about_flags.mm
@@ -2866,6 +2866,10 @@
      flag_descriptions::kMostVisitedTilesCustomizationName,
      flag_descriptions::kMostVisitedTilesCustomizationDescription,
      flags_ui::kOsIos, FEATURE_VALUE_TYPE(kMostVisitedTilesCustomizationIOS)},
+    {"tab-group-color-on-surface",
+     flag_descriptions::kTabGroupColorOnSurfaceName,
+     flag_descriptions::kTabGroupColorOnSurfaceDescription, flags_ui::kOsIos,
+     FEATURE_VALUE_TYPE(kTabGroupColorOnSurface)},
 });
 
 bool SkipConditionalFeatureEntry(const flags_ui::FeatureEntry& entry) {
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
index 087cdd76..71c5fe8 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -1601,6 +1601,10 @@
     "When enabled, the new Tab Grid to Browser (and vice versa) transitions"
     "are used.";
 
+const char kTabGroupColorOnSurfaceName[] = "Tab group color on surfaces";
+const char kTabGroupColorOnSurfaceDescription[] =
+    "Adds the tab group color to the tab group and tab grid surfaces.";
+
 const char kTabGroupInOverflowMenuName[] =
     "Enable the Tab Group button in the overflow menu";
 const char kTabGroupInOverflowMenuDescription[] =
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
index 5c515673..19d8ee3a3b 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -954,6 +954,9 @@
 extern const char kTabGridNewTransitionsName[];
 extern const char kTabGridNewTransitionsDescription[];
 
+extern const char kTabGroupColorOnSurfaceName[];
+extern const char kTabGroupColorOnSurfaceDescription[];
+
 extern const char kTabGroupInOverflowMenuName[];
 extern const char kTabGroupInOverflowMenuDescription[];
 
diff --git a/ios/chrome/browser/intelligence/proto_wrappers/page_context_wrapper.mm b/ios/chrome/browser/intelligence/proto_wrappers/page_context_wrapper.mm
index 60a7e3e7..a864702 100644
--- a/ios/chrome/browser/intelligence/proto_wrappers/page_context_wrapper.mm
+++ b/ios/chrome/browser/intelligence/proto_wrappers/page_context_wrapper.mm
@@ -214,6 +214,8 @@
               completionCallback:
                   (base::OnceCallback<void(PageContextWrapperCallbackResponse)>)
                       completionCallback {
+  CHECK(webState);
+
   self = [super init];
   if (self) {
     _asyncTasksToComplete = 0;
@@ -664,6 +666,10 @@
 // Updates the snapshot for the given WebState, and executes the `barrier`
 // callback when finished.
 - (void)updateSnapshotWithBarrier:(base::RepeatingClosure)barrier {
+  if (!_webState) {
+    barrier.Run();
+    return;
+  }
   __weak PageContextWrapper* weakSelf = self;
   SnapshotTabHelper::FromWebState(_webState.get())
       ->UpdateSnapshotWithCallback(^(UIImage* image) {
@@ -681,6 +687,8 @@
   if (_webState) {
     SnapshotTabHelper::FromWebState(_webState.get())
         ->UpdateSnapshotWithCallback(callback);
+  } else {
+    callback(nil);
   }
 }
 
diff --git a/ios/chrome/browser/intelligence/proto_wrappers/page_context_wrapper_unittest.mm b/ios/chrome/browser/intelligence/proto_wrappers/page_context_wrapper_unittest.mm
index 6e9d29fa..5c26488a 100644
--- a/ios/chrome/browser/intelligence/proto_wrappers/page_context_wrapper_unittest.mm
+++ b/ios/chrome/browser/intelligence/proto_wrappers/page_context_wrapper_unittest.mm
@@ -100,7 +100,7 @@
 
 struct PrintToStringParamName {
   std::string operator()(const testing::TestParamInfo<bool>& info) const {
-    return info.param ? "WithFeatureEnabled" : "WithFeatureDisabled";
+    return info.param ? "NewRefactoredVersion" : "OldVersion";
   }
 };
 
@@ -1184,6 +1184,81 @@
             "Child frame cross-origin text B");
 }
 
+// Tests that the wrapper correctly handles a destroyed WebState during a forced
+// snapshot update.
+TEST_P(PageContextWrapperTest,
+       PopulatePageContext_WebStateDestroyedDuringForcedSnapshot) {
+  base::RunLoop run_loop;
+  PageContextWrapperCallbackResponse captured_response;
+
+  PageContextWrapper* wrapper = [[PageContextWrapper alloc]
+        initWithWebState:web_state()
+      completionCallback:base::BindOnce(
+                             [](base::RunLoop* run_loop,
+                                PageContextWrapperCallbackResponse*
+                                    out_response,
+                                PageContextWrapperCallbackResponse response) {
+                               *out_response = std::move(response);
+                               run_loop->Quit();
+                             },
+                             &run_loop, &captured_response)];
+
+  wrapper.shouldGetSnapshot = YES;
+  wrapper.shouldForceUpdateMissingSnapshots = YES;
+
+  // Simulate a snapshot failure, which will trigger a forced update.
+  snapshot_delegate_.canTakeSnapshot = NO;
+
+  // Make the web_state hidden to trigger the async snapshot retrieval path.
+  web_state()->WasHidden();
+
+  [wrapper populatePageContextFieldsAsync];
+
+  // Destroy the web state after the async work has started.
+  web_state_.reset();
+
+  run_loop.Run();
+
+  // Verify that the callback was called with a generic error because the
+  // WebState was destroyed during the operation.
+  ASSERT_FALSE(captured_response.has_value());
+  EXPECT_EQ(captured_response.error(), PageContextWrapperError::kGenericError);
+}
+
+// Tests that the wrapper correctly handles a destroyed WebState.
+TEST_P(PageContextWrapperTest, PopulatePageContext_WebStateDestroyed) {
+  base::RunLoop run_loop;
+  PageContextWrapperCallbackResponse captured_response;
+
+  PageContextWrapper* wrapper = [[PageContextWrapper alloc]
+        initWithWebState:web_state()
+      completionCallback:base::BindOnce(
+                             [](base::RunLoop* run_loop,
+                                PageContextWrapperCallbackResponse*
+                                    out_response,
+                                PageContextWrapperCallbackResponse response) {
+                               *out_response = std::move(response);
+                               run_loop->Quit();
+                             },
+                             &run_loop, &captured_response)];
+
+  wrapper.shouldGetSnapshot = YES;
+  wrapper.shouldGetAnnotatedPageContent = YES;
+  wrapper.shouldGetInnerText = YES;
+  wrapper.shouldGetFullPagePDF = YES;
+
+  // Destroy the web state after initializing the wrapper.
+  web_state_.reset();
+
+  [wrapper populatePageContextFieldsAsync];
+  run_loop.Run();
+
+  // Verify that the callback was called with a generic error because the
+  // WebState was destroyed.
+  ASSERT_FALSE(captured_response.has_value());
+  EXPECT_EQ(captured_response.error(), PageContextWrapperError::kGenericError);
+}
+
 INSTANTIATE_TEST_SUITE_P(,
                          PageContextWrapperTest,
                          testing::Bool(),
diff --git a/ios/chrome/browser/omnibox/ui/omnibox_container_view.mm b/ios/chrome/browser/omnibox/ui/omnibox_container_view.mm
index d41c708..81818c48 100644
--- a/ios/chrome/browser/omnibox/ui/omnibox_container_view.mm
+++ b/ios/chrome/browser/omnibox/ui/omnibox_container_view.mm
@@ -54,8 +54,6 @@
 
 /// Space between the clear button and the edge of the omnibox.
 const CGFloat kTextInputViewClearButtonTrailingOffset = 4;
-/// The maximum number of lines for the text view before it starts scrolling.
-const int kMaxLines = 3;
 
 /// Clear button inset on all sides.
 const CGFloat kClearButtonInset = 4.0f;
@@ -73,6 +71,17 @@
   return NO;
 }
 
+/// The maxium number of lines for the multiline omnibox before it starts
+/// scrolling in the presentation context.
+int MaxNumberOfLines(OmniboxPresentationContext presentation_context) {
+  if (presentation_context == OmniboxPresentationContext::kComposebox) {
+    return 5;
+  }
+  // Lower as the other presentation context don't cap the height of the text
+  // view.
+  return 3;
+}
+
 /// Creates and configures the leading image view.
 UIImageView* CreateLeadingImageView(
     UIColor* icon_tint,
@@ -179,6 +188,12 @@
   CGFloat _lastKnownTextViewWidth;
   // Whether to hide the leading image.
   BOOL _hideLeadingImage;
+  // The last computed ideal height of the text view, before being constrained
+  // by the container's bounds.
+  CGFloat _lastComputedIdealHeight;
+  // The last computed intrinsic height, used by the `intrinsicContentSize`
+  // property.
+  CGFloat _currentIntrinsicHeight;
 }
 
 @synthesize heightDelegate = _heightDelegate;
@@ -261,6 +276,7 @@
     _lastKnownTextViewWidth = _textView.bounds.size.width;
     [self updateTextViewHeight];
   }
+  [self updateTextViewLayout];
 }
 
 - (void)setLeadingImage:(UIImage*)image
@@ -343,16 +359,18 @@
   return _textInputView;
 }
 
+#pragma mark - Private
+
+/// Updates the text view intrinsic content height and clip autocomplete text.
 - (void)updateTextViewHeight {
   if (!_textView) {
     return;
   }
 
-  // Recalculate textView height and update it to clip and scroll if necessary.
+  // Computes user text height.
   CGFloat verticalPadding =
       _textView.textContainerInset.top + _textView.textContainerInset.bottom;
   CGFloat singleLineHeight = [self singleLineHeight];
-  CGFloat maxHeight = (singleLineHeight * kMaxLines) + verticalPadding;
 
   // Calculate the height of the user text.
   NSAttributedString* userText = _textView.attributedUserText;
@@ -377,8 +395,8 @@
   if (!userTextHeight) {
     userTextHeight = singleLineHeight;
   }
-  CGFloat newHeight = ceilf(userTextHeight + verticalPadding);
 
+  // Records the number of lines and update it in the text view.
   NSInteger numberOfLines = round(userTextHeight / singleLineHeight);
   [self.metricsRecorder setNumberOfLines:numberOfLines];
   _textView.textContainer.maximumNumberOfLines = numberOfLines;
@@ -386,16 +404,38 @@
       [self lineBreakModeForUserText:userText];
   [self updateLastLineClipping:defaultLineBreakMode];
 
-  newHeight = MIN(newHeight, maxHeight);
+  // Limit the number of lines and update intrinsic size.
+  _lastComputedIdealHeight = ceilf(userTextHeight + verticalPadding);
+  CGFloat maxHeightFromLines =
+      (singleLineHeight * MaxNumberOfLines(_presentationContext)) +
+      verticalPadding;
+  CGFloat intrinsicHeight = MIN(_lastComputedIdealHeight, maxHeightFromLines);
+
   if (!_textInputHeightConstraint) {
     _textInputHeightConstraint =
-        [_textView.heightAnchor constraintEqualToConstant:newHeight];
+        [_textView.heightAnchor constraintEqualToConstant:intrinsicHeight];
+    // Lower priority as the height is capped by the available height set by the
+    // embedder.
+    _textInputHeightConstraint.priority = UILayoutPriorityDefaultHigh + 1;
     _textInputHeightConstraint.active = YES;
   } else {
-    _textInputHeightConstraint.constant = newHeight;
+    _textInputHeightConstraint.constant = intrinsicHeight;
   }
-  _textView.scrollEnabled = userTextHeight > maxHeight;
-  [self.heightDelegate textFieldViewContaining:self didChangeHeight:newHeight];
+
+  if (_currentIntrinsicHeight != intrinsicHeight) {
+    _currentIntrinsicHeight = intrinsicHeight;
+    [self.heightDelegate textFieldViewContaining:self
+                                 didChangeHeight:intrinsicHeight];
+  }
+}
+
+/// Updates the text view layout.
+- (void)updateTextViewLayout {
+  if (!_textView) {
+    return;
+  }
+
+  _textView.scrollEnabled = _lastComputedIdealHeight > self.bounds.size.height;
 }
 
 /// Updates the paragraph style to clip the last line.
diff --git a/ios/chrome/browser/policy/model/policy_egtest.mm b/ios/chrome/browser/policy/model/policy_egtest.mm
index 4fda920..317b44a 100644
--- a/ios/chrome/browser/policy/model/policy_egtest.mm
+++ b/ios/chrome/browser/policy/model/policy_egtest.mm
@@ -576,6 +576,18 @@
       @"Profile reporting section is visible.");
 }
 
+// Tests the chrome://management page when browser reporting is enabled.
+- (void)testManagementPageManagedWithBrowserReporting {
+  // Set up profile reporting.
+  SetPolicy(true, policy::key::kCloudReportingEnabled);
+
+  // Open the management page and check if the content is expected.
+  [ChromeEarlGrey loadURL:GURL(kChromeUIManagementURL)];
+  [ChromeEarlGrey waitForWebStateContainingText:
+                      l10n_util::GetStringUTF8(
+                          IDS_MANAGEMENT_BROWSER_REPORTING_EXPLANATION)];
+}
+
 // Tests the chrome://management page when profile reporting is enabled.
 - (void)testManagementPageManagedWithProfileReporting {
   // Set up profile reporting.
@@ -588,6 +600,24 @@
                           IDS_MANAGEMENT_PROFILE_REPORTING_EXPLANATION)];
 }
 
+// Tests the chrome://management page when browser reporting is enabled.
+- (void)testManagementPageManagedWithBrowserAndProfileReporting {
+  // Set up profile reporting.
+  SetPolicy(true, policy::key::kCloudReportingEnabled);
+
+  // Open the management page and check if the content is expected.
+  [ChromeEarlGrey loadURL:GURL(kChromeUIManagementURL)];
+  [ChromeEarlGrey waitForWebStateContainingText:
+                      l10n_util::GetStringUTF8(
+                          IDS_MANAGEMENT_BROWSER_REPORTING_EXPLANATION)];
+
+  // If both are enabled, only show the browser reporting section.
+  GREYAssertFalse(
+      [ChromeEarlGrey webStateContainsElement:VisibleElementSelector(
+                                                  @"profile-reporting-info")],
+      @"Profile reporting section is visible.");
+}
+
 // Tests the chrome://management page when there are machine level policies and
 // user level policies from the same domain.
 - (void)testManagementPageManagedWithCBCMAndUserPolicyDifferentDomains {
diff --git a/ios/chrome/browser/recent_tabs/coordinator/recent_tabs_mediator.mm b/ios/chrome/browser/recent_tabs/coordinator/recent_tabs_mediator.mm
index 2310f53..8ab22fa 100644
--- a/ios/chrome/browser/recent_tabs/coordinator/recent_tabs_mediator.mm
+++ b/ios/chrome/browser/recent_tabs/coordinator/recent_tabs_mediator.mm
@@ -71,6 +71,7 @@
         kTrustedVaultRecoverabilityDegradedForPasswords:
     case syncer::SyncService::UserActionableError::
         kTrustedVaultRecoverabilityDegradedForEverything:
+    case syncer::SyncService::UserActionableError::kBookmarksLimitExceeded:
       return false;
 
     // TODO(crbug.com/370026230): Update this case upon UI implementation.
diff --git a/ios/chrome/browser/search_engine_choice/ui/search_engine_current_default_pill_view.mm b/ios/chrome/browser/search_engine_choice/ui/search_engine_current_default_pill_view.mm
index 9965d17e..3967ee7 100644
--- a/ios/chrome/browser/search_engine_choice/ui/search_engine_current_default_pill_view.mm
+++ b/ios/chrome/browser/search_engine_choice/ui/search_engine_current_default_pill_view.mm
@@ -18,20 +18,6 @@
 // Border width for the current default pill.
 constexpr CGFloat kCurrentDefaultPillBorderWidth = 1.;
 
-// Returns just "Current default".
-// TODO(crbug.com/458252292): Need to add "Current default" string.
-NSString* GetCurrentDefaultString() {
-  NSString* string = l10n_util::GetNSStringF(
-      IDS_SEARCH_ENGINE_CHOICE_CURRENT_DEFAULT_SEARCH_ENGINE_PREPEND,
-      std::u16string());
-  StringWithTag parsed_string =
-      ParseStringWithTag(string, @"BEGIN_BOLD[ \t]*", @"[ \t]*END_BOLD");
-  if (parsed_string.range.location == NSNotFound) {
-    return string;
-  }
-  return [parsed_string.string substringWithRange:parsed_string.range];
-}
-
 }  // namespace
 
 @implementation SearchEngineCurrentDefaultPillView
@@ -44,7 +30,11 @@
     label.translatesAutoresizingMaskIntoConstraints = NO;
     label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleCaption2];
     label.adjustsFontForContentSizeCategory = YES;
-    label.text = GetCurrentDefaultString();
+    // TODO(crbug.com/458252292): Need to remove
+    // IDS_SEARCH_ENGINE_CHOICE_CURRENT_DEFAULT_SEARCH_ENGINE_PREPEND string, in
+    // M145.
+    label.text = l10n_util::GetNSString(
+        IDS_SEARCH_ENGINE_CHOICE_CURRENT_DEFAULT_SEARCH_ENGINE);
     label.textColor = [UIColor colorNamed:kTextSecondaryColor];
     AddSameConstraintsWithInsets(
         label, self,
diff --git a/ios/chrome/browser/settings/model/sync/utils/account_error_ui_info.h b/ios/chrome/browser/settings/model/sync/utils/account_error_ui_info.h
index b37a08cd..c5571d7 100644
--- a/ios/chrome/browser/settings/model/sync/utils/account_error_ui_info.h
+++ b/ios/chrome/browser/settings/model/sync/utils/account_error_ui_info.h
@@ -20,6 +20,8 @@
   kReauthForFetchKeys,
   // User needs to reauthenticate for degraded recoverability.
   kReauthForDegradedRecoverability,
+  // User needs to acknowledge their bookmark error.
+  kAcknowledgeBookmarkError,
 };
 
 // Contains the information of the account error UI item.
diff --git a/ios/chrome/browser/settings/model/sync/utils/identity_error_util.mm b/ios/chrome/browser/settings/model/sync/utils/identity_error_util.mm
index 30c7b3d..50f7706 100644
--- a/ios/chrome/browser/settings/model/sync/utils/identity_error_util.mm
+++ b/ios/chrome/browser/settings/model/sync/utils/identity_error_util.mm
@@ -98,6 +98,14 @@
   return errorInfo;
 }
 
+// Gets the AccountErrorUIInfo data representing the kBookmarksLimitExceeded
+// error.
+AccountErrorUIInfo* GetUIInfoForBookmarksLimitExceededError() {
+  // TODO(crbug.com/452968646): forward to  the concrete help center article
+  // link.
+  return nil;
+}
+
 }  // namespace
 
 AccountErrorUIInfo* GetAccountErrorUIInfo(syncer::SyncService* sync_service) {
@@ -123,6 +131,8 @@
     case syncer::SyncService::UserActionableError::
         kTrustedVaultRecoverabilityDegradedForEverything:
       return GetUIInfoForTrustedVaultRecoverabilityDegradedErrorForEverything();
+    case syncer::SyncService::UserActionableError::kBookmarksLimitExceeded:
+      return GetUIInfoForBookmarksLimitExceededError();
     case syncer::SyncService::UserActionableError::kNone:
       break;
 
diff --git a/ios/chrome/browser/settings/model/sync/utils/sync_error_infobar_delegate.mm b/ios/chrome/browser/settings/model/sync/utils/sync_error_infobar_delegate.mm
index f05dde4..cab21dd1e 100644
--- a/ios/chrome/browser/settings/model/sync/utils/sync_error_infobar_delegate.mm
+++ b/ios/chrome/browser/settings/model/sync/utils/sync_error_infobar_delegate.mm
@@ -164,6 +164,10 @@
       [presenter_ showTrustedVaultReauthForDegradedRecoverabilityWithTrigger:
                       TrustedVaultTriggerFromInfoBarTrigger(trigger_)];
       break;
+    case syncer::SyncService::UserActionableError::kBookmarksLimitExceeded:
+      // TODO(crbug.com/452968646): Navigate to the concrete help center
+      // article.
+      break;
   }
 
   return false;
@@ -231,6 +235,7 @@
         kNeedsTrustedVaultKeyForEverything:
     case syncer::SyncService::UserActionableError::
         kTrustedVaultRecoverabilityDegradedForEverything:
+    case syncer::SyncService::UserActionableError::kBookmarksLimitExceeded:
       return false;
   }
   NOTREACHED();
diff --git a/ios/chrome/browser/settings/model/sync/utils/sync_util.mm b/ios/chrome/browser/settings/model/sync/utils/sync_util.mm
index 6c43a227..c23108c2 100644
--- a/ios/chrome/browser/settings/model/sync/utils/sync_util.mm
+++ b/ios/chrome/browser/settings/model/sync/utils/sync_util.mm
@@ -50,7 +50,8 @@
   SYNC_SYNC_SETTINGS_NOT_CONFIRMED = 5,
   SYNC_NEEDS_TRUSTED_VAULT_KEY = 6,
   SYNC_TRUSTED_VAULT_RECOVERABILITY_DEGRADED = 7,
-  kMaxValue = SYNC_TRUSTED_VAULT_RECOVERABILITY_DEGRADED,
+  SYNC_BOOKMARKS_LIMIT_EXCEEDED = 8,
+  kMaxValue = SYNC_BOOKMARKS_LIMIT_EXCEEDED,
 };
 // LINT.ThenChange(/tools/metrics/histograms/metadata/sync/enums.xml:SyncErrorInfobarTypes)
 
@@ -75,6 +76,8 @@
     case syncer::SyncService::UserActionableError::
         kTrustedVaultRecoverabilityDegradedForEverything:
       return SYNC_TRUSTED_VAULT_RECOVERABILITY_DEGRADED;
+    case syncer::SyncService::UserActionableError::kBookmarksLimitExceeded:
+      return SYNC_BOOKMARKS_LIMIT_EXCEEDED;
     // TODO(crbug.com/370026230): Update this case once GetAccountErrorUIInfo()
     // returns a non-nil value for it.
     case syncer::SyncService::UserActionableError::kNeedsClientUpgrade:
@@ -108,6 +111,9 @@
         kTrustedVaultRecoverabilityDegradedForEverything:
       return l10n_util::GetStringUTF16(
           IDS_IOS_IDENTITY_ERROR_INFOBAR_VERIFY_ITS_YOU_TITLE);
+    case syncer::SyncService::UserActionableError::kBookmarksLimitExceeded:
+      // TODO(crbug.com/452968646): return the required string for the bookmarks
+      // limit exceeded error.
     case syncer::SyncService::UserActionableError::kNone:
     case syncer::SyncService::UserActionableError::kNeedsClientUpgrade:
       NOTREACHED();
@@ -143,6 +149,9 @@
         kTrustedVaultRecoverabilityDegradedForEverything:
       return l10n_util::GetNSString(
           IDS_IOS_IDENTITY_ERROR_INFOBAR_MAKE_SURE_YOU_CAN_ALWAYS_USE_CHROME_DATA_MESSAGE);
+    case syncer::SyncService::UserActionableError::kBookmarksLimitExceeded:
+      // TODO(crbug.com/452968646): return the required string for the bookmarks
+      // limit exceeded error.
     case syncer::SyncService::UserActionableError::kNone:
     case syncer::SyncService::UserActionableError::kNeedsClientUpgrade:
       NOTREACHED();
@@ -174,6 +183,9 @@
         kTrustedVaultRecoverabilityDegradedForEverything:
       return l10n_util::GetNSString(
           IDS_IOS_IDENTITY_ERROR_INFOBAR_VERIFY_BUTTON_LABEL);
+    case syncer::SyncService::UserActionableError::kBookmarksLimitExceeded:
+      // TODO(crbug.com/452968646): return the required string for the bookmarks
+      // limit exceeded error.
     case syncer::SyncService::UserActionableError::kNone:
     case syncer::SyncService::UserActionableError::kNeedsClientUpgrade:
       NOTREACHED();
@@ -221,6 +233,10 @@
       // syncer::AlwaysEncryptedUserTypes().
       return l10n_util::GetNSString(
           IDS_IOS_GOOGLE_SERVICES_SETTINGS_SYNC_FIX_RECOVERABILITY_DEGRADED_FOR_PASSWORDS);
+    case syncer::SyncService::UserActionableError::kBookmarksLimitExceeded:
+      // TODO(crbug.com/452968646): return the required string for the bookmarks
+      // limit exceeded error.
+      return nil;
     case syncer::SyncService::UserActionableError::kNeedsClientUpgrade:
       // UI not implemented for this case.
       return nil;
@@ -270,6 +286,10 @@
     case syncer::SyncService::UserActionableError::
         kTrustedVaultRecoverabilityDegradedForEverything:
       return GetSyncErrorDescriptionForSyncService(syncService);
+    case syncer::SyncService::UserActionableError::kBookmarksLimitExceeded:
+      // TODO(crbug.com/452968646): return the required string for the bookmarks
+      // limit exceeded error.
+      return nil;
     case syncer::SyncService::UserActionableError::kNeedsClientUpgrade:
       // UI not implemented for this case.
       return nil;
@@ -303,6 +323,10 @@
     case syncer::SyncService::UserActionableError::
         kTrustedVaultRecoverabilityDegradedForEverything:
       return l10n_util::GetNSString(IDS_IOS_SYNC_VERIFY_ITS_YOU_BUTTON);
+    case syncer::SyncService::UserActionableError::kBookmarksLimitExceeded:
+      // TODO(crbug.com/452968646): return the required string for the bookmarks
+      // limit exceeded error.
+      return nil;
     case syncer::SyncService::UserActionableError::kNone:
     // UI not implemented for this case.
     case syncer::SyncService::UserActionableError::kNeedsClientUpgrade:
@@ -324,6 +348,7 @@
         kTrustedVaultRecoverabilityDegradedForPasswords:
     case syncer::SyncService::UserActionableError::
         kTrustedVaultRecoverabilityDegradedForEverything:
+    case syncer::SyncService::UserActionableError::kBookmarksLimitExceeded:
     // UI not implemented for this case.
     case syncer::SyncService::UserActionableError::kNeedsClientUpgrade:
       return false;
diff --git a/ios/chrome/browser/settings/ui_bundled/google_services/manage_sync_settings_mediator.mm b/ios/chrome/browser/settings/ui_bundled/google_services/manage_sync_settings_mediator.mm
index 07b2fc5..978c3b0 100644
--- a/ios/chrome/browser/settings/ui_bundled/google_services/manage_sync_settings_mediator.mm
+++ b/ios/chrome/browser/settings/ui_bundled/google_services/manage_sync_settings_mediator.mm
@@ -1316,6 +1316,9 @@
     case syncer::SyncService::UserActionableError::
         kTrustedVaultRecoverabilityDegradedForEverything:
       return SyncTrustedVaultRecoverabilityDegradedErrorItemType;
+    case syncer::SyncService::UserActionableError::kBookmarksLimitExceeded:
+      // TODO(crbug.com/452968646) Add item for kBookmarksLimitExceeded.
+      return std::nullopt;
     case syncer::SyncService::UserActionableError::kNone:
     // UI not implemented for this case.
     case syncer::SyncService::UserActionableError::kNeedsClientUpgrade:
diff --git a/ios/chrome/browser/settings/ui_bundled/password/password_settings/password_settings_coordinator.mm b/ios/chrome/browser/settings/ui_bundled/password/password_settings/password_settings_coordinator.mm
index a77db0a..e560f5d1 100644
--- a/ios/chrome/browser/settings/ui_bundled/password/password_settings/password_settings_coordinator.mm
+++ b/ios/chrome/browser/settings/ui_bundled/password/password_settings/password_settings_coordinator.mm
@@ -395,10 +395,7 @@
 
   __weak __typeof(self) weakSelf = self;
   UIAlertAction* exportAction = [UIAlertAction
-      actionWithTitle:(CredentialExchangeEnabled()
-                           ? l10n_util::GetNSString(
-                                 IDS_IOS_EXPORT_PASSWORDS_AND_PASSKEYS)
-                           : l10n_util::GetNSString(IDS_IOS_EXPORT_PASSWORDS))
+      actionWithTitle:l10n_util::GetNSString(IDS_IOS_EXPORT_PASSWORDS)
                 style:UIAlertActionStyleDefault
               handler:^(UIAlertAction* action) {
                 [weakSelf onStartExportFlowConfirmed];
diff --git a/ios/chrome/browser/shared/public/features/features.h b/ios/chrome/browser/shared/public/features/features.h
index 3f2710f..a12898b 100644
--- a/ios/chrome/browser/shared/public/features/features.h
+++ b/ios/chrome/browser/shared/public/features/features.h
@@ -1173,4 +1173,11 @@
 // Returns true if the Composebox feature is enabled.
 bool IsComposeboxIOSEnabled();
 
+// The feature to enable or disable the group color on the tab group and tab
+// grid surfaces.
+BASE_DECLARE_FEATURE(kTabGroupColorOnSurface);
+
+// Returns true if the TabGroupColorOnSurface feature is enabled.
+bool IsTabGroupColorOnSurfaceEnabled();
+
 #endif  // IOS_CHROME_BROWSER_SHARED_PUBLIC_FEATURES_FEATURES_H_
diff --git a/ios/chrome/browser/shared/public/features/features.mm b/ios/chrome/browser/shared/public/features/features.mm
index 2105e3c..591cc49 100644
--- a/ios/chrome/browser/shared/public/features/features.mm
+++ b/ios/chrome/browser/shared/public/features/features.mm
@@ -1247,3 +1247,9 @@
   }
   return base::FeatureList::IsEnabled(kComposeboxIOS);
 }
+
+BASE_FEATURE(kTabGroupColorOnSurface, base::FEATURE_DISABLED_BY_DEFAULT);
+
+bool IsTabGroupColorOnSurfaceEnabled() {
+  return base::FeatureList::IsEnabled(kTabGroupColorOnSurface);
+}
diff --git a/ios/chrome/browser/sync/model/sync_error_browser_agent.mm b/ios/chrome/browser/sync/model/sync_error_browser_agent.mm
index 332928a..b79c646 100644
--- a/ios/chrome/browser/sync/model/sync_error_browser_agent.mm
+++ b/ios/chrome/browser/sync/model/sync_error_browser_agent.mm
@@ -75,6 +75,7 @@
         kTrustedVaultRecoverabilityDegradedForPasswords:
     case syncer::SyncService::UserActionableError::
         kTrustedVaultRecoverabilityDegradedForEverything:
+    case syncer::SyncService::UserActionableError::kBookmarksLimitExceeded:
     // This error has no UI on iOS.
     case syncer::SyncService::UserActionableError::kNeedsClientUpgrade:
       return false;
diff --git a/ios/chrome/browser/tabs/model/tab_helper_util.mm b/ios/chrome/browser/tabs/model/tab_helper_util.mm
index a50260f..72ba4044 100644
--- a/ios/chrome/browser/tabs/model/tab_helper_util.mm
+++ b/ios/chrome/browser/tabs/model/tab_helper_util.mm
@@ -144,254 +144,346 @@
   return (mask & flag) == flag;
 }
 
+// A builder class to declaratively attach tab helpers to a WebState.
+class TabHelperAttacher {
+ public:
+  template <typename T>
+  class [[nodiscard]] TypedTabHelperAttacher {
+   public:
+    TypedTabHelperAttacher(bool condition,
+                           const raw_ref<web::WebState> web_state,
+                           TabHelperAttacher& attacher)
+        : condition_(condition), web_state_(web_state), attacher_(attacher) {}
+
+    template <typename... Args>
+    void operator()(Args&&... args) {
+      if (condition_) {
+        T::CreateForWebState(&*web_state_, std::forward<Args>(args)...);
+      }
+    }
+
+    template <typename... Factories>
+    void WithFactory(ProfileIOS* profile) {
+      if (condition_) {
+        T::CreateForWebState(&*web_state_,
+                             Factories::GetForProfile(profile)...);
+      }
+    }
+
+    template <typename... Functors>
+    void With(Functors... functors) {
+      if (condition_) {
+        T::CreateForWebState(&*web_state_, functors()...);
+      }
+    }
+
+   private:
+    bool condition_;
+    const raw_ref<web::WebState> web_state_;
+    const raw_ref<TabHelperAttacher> attacher_;
+  };
+
+  TabHelperAttacher(web::WebState* web_state, TabHelperFilter filter_flags)
+      : web_state_(CHECK_DEREF(web_state)),
+        profile_(CHECK_DEREF(
+            ProfileIOS::FromBrowserState(web_state->GetBrowserState()))),
+        is_off_the_record_(profile_->IsOffTheRecord()),
+        for_prerender_(IsTabHelperFilterMaskSet(filter_flags,
+                                                TabHelperFilter::kPrerender)),
+        for_lens_overlay_(
+            IsTabHelperFilterMaskSet(filter_flags,
+                                     TabHelperFilter::kLensOverlay)),
+        for_reader_mode_(
+            IsTabHelperFilterMaskSet(filter_flags,
+                                     TabHelperFilter::kReaderMode)) {}
+
+  // APIs for usage in `AttachTabHelpers`.
+
+  // Creates a tab helper with all of the provided arguments initialized.
+  // Example usage:
+  //     TabHelperAttacher attacher;
+  //     attacher.Create<TabHelper>(arg1, arg2);
+  template <typename T, typename... Args>
+  void Create(Args&&... args) {
+    TypedTabHelperAttacher<T>(true, web_state_,
+                              *this)(std::forward<Args>(args)...);
+  }
+
+  // Creates a tab helper with all of the provided arguments initialized if the
+  // provided condition is met.
+  // Example usage:
+  //     TabHelperAttacher attacher;
+  //     attacher.CreateWhen<TabHelper>(condition, arg1, arg2);
+  template <typename T, typename... Args>
+  void CreateWhen(bool condition, Args&&... args) {
+    TypedTabHelperAttacher<T>(condition, web_state_,
+                              *this)(std::forward<Args>(args)...);
+  }
+
+  // Creates a tab helper if the provided condition is met. Requires providing
+  // additional specification to initialize deferred arguments.
+  // Example usage:
+  //     TabHelperAttacher attacher;
+  //     attacher.CreateDeferredWhen<TabHelper>(condition)
+  //             .With([&](){ return service; });
+  //     attacher.CreateDeferredWhen<TabHelper2>(condition)
+  //             .WithFactory<TabHelperServiceFactory>(profile);
+  template <typename T>
+  TypedTabHelperAttacher<T> CreateDeferredWhen(bool condition) {
+    return TypedTabHelperAttacher<T>(condition, web_state_, *this);
+  }
+
+  // Getters for properties that might be needed for complex conditions.
+  ProfileIOS* GetProfile() const { return &*profile_; }
+  bool IsOffTheRecord() const { return is_off_the_record_; }
+  bool IsForPrerender() const { return for_prerender_; }
+  bool IsForLensOverlay() const { return for_lens_overlay_; }
+  bool IsForReaderMode() const { return for_reader_mode_; }
+  bool IsForStandardNavigation() const {
+    return !for_lens_overlay_ && !for_reader_mode_;
+  }
+  bool IsNotInTabHelperFilter() const {
+    return !for_prerender_ && !for_lens_overlay_ && !for_reader_mode_;
+  }
+
+ private:
+  const raw_ref<web::WebState> web_state_;
+  const raw_ref<ProfileIOS> profile_;
+  const bool is_off_the_record_;
+  const bool for_prerender_;
+  const bool for_lens_overlay_;
+  const bool for_reader_mode_;
+};
+
 }  // namespace
 
 void AttachTabHelpers(web::WebState* web_state, TabHelperFilter filter_flags) {
-  ProfileIOS* const profile =
-      ProfileIOS::FromBrowserState(web_state->GetBrowserState());
-  const bool is_off_the_record = profile->IsOffTheRecord();
-  const bool for_prerender =
-      IsTabHelperFilterMaskSet(filter_flags, TabHelperFilter::kPrerender);
-  const bool for_lens_overlay =
-      IsTabHelperFilterMaskSet(filter_flags, TabHelperFilter::kLensOverlay);
-  const bool for_reader_mode =
-      IsTabHelperFilterMaskSet(filter_flags, TabHelperFilter::kReaderMode);
+  TabHelperAttacher attacher(web_state, filter_flags);
+  ProfileIOS* const profile = attacher.GetProfile();
+  ProfileIOS* original_profile = profile->GetOriginalProfile();
 
   // When adding a new tab helper, please consider whether it should be filtered
   // out when the web_state is presented in the following context:
   // - kPrerender: Tab helpers that are not required or not used for navigation
   // should be filtered out.
-  // - kBottomSheet: The bottom sheet is overlayed on the BVC, tab helpers that
-  // rely on BVC's toolbar entry points should be filtered out.
+  // - kLensOverlay: Tab helpers that are required for Lens UI.
+  // - kReaderMode: Tab helpers that are required for Reader Mode UI.
   //
   // When a web state is presented by the BVC, AttachTabHelpers is called to
   // attach all tab helpers. (the method is idempotent, so it is okay to call it
   // multiple times for the same WebState).
 
-  OverlayRequestQueue::CreateForWebState(web_state);
+  attacher.Create<OverlayRequestQueue>();
+  attacher.Create<VoiceSearchNavigationTabHelper>();
+  attacher.Create<InfoBarManagerImpl>();
+  attacher.Create<FindTabHelper>();
 
-  VoiceSearchNavigationTabHelper::CreateForWebState(web_state);
-  InfoBarManagerImpl::CreateForWebState(web_state);
-
-  FindTabHelper::CreateForWebState(web_state);
-
-  if (!for_reader_mode) {
-    if (!for_lens_overlay) {
-      HistoryTabHelper::CreateForWebState(web_state);
-    } else if (base::FeatureList::IsEnabled(kLensOverlayNavigationHistory)) {
-      HistoryTabHelper::CreateForWebState(web_state);
-      HistoryTabHelper::FromWebState(web_state)->EnableLensURLProcessing();
-    }
+  bool should_create_history_tab_helper =
+      !attacher.IsForReaderMode() &&
+      (!attacher.IsForLensOverlay() ||
+       base::FeatureList::IsEnabled(kLensOverlayNavigationHistory));
+  attacher.CreateWhen<HistoryTabHelper>(should_create_history_tab_helper);
+  if (should_create_history_tab_helper && attacher.IsForLensOverlay()) {
+    HistoryTabHelper::FromWebState(web_state)->EnableLensURLProcessing();
   }
 
-  LoadTimingTabHelper::CreateForWebState(web_state);
-  OverscrollActionsTabHelper::CreateForWebState(web_state);
-  IOSTaskTabHelper::CreateForWebState(web_state);
-  if (!for_lens_overlay && !for_reader_mode &&
-      IsPriceAlertsEligibleForWebState(web_state)) {
-    ShoppingPersistedDataTabHelper::CreateForWebState(web_state);
-  }
-  commerce::CommerceTabHelper::CreateForWebState(
-      web_state, is_off_the_record,
+  attacher.Create<LoadTimingTabHelper>();
+  attacher.Create<OverscrollActionsTabHelper>();
+  attacher.Create<IOSTaskTabHelper>();
+
+  attacher.CreateWhen<ShoppingPersistedDataTabHelper>(
+      attacher.IsForStandardNavigation() &&
+      IsPriceAlertsEligibleForWebState(web_state));
+
+  attacher.Create<commerce::CommerceTabHelper>(
+      attacher.IsOffTheRecord(),
       commerce::ShoppingServiceFactory::GetForProfile(profile));
 
-  if (!for_lens_overlay && !for_reader_mode && !for_prerender) {
-    // Since LensTabHelper listens for a custom scheme, it needs to be
-    // created before AppLauncherTabHelper, which will filter out
-    // unhandled schemes.
-    LensTabHelper::CreateForWebState(web_state);
-    if (IsLensOverlayAvailable(profile->GetPrefs())) {
-      LensOverlayTabHelper::CreateForWebState(web_state);
-    }
-    AppLauncherTabHelper::CreateForWebState(
-        web_state, [[AppLauncherAbuseDetector alloc] init], is_off_the_record);
+  // Since LensTabHelper listens for a custom scheme, it needs to be
+  // created before AppLauncherTabHelper, which will filter out
+  // unhandled schemes.
+  attacher.CreateWhen<LensTabHelper>(attacher.IsNotInTabHelperFilter());
+  attacher.CreateWhen<LensOverlayTabHelper>(
+      attacher.IsNotInTabHelperFilter() &&
+      IsLensOverlayAvailable(profile->GetPrefs()));
+  attacher
+      .CreateDeferredWhen<AppLauncherTabHelper>(
+          attacher.IsNotInTabHelperFilter())
+      .With([&]() { return [[AppLauncherAbuseDetector alloc] init]; },
+            [&]() { return attacher.IsOffTheRecord(); });
+  attacher
+      .CreateDeferredWhen<ReaderModeTabHelper>(
+          attacher.IsNotInTabHelperFilter() && IsReaderModeAvailable())
+      .WithFactory<DistillerServiceFactory>(profile);
 
-    if (IsReaderModeAvailable()) {
-      ReaderModeTabHelper::CreateForWebState(
-          web_state, DistillerServiceFactory::GetForProfile(profile));
-    }
-  }
-  security_interstitials::IOSBlockingPageTabHelper::CreateForWebState(
-      web_state);
-  password_manager::WellKnownChangePasswordTabHelper::CreateForWebState(
-      web_state);
+  attacher.Create<security_interstitials::IOSBlockingPageTabHelper>();
+  attacher.Create<password_manager::WellKnownChangePasswordTabHelper>();
+  attacher.Create<InvalidUrlTabHelper>();
 
-  InvalidUrlTabHelper::CreateForWebState(web_state);
+  attacher.CreateWhen<InfobarOverlayRequestInserter>(
+      attacher.IsForStandardNavigation(), &DefaultInfobarOverlayRequestFactory);
+  attacher.CreateWhen<InfobarOverlayTabHelper>(
+      attacher.IsForStandardNavigation());
+  attacher.CreateWhen<TranslateOverlayTabHelper>(
+      attacher.IsForStandardNavigation());
 
-  if (!for_lens_overlay && !for_reader_mode) {
-    InfobarOverlayRequestInserter::CreateForWebState(
-        web_state, &DefaultInfobarOverlayRequestFactory);
-    InfobarOverlayTabHelper::CreateForWebState(web_state);
-    TranslateOverlayTabHelper::CreateForWebState(web_state);
-  }
+  attacher.CreateWhen<FontSizeTabHelper>(ios::provider::IsTextZoomEnabled());
+  attacher.CreateWhen<BreadcrumbManagerTabHelper>(
+      breadcrumbs::IsEnabled(GetApplicationContext()->GetLocalState()));
 
-  if (ios::provider::IsTextZoomEnabled()) {
-    FontSizeTabHelper::CreateForWebState(web_state);
-  }
+  attacher.Create<AnnotationsTabHelper>();
 
-  if (breadcrumbs::IsEnabled(GetApplicationContext()->GetLocalState())) {
-    BreadcrumbManagerTabHelper::CreateForWebState(web_state);
-  }
+  // Safe Browsing helpers are not created for reader mode.
+  attacher
+      .CreateDeferredWhen<SafeBrowsingQueryManager>(!attacher.IsForReaderMode())
+      .WithFactory<SafeBrowsingClientFactory>(profile);
+  attacher
+      .CreateDeferredWhen<SafeBrowsingTabHelper>(!attacher.IsForReaderMode())
+      .WithFactory<SafeBrowsingClientFactory>(profile);
+  attacher.CreateWhen<SafeBrowsingUrlAllowList>(!attacher.IsForReaderMode());
+  attacher.CreateWhen<SafeBrowsingUnsafeResourceContainer>(
+      !attacher.IsForReaderMode());
 
-  AnnotationsTabHelper::CreateForWebState(web_state);
+  attacher.Create<TailoredSecurityTabHelper>(
+      TailoredSecurityServiceFactory::GetForProfile(profile));
+  attacher.Create<PolicyUrlBlockingTabHelper>();
 
-  if (!for_reader_mode) {
-    SafeBrowsingClient* client =
-        SafeBrowsingClientFactory::GetForProfile(profile);
-    SafeBrowsingQueryManager::CreateForWebState(web_state, client);
-    SafeBrowsingTabHelper::CreateForWebState(web_state, client);
-    SafeBrowsingUrlAllowList::CreateForWebState(web_state);
-    SafeBrowsingUnsafeResourceContainer::CreateForWebState(web_state);
-  }
+  // Supervised user services are not supported for off-the-record.
+  attacher.CreateWhen<SupervisedUserURLFilterTabHelper>(
+      !attacher.IsOffTheRecord());
+  attacher.CreateWhen<SupervisedUserErrorContainer>(!attacher.IsOffTheRecord());
 
-  TailoredSecurityTabHelper::CreateForWebState(
-      web_state, TailoredSecurityServiceFactory::GetForProfile(profile));
+  attacher.Create<ImageFetchTabHelper>();
+  attacher.Create<NewTabPageTabHelper>();
+  attacher.Create<ShareFileDownloadTabHelper>();
+  attacher.Create<OptimizationGuideTabHelper>();
+  attacher.Create<OptimizationGuideValidationTabHelper>();
 
-  PolicyUrlBlockingTabHelper::CreateForWebState(web_state);
-
-  // Supervised user services are not supported for off-the-record browser
-  // state.
-  if (!is_off_the_record) {
-    SupervisedUserURLFilterTabHelper::CreateForWebState(web_state);
-    SupervisedUserErrorContainer::CreateForWebState(web_state);
-  }
-
-  ImageFetchTabHelper::CreateForWebState(web_state);
-
-  NewTabPageTabHelper::CreateForWebState(web_state);
-  ShareFileDownloadTabHelper::CreateForWebState(web_state);
-  OptimizationGuideTabHelper::CreateForWebState(web_state);
-  OptimizationGuideValidationTabHelper::CreateForWebState(web_state);
-  ProfileIOS* original_profile = profile->GetOriginalProfile();
-  favicon::WebFaviconDriver::CreateForWebState(
-      web_state, ios::FaviconServiceFactory::GetForProfile(
-                     original_profile, ServiceAccessType::IMPLICIT_ACCESS));
-  history::WebStateTopSitesObserver::CreateForWebState(
-      web_state, ios::TopSitesFactory::GetForProfile(original_profile).get());
+  attacher.Create<favicon::WebFaviconDriver>(
+      ios::FaviconServiceFactory::GetForProfile(
+          original_profile, ServiceAccessType::IMPLICIT_ACCESS));
+  attacher.Create<history::WebStateTopSitesObserver>(
+      ios::TopSitesFactory::GetForProfile(original_profile).get());
 
   // Depends on favicon::WebFaviconDriver, must be created after it.
-  SearchEngineTabHelper::CreateForWebState(web_state);
+  attacher.Create<SearchEngineTabHelper>();
 
   ukm::InitializeSourceUrlRecorderForWebState(web_state);
 
   // Download tab helpers.
-  DownloadManagerTabHelper::CreateForWebState(web_state);
-  SafariDownloadTabHelper::CreateForWebState(web_state);
-  VcardTabHelper::CreateForWebState(web_state);
-  DocumentDownloadTabHelper::CreateForWebState(web_state);
+  attacher.Create<DownloadManagerTabHelper>();
+  attacher.Create<SafariDownloadTabHelper>();
+  attacher.Create<VcardTabHelper>();
+  attacher.Create<DocumentDownloadTabHelper>();
 
-  PageloadForegroundDurationTabHelper::CreateForWebState(web_state);
+  attacher.Create<PageloadForegroundDurationTabHelper>();
 
-  LookalikeUrlTabHelper::CreateForWebState(web_state);
-  LookalikeUrlTabAllowList::CreateForWebState(web_state);
-  LookalikeUrlContainer::CreateForWebState(web_state);
+  attacher.Create<LookalikeUrlTabHelper>();
+  attacher.Create<LookalikeUrlTabAllowList>();
+  attacher.Create<LookalikeUrlContainer>();
 
   // TODO(crbug.com/41360476): pre-rendered WebState have lots of unnecessary
   // tab helpers for historical reasons. For the moment, AttachTabHelpers
   // allows to inhibit the creation of some of them.
-  if (!for_lens_overlay && !for_reader_mode && !for_prerender) {
-    SadTabTabHelper::CreateForWebState(
-        web_state, SadTabTabHelper::kDefaultRepeatFailureInterval);
-    SnapshotTabHelper::CreateForWebState(web_state);
-    SnapshotSourceTabHelper::CreateForWebState(web_state);
-    PagePlaceholderTabHelper::CreateForWebState(web_state);
+  attacher.CreateWhen<SadTabTabHelper>(
+      attacher.IsNotInTabHelperFilter(),
+      SadTabTabHelper::kDefaultRepeatFailureInterval);
+  attacher.CreateWhen<SnapshotTabHelper>(attacher.IsNotInTabHelperFilter());
+  attacher.CreateWhen<SnapshotSourceTabHelper>(
+      attacher.IsNotInTabHelperFilter());
+  attacher.CreateWhen<PagePlaceholderTabHelper>(
+      attacher.IsNotInTabHelperFilter());
+  attacher.CreateWhen<PasswordTabHelper>(attacher.IsNotInTabHelperFilter());
+  attacher.CreateWhen<AutofillBottomSheetTabHelper>(
+      attacher.IsNotInTabHelperFilter());
+  attacher.CreateWhen<AutofillTabHelper>(attacher.IsNotInTabHelperFilter());
 
-    PasswordTabHelper::CreateForWebState(web_state);
-    AutofillBottomSheetTabHelper::CreateForWebState(web_state);
-    AutofillTabHelper::CreateForWebState(web_state);
-  }
+  attacher.CreateWhen<ChromeIOSTranslateClient>(
+      attacher.IsNotInTabHelperFilter(),
+      InfoBarManagerImpl::FromWebState(web_state));
 
-  if (!for_lens_overlay && !for_prerender && !for_reader_mode) {
-    ChromeIOSTranslateClient::CreateForWebState(
-        web_state, InfoBarManagerImpl::FromWebState(web_state));
-  }
-
-  if (!for_lens_overlay && !for_reader_mode) {
+  // Special case for use of GetOrCreateForWebState.
+  if (!attacher.IsForStandardNavigation()) {
     InfobarBadgeTabHelper::GetOrCreateForWebState(web_state);
-    if (base::FeatureList::IsEnabled(kIOSPasskeyShim)) {
-      PasskeyTabHelper::CreateForWebState(
-          web_state, IOSPasskeyModelFactory::GetForProfile(profile),
-          std::make_unique<IOSChromePasskeyClient>(web_state));
-    }
   }
 
-  if (base::FeatureList::IsEnabled(kSharedHighlightingIOS)) {
-    LinkToTextTabHelper::CreateForWebState(web_state);
-  }
+  attacher
+      .CreateDeferredWhen<PasskeyTabHelper>(
+          attacher.IsForStandardNavigation() &&
+          base::FeatureList::IsEnabled(kIOSPasskeyShim))
+      .With([&]() { return IOSPasskeyModelFactory::GetForProfile(profile); },
+            [&]() {
+              return std::make_unique<IOSChromePasskeyClient>(web_state);
+            });
 
-  WebSelectionTabHelper::CreateForWebState(web_state);
+  attacher.CreateWhen<LinkToTextTabHelper>(
+      base::FeatureList::IsEnabled(kSharedHighlightingIOS));
 
-  WebPerformanceMetricsTabHelper::CreateForWebState(web_state);
+  attacher.Create<WebSelectionTabHelper>();
+  attacher.Create<WebPerformanceMetricsTabHelper>();
+  attacher.Create<OfflinePageTabHelper>(
+      ReadingListModelFactory::GetForProfile(profile));
+  attacher.Create<PermissionsTabHelper>();
+  attacher.Create<RepostFormTabHelper>();
+  attacher.Create<HttpsOnlyModeUpgradeTabHelper>(
+      profile->GetPrefs(), HttpsUpgradeServiceFactory::GetForProfile(profile));
+  attacher.Create<HttpsOnlyModeContainer>();
 
-  OfflinePageTabHelper::CreateForWebState(
-      web_state, ReadingListModelFactory::GetForProfile(profile));
-  PermissionsTabHelper::CreateForWebState(web_state);
+  attacher
+      .CreateDeferredWhen<TypedNavigationUpgradeTabHelper>(
+          !attacher.IsForPrerender() &&
+          base::FeatureList::IsEnabled(
+              omnibox::kDefaultTypedNavigationsToHttps))
+      .WithFactory<HttpsUpgradeServiceFactory>(profile);
 
-  RepostFormTabHelper::CreateForWebState(web_state);
+  attacher.CreateWhen<PriceNotificationsTabHelper>(
+      attacher.IsForStandardNavigation() && !attacher.IsOffTheRecord());
 
-  HttpsOnlyModeUpgradeTabHelper::CreateForWebState(
-      web_state, profile->GetPrefs(),
-      HttpsUpgradeServiceFactory::GetForProfile(profile));
-  HttpsOnlyModeContainer::CreateForWebState(web_state);
+  attacher
+      .CreateDeferredWhen<ContextualPanelTabHelper>(
+          attacher.IsForStandardNavigation() && IsContextualPanelEnabled())
+      .With([&]() {
+        ContextualPanelModelService* model_service =
+            ContextualPanelModelServiceFactory::GetForProfile(profile);
+        // Revert back to model_service->models() once DanglingUntriaged is
+        // removed.
+        std::map<ContextualPanelItemType,
+                 raw_ptr<ContextualPanelModel, DanglingUntriaged>>
+            models;
+        for (auto const& [key, val] : model_service->models()) {
+          models.emplace(key, val);
+        }
+        return models;
+      });
 
-  if (!for_prerender &&
-      base::FeatureList::IsEnabled(omnibox::kDefaultTypedNavigationsToHttps)) {
-    TypedNavigationUpgradeTabHelper::CreateForWebState(
-        web_state, HttpsUpgradeServiceFactory::GetForProfile(profile));
-  }
+  auto* optimization_guide_decider =
+      OptimizationGuideServiceFactory::GetForProfile(profile);
+  attacher.CreateWhen<AboutThisSiteTabHelper>(
+      attacher.IsForStandardNavigation() && !attacher.IsOffTheRecord() &&
+          IsAboutThisSiteFeatureEnabled() && optimization_guide_decider,
+      optimization_guide_decider);
 
-  if (!for_lens_overlay && !for_reader_mode && !is_off_the_record) {
-    PriceNotificationsTabHelper::CreateForWebState(web_state);
-  }
+  attacher.CreateWhen<DataSharingTabHelper>(
+      !attacher.IsOffTheRecord() && !attacher.IsForPrerender() &&
+      data_sharing::features::ShouldInterceptUrlForVersioning());
 
-  if (!for_lens_overlay && !for_reader_mode && IsContextualPanelEnabled()) {
-    ContextualPanelModelService* model_service =
-        ContextualPanelModelServiceFactory::GetForProfile(profile);
-    // Revert back to model_service->models() once DanglingUntriaged is removed.
-    std::map<ContextualPanelItemType,
-             raw_ptr<ContextualPanelModel, DanglingUntriaged>>
-        models;
-    for (auto const& [key, val] : model_service->models()) {
-      models.emplace(key, val);
-    }
-    ContextualPanelTabHelper::CreateForWebState(web_state, models);
-  }
+  attacher.Create<EditMenuTabHelper>();
 
-  if (!for_lens_overlay && !for_reader_mode && !is_off_the_record &&
-      IsAboutThisSiteFeatureEnabled()) {
-    if (auto* optimization_guide_decider =
-            OptimizationGuideServiceFactory::GetForProfile(profile)) {
-      AboutThisSiteTabHelper::CreateForWebState(web_state,
-                                                optimization_guide_decider);
-    }
-  }
+  attacher.CreateWhen<MiniMapTabHelper>(
+      !attacher.IsOffTheRecord() &&
+      base::FeatureList::IsEnabled(kIOSMiniMapUniversalLink));
 
-  if (!is_off_the_record && !for_prerender) {
-    if (data_sharing::features::ShouldInterceptUrlForVersioning()) {
-      DataSharingTabHelper::CreateForWebState(web_state);
-    }
-  }
+  attacher.CreateWhen<BwgTabHelper>(!attacher.IsOffTheRecord() &&
+                                    !attacher.IsForPrerender() &&
+                                    IsPageActionMenuEnabled());
 
-  EditMenuTabHelper::CreateForWebState(web_state);
+  attacher.Create<WebViewProxyTabHelper>();
 
-  if (!is_off_the_record &&
-      base::FeatureList::IsEnabled(kIOSMiniMapUniversalLink)) {
-    MiniMapTabHelper::CreateForWebState(web_state);
-  }
-
-  if (!is_off_the_record && !for_prerender && IsPageActionMenuEnabled()) {
-    BwgTabHelper::CreateForWebState(web_state);
-  }
-
-  WebViewProxyTabHelper::CreateForWebState(web_state);
-
-  if (!for_prerender && !for_reader_mode && !for_lens_overlay &&
+  attacher.CreateWhen<ChooseFileTabHelper>(
+      attacher.IsNotInTabHelperFilter() &&
       (base::FeatureList::IsEnabled(kIOSChooseFromDrive) ||
-       base::FeatureList::IsEnabled(kIOSCustomFileUploadMenu))) {
-    ChooseFileTabHelper::CreateForWebState(web_state);
-  }
-  if (!for_prerender && !for_reader_mode && !for_lens_overlay &&
-      base::FeatureList::IsEnabled(kIOSCustomFileUploadMenu)) {
-    LastTapLocationTabHelper::CreateForWebState(web_state);
-  }
+       base::FeatureList::IsEnabled(kIOSCustomFileUploadMenu)));
+  attacher.CreateWhen<LastTapLocationTabHelper>(
+      attacher.IsNotInTabHelperFilter() &&
+      base::FeatureList::IsEnabled(kIOSCustomFileUploadMenu));
 }
diff --git a/ios/chrome/browser/tips_notifications/coordinator/enhanced_safe_browsing_promo_coordinator.mm b/ios/chrome/browser/tips_notifications/coordinator/enhanced_safe_browsing_promo_coordinator.mm
index a96aabdb..a5bb04d 100644
--- a/ios/chrome/browser/tips_notifications/coordinator/enhanced_safe_browsing_promo_coordinator.mm
+++ b/ios/chrome/browser/tips_notifications/coordinator/enhanced_safe_browsing_promo_coordinator.mm
@@ -23,6 +23,7 @@
   EnhancedSafeBrowsingPromoViewController* _viewController;
   EnhancedSafeBrowsingPromoInstructionsViewController*
       _instructionsViewController;
+  UINavigationController* _instructionsNavigationController;
   BOOL _showSettingsOnDismiss;
 }
 
@@ -45,6 +46,7 @@
 - (void)stop {
   _instructionsViewController.actionHandler = nil;
   _instructionsViewController = nil;
+  _instructionsNavigationController = nil;
   ProceduralBlock completion = nil;
   if (_showSettingsOnDismiss) {
     completion = ^{
@@ -68,8 +70,15 @@
   _instructionsViewController =
       [[EnhancedSafeBrowsingPromoInstructionsViewController alloc] init];
   _instructionsViewController.actionHandler = self;
-  _instructionsViewController.presentationController.delegate = self;
-  [_viewController presentViewController:_instructionsViewController
+  _instructionsNavigationController = [[UINavigationController alloc]
+      initWithRootViewController:_instructionsViewController];
+  _instructionsViewController.navigationItem.rightBarButtonItem =
+      [[UIBarButtonItem alloc]
+          initWithBarButtonSystemItem:UIBarButtonSystemItemCancel
+                               target:self
+                               action:@selector(dismissInstructions)];
+  _instructionsNavigationController.presentationController.delegate = self;
+  [_viewController presentViewController:_instructionsNavigationController
                                 animated:YES
                               completion:nil];
 }
@@ -85,19 +94,13 @@
   [self dismissScreen];
 }
 
-- (void)confirmationAlertDismissAction {
-  [_instructionsViewController.presentingViewController
-      dismissViewControllerAnimated:YES
-                         completion:nil];
-  _instructionsViewController = nil;
-}
-
 #pragma mark - UIAdaptivePresentationControllerDelegate
 
 - (void)presentationControllerDidDismiss:
     (UIPresentationController*)presentationController {
   if (presentationController.presentedViewController ==
-      _instructionsViewController) {
+      _instructionsNavigationController) {
+    _instructionsNavigationController = nil;
     _instructionsViewController = nil;
   } else {
     // The UINavigationController was dismissed.
@@ -107,6 +110,13 @@
 
 #pragma mark - Private methods
 
+// Dismisses the instruction sheet.
+- (void)dismissInstructions {
+  [_instructionsNavigationController.presentingViewController
+      dismissViewControllerAnimated:YES
+                         completion:nil];
+}
+
 // Sends a command that will stop this coordinator and dismiss the screen.
 - (void)dismissScreen {
   id<BrowserCoordinatorCommands> handler = HandlerForProtocol(
diff --git a/ios/chrome/browser/tips_notifications/coordinator/lens_promo_coordinator.mm b/ios/chrome/browser/tips_notifications/coordinator/lens_promo_coordinator.mm
index 85ab4d4..dff7e9b 100644
--- a/ios/chrome/browser/tips_notifications/coordinator/lens_promo_coordinator.mm
+++ b/ios/chrome/browser/tips_notifications/coordinator/lens_promo_coordinator.mm
@@ -24,6 +24,7 @@
 @implementation LensPromoCoordinator {
   LensPromoViewController* _viewController;
   LensPromoInstructionsViewController* _instructionsViewController;
+  UINavigationController* _instructionsNavigationController;
   BOOL _presentBubbleOnDismiss;
   BOOL _goToLensOnDismiss;
 }
@@ -48,6 +49,7 @@
 - (void)stop {
   _instructionsViewController.actionHandler = nil;
   _instructionsViewController = nil;
+  _instructionsNavigationController = nil;
   ProceduralBlock completion = nil;
   CommandDispatcher* dispatcher = self.browser->GetCommandDispatcher();
   if (_goToLensOnDismiss) {
@@ -81,8 +83,14 @@
   _instructionsViewController =
       [[LensPromoInstructionsViewController alloc] init];
   _instructionsViewController.actionHandler = self;
-  _instructionsViewController.presentationController.delegate = self;
-  [_viewController presentViewController:_instructionsViewController
+  _instructionsNavigationController = [[UINavigationController alloc]
+      initWithRootViewController:_instructionsViewController];
+  _instructionsViewController.navigationItem.rightBarButtonItem =
+      [[UIBarButtonItem alloc]
+          initWithBarButtonSystemItem:UIBarButtonSystemItemCancel
+                               target:self
+                               action:@selector(dismissInstructions)];
+  [_viewController presentViewController:_instructionsNavigationController
                                 animated:YES
                               completion:nil];
 }
@@ -99,27 +107,24 @@
   [self dismissScreen];
 }
 
-- (void)confirmationAlertDismissAction {
-  [_instructionsViewController.presentingViewController
-      dismissViewControllerAnimated:YES
-                         completion:nil];
-  _instructionsViewController = nil;
-}
-
 #pragma mark - UIAdaptivePresentationControllerDelegate
 
 - (void)presentationControllerDidDismiss:
     (UIPresentationController*)presentationController {
-  if (presentationController.presentedViewController ==
-      _instructionsViewController) {
-    _instructionsViewController = nil;
-  } else {
-    // The UINavigationController was dismissed.
-    [self dismissScreen];
-  }
+  [self dismissScreen];
 }
+
 #pragma mark - Private methods
 
+// Dismisses the instruction sheet.
+- (void)dismissInstructions {
+  [_instructionsNavigationController.presentingViewController
+      dismissViewControllerAnimated:YES
+                         completion:nil];
+  _instructionsNavigationController = nil;
+  _instructionsViewController = nil;
+}
+
 // Sends a command that will stop this coordinator and dismiss the screen.
 - (void)dismissScreen {
   id<BrowserCoordinatorCommands> handler = HandlerForProtocol(
diff --git a/ios/chrome/browser/tips_notifications/coordinator/search_what_you_see_promo_coordinator.mm b/ios/chrome/browser/tips_notifications/coordinator/search_what_you_see_promo_coordinator.mm
index 0c821c0..19dd9a15 100644
--- a/ios/chrome/browser/tips_notifications/coordinator/search_what_you_see_promo_coordinator.mm
+++ b/ios/chrome/browser/tips_notifications/coordinator/search_what_you_see_promo_coordinator.mm
@@ -24,6 +24,7 @@
 @implementation SearchWhatYouSeePromoCoordinator {
   SearchWhatYouSeePromoViewController* _viewController;
   SearchWhatYouSeePromoInstructionsViewController* _instructionsViewController;
+  UINavigationController* _instructionsNavigationController;
 }
 
 #pragma mark - ChromeCoordinator
@@ -60,7 +61,8 @@
 
 - (void)confirmationAlertSecondaryAction {
   if (_viewController.presentedViewController &&
-      _viewController.presentedViewController == _instructionsViewController) {
+      _viewController.presentedViewController ==
+          _instructionsNavigationController) {
     [self openURLInNewTab:GURL(kLearnMoreLensURL)];
 
     return;
@@ -69,23 +71,20 @@
   _instructionsViewController =
       [[SearchWhatYouSeePromoInstructionsViewController alloc] init];
   _instructionsViewController.actionHandler = self;
-  _instructionsViewController.presentationController.delegate = self;
-  [_viewController presentViewController:_instructionsViewController
+  _instructionsNavigationController = [[UINavigationController alloc]
+      initWithRootViewController:_instructionsViewController];
+  _instructionsNavigationController.presentationController.delegate = self;
+  _instructionsViewController.navigationItem.rightBarButtonItem =
+      [[UIBarButtonItem alloc]
+          initWithBarButtonSystemItem:UIBarButtonSystemItemCancel
+                               target:self
+                               action:@selector(dismissInstructions)];
+  [_viewController presentViewController:_instructionsNavigationController
                                 animated:YES
                               completion:nil];
 }
 
 - (void)confirmationAlertDismissAction {
-  if (_viewController.presentedViewController &&
-      _viewController.presentedViewController == _instructionsViewController) {
-    _instructionsViewController.actionHandler = nil;
-    _instructionsViewController = nil;
-
-    [_viewController dismissViewControllerAnimated:YES completion:nil];
-
-    return;
-  }
-
   [self dismiss];
 }
 
@@ -95,9 +94,10 @@
     (UIPresentationController*)presentationController {
   if (presentationController.presentedViewController &&
       presentationController.presentedViewController ==
-          _instructionsViewController) {
+          _instructionsNavigationController) {
     _instructionsViewController.actionHandler = nil;
     _instructionsViewController = nil;
+    _instructionsNavigationController = nil;
 
     return;
   }
@@ -107,6 +107,13 @@
 
 #pragma mark - Private methods
 
+// Dismisses the instructions.
+- (void)dismissInstructions {
+  [_instructionsNavigationController.presentingViewController
+      dismissViewControllerAnimated:YES
+                         completion:nil];
+}
+
 // Sends a command that will stop this coordinator and dismiss the promo.
 - (void)dismiss {
   id<BrowserCoordinatorCommands> handler = HandlerForProtocol(
diff --git a/ios/chrome/browser/webui/ui_bundled/management/management_ui.mm b/ios/chrome/browser/webui/ui_bundled/management/management_ui.mm
index f7e606e..1f2b50d 100644
--- a/ios/chrome/browser/webui/ui_bundled/management/management_ui.mm
+++ b/ios/chrome/browser/webui/ui_bundled/management/management_ui.mm
@@ -84,6 +84,12 @@
   return std::nullopt;
 }
 
+// Whether the Browser Reporting section should be displayed. This section is
+// visible if reporting is enabled at the browser level.
+bool IsBrowserReportingEnabled(PrefService* local_state) {
+  return local_state->GetBoolean(enterprise_reporting::kCloudReportingEnabled);
+}
+
 // Whether the Profile Reporting section should be displayed. This section is
 // visible if reporting is enabled at the profile level.
 bool IsProfileReportingEnabled(PrefService* profile_prefs) {
@@ -181,6 +187,33 @@
   ProfileIOS* profile = ProfileIOS::FromWebUIIOS(web_ui)->GetOriginalProfile();
   source->AddLocalizedString("browserReporting",
                              IDS_MANAGEMENT_BROWSER_REPORTING);
+
+  // Browser reporting
+  source->AddBoolean(
+      "browserReportingEnabled",
+      IsBrowserReportingEnabled(GetApplicationContext()->GetLocalState()));
+  source->AddLocalizedString("browserReportingExplanation",
+                             IDS_MANAGEMENT_BROWSER_REPORTING_EXPLANATION);
+  source->AddLocalizedString("browserReportingOverview",
+                             IDS_MANAGEMENT_BROWSER_REPORTING_OVERVIEW);
+  source->AddLocalizedString(
+      "browserReportingDeviceInformation",
+      IDS_MANAGEMENT_BROWSER_REPORTING_DEVICE_INFORMATION);
+  source->AddLocalizedString(
+      "browserReportingDeviceInformationContinued",
+      IDS_MANAGEMENT_BROWSER_REPORTING_DEVICE_INFORMATION_CONTINUED);
+  source->AddLocalizedString(
+      "browserReportingBrowserAndProfiles",
+      IDS_MANAGEMENT_BROWSER_REPORTING_BROWSER_AND_PROFILES);
+  source->AddLocalizedString(
+      "browserReportingBrowserAndProfilesContinued",
+      IDS_MANAGEMENT_BROWSER_REPORTING_BROWSER_AND_PROFILES_CONTINUED);
+  source->AddLocalizedString("browserReportingPolicy",
+                             IDS_MANAGEMENT_BROWSER_REPORTING_POLICY);
+  source->AddLocalizedString("browserReportingLearnMore",
+                             IDS_MANAGEMENT_BROWSER_REPORTING_LEARN_MORE);
+
+  // Profile reporting
   source->AddBoolean("profileReportingEnabled",
                      IsProfileReportingEnabled(profile->GetPrefs()));
   source->AddLocalizedString("profileReportingExplanation",
diff --git a/ios_internal b/ios_internal
index bcbdb6b..342cef1 160000
--- a/ios_internal
+++ b/ios_internal
@@ -1 +1 @@
-Subproject commit bcbdb6b7cd2a73025b424a1e1735fe13e47fe5b1
+Subproject commit 342cef18f756b0a68d9a51ed4ef6c361285af830
diff --git a/media/gpu/vaapi/vaapi_jpeg_decoder_unittest.cc b/media/gpu/vaapi/vaapi_jpeg_decoder_unittest.cc
index edc43cb..219685c2 100644
--- a/media/gpu/vaapi/vaapi_jpeg_decoder_unittest.cc
+++ b/media/gpu/vaapi/vaapi_jpeg_decoder_unittest.cc
@@ -538,13 +538,18 @@
   viz::SharedImageFormat si_format =
       exported_pixmap->pixmap->GetSharedImageFormat();
   ASSERT_EQ(si_format.NumberOfPlanes(), static_cast<int>(handle.planes.size()));
-  ASSERT_EQ(si_format, viz::MultiPlaneFormat::kYV12);
-  std::swap(handle.planes[1], handle.planes[2]);
+  if (si_format == viz::MultiPlaneFormat::kYV12) {
+    std::swap(handle.planes[1], handle.planes[2]);
+  } else {
+    ASSERT_EQ(si_format, viz::MultiPlaneFormat::kNV12);
+  }
 
   std::unique_ptr<vaapi_test_utils::DecodedImage> decoded_image =
       vaapi_test_utils::NativePixmapToDecodedImage(
           handle, exported_pixmap->pixmap->GetBufferSize(),
-          gfx::BufferFormat::YVU_420);
+          si_format == viz::MultiPlaneFormat::kYV12
+              ? gfx::BufferFormat::YVU_420
+              : gfx::BufferFormat::YUV_420_BIPLANAR);
   ASSERT_TRUE(decoded_image);
 
   // Decode the image using libyuv. Using |temp_*| for resource management.
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc
index 37b41e9..ed8ee74 100644
--- a/net/http/http_network_transaction_unittest.cc
+++ b/net/http/http_network_transaction_unittest.cc
@@ -28860,4 +28860,56 @@
             alternative_service_info_vector[0].alternative_service().host);
 }
 
+// If the proxy is not direct, we should see no additional capacity offered.
+TEST_P(HttpNetworkTransactionTest, ProxyAdditionalCapacity) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndEnableFeatureWithParameters(
+      features::kTcpSocketPoolLimitRandomization,
+      {
+          {
+              "TcpSocketPoolLimitRandomizationBase",
+              "0.1",
+          },
+          {
+              "TcpSocketPoolLimitRandomizationCapacity",
+              "2",
+          },
+          {
+              "TcpSocketPoolLimitRandomizationMinimum",
+              "0.3",
+          },
+          {
+              "TcpSocketPoolLimitRandomizationNoise",
+              "0.4",
+          },
+      });
+  std::unique_ptr<HttpNetworkSession> session = CreateSession(&session_deps_);
+  EXPECT_EQ(session
+                ->GetSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL,
+                                ProxyChain::Direct())
+                ->AdditionalCapacityForTest(),
+            SocketPoolAdditionalCapacity::CreateForTest(0.1, 2, 0.3, 0.4));
+  EXPECT_EQ(session
+                ->GetSocketPool(HttpNetworkSession::WEBSOCKET_SOCKET_POOL,
+                                ProxyChain::Direct())
+                ->AdditionalCapacityForTest(),
+            SocketPoolAdditionalCapacity::CreateForTest(0.1, 2, 0.3, 0.4));
+  EXPECT_EQ(session
+                ->GetSocketPool(
+                    HttpNetworkSession::NORMAL_SOCKET_POOL,
+                    ProxyChain(ProxyServer::SCHEME_HTTPS,
+                               SameProxyWithDifferentSchemesProxyResolver::
+                                   ProxyHostPortPair()))
+                ->AdditionalCapacityForTest(),
+            SocketPoolAdditionalCapacity::CreateEmpty());
+  EXPECT_EQ(session
+                ->GetSocketPool(
+                    HttpNetworkSession::WEBSOCKET_SOCKET_POOL,
+                    ProxyChain(ProxyServer::SCHEME_HTTPS,
+                               SameProxyWithDifferentSchemesProxyResolver::
+                                   ProxyHostPortPair()))
+                ->AdditionalCapacityForTest(),
+            SocketPoolAdditionalCapacity::CreateEmpty());
+}
+
 }  // namespace net
diff --git a/net/http/transport_security_state_static.pins b/net/http/transport_security_state_static.pins
index 5c30622..6b3605f 100644
--- a/net/http/transport_security_state_static.pins
+++ b/net/http/transport_security_state_static.pins
@@ -43,9 +43,9 @@
 #   hash function for preloaded entries again (we have already done so once).
 #
 
-# Last updated: 2025-11-19 12:52 UTC
+# Last updated: 2025-11-20 12:53 UTC
 PinsListTimestamp
-1763556756
+1763643200
 
 TestSPKI
 sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
diff --git a/net/http/transport_security_state_static_pins.json b/net/http/transport_security_state_static_pins.json
index 14520a3..40bb7978 100644
--- a/net/http/transport_security_state_static_pins.json
+++ b/net/http/transport_security_state_static_pins.json
@@ -31,7 +31,7 @@
 // the 'static_spki_hashes' and 'bad_static_spki_hashes' fields in 'pinsets'
 // refer to, and the timestamp at which the pins list was last updated.
 //
-// Last updated: 2025-11-19 12:52 UTC
+// Last updated: 2025-11-20 12:53 UTC
 //
 {
   "pinsets": [
diff --git a/net/socket/client_socket_pool.h b/net/socket/client_socket_pool.h
index 3c6b5159..45aa8275 100644
--- a/net/socket/client_socket_pool.h
+++ b/net/socket/client_socket_pool.h
@@ -369,6 +369,10 @@
   static base::TimeDelta used_idle_socket_timeout();
   static void set_used_idle_socket_timeout(base::TimeDelta timeout);
 
+  const SocketPoolAdditionalCapacity& AdditionalCapacityForTest() const {
+    return AdditionalCapacity();
+  }
+
  protected:
   ClientSocketPool(size_t socket_soft_cap,
                    SocketPoolAdditionalCapacity additional_capacity,
diff --git a/net/socket/client_socket_pool_manager_impl.cc b/net/socket/client_socket_pool_manager_impl.cc
index 5bef386..0896200 100644
--- a/net/socket/client_socket_pool_manager_impl.cc
+++ b/net/socket/client_socket_pool_manager_impl.cc
@@ -66,6 +66,8 @@
 
   size_t sockets_per_proxy_chain;
   size_t sockets_per_group;
+  SocketPoolAdditionalCapacity additional_capacity =
+      SocketPoolAdditionalCapacity::Create();
   if (proxy_chain.is_direct()) {
     sockets_per_proxy_chain = socket_soft_cap_per_pool(pool_type_);
     sockets_per_group = max_sockets_per_group(pool_type_);
@@ -73,6 +75,7 @@
     sockets_per_proxy_chain = max_sockets_per_proxy_chain(pool_type_);
     sockets_per_group =
         std::min(sockets_per_proxy_chain, max_sockets_per_group(pool_type_));
+    additional_capacity = SocketPoolAdditionalCapacity::CreateEmpty();
   }
 
   std::unique_ptr<ClientSocketPool> new_pool;
@@ -81,12 +84,11 @@
   if (pool_type_ == HttpNetworkSession::WEBSOCKET_SOCKET_POOL &&
       proxy_chain.is_direct()) {
     new_pool = std::make_unique<WebSocketTransportClientSocketPool>(
-        sockets_per_proxy_chain, SocketPoolAdditionalCapacity::Create(),
-        proxy_chain, &websocket_common_connect_job_params_);
+        sockets_per_proxy_chain, additional_capacity, proxy_chain,
+        &websocket_common_connect_job_params_);
   } else {
     new_pool = std::make_unique<TransportClientSocketPool>(
-        sockets_per_proxy_chain, sockets_per_group,
-        SocketPoolAdditionalCapacity::Create(),
+        sockets_per_proxy_chain, sockets_per_group, additional_capacity,
         unused_idle_socket_timeout(pool_type_), proxy_chain,
         pool_type_ == HttpNetworkSession::WEBSOCKET_SOCKET_POOL,
         &common_connect_job_params_, cleanup_on_ip_address_change_);
diff --git a/net/socket/socket_pool_additional_capacity.cc b/net/socket/socket_pool_additional_capacity.cc
index df416cf8..cec80c6 100644
--- a/net/socket/socket_pool_additional_capacity.cc
+++ b/net/socket/socket_pool_additional_capacity.cc
@@ -41,6 +41,10 @@
   return SocketPoolAdditionalCapacity();
 }
 
+SocketPoolAdditionalCapacity SocketPoolAdditionalCapacity::CreateEmpty() {
+  return SocketPoolAdditionalCapacity();
+}
+
 // static
 SocketPoolAdditionalCapacity SocketPoolAdditionalCapacity::CreateForTest(
     double base,
diff --git a/net/socket/socket_pool_additional_capacity.h b/net/socket/socket_pool_additional_capacity.h
index 9287ded..5582c23 100644
--- a/net/socket/socket_pool_additional_capacity.h
+++ b/net/socket/socket_pool_additional_capacity.h
@@ -30,6 +30,9 @@
   // This initializes using values from kTcpSocketPoolLimitRandomization.
   static SocketPoolAdditionalCapacity Create();
 
+  // This initializes an empty pool that contains no capacity.
+  static SocketPoolAdditionalCapacity CreateEmpty();
+
   static SocketPoolAdditionalCapacity CreateForTest(double base,
                                                     size_t capacity,
                                                     double minimum,
diff --git a/net/socket/socket_pool_additional_capacity_unittest.cc b/net/socket/socket_pool_additional_capacity_unittest.cc
index 2e2d834..72a4f05 100644
--- a/net/socket/socket_pool_additional_capacity_unittest.cc
+++ b/net/socket/socket_pool_additional_capacity_unittest.cc
@@ -16,9 +16,6 @@
 
 namespace {
 
-const SocketPoolAdditionalCapacity kEmptyPool =
-    SocketPoolAdditionalCapacity::CreateForTest(0.0, 0, 0.0, 0.0);
-
 // This should be kept in sync with the field trial config's default pool.
 const SocketPoolAdditionalCapacity kFieldTrialPool =
     SocketPoolAdditionalCapacity::CreateForTest(0.000001, 256, 0.01, 0.2);
@@ -27,7 +24,8 @@
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitAndDisableFeature(
       features::kTcpSocketPoolLimitRandomization);
-  EXPECT_EQ(SocketPoolAdditionalCapacity::Create(), kEmptyPool);
+  EXPECT_EQ(SocketPoolAdditionalCapacity::Create(),
+            SocketPoolAdditionalCapacity::CreateEmpty());
 }
 
 TEST(SocketPoolAdditionalCapacityTest, CreateWithEnabledFeature) {
@@ -64,36 +62,39 @@
 }
 
 TEST(SocketPoolAdditionalCapacityTest, InvalidCreation) {
+  const SocketPoolAdditionalCapacity empty_pool =
+      SocketPoolAdditionalCapacity::CreateEmpty();
+
   // base range
   EXPECT_EQ(SocketPoolAdditionalCapacity::CreateForTest(-0.1, 2, 0.3, 0.4),
-            kEmptyPool);
+            empty_pool);
   EXPECT_EQ(SocketPoolAdditionalCapacity::CreateForTest(1.1, 2, 0.3, 0.4),
-            kEmptyPool);
+            empty_pool);
   EXPECT_EQ(
       SocketPoolAdditionalCapacity::CreateForTest(std::nan(""), 2, 0.3, 0.4),
-      kEmptyPool);
+      empty_pool);
 
   // capacity range
   EXPECT_EQ(SocketPoolAdditionalCapacity::CreateForTest(0.1, 2000, 0.3, 0.4),
-            kEmptyPool);
+            empty_pool);
 
   // minimum range
   EXPECT_EQ(SocketPoolAdditionalCapacity::CreateForTest(0.1, 2, -0.3, 0.4),
-            kEmptyPool);
+            empty_pool);
   EXPECT_EQ(SocketPoolAdditionalCapacity::CreateForTest(0.1, 2, 1.3, 0.4),
-            kEmptyPool);
+            empty_pool);
   EXPECT_EQ(
       SocketPoolAdditionalCapacity::CreateForTest(0.1, 2, std::nan(""), 0.4),
-      kEmptyPool);
+      empty_pool);
 
   // noise range
   EXPECT_EQ(SocketPoolAdditionalCapacity::CreateForTest(0.1, 2, 0.3, -0.4),
-            kEmptyPool);
+            empty_pool);
   EXPECT_EQ(SocketPoolAdditionalCapacity::CreateForTest(0.1, 2, 0.3, 1.4),
-            kEmptyPool);
+            empty_pool);
   EXPECT_EQ(
       SocketPoolAdditionalCapacity::CreateForTest(0.1, 2, 0.3, std::nan("")),
-      kEmptyPool);
+      empty_pool);
 }
 
 TEST(SocketPoolAdditionalCapacityTest, NextStateBeforeAllocation) {
@@ -201,42 +202,45 @@
 }
 
 TEST(SocketPoolAdditionalCapacityTest, EmptyPool) {
+  const SocketPoolAdditionalCapacity empty_pool =
+      SocketPoolAdditionalCapacity::CreateEmpty();
+
   // No sockets in use
   EXPECT_EQ(
       SocketPoolState::kUncapped,
-      kEmptyPool.NextStateBeforeAllocation(SocketPoolState::kUncapped, 0, 256));
+      empty_pool.NextStateBeforeAllocation(SocketPoolState::kUncapped, 0, 256));
   EXPECT_EQ(
       SocketPoolState::kUncapped,
-      kEmptyPool.NextStateAfterRelease(SocketPoolState::kUncapped, 0, 256));
-  EXPECT_EQ(SocketPoolState::kUncapped, kEmptyPool.NextStateBeforeAllocation(
+      empty_pool.NextStateAfterRelease(SocketPoolState::kUncapped, 0, 256));
+  EXPECT_EQ(SocketPoolState::kUncapped, empty_pool.NextStateBeforeAllocation(
                                             SocketPoolState::kCapped, 0, 256));
   EXPECT_EQ(SocketPoolState::kUncapped,
-            kEmptyPool.NextStateAfterRelease(SocketPoolState::kCapped, 0, 256));
+            empty_pool.NextStateAfterRelease(SocketPoolState::kCapped, 0, 256));
 
   // 50% of soft cap in use
   EXPECT_EQ(SocketPoolState::kUncapped,
-            kEmptyPool.NextStateBeforeAllocation(SocketPoolState::kUncapped,
+            empty_pool.NextStateBeforeAllocation(SocketPoolState::kUncapped,
                                                  128, 256));
   EXPECT_EQ(
       SocketPoolState::kUncapped,
-      kEmptyPool.NextStateAfterRelease(SocketPoolState::kUncapped, 128, 256));
+      empty_pool.NextStateAfterRelease(SocketPoolState::kUncapped, 128, 256));
   EXPECT_EQ(
       SocketPoolState::kUncapped,
-      kEmptyPool.NextStateBeforeAllocation(SocketPoolState::kCapped, 128, 256));
+      empty_pool.NextStateBeforeAllocation(SocketPoolState::kCapped, 128, 256));
   EXPECT_EQ(
       SocketPoolState::kUncapped,
-      kEmptyPool.NextStateAfterRelease(SocketPoolState::kCapped, 128, 256));
+      empty_pool.NextStateAfterRelease(SocketPoolState::kCapped, 128, 256));
 
   // 100% of soft cap in use
   EXPECT_EQ(SocketPoolState::kCapped,
-            kEmptyPool.NextStateBeforeAllocation(SocketPoolState::kUncapped,
+            empty_pool.NextStateBeforeAllocation(SocketPoolState::kUncapped,
                                                  256, 256));
   EXPECT_EQ(
       SocketPoolState::kCapped,
-      kEmptyPool.NextStateAfterRelease(SocketPoolState::kUncapped, 256, 256));
-  EXPECT_EQ(SocketPoolState::kCapped, kEmptyPool.NextStateBeforeAllocation(
+      empty_pool.NextStateAfterRelease(SocketPoolState::kUncapped, 256, 256));
+  EXPECT_EQ(SocketPoolState::kCapped, empty_pool.NextStateBeforeAllocation(
                                           SocketPoolState::kCapped, 256, 256));
-  EXPECT_EQ(SocketPoolState::kCapped, kEmptyPool.NextStateAfterRelease(
+  EXPECT_EQ(SocketPoolState::kCapped, empty_pool.NextStateAfterRelease(
                                           SocketPoolState::kCapped, 256, 256));
 }
 
diff --git a/remoting/resources/remoting_strings_ar.xtb b/remoting/resources/remoting_strings_ar.xtb
index cf61004..f3e6499 100644
--- a/remoting/resources/remoting_strings_ar.xtb
+++ b/remoting/resources/remoting_strings_ar.xtb
@@ -97,7 +97,7 @@
 <translation id="5170982930780719864">رقم تعريف المضيف غير صالح.</translation>
 <translation id="5204575267916639804">الأسئلة الشائعة</translation>
 <translation id="5222676887888702881">تسجيل الخروج</translation>
-<translation id="5234764350956374838">تجاهل</translation>
+<translation id="5234764350956374838">إغلاق</translation>
 <translation id="5308380583665731573">اتصال</translation>
 <translation id="533625276787323658">لا يوجد أي جهاز كمبيوتر للاتصال به</translation>
 <translation id="5397086374758643919">‏أداة إزالة مضيف سطح المكتب البعيد من Chrome</translation>
diff --git a/sandbox/linux/integration_tests/bpf_dsl_seccomp_unittest.cc b/sandbox/linux/integration_tests/bpf_dsl_seccomp_unittest.cc
index 8e0e52ad..d9aec9c9 100644
--- a/sandbox/linux/integration_tests/bpf_dsl_seccomp_unittest.cc
+++ b/sandbox/linux/integration_tests/bpf_dsl_seccomp_unittest.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include <errno.h>
 #include <fcntl.h>
 #include <pthread.h>
@@ -27,6 +22,7 @@
 #include <memory>
 #include <vector>
 
+#include "base/compiler_specific.h"
 #include "base/containers/adapters.h"
 #include "base/containers/contains.h"
 #include "base/containers/span.h"
@@ -668,7 +664,7 @@
   // unaffected by our policy.
   struct utsname uts = {};
   BPF_ASSERT(!uname(&uts));
-  BPF_ASSERT(!strcmp(uts.sysname, "Linux"));
+  UNSAFE_TODO(BPF_ASSERT(!strcmp(uts.sysname, "Linux")));
 }
 
 intptr_t AllowRedirectedSyscall(const struct arch_seccomp_data& args, void*) {
@@ -1701,24 +1697,19 @@
     // call. But if we ever get called for anything else, we want to verbosely
     // print as much information as possible.
     const char* msg = (const char*)aux;
-    printf(
-        "Clone() was called with unexpected arguments\n"
-        "  nr: %d\n"
-        "  1: 0x%llX\n"
-        "  2: 0x%llX\n"
-        "  3: 0x%llX\n"
-        "  4: 0x%llX\n"
-        "  5: 0x%llX\n"
-        "  6: 0x%llX\n"
-        "%s\n",
-        args.nr,
-        (long long)args.args[0],
-        (long long)args.args[1],
-        (long long)args.args[2],
-        (long long)args.args[3],
-        (long long)args.args[4],
-        (long long)args.args[5],
-        msg);
+    UNSAFE_TODO(
+        printf("Clone() was called with unexpected arguments\n"
+               "  nr: %d\n"
+               "  1: 0x%llX\n"
+               "  2: 0x%llX\n"
+               "  3: 0x%llX\n"
+               "  4: 0x%llX\n"
+               "  5: 0x%llX\n"
+               "  6: 0x%llX\n"
+               "%s\n",
+               args.nr, (long long)args.args[0], (long long)args.args[1],
+               (long long)args.args[2], (long long)args.args[3],
+               (long long)args.args[4], (long long)args.args[5], msg));
   }
   return -EPERM;
 }
@@ -2073,7 +2064,7 @@
       return false;
     }
     count -= transfered;
-    buffer += transfered;
+    UNSAFE_TODO(buffer += transfered);
     offset += transfered;
   }
   return true;
@@ -2086,7 +2077,7 @@
       return false;
     }
     count -= transfered;
-    buffer += transfered;
+    UNSAFE_TODO(buffer += transfered);
     offset += transfered;
   }
   return true;
@@ -2140,7 +2131,8 @@
                          read_test_string,
                          sizeof(read_test_string),
                          kLargeOffset));
-  BPF_ASSERT_EQ(0, memcmp(kTestString, read_test_string, sizeof(kTestString)));
+  UNSAFE_TODO(BPF_ASSERT_EQ(
+      0, memcmp(kTestString, read_test_string, sizeof(kTestString))));
   BPF_ASSERT(pread_64_was_forwarded);
 }
 
diff --git a/sandbox/linux/integration_tests/seccomp_broker_process_unittest.cc b/sandbox/linux/integration_tests/seccomp_broker_process_unittest.cc
index 11e47ddb..4e73c378 100644
--- a/sandbox/linux/integration_tests/seccomp_broker_process_unittest.cc
+++ b/sandbox/linux/integration_tests/seccomp_broker_process_unittest.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include <errno.h>
 #include <fcntl.h>
 #include <sys/inotify.h>
@@ -19,6 +14,7 @@
 #include <type_traits>
 #include <vector>
 
+#include "base/compiler_specific.h"
 #include "base/files/file.h"
 #include "base/files/file_path.h"
 #include "base/files/file_path_watcher.h"
@@ -956,7 +952,7 @@
     // Open cpuinfo directly.
     int cpu_info_fd = HANDLE_EINTR(open(kFileCpuInfo, O_RDONLY));
     BPF_ASSERT_GE(cpu_info_fd, 0);
-    memset(cpuinfo_buf_, 1, sizeof(cpuinfo_buf_));
+    UNSAFE_TODO(memset(cpuinfo_buf_, 1, sizeof(cpuinfo_buf_)));
     read_len_unsandboxed_ =
         HANDLE_EINTR(read(cpu_info_fd, cpuinfo_buf_, sizeof(cpuinfo_buf_)));
     BPF_ASSERT_GT(read_len_unsandboxed_, 0);
@@ -986,7 +982,7 @@
     base::ScopedFD cpuinfo_fd_closer(cpuinfo_fd);
     BPF_ASSERT_GE(cpuinfo_fd, 0);
     char buf[3];
-    memset(buf, 0, sizeof(buf));
+    UNSAFE_TODO(memset(buf, 0, sizeof(buf)));
     int read_len_sandboxed = HANDLE_EINTR(read(cpuinfo_fd, buf, sizeof(buf)));
     BPF_ASSERT_GT(read_len_sandboxed, 0);
 
@@ -994,7 +990,8 @@
     BPF_ASSERT_EQ(read_len_sandboxed, read_len_unsandboxed_);
     // Compare the cpuinfo as returned by the broker with the one we opened
     // ourselves.
-    BPF_ASSERT_EQ(memcmp(buf, cpuinfo_buf_, read_len_sandboxed), 0);
+    UNSAFE_TODO(
+        BPF_ASSERT_EQ(memcmp(buf, cpuinfo_buf_, read_len_sandboxed), 0));
   }
 
  private:
@@ -1046,7 +1043,7 @@
     len = HANDLE_EINTR(read(tempfile.fd(), buf, sizeof(buf)));
 
     BPF_ASSERT_EQ(len, static_cast<ssize_t>(sizeof(test_text)));
-    BPF_ASSERT_EQ(memcmp(test_text, buf, sizeof(test_text)), 0);
+    UNSAFE_TODO(BPF_ASSERT_EQ(memcmp(test_text, buf, sizeof(test_text)), 0));
 
     BPF_ASSERT_EQ(close(tempfile2), 0);
   }
@@ -1280,7 +1277,7 @@
       char buf[1024];
       ssize_t len = HANDLE_EINTR(read(fd_check, buf, sizeof(buf)));
       BPF_ASSERT_EQ(len, static_cast<ssize_t>(sizeof(kTestText)));
-      BPF_ASSERT_EQ(memcmp(kTestText, buf, sizeof(kTestText)), 0);
+      UNSAFE_TODO(BPF_ASSERT_EQ(memcmp(kTestText, buf, sizeof(kTestText)), 0));
     }
   }
 
@@ -1309,7 +1306,7 @@
  public:
   BrokerParams ChildSetUpPreSandbox() override {
     BPF_ASSERT_EQ(12, HANDLE_EINTR(write(tmp_file_.fd(), "blahblahblah", 12)));
-    memset(&sb_, 0, sizeof(sb_));
+    UNSAFE_TODO(memset(&sb_, 0, sizeof(sb_)));
     return BrokerParams();
   }
 
@@ -1868,7 +1865,8 @@
     ssize_t retlen = syscaller->Readlink(newpath_.c_str(), readlink_buf_,
                                          sizeof(readlink_buf_));
     BPF_ASSERT(retlen == static_cast<ssize_t>(oldpath_.length()));
-    BPF_ASSERT_EQ(0, memcmp(oldpath_.c_str(), readlink_buf_, retlen));
+    UNSAFE_TODO(
+        BPF_ASSERT_EQ(0, memcmp(oldpath_.c_str(), readlink_buf_, retlen)));
   }
 };
 
@@ -2808,7 +2806,7 @@
     std::vector<char> buf(4096);
     BPF_ASSERT_GE(read(inotify_instance.get(), buf.data(), buf.size()), 0);
     struct inotify_event* event =
-        reinterpret_cast<struct inotify_event*>(buf.data());
+        UNSAFE_TODO(reinterpret_cast<struct inotify_event*>(buf.data()));
     BPF_ASSERT_EQ(event->wd, wd);
 
     // Removing the watch should succeed.
@@ -2864,7 +2862,8 @@
                                                     base::File::FLAG_READ |
                                                     base::File::FLAG_WRITE);
     char buf2[] = "a";
-    BPF_ASSERT_EQ(temp_file_again.Write(0, buf2, sizeof(buf2)), sizeof(buf2));
+    UNSAFE_TODO(BPF_ASSERT_EQ(temp_file_again.Write(0, buf2, sizeof(buf2)),
+                              sizeof(buf2)));
     temp_file_again.Flush();
     temp_file_again.Close();
     // Wait until we receive a notification about the file modification.
diff --git a/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc b/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc
index 424f755..3882967 100644
--- a/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc
+++ b/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 // Note: any code in this file MUST be async-signal safe.
 
 #include "sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h"
@@ -89,7 +84,7 @@
       break;
     }
     size -= ret;
-    error_message += ret;
+    UNSAFE_TODO(error_message += ret);
   }
 }
 
@@ -499,35 +494,44 @@
   uint64_t call = args.args[0];
   if (args.nr == __NR_socketcall && 0 < call && call <= kLastSocketcall) {
     const size_t real_args_arr_len =
-        socketcall_args[call].num_args + socketcall_args[call].num_zeroes;
+        UNSAFE_TODO(socketcall_args[call]).num_args +
+        UNSAFE_TODO(socketcall_args[call]).num_zeroes;
 // The length of this array is bounded by the entries in the array above,
 // but the compiler isn't smart enough to figure that out.
 #pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Wvla-extension"
     unsigned long real_args_arr[real_args_arr_len];
 #pragma clang diagnostic pop
-    memcpy(real_args_arr, reinterpret_cast<unsigned long*>(args.args[1]),
-           real_args_arr_len * sizeof(unsigned long));
-    memset(real_args_arr + socketcall_args[call].num_args, 0,
-           socketcall_args[call].num_zeroes * sizeof(unsigned long));
+    UNSAFE_TODO(memcpy(real_args_arr,
+                       reinterpret_cast<unsigned long*>(args.args[1]),
+                       real_args_arr_len * sizeof(unsigned long)));
+    UNSAFE_TODO(
+        memset(real_args_arr + socketcall_args[call].num_args, 0,
+               socketcall_args[call].num_zeroes * sizeof(unsigned long)));
     switch (real_args_arr_len) {
       case 2:
-        return syscall(socketcall_args[call].sysno, real_args_arr[0],
-                       real_args_arr[1]);
+        return syscall(UNSAFE_TODO(socketcall_args[call]).sysno,
+                       real_args_arr[0], UNSAFE_TODO(real_args_arr[1]));
       case 3:
-        return syscall(socketcall_args[call].sysno, real_args_arr[0],
-                       real_args_arr[1], real_args_arr[2]);
+        return syscall(UNSAFE_TODO(socketcall_args[call]).sysno,
+                       real_args_arr[0], UNSAFE_TODO(real_args_arr[1]),
+                       UNSAFE_TODO(real_args_arr[2]));
       case 4:
-        return syscall(socketcall_args[call].sysno, real_args_arr[0],
-                       real_args_arr[1], real_args_arr[2], real_args_arr[3]);
+        return syscall(UNSAFE_TODO(socketcall_args[call]).sysno,
+                       real_args_arr[0], UNSAFE_TODO(real_args_arr[1]),
+                       UNSAFE_TODO(real_args_arr[2]),
+                       UNSAFE_TODO(real_args_arr[3]));
       case 5:
-        return syscall(socketcall_args[call].sysno, real_args_arr[0],
-                       real_args_arr[1], real_args_arr[2], real_args_arr[3],
-                       real_args_arr[4]);
+        return syscall(
+            UNSAFE_TODO(socketcall_args[call]).sysno, real_args_arr[0],
+            UNSAFE_TODO(real_args_arr[1]), UNSAFE_TODO(real_args_arr[2]),
+            UNSAFE_TODO(real_args_arr[3]), UNSAFE_TODO(real_args_arr[4]));
       case 6:
-        return syscall(socketcall_args[call].sysno, real_args_arr[0],
-                       real_args_arr[1], real_args_arr[2], real_args_arr[3],
-                       real_args_arr[4], real_args_arr[5]);
+        return syscall(
+            UNSAFE_TODO(socketcall_args[call]).sysno, real_args_arr[0],
+            UNSAFE_TODO(real_args_arr[1]), UNSAFE_TODO(real_args_arr[2]),
+            UNSAFE_TODO(real_args_arr[3]), UNSAFE_TODO(real_args_arr[4]),
+            UNSAFE_TODO(real_args_arr[5]));
       default:
         break;
     }
diff --git a/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers_unittest.cc b/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers_unittest.cc
index 391d9ca..8b0eeca 100644
--- a/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers_unittest.cc
+++ b/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers_unittest.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h"
 
 #include <fcntl.h>
@@ -21,6 +16,7 @@
 #include <utility>
 
 #include "base/check_op.h"
+#include "base/compiler_specific.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_file.h"
 #include "base/strings/safe_sprintf.h"
@@ -188,7 +184,8 @@
 SANDBOX_EXPORT intptr_t
 SIGSYSDirectSocketSyscallHandler(const struct arch_seccomp_data& args, void*) {
   // Record syscall args.
-  memcpy(g_syscall_args, args.args, kNumArgsToCopy * sizeof(uint64_t));
+  UNSAFE_TODO(
+      memcpy(g_syscall_args, args.args, kNumArgsToCopy * sizeof(uint64_t)));
   g_syscall_no = args.nr;
   return kDirectSocketSyscallRetVal;
 }
@@ -239,8 +236,8 @@
   // If the args don't match, crash to fail the test.
   for (size_t i = 0; i < N; i++) {
     unsigned long rewritten_socketcall_arg =
-        *reinterpret_cast<unsigned long*>(&g_syscall_args[i]);
-    CHECK_EQ(rewritten_socketcall_arg, expected_args[i])
+        *reinterpret_cast<unsigned long*>(&UNSAFE_TODO(g_syscall_args[i]));
+    UNSAFE_TODO(CHECK_EQ(rewritten_socketcall_arg, expected_args[i]))
         << "Socketcall " << current_socketcall << " differs at argument " << i;
   }
 }
diff --git a/sandbox/linux/seccomp-bpf/sandbox_bpf.cc b/sandbox/linux/seccomp-bpf/sandbox_bpf.cc
index d34da5b..8ad0ed31 100644
--- a/sandbox/linux/seccomp-bpf/sandbox_bpf.cc
+++ b/sandbox/linux/seccomp-bpf/sandbox_bpf.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "sandbox/linux/seccomp-bpf/sandbox_bpf.h"
 
 #include <errno.h>
@@ -239,7 +234,7 @@
 #pragma clang diagnostic pop
   const struct sock_fprog prog = {static_cast<unsigned short>(program.size()),
                                   bpf};
-  memcpy(bpf, &program[0], sizeof(bpf));
+  UNSAFE_TODO(memcpy(bpf, &program[0], sizeof(bpf)));
   CodeGen::Program().swap(program);  // vector swap trick
 
   // Make an attempt to release memory that is no longer needed here, rather
diff --git a/sandbox/linux/seccomp-bpf/syscall_unittest.cc b/sandbox/linux/seccomp-bpf/syscall_unittest.cc
index 95da98c..9f42360 100644
--- a/sandbox/linux/seccomp-bpf/syscall_unittest.cc
+++ b/sandbox/linux/seccomp-bpf/syscall_unittest.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "sandbox/linux/seccomp-bpf/syscall.h"
 
 #include <asm/unistd.h>
@@ -22,6 +17,7 @@
 #include <array>
 #include <vector>
 
+#include "base/compiler_specific.h"
 #include "base/memory/page_size.h"
 #include "base/memory/raw_ptr.h"
 #include "base/posix/eintr_wrapper.h"
@@ -50,7 +46,8 @@
 template <typename T>
 T LoadBehind(intptr_t ptr) {
   T ret;
-  memcpy(&ret, reinterpret_cast<const void*>(ptr - sizeof(T)), sizeof(ret));
+  UNSAFE_TODO(memcpy(&ret, reinterpret_cast<const void*>(ptr - sizeof(T)),
+                     sizeof(ret)));
   return ret;
 }
 
@@ -111,7 +108,8 @@
   std::vector<uint64_t>* const seen_syscall_args =
       static_cast<std::vector<uint64_t>*>(aux);
   BPF_ASSERT(std::size(args.args) == 6);
-  seen_syscall_args->assign(args.args, args.args + std::size(args.args));
+  seen_syscall_args->assign(args.args,
+                            UNSAFE_TODO(args.args + std::size(args.args)));
   return -ENOMEM;
 }
 
@@ -244,14 +242,14 @@
                                                           )));
 #if !defined(MEMORY_SANITIZER)
   // MSan considers the memory backing addr2 uninitialized.
-  EXPECT_EQ(0, memcmp(addr2 + kPageSize, addr3, kPageSize));
+  UNSAFE_TODO(EXPECT_EQ(0, memcmp(addr2 + kPageSize, addr3, kPageSize)));
 
   // Just to be absolutely on the safe side, also verify that the file
   // contents matches what we are getting from a read() operation.
   base::FixedArray<char> buf(2 * kPageSize);
   EXPECT_EQ(2 * kPageSize, static_cast<size_t>(Syscall::Call(
                                __NR_read, fd, buf.data(), 2 * kPageSize)));
-  EXPECT_EQ(0, memcmp(addr2, buf.data(), 2 * kPageSize));
+  UNSAFE_TODO(EXPECT_EQ(0, memcmp(addr2, buf.data(), 2 * kPageSize)));
 #endif
 
   // Clean up
diff --git a/sandbox/linux/seccomp-bpf/trap.cc b/sandbox/linux/seccomp-bpf/trap.cc
index 9fbefe3..1316786d 100644
--- a/sandbox/linux/seccomp-bpf/trap.cc
+++ b/sandbox/linux/seccomp-bpf/trap.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "sandbox/linux/seccomp-bpf/trap.h"
 
 #include <errno.h>
@@ -231,7 +226,7 @@
                        SECCOMP_PARM6(ctx));
 #endif  // defined(__mips__)
   } else {
-    const auto& trap = trap_array_[info->si_errno - 1];
+    const auto& trap = UNSAFE_TODO(trap_array_[info->si_errno - 1]);
     if (!trap.safe) {
       SetIsInSigHandler();
     }
@@ -338,7 +333,7 @@
 
   uint16_t id = trap_array_size_ + 1;
   trap_ids_[handler] = id;
-  trap_array_[trap_array_size_] = handler;
+  UNSAFE_TODO(trap_array_[trap_array_size_]) = handler;
   trap_array_size_++;
   return id;
 }
diff --git a/sandbox/linux/services/libc_interceptor.cc b/sandbox/linux/services/libc_interceptor.cc
index db1555f..18a6aee1 100644
--- a/sandbox/linux/services/libc_interceptor.cc
+++ b/sandbox/linux/services/libc_interceptor.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "sandbox/linux/services/libc_interceptor.h"
 
 #include <dlfcn.h>
@@ -167,8 +162,8 @@
     return false;
   if (timezone_out_len) {
     const size_t copy_len = std::min(timezone_out_len - 1, timezone.size());
-    memcpy(timezone_out, timezone.data(), copy_len);
-    timezone_out[copy_len] = 0;
+    UNSAFE_TODO(memcpy(timezone_out, timezone.data(), copy_len));
+    UNSAFE_TODO(timezone_out[copy_len]) = 0;
     output->tm_zone = timezone_out;
   } else {
     base::AutoLock lock(g_timezones_lock.Get());
@@ -204,7 +199,7 @@
   request.WriteString(
       std::string(reinterpret_cast<char*>(&input), sizeof(input)));
 
-  memset(output, 0, sizeof(struct tm));
+  UNSAFE_TODO(memset(output, 0, sizeof(struct tm)));
 
   uint8_t reply_buf[512];
   const ssize_t r = base::UnixDomainSocket::SendRecvMsg(
@@ -213,10 +208,10 @@
     return;
 
   base::Pickle reply = base::Pickle::WithUnownedBuffer(
-      base::span(reply_buf, base::checked_cast<size_t>(r)));
+      UNSAFE_TODO(base::span(reply_buf, base::checked_cast<size_t>(r))));
   base::PickleIterator iter(reply);
   if (!ReadTimeStruct(&iter, output, timezone_out, timezone_out_len)) {
-    memset(output, 0, sizeof(struct tm));
+    UNSAFE_TODO(memset(output, 0, sizeof(struct tm)));
   }
 }
 
@@ -229,7 +224,7 @@
     return false;
 
   time_t time;
-  memcpy(&time, time_string.data(), sizeof(time));
+  UNSAFE_TODO(memcpy(&time, time_string.data(), sizeof(time)));
   struct tm expanded_time = {};
   localtime_r(&time, &expanded_time);
 
@@ -237,7 +232,7 @@
   WriteTimeStruct(&reply, expanded_time);
 
   struct msghdr msg;
-  memset(&msg, 0, sizeof(msg));
+  UNSAFE_TODO(memset(&msg, 0, sizeof(msg)));
 
   struct iovec iov = {const_cast<uint8_t*>(reply.data()), reply.size()};
   msg.msg_iov = &iov;
diff --git a/sandbox/linux/services/syscall_wrappers.cc b/sandbox/linux/services/syscall_wrappers.cc
index ecc897e..b7f4349b 100644
--- a/sandbox/linux/services/syscall_wrappers.cc
+++ b/sandbox/linux/services/syscall_wrappers.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/390223051): Remove C-library calls to fix the errors.
-#pragma allow_unsafe_libc_calls
-#endif
-
 #include "sandbox/linux/services/syscall_wrappers.h"
 
 #include <fcntl.h>
@@ -156,9 +151,9 @@
   // In some toolchain (in particular Android and PNaCl toolchain),
   // sigset_t is 32 bits, but the Linux ABI uses more.
   LinuxSigSet linux_value;
-  std::memset(&linux_value, 0, sizeof(LinuxSigSet));
-  std::memcpy(&linux_value, set, std::min(sizeof(sigset_t),
-                                          sizeof(LinuxSigSet)));
+  UNSAFE_TODO(std::memset(&linux_value, 0, sizeof(LinuxSigSet)));
+  UNSAFE_TODO(std::memcpy(&linux_value, set,
+                          std::min(sizeof(sigset_t), sizeof(LinuxSigSet))));
 
   return syscall(__NR_rt_sigprocmask, how, &linux_value, nullptr,
                  sizeof(linux_value));
diff --git a/sandbox/linux/services/syscall_wrappers_unittest.cc b/sandbox/linux/services/syscall_wrappers_unittest.cc
index 0905089f..41aaffb 100644
--- a/sandbox/linux/services/syscall_wrappers_unittest.cc
+++ b/sandbox/linux/services/syscall_wrappers_unittest.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "sandbox/linux/services/syscall_wrappers.h"
 
 #include <fcntl.h>
@@ -17,6 +12,7 @@
 #include <sys/wait.h>
 #include <unistd.h>
 
+#include "base/compiler_specific.h"
 #include "base/logging.h"
 #include "base/memory/page_size.h"
 #include "base/posix/eintr_wrapper.h"
@@ -98,8 +94,8 @@
   ASSERT_EQ(0, sigaddset(&sigset, LINUX_SIGSEGV));
   ASSERT_EQ(0, sigaddset(&sigset, LINUX_SIGBUS));
   uint64_t linux_sigset = 0;
-  std::memcpy(&linux_sigset, &sigset,
-              std::min(sizeof(sigset), sizeof(linux_sigset)));
+  UNSAFE_TODO(std::memcpy(&linux_sigset, &sigset,
+                          std::min(sizeof(sigset), sizeof(linux_sigset))));
   EXPECT_EQ((1ULL << (LINUX_SIGSEGV - 1)) | (1ULL << (LINUX_SIGBUS - 1)),
             linux_sigset);
 }
@@ -113,12 +109,13 @@
   // will right-align them on a page, with a guard page after.
   char* two_pages = static_cast<char*>(TestUtils::MapPagesOrDie(2));
   TestUtils::MprotectLastPageOrDie(two_pages, 2);
-  char* page1_end = two_pages + base::GetPageSize();
+  char* page1_end = UNSAFE_TODO(two_pages + base::GetPageSize());
 
   // First, check that calling stat with |stat_buf| pointing to the last byte on
   // a page causes EFAULT.
-  int res = sys_stat(tmp_file.full_file_name(),
-                     reinterpret_cast<struct kernel_stat*>(page1_end - 1));
+  int res = sys_stat(
+      tmp_file.full_file_name(),
+      reinterpret_cast<struct kernel_stat*>(UNSAFE_TODO(page1_end - 1)));
   ASSERT_EQ(res, -1);
   if (res < 0 && errno == EOVERFLOW) {
     GTEST_SKIP();
@@ -127,9 +124,9 @@
 
   // Now, check that we have the correctly sized stat structure.
   struct kernel_stat* sb = reinterpret_cast<struct kernel_stat*>(
-      page1_end - sizeof(struct kernel_stat));
+      UNSAFE_TODO(page1_end - sizeof(struct kernel_stat)));
   // Memset to c's so we can check the kernel zero'd the padding...
-  memset(sb, 'c', sizeof(struct kernel_stat));
+  UNSAFE_TODO(memset(sb, 'c', sizeof(struct kernel_stat)));
   res = sys_stat(tmp_file.full_file_name(), sb);
   ASSERT_EQ(res, 0);
 
@@ -184,20 +181,20 @@
   // will right-align them on a page, with a guard page after.
   char* two_pages = static_cast<char*>(TestUtils::MapPagesOrDie(2));
   TestUtils::MprotectLastPageOrDie(two_pages, 2);
-  char* page1_end = two_pages + base::GetPageSize();
+  char* page1_end = UNSAFE_TODO(two_pages + base::GetPageSize());
 
   // First, check that calling stat with |stat_buf| pointing to the last byte on
   // a page causes EFAULT.
-  int res =
-      sys_fstatat64(AT_FDCWD, tmp_file.full_file_name(),
-                    reinterpret_cast<struct kernel_stat64*>(page1_end - 1), 0);
+  int res = sys_fstatat64(
+      AT_FDCWD, tmp_file.full_file_name(),
+      reinterpret_cast<struct kernel_stat64*>(UNSAFE_TODO(page1_end - 1)), 0);
   ASSERT_EQ(res, -1);
   ASSERT_EQ(errno, EFAULT);
 
   // Now, check that we have the correctly sized stat structure.
   struct kernel_stat64* sb = reinterpret_cast<struct kernel_stat64*>(
-      page1_end - sizeof(struct kernel_stat64));
-  memset(sb, 0, sizeof(struct kernel_stat64));
+      UNSAFE_TODO(page1_end - sizeof(struct kernel_stat64)));
+  UNSAFE_TODO(memset(sb, 0, sizeof(struct kernel_stat64)));
   res = sys_fstatat64(AT_FDCWD, tmp_file.full_file_name(), sb, 0);
   ASSERT_EQ(res, 0);
 
diff --git a/sandbox/linux/services/yama_unittest.cc b/sandbox/linux/services/yama_unittest.cc
index d31710f1..5e8d5ad 100644
--- a/sandbox/linux/services/yama_unittest.cc
+++ b/sandbox/linux/services/yama_unittest.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/390223051): Remove C-library calls to fix the errors.
-#pragma allow_unsafe_libc_calls
-#endif
-
 #include <errno.h>
 #include <fcntl.h>
 #include <sys/ptrace.h>
@@ -114,8 +109,9 @@
   EXPECT_EQ(static_cast<bool>(status1 & Yama::STATUS_PRESENT),
             Yama::IsPresent());
 
-  fprintf(stdout, "Yama present: %s - enforcing: %s\n",
-          Yama::IsPresent() ? "Y" : "N", Yama::IsEnforcing() ? "Y" : "N");
+  UNSAFE_TODO(fprintf(stdout, "Yama present: %s - enforcing: %s\n",
+                      Yama::IsPresent() ? "Y" : "N",
+                      Yama::IsEnforcing() ? "Y" : "N"));
 }
 
 SANDBOX_TEST(Yama, RestrictPtraceSucceedsWhenYamaPresent) {
diff --git a/sandbox/linux/syscall_broker/broker_client.cc b/sandbox/linux/syscall_broker/broker_client.cc
index 848af102..96174e78 100644
--- a/sandbox/linux/syscall_broker/broker_client.cc
+++ b/sandbox/linux/syscall_broker/broker_client.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "sandbox/linux/syscall_broker/broker_client.h"
 
 #include <errno.h>
@@ -20,6 +15,7 @@
 #include <utility>
 
 #include "base/check.h"
+#include "base/compiler_specific.h"
 #include "build/build_config.h"
 #include "sandbox/linux/syscall_broker/broker_channel.h"
 #include "sandbox/linux/syscall_broker/broker_command.h"
@@ -121,7 +117,7 @@
   if (return_length > bufsize) {
     return_length = bufsize;
   }
-  memcpy(buf, return_data, return_length);
+  UNSAFE_TODO(memcpy(buf, return_data, return_length));
   return return_length;
 }
 
@@ -230,7 +226,8 @@
 
   BrokerSimpleMessage reply;
   ssize_t msg_len = message.SendRecvMsgWithFlagsMultipleFds(
-      ipc_channel_.get(), 0, base::span<const int>(&fd, 1u), {}, &reply);
+      ipc_channel_.get(), 0, UNSAFE_TODO(base::span<const int>(&fd, 1u)), {},
+      &reply);
 
   if (msg_len < 0)
     return msg_len;
@@ -369,7 +366,7 @@
     return -ENOMEM;
   if (static_cast<size_t>(return_length) != expected_result_size)
     return -ENOMEM;
-  memcpy(result_ptr, return_data, expected_result_size);
+  UNSAFE_TODO(memcpy(result_ptr, return_data, expected_result_size));
   return return_value;
 }
 
diff --git a/sandbox/linux/syscall_broker/broker_host.cc b/sandbox/linux/syscall_broker/broker_host.cc
index bf1339b..1ec857a6 100644
--- a/sandbox/linux/syscall_broker/broker_host.cc
+++ b/sandbox/linux/syscall_broker/broker_host.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "sandbox/linux/syscall_broker/broker_host.h"
 
 #include <errno.h>
@@ -25,6 +20,7 @@
 #include <tuple>
 #include <utility>
 
+#include "base/compiler_specific.h"
 #include "base/files/scoped_file.h"
 #include "base/logging.h"
 #include "base/posix/eintr_wrapper.h"
@@ -61,7 +57,7 @@
 std::optional<std::string> BrokerHost::RewritePathname(const char* pathname) {
   if (base::StartsWith(pathname, kProcSelf)) {
     return base::StringPrintf("/proc/%d/%s", sandboxed_process_pid_,
-                              pathname + kProcSelfNumChars);
+                              UNSAFE_TODO(pathname + kProcSelfNumChars));
   }
 
   return std::nullopt;
diff --git a/sandbox/linux/syscall_broker/broker_process_unittest.cc b/sandbox/linux/syscall_broker/broker_process_unittest.cc
index 9679b40..4b485f7 100644
--- a/sandbox/linux/syscall_broker/broker_process_unittest.cc
+++ b/sandbox/linux/syscall_broker/broker_process_unittest.cc
@@ -2,12 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "sandbox/linux/syscall_broker/broker_process.h"
 
 #include <errno.h>
@@ -28,6 +22,7 @@
 #include <string_view>
 #include <vector>
 
+#include "base/compiler_specific.h"
 #include "base/containers/flat_map.h"
 #include "base/containers/flat_set.h"
 #include "base/containers/span.h"
@@ -409,7 +404,7 @@
     base::ScopedFD cpuinfo_fd_closer(cpuinfo_fd);
     EXPECT_GE(cpuinfo_fd, 0);
     char buf[3];
-    memset(buf, 0, sizeof(buf));
+    UNSAFE_TODO(memset(buf, 0, sizeof(buf)));
     int read_len1 = read(cpuinfo_fd, buf, sizeof(buf));
     EXPECT_GT(read_len1, 0);
 
@@ -418,7 +413,7 @@
     base::ScopedFD cpuinfo_fd2_closer(cpuinfo_fd2);
     EXPECT_GE(cpuinfo_fd2, 0);
     char buf2[3];
-    memset(buf2, 1, sizeof(buf2));
+    UNSAFE_TODO(memset(buf2, 1, sizeof(buf2)));
     int read_len2 = read(cpuinfo_fd2, buf2, sizeof(buf2));
     EXPECT_GT(read_len1, 0);
 
@@ -426,7 +421,7 @@
     EXPECT_EQ(read_len1, read_len2);
     // Compare the cpuinfo as returned by the broker with the one we opened
     // ourselves.
-    EXPECT_EQ(memcmp(buf, buf2, read_len1), 0);
+    UNSAFE_TODO(EXPECT_EQ(memcmp(buf, buf2, read_len1), 0));
 
     ASSERT_TRUE(TestUtils::CurrentProcessHasChildren());
   }
@@ -496,7 +491,7 @@
   len = read(tempfile.fd(), buf, sizeof(buf));
 
   ASSERT_EQ(len, static_cast<ssize_t>(sizeof(test_text)));
-  ASSERT_EQ(memcmp(test_text, buf, sizeof(test_text)), 0);
+  UNSAFE_TODO(ASSERT_EQ(memcmp(test_text, buf, sizeof(test_text)), 0));
 
   ASSERT_EQ(close(tempfile2), 0);
 }
@@ -885,7 +880,7 @@
     char buf[1024];
     ssize_t len = HANDLE_EINTR(read(fd_check, buf, sizeof(buf)));
     ASSERT_EQ(len, static_cast<ssize_t>(sizeof(kTestText)));
-    ASSERT_EQ(memcmp(kTestText, buf, sizeof(kTestText)), 0);
+    UNSAFE_TODO(ASSERT_EQ(memcmp(kTestText, buf, sizeof(kTestText)), 0));
   }
 
   // Cleanup.
@@ -923,7 +918,7 @@
 
     ASSERT_TRUE(open_broker.Fork(base::BindOnce(&NoOpCallback)));
 
-    memset(&sb, 0, sizeof(sb));
+    UNSAFE_TODO(memset(&sb, 0, sizeof(sb)));
     EXPECT_EQ(-kFakeErrnoSentinel,
               open_broker.GetBrokerClientSignalBased()->DefaultStatForTesting(
                   tempfile_name, follow_links, &sb));
@@ -942,7 +937,7 @@
 
     ASSERT_TRUE(open_broker.Fork(base::BindOnce(&NoOpCallback)));
 
-    memset(&sb, 0, sizeof(sb));
+    UNSAFE_TODO(memset(&sb, 0, sizeof(sb)));
     EXPECT_EQ(-kFakeErrnoSentinel,
               open_broker.GetBrokerClientSignalBased()->DefaultStatForTesting(
                   nonesuch_name, follow_links, &sb));
@@ -957,7 +952,7 @@
 
     ASSERT_TRUE(open_broker.Fork(base::BindOnce(&NoOpCallback)));
 
-    memset(&sb, 0, sizeof(sb));
+    UNSAFE_TODO(memset(&sb, 0, sizeof(sb)));
     EXPECT_EQ(-kFakeErrnoSentinel,
               open_broker.GetBrokerClientSignalBased()->DefaultStatForTesting(
                   tempfile_name, follow_links, &sb));
@@ -973,7 +968,7 @@
 
     ASSERT_TRUE(open_broker.Fork(base::BindOnce(&NoOpCallback)));
 
-    memset(&sb, 0, sizeof(sb));
+    UNSAFE_TODO(memset(&sb, 0, sizeof(sb)));
     EXPECT_EQ(-ENOENT,
               open_broker.GetBrokerClientSignalBased()->DefaultStatForTesting(
                   nonesuch_name, follow_links, &sb));
@@ -1020,7 +1015,7 @@
 
     ASSERT_TRUE(open_broker.Fork(base::BindOnce(&NoOpCallback)));
 
-    memset(&sb, 0, sizeof(sb));
+    UNSAFE_TODO(memset(&sb, 0, sizeof(sb)));
     EXPECT_EQ(-ENOENT,
               open_broker.GetBrokerClientSignalBased()->DefaultStatForTesting(
                   nonesuch_name, follow_links, &sb));
@@ -1069,7 +1064,7 @@
 
     ASSERT_TRUE(open_broker.Fork(base::BindOnce(&NoOpCallback)));
 
-    memset(&sb, 0, sizeof(sb));
+    UNSAFE_TODO(memset(&sb, 0, sizeof(sb)));
     EXPECT_EQ(0,
               open_broker.GetBrokerClientSignalBased()->DefaultStatForTesting(
                   tempfile_name, follow_links, &sb));
@@ -1339,7 +1334,7 @@
     ssize_t retlen = open_broker.GetBrokerClientSignalBased()->Readlink(
         newpath_name, buf, sizeof(buf));
     EXPECT_TRUE(retlen == static_cast<ssize_t>(strlen(oldpath_name)));
-    EXPECT_EQ(0, memcmp(oldpath_name, buf, retlen));
+    UNSAFE_TODO(EXPECT_EQ(0, memcmp(oldpath_name, buf, retlen)));
   }
   {
     // Actual file with permissions to see file, but too small a buffer.
diff --git a/sandbox/policy/mojom/sandbox.mojom b/sandbox/policy/mojom/sandbox.mojom
index 6b99d9f..65bb6c0 100644
--- a/sandbox/policy/mojom/sandbox.mojom
+++ b/sandbox/policy/mojom/sandbox.mojom
@@ -92,9 +92,8 @@
   // |kXrCompositing| hosts XR Device Service on Windows.
   [EnableIf=is_win] kXrCompositing,
 
-  // Allows LPAC capabilities for WinHttp. This only needs internet access,
-  // policy access, and service access.
-  [EnableIf=is_win] kWindowsSystemProxyResolver,
+  // Allows access to OS system proxy resolver APIs.
+  [EnableIf=is_win] kProxyResolver,
 
   // Used to protect processes that perform hardware video decode acceleration.
   // Currently uses the same policy as the GPU process sandbox. Warm-up does
diff --git a/sandbox/policy/sandbox_type.cc b/sandbox/policy/sandbox_type.cc
index 48b116b..5f6c293 100644
--- a/sandbox/policy/sandbox_type.cc
+++ b/sandbox/policy/sandbox_type.cc
@@ -45,7 +45,7 @@
 constexpr char kXrCompositingSandbox[] = "xr_compositing";
 constexpr char kIconReaderSandbox[] = "icon_reader";
 constexpr char kMediaFoundationCdmSandbox[] = "mf_cdm";
-constexpr char kWindowsSystemProxyResolverSandbox[] = "proxy_resolver_win";
+constexpr char kProxyResolverSandbox[] = "proxy_resolver";
 #endif  // BUILDFLAG(IS_WIN)
 
 #if BUILDFLAG(IS_MAC)
@@ -133,7 +133,7 @@
     case Sandbox::kPdfConversion:
     case Sandbox::kIconReader:
     case Sandbox::kMediaFoundationCdm:
-    case Sandbox::kWindowsSystemProxyResolver:
+    case Sandbox::kProxyResolver:
 #endif  // BUILDFLAG(IS_WIN)
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
     case Sandbox::kShapeDetection:
@@ -265,8 +265,8 @@
       return kIconReaderSandbox;
     case Sandbox::kMediaFoundationCdm:
       return kMediaFoundationCdmSandbox;
-    case Sandbox::kWindowsSystemProxyResolver:
-      return kWindowsSystemProxyResolverSandbox;
+    case Sandbox::kProxyResolver:
+      return kProxyResolverSandbox;
 #endif  // BUILDFLAG(IS_WIN)
 #if BUILDFLAG(IS_MAC)
     case Sandbox::kMirroring:
@@ -353,8 +353,8 @@
   if (sandbox_string == kMediaFoundationCdmSandbox) {
     return Sandbox::kMediaFoundationCdm;
   }
-  if (sandbox_string == kWindowsSystemProxyResolverSandbox) {
-    return Sandbox::kWindowsSystemProxyResolver;
+  if (sandbox_string == kProxyResolverSandbox) {
+    return Sandbox::kProxyResolver;
   }
 #endif
 #if BUILDFLAG(IS_MAC)
diff --git a/sandbox/policy/win/sandbox_win.cc b/sandbox/policy/win/sandbox_win.cc
index a2ceae2b..6dde72c 100644
--- a/sandbox/policy/win/sandbox_win.cc
+++ b/sandbox/policy/win/sandbox_win.cc
@@ -351,7 +351,7 @@
     case Sandbox::kPrintCompositor:
       sandbox_base_name = std::string("cr.sb.prnc");
       break;
-    case Sandbox::kWindowsSystemProxyResolver:
+    case Sandbox::kProxyResolver:
       sandbox_base_name = std::string("cr.sb.pxy");
       break;
     default:
@@ -387,7 +387,7 @@
       !(sandbox_type == Sandbox::kPrintCompositor &&
         base::FeatureList::IsEnabled(
             sandbox::policy::features::kPrintCompositorLPAC)) &&
-      sandbox_type != Sandbox::kWindowsSystemProxyResolver) {
+      sandbox_type != Sandbox::kProxyResolver) {
     return SBOX_ERROR_UNSUPPORTED;
   }
 
@@ -447,7 +447,7 @@
     container->SetEnableLowPrivilegeAppContainer(true);
   }
 
-  if (sandbox_type == Sandbox::kWindowsSystemProxyResolver) {
+  if (sandbox_type == Sandbox::kProxyResolver) {
     container->AddCapability(base::win::WellKnownCapability::kInternetClient);
     container->AddCapability(kLpacServicesManagement);
     container->AddCapability(kLpacEnterprisePolicyChangeNotifications);
@@ -808,8 +808,9 @@
         sandbox::policy::features::kPrintCompositorLPAC);
   }
 
-  if (sandbox_type == Sandbox::kWindowsSystemProxyResolver)
+  if (sandbox_type == Sandbox::kProxyResolver) {
     return true;
+  }
 
   return false;
 }
@@ -1087,8 +1088,8 @@
       return "Service With Jit";
     case Sandbox::kIconReader:
       return "Icon Reader";
-    case Sandbox::kWindowsSystemProxyResolver:
-      return "Windows System Proxy Resolver";
+    case Sandbox::kProxyResolver:
+      return "Proxy Resolver";
   }
   NOTREACHED();
 }
diff --git a/sandbox/policy/win/sandbox_win_unittest.cc b/sandbox/policy/win/sandbox_win_unittest.cc
index 767f7f3d..b9fbc4c 100644
--- a/sandbox/policy/win/sandbox_win_unittest.cc
+++ b/sandbox/policy/win/sandbox_win_unittest.cc
@@ -298,7 +298,7 @@
         kLpacIdentityServices, kLpacCryptoServices, kLpacChromeInstallFiles,
         kRegistryRead},
        {}},
-      {sandbox::mojom::Sandbox::kWindowsSystemProxyResolver,
+      {sandbox::mojom::Sandbox::kProxyResolver,
        L"S-1-15-2-1733900417-1595997880-1847635518-1308794714-877418578-"
        L"3685220290-3324296907",
        true,
diff --git a/sandbox/win/src/address_sanitizer_test.cc b/sandbox/win/src/address_sanitizer_test.cc
index 6d5b3c05..e36ac86 100644
--- a/sandbox/win/src/address_sanitizer_test.cc
+++ b/sandbox/win/src/address_sanitizer_test.cc
@@ -2,16 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include <stdio.h>
 
 #include <memory>
 #include <optional>
 
+#include "base/compiler_specific.h"
 #include "base/environment.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
@@ -49,7 +45,7 @@
   // overflow) in this code.
   volatile int idx = 42;
   int* volatile blah = new int[42];
-  blah[idx] = 42;
+  UNSAFE_TODO(blah[idx]) = 42;
   delete[] blah;
   return SBOX_TEST_FAILED;
 }
@@ -97,17 +93,19 @@
     std::string data;
     ASSERT_TRUE(base::ReadFileToString(base::FilePath(temp_file_name), &data));
     // Redirection uses a feature that was added in Windows Vista.
-    ASSERT_TRUE(
-        strstr(data.c_str(), "ERROR: AddressSanitizer: heap-buffer-overflow"))
+    ASSERT_TRUE(UNSAFE_TODO(
+        strstr(data.c_str(), "ERROR: AddressSanitizer: heap-buffer-overflow")))
         << "There doesn't seem to be an ASan report:\n"
         << data;
-    ASSERT_TRUE(strstr(data.c_str(), "AddressSanitizerTests_Report"))
+    ASSERT_TRUE(
+        UNSAFE_TODO(strstr(data.c_str(), "AddressSanitizerTests_Report")))
         << "The ASan report doesn't appear to be symbolized:\n"
         << data;
     std::string source_file_basename(__FILE__);
     size_t last_slash = source_file_basename.find_last_of("/\\");
     last_slash = last_slash == std::string::npos ? 0 : last_slash + 1;
-    ASSERT_TRUE(strstr(data.c_str(), &source_file_basename[last_slash]))
+    ASSERT_TRUE(
+        UNSAFE_TODO(strstr(data.c_str(), &source_file_basename[last_slash])))
         << "The stack trace doesn't have a correct filename:\n"
         << data;
   } else {
diff --git a/sandbox/win/src/app_container_test.cc b/sandbox/win/src/app_container_test.cc
index 6f351c0..6f062db 100644
--- a/sandbox/win/src/app_container_test.cc
+++ b/sandbox/win/src/app_container_test.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include <windows.h>
 
 #include <memory>
@@ -14,6 +9,7 @@
 #include <vector>
 
 #include "base/command_line.h"
+#include "base/compiler_specific.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/format_macros.h"
@@ -85,11 +81,12 @@
   ASSERT_EQ(capabilities.size(), security_capabilities->CapabilityCount)
       << TokenTypeToName(impersonation);
   for (size_t index = 0; index < capabilities.size(); ++index) {
-    EXPECT_EQ(capabilities[index].GetAttributes(),
-              security_capabilities->Capabilities[index].Attributes)
+    EXPECT_EQ(
+        capabilities[index].GetAttributes(),
+        UNSAFE_TODO(security_capabilities->Capabilities[index]).Attributes)
         << TokenTypeToName(impersonation);
     EXPECT_TRUE(capabilities[index].GetSid().Equal(
-        security_capabilities->Capabilities[index].Sid))
+        UNSAFE_TODO(security_capabilities->Capabilities[index]).Sid))
         << TokenTypeToName(impersonation);
   }
 }
diff --git a/sandbox/win/src/app_container_unittest.cc b/sandbox/win/src/app_container_unittest.cc
index e1148076..3508c8f 100644
--- a/sandbox/win/src/app_container_unittest.cc
+++ b/sandbox/win/src/app_container_unittest.cc
@@ -2,16 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include <windows.h>
 
 #include <string>
 #include <vector>
 
+#include "base/compiler_specific.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
@@ -62,10 +58,10 @@
   for (DWORD index = 0; index < security_capabilities->CapabilityCount;
        ++index) {
     if (!capabilities[index].Equal(
-            security_capabilities->Capabilities[index].Sid)) {
+            UNSAFE_TODO(security_capabilities->Capabilities[index]).Sid)) {
       return false;
     }
-    if (security_capabilities->Capabilities[index].Attributes !=
+    if (UNSAFE_TODO(security_capabilities->Capabilities[index]).Attributes !=
         SE_GROUP_ENABLED) {
       return false;
     }
diff --git a/sandbox/win/src/crosscall_client.h b/sandbox/win/src/crosscall_client.h
index b65c8d6..81e56a93 100644
--- a/sandbox/win/src/crosscall_client.h
+++ b/sandbox/win/src/crosscall_client.h
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #ifndef SANDBOX_WIN_SRC_CROSSCALL_CLIENT_H_
 #define SANDBOX_WIN_SRC_CROSSCALL_CLIENT_H_
 
diff --git a/sandbox/win/src/crosscall_params.h b/sandbox/win/src/crosscall_params.h
index 4ee9a36..2daeaeb 100644
--- a/sandbox/win/src/crosscall_params.h
+++ b/sandbox/win/src/crosscall_params.h
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #ifndef SANDBOX_WIN_SRC_CROSSCALL_PARAMS_H_
 #define SANDBOX_WIN_SRC_CROSSCALL_PARAMS_H_
 
@@ -16,6 +11,7 @@
 #include <stddef.h>
 #include <stdint.h>
 
+#include "base/compiler_specific.h"
 #include "base/memory/raw_ptr_exclusion.h"
 #include "sandbox/win/src/internal_types.h"
 #include "sandbox/win/src/ipc_tags.h"
@@ -55,9 +51,10 @@
 }
 
 inline void* memcpy_wrapper(void* dest, const void* src, size_t count) {
-  if (g_nt.memcpy)
-    return g_nt.memcpy(dest, src, count);
-  return memcpy(dest, src, count);
+  if (UNSAFE_TODO(g_nt.memcpy)) {
+    return UNSAFE_TODO(g_nt.memcpy)(dest, src, count);
+  }
+  return UNSAFE_TODO(memcpy(dest, src, count));
 }
 
 }  // namespace
@@ -252,12 +249,13 @@
     }
 
     if ((size > sizeof(*this)) ||
-        (param_info_[index].offset_ > (sizeof(*this) - size))) {
+        (UNSAFE_TODO(param_info_[index]).offset_ > (sizeof(*this) - size))) {
       // It does not fit, abort copy.
       return false;
     }
 
-    char* dest = reinterpret_cast<char*>(this) + param_info_[index].offset_;
+    char* dest =
+        UNSAFE_TODO(reinterpret_cast<char*>(this) + param_info_[index].offset_);
 
     // We might be touching user memory, this has to be done from inside a try
     // except.
@@ -272,15 +270,17 @@
     if (is_in_out)
       SetIsInOut(true);
 
-    param_info_[index + 1].offset_ = Align(param_info_[index].offset_ + size);
-    param_info_[index].size_ = size;
-    param_info_[index].type_ = type;
+    UNSAFE_TODO(param_info_[index + 1]).offset_ =
+        Align(UNSAFE_TODO(param_info_[index]).offset_ + size);
+    UNSAFE_TODO(param_info_[index]).size_ = size;
+    UNSAFE_TODO(param_info_[index]).type_ = type;
     return true;
   }
 
   // Returns a pointer to a parameter in the memory section.
   void* GetParamPtr(size_t index) {
-    return reinterpret_cast<char*>(this) + param_info_[index].offset_;
+    return UNSAFE_TODO(reinterpret_cast<char*>(this) +
+                       param_info_[index].offset_);
   }
 
   // Returns the total size of the buffer. Only valid once all the paramters
diff --git a/sandbox/win/src/crosscall_server.cc b/sandbox/win/src/crosscall_server.cc
index a0fe6987..12d07c3 100644
--- a/sandbox/win/src/crosscall_server.cc
+++ b/sandbox/win/src/crosscall_server.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "sandbox/win/src/crosscall_server.h"
 
 #include <stddef.h>
@@ -17,6 +12,7 @@
 #include <vector>
 
 #include "base/check.h"
+#include "base/compiler_specific.h"
 #include "base/strings/utf_string_conversions.h"
 #include "sandbox/win/src/crosscall_client.h"
 #include "sandbox/win/src/crosscall_params.h"
@@ -161,7 +157,7 @@
     *output_size = declared_size;
     backing_mem = new char[declared_size];
     copied_params = reinterpret_cast<CrossCallParamsEx*>(backing_mem);
-    memcpy(backing_mem, call_params, declared_size);
+    UNSAFE_TODO(memcpy(backing_mem, call_params, declared_size));
 
     // Avoid compiler optimizations across this point. Any value stored in
     // memory should be stored for real, and values previously read from memory
@@ -189,9 +185,10 @@
   // Here and below we're making use of uintptr_t to have well-defined integer
   // overflow when doing pointer arithmetic.
   auto backing_mem_ptr = reinterpret_cast<uintptr_t>(backing_mem);
-  auto last_byte = reinterpret_cast<uintptr_t>(&backing_mem[declared_size]);
+  auto last_byte =
+      reinterpret_cast<uintptr_t>(&UNSAFE_TODO(backing_mem[declared_size]));
   auto first_byte =
-      reinterpret_cast<uintptr_t>(&backing_mem[min_declared_size]);
+      reinterpret_cast<uintptr_t>(&UNSAFE_TODO(backing_mem[min_declared_size]));
 
   // Verify here that all and each parameters make sense. This is done in the
   // local copy.
@@ -224,10 +221,11 @@
     return nullptr;
   // The size is always computed from the parameter minus the next
   // parameter, this works because the message has an extra parameter slot
-  *size = param_info_[index].size_;
-  *type = param_info_[index].type_;
+  *size = UNSAFE_TODO(param_info_[index]).size_;
+  *type = UNSAFE_TODO(param_info_[index]).type_;
 
-  return param_info_[index].offset_ + reinterpret_cast<char*>(this);
+  return UNSAFE_TODO(param_info_[index].offset_ +
+                     reinterpret_cast<char*>(this));
 }
 
 // Covers common case for 32 bit integers.
diff --git a/sandbox/win/src/eat_resolver.cc b/sandbox/win/src/eat_resolver.cc
index b590fd8..adfae7e1 100644
--- a/sandbox/win/src/eat_resolver.cc
+++ b/sandbox/win/src/eat_resolver.cc
@@ -2,16 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "sandbox/win/src/eat_resolver.h"
 
 #include <ntstatus.h>
 #include <stddef.h>
 
+#include "base/compiler_specific.h"
 #include "base/win/pe_image.h"
 #include "sandbox/win/src/nt_internals.h"
 #include "sandbox/win/src/sandbox_nt_util.h"
@@ -42,7 +38,8 @@
 
   size_t thunk_bytes = GetInternalThunkSize();
   storage_bytes -= thunk_bytes;
-  thunk_storage = reinterpret_cast<char*>(thunk_storage) + thunk_bytes;
+  thunk_storage =
+      UNSAFE_TODO(reinterpret_cast<char*>(thunk_storage) + thunk_bytes);
 #endif
 
   if (!SetInternalThunk(thunk_storage, storage_bytes, target_, interceptor_))
diff --git a/sandbox/win/src/file_policy_test.cc b/sandbox/win/src/file_policy_test.cc
index dfd88db..a52b3a0 100644
--- a/sandbox/win/src/file_policy_test.cc
+++ b/sandbox/win/src/file_policy_test.cc
@@ -2,19 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include <windows.h>
+#include <winternl.h>
 
 #include <ntstatus.h>
 #include <winioctl.h>
-#include <winternl.h>
 
 #include <algorithm>
 
+#include "base/compiler_specific.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_number_conversions_win.h"
 #include "base/strings/string_util_win.h"
@@ -52,10 +48,12 @@
   std::wstring operation(argv[0]);
 
   if (operation == L"Read") {
-    base::win::ScopedHandle file1(CreateFile(
-        argv[1], GENERIC_READ, kSharing, nullptr, OPEN_EXISTING, 0, nullptr));
-    base::win::ScopedHandle file2(CreateFile(
-        argv[1], FILE_EXECUTE, kSharing, nullptr, OPEN_EXISTING, 0, nullptr));
+    base::win::ScopedHandle file1(CreateFile(UNSAFE_TODO(argv[1]), GENERIC_READ,
+                                             kSharing, nullptr, OPEN_EXISTING,
+                                             0, nullptr));
+    base::win::ScopedHandle file2(CreateFile(UNSAFE_TODO(argv[1]), FILE_EXECUTE,
+                                             kSharing, nullptr, OPEN_EXISTING,
+                                             0, nullptr));
 
     if (file1.is_valid() == file2.is_valid()) {
       return file1.is_valid() ? SBOX_TEST_SUCCEEDED : SBOX_TEST_DENIED;
@@ -63,12 +61,12 @@
     return file1.is_valid() ? SBOX_TEST_FIRST_ERROR : SBOX_TEST_SECOND_ERROR;
 
   } else if (operation == L"Write") {
-    base::win::ScopedHandle file1(
-        CreateFile(argv[1], GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE,
-                   kSharing, nullptr, OPEN_EXISTING, 0, nullptr));
+    base::win::ScopedHandle file1(CreateFile(
+        UNSAFE_TODO(argv[1]), GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE,
+        kSharing, nullptr, OPEN_EXISTING, 0, nullptr));
     base::win::ScopedHandle file2(
-        CreateFile(argv[1], GENERIC_READ | FILE_WRITE_DATA, kSharing, nullptr,
-                   OPEN_EXISTING, 0, nullptr));
+        CreateFile(UNSAFE_TODO(argv[1]), GENERIC_READ | FILE_WRITE_DATA,
+                   kSharing, nullptr, OPEN_EXISTING, 0, nullptr));
 
     if (file1.is_valid() == file2.is_valid()) {
       return file1.is_valid() ? SBOX_TEST_SUCCEEDED : SBOX_TEST_DENIED;
@@ -76,10 +74,12 @@
     return file1.is_valid() ? SBOX_TEST_FIRST_ERROR : SBOX_TEST_SECOND_ERROR;
 
   } else if (operation == L"ReadCreate") {
-    base::win::ScopedHandle file2(CreateFile(argv[1], GENERIC_READ, kSharing,
-                                             nullptr, CREATE_NEW, 0, nullptr));
-    base::win::ScopedHandle file1(CreateFile(
-        argv[1], GENERIC_READ, kSharing, nullptr, CREATE_ALWAYS, 0, nullptr));
+    base::win::ScopedHandle file2(CreateFile(UNSAFE_TODO(argv[1]), GENERIC_READ,
+                                             kSharing, nullptr, CREATE_NEW, 0,
+                                             nullptr));
+    base::win::ScopedHandle file1(CreateFile(UNSAFE_TODO(argv[1]), GENERIC_READ,
+                                             kSharing, nullptr, CREATE_ALWAYS,
+                                             0, nullptr));
 
     if (file1.is_valid() == file2.is_valid()) {
       return file1.is_valid() ? SBOX_TEST_SUCCEEDED : SBOX_TEST_DENIED;
@@ -138,7 +138,7 @@
                              OBJ_CASE_INSENSITIVE, nullptr, nullptr);
 
   unsigned options = 0;
-  if (argc == 2 && !base::StringToUint(argv[1], &options)) {
+  if (argc == 2 && !base::StringToUint(UNSAFE_TODO(argv[1]), &options)) {
     return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND;
   }
 
@@ -179,7 +179,7 @@
                              OBJ_CASE_INSENSITIVE, nullptr, nullptr);
 
   unsigned options = 0;
-  if (argc == 2 && !base::StringToUint(argv[1], &options)) {
+  if (argc == 2 && !base::StringToUint(UNSAFE_TODO(argv[1]), &options)) {
     return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND;
   }
 
@@ -227,8 +227,9 @@
   if (argc != 2)
     return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND;
 
-  if (::MoveFileEx(argv[0], argv[1], 0))
+  if (::MoveFileEx(argv[0], UNSAFE_TODO(argv[1]), 0)) {
     return SBOX_TEST_SUCCEEDED;
+  }
 
   if (::GetLastError() != ERROR_ACCESS_DENIED)
     return SBOX_TEST_FAILED;
@@ -251,7 +252,7 @@
   if (argc != 2)
     return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND;
 
-  bool expect_directory = (L'd' == argv[1][0]);
+  bool expect_directory = (L'd' == UNSAFE_TODO(argv[1])[0]);
 
   UNICODE_STRING object_name;
   std::wstring file = MakePathToSys(argv[0], true);
@@ -423,7 +424,7 @@
   ASSERT_NE(::GetTempPath(MAX_PATH, temp_directory), 0u);
   ASSERT_NE(::GetTempFileName(temp_directory, L"test", 0, temp_file_name), 0u);
 
-  wcscat_s(temp_directory, MAX_PATH, L"*");
+  UNSAFE_TODO(wcscat_s(temp_directory, MAX_PATH, L"*"));
   EXPECT_TRUE(runner.AllowFileAccess(FileSemantics::kAllowAny, temp_directory));
 
   wchar_t command_write[MAX_PATH + 20] = {};
diff --git a/sandbox/win/src/filesystem_interception.cc b/sandbox/win/src/filesystem_interception.cc
index 35eb45a..078e5fa 100644
--- a/sandbox/win/src/filesystem_interception.cc
+++ b/sandbox/win/src/filesystem_interception.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "sandbox/win/src/filesystem_interception.h"
 
 #include <ntstatus.h>
diff --git a/sandbox/win/src/handle_closer_test.cc b/sandbox/win/src/handle_closer_test.cc
index cb747e2..6ff30b2d 100644
--- a/sandbox/win/src/handle_closer_test.cc
+++ b/sandbox/win/src/handle_closer_test.cc
@@ -2,14 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include <limits.h>
 #include <stddef.h>
 
+#include "base/compiler_specific.h"
 #include "base/strings/string_util.h"
 #include "base/win/scoped_handle.h"
 #include "sandbox/win/src/handle_closer_agent.h"
@@ -64,7 +60,8 @@
     return SBOX_TEST_FAILED_TO_RUN_TEST;
   }
   bool should_find = argv[0][0] == L'Y';
-  if (argv[0][1] != L'\0' || (!should_find && argv[0][0] != L'N')) {
+  if (UNSAFE_TODO(argv[0][1]) != L'\0' ||
+      (!should_find && argv[0][0] != L'N')) {
     return SBOX_TEST_FAILED_TO_RUN_TEST;
   }
 
@@ -94,7 +91,7 @@
         auto handle_name = GetPathFromHandle(handle);
         if (handle_name) {
           for (int i = 1; i < argc; ++i) {
-            if (handle_name.value() == argv[i]) {
+            if (handle_name.value() == UNSAFE_TODO(argv[i])) {
               return should_find ? SBOX_TEST_SUCCEEDED : SBOX_TEST_FAILED;
             }
           }
@@ -205,12 +202,12 @@
     CHECK(event);
     CHECK(::RegisterWaitForSingleObject(&pool, event, ThreadPoolTask, event,
                                         INFINITE, WT_EXECUTEONLYONCE));
-    wait_list[i] = event;
+    UNSAFE_TODO(wait_list[i]) = event;
   }
 
   // Signal all the waiters.
   for (int i = 0; i < kWaitCount; ++i)
-    CHECK(::SetEvent(wait_list[i]));
+    CHECK(::SetEvent(UNSAFE_TODO(wait_list[i])));
 
   CHECK_EQ(::WaitForSingleObject(finish_event, INFINITE), WAIT_OBJECT_0);
   CHECK(::CloseHandle(finish_event));
diff --git a/sandbox/win/src/interception.cc b/sandbox/win/src/interception.cc
index 6af0ac9..8289366 100644
--- a/sandbox/win/src/interception.cc
+++ b/sandbox/win/src/interception.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 // For information about interceptions as a whole see
 // http://dev.chromium.org/developers/design-documents/sandbox .
 
@@ -20,6 +15,7 @@
 
 #include "base/bits.h"
 #include "base/check_op.h"
+#include "base/compiler_specific.h"
 #include "base/containers/heap_array.h"
 #include "base/notreached.h"
 #include "base/rand_util.h"
@@ -271,7 +267,7 @@
     return false;
 
   *buffer_bytes -= required;
-  *buffer = reinterpret_cast<char*>(*buffer) + required;
+  *buffer = UNSAFE_TODO(reinterpret_cast<char*>(*buffer) + required);
 
   // set up the dll info to be what we know about it at this time
   dll_info->unload_module = (data.type == INTERCEPTION_UNLOAD_MODULE);
@@ -279,7 +275,7 @@
   dll_info->offset_to_functions = required;
   dll_info->num_functions = 0;
   data.dll.copy(dll_info->dll_name, data.dll.size());
-  dll_info->dll_name[data.dll.size()] = L'\0';
+  UNSAFE_TODO(dll_info->dll_name[data.dll.size()]) = L'\0';
 
   return true;
 }
@@ -311,7 +307,7 @@
 
   // update the caller's values
   *buffer_bytes -= required;
-  *buffer = reinterpret_cast<char*>(*buffer) + required;
+  *buffer = UNSAFE_TODO(reinterpret_cast<char*>(*buffer) + required);
 
   function->record_bytes = required;
   function->type = data.type;
@@ -320,13 +316,13 @@
   char* names = function->function;
 
   data.function.copy(names, name_bytes);
-  names += name_bytes;
-  *names++ = '\0';
+  UNSAFE_TODO(names += name_bytes);
+  *UNSAFE_TODO(names++) = '\0';
 
   // interceptor follows the function_name
   data.interceptor.copy(names, interceptor_bytes);
-  names += interceptor_bytes;
-  *names++ = '\0';
+  UNSAFE_TODO(names += interceptor_bytes);
+  *UNSAFE_TODO(names++) = '\0';
 
   // update the dll table
   dll_info->num_functions++;
@@ -375,7 +371,7 @@
   size_t thunk_offset = internal::GetGranularAlignedRandomOffset(thunk_bytes);
 
   // Split the base and offset along page boundaries.
-  thunk_base += thunk_offset & ~(kPageSize - 1);
+  UNSAFE_TODO(thunk_base += thunk_offset & ~(kPageSize - 1));
   thunk_offset &= kPageSize - 1;
 
   // Make an aligned, padded allocation, and move the pointer to our chunk.
@@ -384,8 +380,8 @@
       ::VirtualAllocEx(child, thunk_base, thunk_bytes_padded, MEM_COMMIT,
                        PAGE_EXECUTE_READWRITE));
   CHECK(thunk_base);  // If this fails we'd crash anyway on an invalid access.
-  DllInterceptionData* thunks =
-      reinterpret_cast<DllInterceptionData*>(thunk_base + thunk_offset);
+  DllInterceptionData* thunks = reinterpret_cast<DllInterceptionData*>(
+      UNSAFE_TODO(thunk_base + thunk_offset));
 
   // this should write all the individual thunks to the child's memory
   base::expected<PatchClientResultData, ResultCode> patch =
@@ -443,16 +439,16 @@
     NTSTATUS ret = thunk.Setup(
         ntdll_base, nullptr, interception.function.c_str(),
         interception.interceptor.c_str(), interception.interceptor_address,
-        &thunks->thunks[patch.dll_data.num_thunks],
+        &UNSAFE_TODO(thunks->thunks[patch.dll_data.num_thunks]),
         thunk_bytes - patch.dll_data.used_bytes, nullptr);
     if (!NT_SUCCESS(ret)) {
       ::SetLastError(GetLastErrorFromNtStatus(ret));
       return base::unexpected(SBOX_ERROR_CANNOT_SETUP_INTERCEPTION_THUNK);
     }
 
-    DCHECK(!patch.originals.functions[interception.id]);
-    patch.originals.functions[interception.id] =
-        &thunks->thunks[patch.dll_data.num_thunks];
+    DCHECK(!UNSAFE_TODO(patch.originals.functions[interception.id]));
+    UNSAFE_TODO(patch.originals.functions[interception.id]) =
+        &UNSAFE_TODO(thunks->thunks[patch.dll_data.num_thunks]);
 
     patch.dll_data.num_thunks++;
     patch.dll_data.used_bytes += sizeof(ThunkData);
diff --git a/sandbox/win/src/interception_unittest.cc b/sandbox/win/src/interception_unittest.cc
index 208330f6f..ca53a530 100644
--- a/sandbox/win/src/interception_unittest.cc
+++ b/sandbox/win/src/interception_unittest.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 // This file contains unit tests for InterceptionManager.
 // The tests require private information so the whole interception.cc file is
 // included from this file.
@@ -21,6 +16,7 @@
 #include <bit>
 #include <set>
 
+#include "base/compiler_specific.h"
 #include "base/containers/heap_array.h"
 #include "sandbox/win/src/interception_internal.h"
 #include "sandbox/win/src/interceptors.h"
@@ -60,7 +56,7 @@
     ASSERT_NE(0u, dll->num_functions);
 
     FunctionInfo* function = reinterpret_cast<FunctionInfo*>(
-        reinterpret_cast<char*>(dll) + dll->offset_to_functions);
+        UNSAFE_TODO(reinterpret_cast<char*>(dll) + dll->offset_to_functions));
 
     for (size_t j = 0; j < dll->num_functions; j++) {
       ASSERT_EQ(0u, function->record_bytes % sizeof(size_t));
@@ -68,11 +64,12 @@
       char* name = function->function;
       size_t length = strlen(name);
       ASSERT_NE(0u, length);
-      name += length + 1;
+      UNSAFE_TODO(name += length + 1);
 
       // look for overflows
-      ASSERT_GT(reinterpret_cast<char*>(buffer.data()) + buffer.size(),
-                name + strlen(name));
+      ASSERT_GT(
+          UNSAFE_TODO(reinterpret_cast<char*>(buffer.data()) + buffer.size()),
+          UNSAFE_TODO(name + strlen(name)));
 
       // look for a named interceptor
       if (strlen(name)) {
@@ -83,13 +80,13 @@
       }
 
       (*num_functions)++;
-      function = reinterpret_cast<FunctionInfo*>(
-          reinterpret_cast<char*>(function) + function->record_bytes);
+      function = reinterpret_cast<FunctionInfo*>(UNSAFE_TODO(
+          reinterpret_cast<char*>(function) + function->record_bytes));
     }
 
     (*num_dlls)++;
-    dll = reinterpret_cast<DllPatchInfo*>(reinterpret_cast<char*>(dll) +
-                                          dll->record_bytes);
+    dll = reinterpret_cast<DllPatchInfo*>(
+        UNSAFE_TODO(reinterpret_cast<char*>(dll) + dll->record_bytes));
   }
 }
 
diff --git a/sandbox/win/src/ipc_args.cc b/sandbox/win/src/ipc_args.cc
index d6f667eb..65e0f8d 100644
--- a/sandbox/win/src/ipc_args.cc
+++ b/sandbox/win/src/ipc_args.cc
@@ -2,15 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "sandbox/win/src/ipc_args.h"
 
 #include <stddef.h>
 
+#include "base/compiler_specific.h"
 #include "sandbox/win/src/crosscall_params.h"
 #include "sandbox/win/src/crosscall_server.h"
 
@@ -19,15 +15,15 @@
 // Releases memory allocated for IPC arguments, if needed.
 void ReleaseArgs(const IPCParams* ipc_params, void* args[kMaxIpcParams]) {
   for (size_t i = 0; i < kMaxIpcParams; i++) {
-    switch (ipc_params->args[i]) {
+    switch (UNSAFE_TODO(ipc_params->args[i])) {
       case WCHAR_TYPE: {
-        delete reinterpret_cast<std::wstring*>(args[i]);
-        args[i] = nullptr;
+        delete reinterpret_cast<std::wstring*>(UNSAFE_TODO(args[i]));
+        UNSAFE_TODO(args[i]) = nullptr;
         break;
       }
       case INOUTPTR_TYPE: {
-        delete reinterpret_cast<CountedBuffer*>(args[i]);
-        args[i] = nullptr;
+        delete reinterpret_cast<CountedBuffer*>(UNSAFE_TODO(args[i]));
+        UNSAFE_TODO(args[i]) = nullptr;
         break;
       }
       default:
@@ -46,18 +42,18 @@
   for (uint32_t i = 0; i < params->GetParamsCount(); i++) {
     uint32_t size;
     ArgType type;
-    args[i] = params->GetRawParameter(i, &size, &type);
-    if (args[i]) {
-      ipc_params->args[i] = type;
+    UNSAFE_TODO(args[i]) = params->GetRawParameter(i, &size, &type);
+    if (UNSAFE_TODO(args[i])) {
+      UNSAFE_TODO(ipc_params->args[i]) = type;
       switch (type) {
         case WCHAR_TYPE: {
           std::unique_ptr<std::wstring> data(new std::wstring);
           if (!params->GetParameterStr(i, data.get())) {
-            args[i] = 0;
+            UNSAFE_TODO(args[i]) = 0;
             ReleaseArgs(ipc_params, args);
             return false;
           }
-          args[i] = data.release();
+          UNSAFE_TODO(args[i]) = data.release();
           break;
         }
         case UINT32_TYPE: {
@@ -67,7 +63,7 @@
             return false;
           }
           IPCInt ipc_int(data);
-          args[i] = ipc_int.AsVoidPtr();
+          UNSAFE_TODO(args[i]) = ipc_int.AsVoidPtr();
           break;
         }
         case VOIDPTR_TYPE: {
@@ -76,16 +72,16 @@
             ReleaseArgs(ipc_params, args);
             return false;
           }
-          args[i] = data;
+          UNSAFE_TODO(args[i]) = data;
           break;
         }
         case INOUTPTR_TYPE: {
-          if (!args[i]) {
+          if (!UNSAFE_TODO(args[i])) {
             ReleaseArgs(ipc_params, args);
             return false;
           }
-          CountedBuffer* buffer = new CountedBuffer(args[i], size);
-          args[i] = buffer;
+          CountedBuffer* buffer = new CountedBuffer(UNSAFE_TODO(args[i]), size);
+          UNSAFE_TODO(args[i]) = buffer;
           break;
         }
         default:
diff --git a/sandbox/win/src/ipc_leak_test.cc b/sandbox/win/src/ipc_leak_test.cc
index 0e9efed..c3a472d 100644
--- a/sandbox/win/src/ipc_leak_test.cc
+++ b/sandbox/win/src/ipc_leak_test.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include <windows.h>
 #include <winternl.h>
 
@@ -15,6 +10,7 @@
 
 #include <memory>
 
+#include "base/compiler_specific.h"
 #include "base/memory/page_size.h"
 #include "base/win/windows_handle_util.h"
 #include "sandbox/win/src/crosscall_client.h"
@@ -46,7 +42,7 @@
   // Should not exceed kPolMemSize from |sandbox_policy_base.cc|.
   const size_t kTotalPolicySz = 4096 * 6;
   char* mem = new char[kTotalPolicySz];
-  memset(mem, 0, kTotalPolicySz);
+  UNSAFE_TODO(memset(mem, 0, kTotalPolicySz));
   PolicyGlobal* policy = reinterpret_cast<PolicyGlobal*>(mem);
   policy->data_size = kTotalPolicySz - sizeof(PolicyGlobal);
   return policy;
@@ -155,17 +151,18 @@
 void CopyPolicyToTarget(const void* source, size_t size, void* dest) {
   if (!source || !size)
     return;
-  memcpy(dest, source, size);
+  UNSAFE_TODO(memcpy(dest, source, size));
   sandbox::PolicyGlobal* policy =
       reinterpret_cast<sandbox::PolicyGlobal*>(dest);
 
   size_t offset = reinterpret_cast<size_t>(source);
 
   for (size_t i = 0; i < kSandboxIpcCount; i++) {
-    size_t buffer = reinterpret_cast<size_t>(policy->entry[i]);
+    size_t buffer = reinterpret_cast<size_t>(UNSAFE_TODO(policy->entry[i]));
     if (buffer) {
       buffer -= offset;
-      policy->entry[i] = reinterpret_cast<sandbox::PolicyBuffer*>(buffer);
+      UNSAFE_TODO(policy->entry[i]) =
+          reinterpret_cast<sandbox::PolicyBuffer*>(buffer);
     }
   }
 }
@@ -184,7 +181,7 @@
   CopyPolicyToTarget(policy, policy->data_size + sizeof(PolicyGlobal),
                      current_policy);
 
-  int test = wcstol(argv[0], nullptr, 10);
+  int test = UNSAFE_TODO(wcstol(argv[0], nullptr, 10));
 
   static_assert(TESTIPC_NTOPENFILE == 0,
                 "TESTIPC_NTOPENFILE must be first in enum.");
@@ -228,7 +225,7 @@
   };
 
   auto* ipc_data = reinterpret_cast<ipc_internal*>(
-      reinterpret_cast<char*>(memory) + base_start);
+      UNSAFE_TODO(reinterpret_cast<char*>(memory) + base_start));
 
   return base::win::HandleToUint32(ipc_data->answer.handle);
 }
diff --git a/sandbox/win/src/ipc_unittest.cc b/sandbox/win/src/ipc_unittest.cc
index 16dcbaa..4db62ce 100644
--- a/sandbox/win/src/ipc_unittest.cc
+++ b/sandbox/win/src/ipc_unittest.cc
@@ -2,14 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include <stddef.h>
 #include <stdint.h>
 
+#include "base/compiler_specific.h"
 #include "base/memory/raw_ptr_exclusion.h"
 #include "sandbox/win/src/crosscall_client.h"
 #include "sandbox/win/src/crosscall_server.h"
@@ -26,7 +22,7 @@
                          size_t* base_start) {
   // Allocate memory
   char* mem = new char[total_shared_size];
-  memset(mem, 0, total_shared_size);
+  UNSAFE_TODO(memset(mem, 0, total_shared_size));
   // Calculate how many channels we can fit in the shared memory.
   total_shared_size -= offsetof(IPCControl, channels);
   size_t channel_count =
@@ -47,7 +43,7 @@
                  size_t channel_size,
                  TestFixMode mode) {
   for (size_t ix = 0; ix != client_control->channels_count; ++ix) {
-    ChannelControl& channel = client_control->channels[ix];
+    ChannelControl& channel = UNSAFE_TODO(client_control->channels[ix]);
     channel.channel_base = base_start;
     channel.state = kFreeChannel;
     if (mode != FIX_NO_EVENTS) {
@@ -61,7 +57,7 @@
 
 void CloseChannelEvents(IPCControl* client_control) {
   for (size_t ix = 0; ix != client_control->channels_count; ++ix) {
-    ChannelControl& channel = client_control->channels[ix];
+    ChannelControl& channel = UNSAFE_TODO(client_control->channels[ix]);
     ::CloseHandle(channel.ping_event);
     ::CloseHandle(channel.pong_event);
   }
@@ -96,57 +92,61 @@
 
   // Test that we lock the first 3 channels in sequence.
   void* buff0 = client.GetBuffer();
-  EXPECT_TRUE(mem + client_control->channels[0].channel_base == buff0);
+  EXPECT_TRUE(
+      UNSAFE_TODO(mem + client_control->channels[0].channel_base == buff0));
   EXPECT_EQ(kBusyChannel, client_control->channels[0].state);
-  EXPECT_EQ(kFreeChannel, client_control->channels[1].state);
-  EXPECT_EQ(kFreeChannel, client_control->channels[2].state);
-  EXPECT_EQ(kFreeChannel, client_control->channels[3].state);
-  EXPECT_EQ(kFreeChannel, client_control->channels[4].state);
-  EXPECT_EQ(kFreeChannel, client_control->channels[5].state);
+  EXPECT_EQ(kFreeChannel, UNSAFE_TODO(client_control->channels[1]).state);
+  EXPECT_EQ(kFreeChannel, UNSAFE_TODO(client_control->channels[2]).state);
+  EXPECT_EQ(kFreeChannel, UNSAFE_TODO(client_control->channels[3]).state);
+  EXPECT_EQ(kFreeChannel, UNSAFE_TODO(client_control->channels[4]).state);
+  EXPECT_EQ(kFreeChannel, UNSAFE_TODO(client_control->channels[5]).state);
 
   void* buff1 = client.GetBuffer();
-  EXPECT_TRUE(mem + client_control->channels[1].channel_base == buff1);
+  EXPECT_TRUE(
+      UNSAFE_TODO(mem + client_control->channels[1].channel_base == buff1));
   EXPECT_EQ(kBusyChannel, client_control->channels[0].state);
-  EXPECT_EQ(kBusyChannel, client_control->channels[1].state);
-  EXPECT_EQ(kFreeChannel, client_control->channels[2].state);
-  EXPECT_EQ(kFreeChannel, client_control->channels[3].state);
-  EXPECT_EQ(kFreeChannel, client_control->channels[4].state);
-  EXPECT_EQ(kFreeChannel, client_control->channels[5].state);
+  EXPECT_EQ(kBusyChannel, UNSAFE_TODO(client_control->channels[1]).state);
+  EXPECT_EQ(kFreeChannel, UNSAFE_TODO(client_control->channels[2]).state);
+  EXPECT_EQ(kFreeChannel, UNSAFE_TODO(client_control->channels[3]).state);
+  EXPECT_EQ(kFreeChannel, UNSAFE_TODO(client_control->channels[4]).state);
+  EXPECT_EQ(kFreeChannel, UNSAFE_TODO(client_control->channels[5]).state);
 
   void* buff2 = client.GetBuffer();
-  EXPECT_TRUE(mem + client_control->channels[2].channel_base == buff2);
+  EXPECT_TRUE(
+      UNSAFE_TODO(mem + client_control->channels[2].channel_base == buff2));
   EXPECT_EQ(kBusyChannel, client_control->channels[0].state);
-  EXPECT_EQ(kBusyChannel, client_control->channels[1].state);
-  EXPECT_EQ(kBusyChannel, client_control->channels[2].state);
-  EXPECT_EQ(kFreeChannel, client_control->channels[3].state);
-  EXPECT_EQ(kFreeChannel, client_control->channels[4].state);
-  EXPECT_EQ(kFreeChannel, client_control->channels[5].state);
+  EXPECT_EQ(kBusyChannel, UNSAFE_TODO(client_control->channels[1]).state);
+  EXPECT_EQ(kBusyChannel, UNSAFE_TODO(client_control->channels[2]).state);
+  EXPECT_EQ(kFreeChannel, UNSAFE_TODO(client_control->channels[3]).state);
+  EXPECT_EQ(kFreeChannel, UNSAFE_TODO(client_control->channels[4]).state);
+  EXPECT_EQ(kFreeChannel, UNSAFE_TODO(client_control->channels[5]).state);
 
   // Test that we unlock and re-lock the right channel.
   client.FreeBuffer(buff1);
   EXPECT_EQ(kBusyChannel, client_control->channels[0].state);
-  EXPECT_EQ(kFreeChannel, client_control->channels[1].state);
-  EXPECT_EQ(kBusyChannel, client_control->channels[2].state);
-  EXPECT_EQ(kFreeChannel, client_control->channels[3].state);
-  EXPECT_EQ(kFreeChannel, client_control->channels[4].state);
-  EXPECT_EQ(kFreeChannel, client_control->channels[5].state);
+  EXPECT_EQ(kFreeChannel, UNSAFE_TODO(client_control->channels[1]).state);
+  EXPECT_EQ(kBusyChannel, UNSAFE_TODO(client_control->channels[2]).state);
+  EXPECT_EQ(kFreeChannel, UNSAFE_TODO(client_control->channels[3]).state);
+  EXPECT_EQ(kFreeChannel, UNSAFE_TODO(client_control->channels[4]).state);
+  EXPECT_EQ(kFreeChannel, UNSAFE_TODO(client_control->channels[5]).state);
 
   void* buff2b = client.GetBuffer();
-  EXPECT_TRUE(mem + client_control->channels[1].channel_base == buff2b);
+  EXPECT_TRUE(
+      UNSAFE_TODO(mem + client_control->channels[1].channel_base == buff2b));
   EXPECT_EQ(kBusyChannel, client_control->channels[0].state);
-  EXPECT_EQ(kBusyChannel, client_control->channels[1].state);
-  EXPECT_EQ(kBusyChannel, client_control->channels[2].state);
-  EXPECT_EQ(kFreeChannel, client_control->channels[3].state);
-  EXPECT_EQ(kFreeChannel, client_control->channels[4].state);
-  EXPECT_EQ(kFreeChannel, client_control->channels[5].state);
+  EXPECT_EQ(kBusyChannel, UNSAFE_TODO(client_control->channels[1]).state);
+  EXPECT_EQ(kBusyChannel, UNSAFE_TODO(client_control->channels[2]).state);
+  EXPECT_EQ(kFreeChannel, UNSAFE_TODO(client_control->channels[3]).state);
+  EXPECT_EQ(kFreeChannel, UNSAFE_TODO(client_control->channels[4]).state);
+  EXPECT_EQ(kFreeChannel, UNSAFE_TODO(client_control->channels[5]).state);
 
   client.FreeBuffer(buff0);
   EXPECT_EQ(kFreeChannel, client_control->channels[0].state);
-  EXPECT_EQ(kBusyChannel, client_control->channels[1].state);
-  EXPECT_EQ(kBusyChannel, client_control->channels[2].state);
-  EXPECT_EQ(kFreeChannel, client_control->channels[3].state);
-  EXPECT_EQ(kFreeChannel, client_control->channels[4].state);
-  EXPECT_EQ(kFreeChannel, client_control->channels[5].state);
+  EXPECT_EQ(kBusyChannel, UNSAFE_TODO(client_control->channels[1]).state);
+  EXPECT_EQ(kBusyChannel, UNSAFE_TODO(client_control->channels[2]).state);
+  EXPECT_EQ(kFreeChannel, UNSAFE_TODO(client_control->channels[3]).state);
+  EXPECT_EQ(kFreeChannel, UNSAFE_TODO(client_control->channels[4]).state);
+  EXPECT_EQ(kFreeChannel, UNSAFE_TODO(client_control->channels[5]).state);
 
   delete[] reinterpret_cast<char*>(client_control);
 }
@@ -263,7 +263,7 @@
   ASSERT_EQ(sizeof(dw), param_size);
   EXPECT_EQ(UINT32_TYPE, type);
   ASSERT_TRUE(param_addr);
-  EXPECT_EQ(0, memcmp(&dw, param_addr, param_size));
+  EXPECT_EQ(0, UNSAFE_TODO(memcmp(&dw, param_addr, param_size)));
 
   // Check handling for windows HANDLES.
   HANDLE h = HANDLE(0x70000500);
@@ -276,7 +276,7 @@
   ASSERT_EQ(sizeof(h), param_size);
   EXPECT_EQ(VOIDPTR_TYPE, type);
   ASSERT_TRUE(param_addr);
-  EXPECT_EQ(0, memcmp(&h, param_addr, param_size));
+  EXPECT_EQ(0, UNSAFE_TODO(memcmp(&h, param_addr, param_size)));
 
   // Check combination of 32 and 64 bits.
   CrossCall(client, tag2, h, dw, h, &answer);
@@ -288,19 +288,19 @@
   ASSERT_EQ(sizeof(h), param_size);
   EXPECT_EQ(VOIDPTR_TYPE, type);
   ASSERT_TRUE(param_addr);
-  EXPECT_EQ(0, memcmp(&h, param_addr, param_size));
+  EXPECT_EQ(0, UNSAFE_TODO(memcmp(&h, param_addr, param_size)));
   type = INVALID_TYPE;
   param_addr = actual_params->GetRawParameter(1, &param_size, &type);
   ASSERT_EQ(sizeof(dw), param_size);
   EXPECT_EQ(UINT32_TYPE, type);
   ASSERT_TRUE(param_addr);
-  EXPECT_EQ(0, memcmp(&dw, param_addr, param_size));
+  EXPECT_EQ(0, UNSAFE_TODO(memcmp(&dw, param_addr, param_size)));
   type = INVALID_TYPE;
   param_addr = actual_params->GetRawParameter(2, &param_size, &type);
   ASSERT_EQ(sizeof(h), param_size);
   EXPECT_EQ(VOIDPTR_TYPE, type);
   ASSERT_TRUE(param_addr);
-  EXPECT_EQ(0, memcmp(&h, param_addr, param_size));
+  EXPECT_EQ(0, UNSAFE_TODO(memcmp(&h, param_addr, param_size)));
 
   CloseChannelEvents(client_control);
   delete[] reinterpret_cast<char*>(client_control);
@@ -425,9 +425,9 @@
   SharedMemIPCClient client(mem);
 
   ServerEvents events = {0};
-  events.ping = client_control->channels[1].ping_event;
-  events.pong = client_control->channels[1].pong_event;
-  events.state = &client_control->channels[1].state;
+  events.ping = UNSAFE_TODO(client_control->channels[1]).ping_event;
+  events.pong = UNSAFE_TODO(client_control->channels[1]).pong_event;
+  events.state = &UNSAFE_TODO(client_control->channels[1]).state;
 
   HANDLE t1 =
       ::CreateThread(nullptr, 0, QuickResponseServer, &events, 0, nullptr);
@@ -435,18 +435,20 @@
   ::CloseHandle(t1);
 
   void* buff0 = client.GetBuffer();
-  EXPECT_TRUE(mem + client_control->channels[0].channel_base == buff0);
+  EXPECT_TRUE(
+      UNSAFE_TODO(mem + client_control->channels[0].channel_base == buff0));
   EXPECT_EQ(kBusyChannel, client_control->channels[0].state);
-  EXPECT_EQ(kFreeChannel, client_control->channels[1].state);
-  EXPECT_EQ(kFreeChannel, client_control->channels[2].state);
+  EXPECT_EQ(kFreeChannel, UNSAFE_TODO(client_control->channels[1]).state);
+  EXPECT_EQ(kFreeChannel, UNSAFE_TODO(client_control->channels[2]).state);
 
   void* buff1 = client.GetBuffer();
-  EXPECT_TRUE(mem + client_control->channels[1].channel_base == buff1);
+  EXPECT_TRUE(
+      UNSAFE_TODO(mem + client_control->channels[1].channel_base == buff1));
   EXPECT_EQ(kBusyChannel, client_control->channels[0].state);
-  EXPECT_EQ(kBusyChannel, client_control->channels[1].state);
-  EXPECT_EQ(kFreeChannel, client_control->channels[2].state);
+  EXPECT_EQ(kBusyChannel, UNSAFE_TODO(client_control->channels[1]).state);
+  EXPECT_EQ(kFreeChannel, UNSAFE_TODO(client_control->channels[2]).state);
 
-  EXPECT_EQ(IpcTag::UNUSED, client_control->channels[1].ipc_tag);
+  EXPECT_EQ(IpcTag::UNUSED, UNSAFE_TODO(client_control->channels[1]).ipc_tag);
 
   IpcTag tag = IpcTag::PING1;
   CrossCallReturn answer;
@@ -458,10 +460,10 @@
     client.FreeBuffer(buff1);
 
   EXPECT_TRUE(SBOX_ALL_OK == result);
-  EXPECT_EQ(tag, client_control->channels[1].ipc_tag);
+  EXPECT_EQ(tag, UNSAFE_TODO(client_control->channels[1]).ipc_tag);
   EXPECT_EQ(kBusyChannel, client_control->channels[0].state);
-  EXPECT_EQ(kFreeChannel, client_control->channels[1].state);
-  EXPECT_EQ(kFreeChannel, client_control->channels[2].state);
+  EXPECT_EQ(kFreeChannel, UNSAFE_TODO(client_control->channels[1]).state);
+  EXPECT_EQ(kFreeChannel, UNSAFE_TODO(client_control->channels[2]).state);
 
   HANDLE t2 =
       ::CreateThread(nullptr, 0, QuickResponseServer, &events, 0, nullptr);
@@ -484,8 +486,8 @@
   EXPECT_TRUE(SBOX_ALL_OK == result);
   EXPECT_EQ(tag, client_control->channels[0].ipc_tag);
   EXPECT_EQ(kFreeChannel, client_control->channels[0].state);
-  EXPECT_EQ(kFreeChannel, client_control->channels[1].state);
-  EXPECT_EQ(kFreeChannel, client_control->channels[2].state);
+  EXPECT_EQ(kFreeChannel, UNSAFE_TODO(client_control->channels[1]).state);
+  EXPECT_EQ(kFreeChannel, UNSAFE_TODO(client_control->channels[2]).state);
 
   CloseChannelEvents(client_control);
   ::CloseHandle(client_control->server_alive);
diff --git a/sandbox/win/src/policy_engine_opcodes.cc b/sandbox/win/src/policy_engine_opcodes.cc
index a2a3efdf..b5d02317 100644
--- a/sandbox/win/src/policy_engine_opcodes.cc
+++ b/sandbox/win/src/policy_engine_opcodes.cc
@@ -2,17 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "sandbox/win/src/policy_engine_opcodes.h"
 
 #include <stddef.h>
 #include <stdint.h>
 
 #include "base/check_op.h"
+#include "base/compiler_specific.h"
 #include "sandbox/win/src/sandbox_nt_types.h"
 #include "sandbox/win/src/sandbox_nt_util.h"
 #include "sandbox/win/src/sandbox_types.h"
@@ -313,7 +309,7 @@
   PolicyOpcode* opcode = new (memory_top_) PolicyOpcode();
 
   // Fill in the standard fields, that every opcode has.
-  memory_top_ += sizeof(PolicyOpcode);
+  UNSAFE_TODO(memory_top_ += sizeof(PolicyOpcode));
   opcode->opcode_id_ = opcode_id;
   opcode->SetOptions(options);
   opcode->has_param_ = 0;
@@ -336,12 +332,12 @@
   size_t bytes = str.size() * sizeof(wchar_t);
   if (memory_size() < bytes)
     return 0;
-  memory_bottom_ -= bytes;
+  UNSAFE_TODO(memory_bottom_ -= bytes);
   if (reinterpret_cast<UINT_PTR>(memory_bottom_.get()) & 1) {
     // TODO(cpu) replace this for something better.
     ::DebugBreak();
   }
-  memcpy(memory_bottom_, str.data(), bytes);
+  UNSAFE_TODO(memcpy(memory_bottom_, str.data(), bytes));
   ptrdiff_t delta = memory_bottom_ - reinterpret_cast<char*>(start);
   return delta;
 }
@@ -366,7 +362,7 @@
     if (parameter_ >= param_count) {
       return EVAL_ERROR;
     }
-    selected_param = &call_params[parameter_];
+    selected_param = &UNSAFE_TODO(call_params[parameter_]);
   }
   EvalResult result = EvaluateHelper(selected_param, match);
 
diff --git a/sandbox/win/src/policy_engine_opcodes.h b/sandbox/win/src/policy_engine_opcodes.h
index cd9a819..8eb4501 100644
--- a/sandbox/win/src/policy_engine_opcodes.h
+++ b/sandbox/win/src/policy_engine_opcodes.h
@@ -2,17 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #ifndef SANDBOX_WIN_SRC_POLICY_ENGINE_OPCODES_H_
 #define SANDBOX_WIN_SRC_POLICY_ENGINE_OPCODES_H_
 
 #include <stddef.h>
 #include <stdint.h>
 
+#include "base/compiler_specific.h"
 #include "base/memory/raw_ptr.h"
 #include "base/numerics/safe_conversions.h"
 #include "sandbox/win/src/policy_engine_params.h"
@@ -157,7 +153,8 @@
   template <typename T>
   void GetArgument(size_t index, T* argument) const {
     static_assert(sizeof(T) <= sizeof(arguments_[0]), "invalid size");
-    *argument = *reinterpret_cast<const T*>(&arguments_[index].mem);
+    *argument =
+        *reinterpret_cast<const T*>(&UNSAFE_TODO(arguments_[index]).mem);
   }
 
   // Sets a stored argument by index. Valid index values are
@@ -165,7 +162,7 @@
   template <typename T>
   void SetArgument(size_t index, const T& argument) {
     static_assert(sizeof(T) <= sizeof(arguments_[0]), "invalid size");
-    *reinterpret_cast<T*>(&arguments_[index].mem) = argument;
+    *reinterpret_cast<T*>(&UNSAFE_TODO(arguments_[index]).mem) = argument;
   }
 
   // Retrieves the actual address of a string argument. When using
@@ -176,7 +173,8 @@
   const wchar_t* GetRelativeString(size_t index) const {
     ptrdiff_t str_delta = 0;
     GetArgument(index, &str_delta);
-    const char* delta = reinterpret_cast<const char*>(this) + str_delta;
+    const char* delta =
+        UNSAFE_TODO(reinterpret_cast<const char*>(this) + str_delta);
     return reinterpret_cast<const wchar_t*>(delta);
   }
 
@@ -267,14 +265,14 @@
   // memory: base pointer to a chunk of memory where the opcodes are created.
   // memory_size: the size in bytes of the memory chunk.
   OpcodeFactory(char* memory, size_t memory_size) : memory_top_(memory) {
-    memory_bottom_ = &memory_top_[memory_size];
+    memory_bottom_ = &UNSAFE_TODO(memory_top_[memory_size]);
   }
 
   // policy: contains the raw memory where the opcodes are created.
   // memory_size: contains the actual size of the policy argument.
   OpcodeFactory(PolicyBuffer* policy, size_t memory_size) {
     memory_top_ = reinterpret_cast<char*>(&policy->opcodes[0]);
-    memory_bottom_ = &memory_top_[memory_size];
+    memory_bottom_ = &UNSAFE_TODO(memory_top_[memory_size]);
   }
 
   OpcodeFactory(const OpcodeFactory&) = delete;
diff --git a/sandbox/win/src/policy_engine_params.h b/sandbox/win/src/policy_engine_params.h
index bc23d9a..991e5bf 100644
--- a/sandbox/win/src/policy_engine_params.h
+++ b/sandbox/win/src/policy_engine_params.h
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #ifndef SANDBOX_WIN_SRC_POLICY_ENGINE_PARAMS_H_
 #define SANDBOX_WIN_SRC_POLICY_ENGINE_PARAMS_H_
 
@@ -14,6 +9,7 @@
 
 #include <string_view>
 
+#include "base/compiler_specific.h"
 #include "base/memory/raw_ptr.h"
 #include "sandbox/win/src/internal_types.h"
 #include "sandbox/win/src/nt_internals.h"
@@ -175,7 +171,9 @@
 struct CountedParameterSet {
   CountedParameterSet() : count(T::PolParamLast) {}
 
-  ParameterSet& operator[](typename T::Args n) { return parameters[n]; }
+  ParameterSet& operator[](typename T::Args n) {
+    return UNSAFE_TODO(parameters[n]);
+  }
 
   CountedParameterSetBase* GetBase() {
     return reinterpret_cast<CountedParameterSetBase*>(this);
diff --git a/sandbox/win/src/policy_engine_processor.cc b/sandbox/win/src/policy_engine_processor.cc
index 1c2b8b3..b14f0854 100644
--- a/sandbox/win/src/policy_engine_processor.cc
+++ b/sandbox/win/src/policy_engine_processor.cc
@@ -2,16 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "sandbox/win/src/policy_engine_processor.h"
 
 #include <stddef.h>
 #include <stdint.h>
 
+#include "base/compiler_specific.h"
+
 namespace sandbox {
 
 void PolicyProcessor::SetInternalState(size_t index, EvalResult result) {
@@ -67,7 +64,7 @@
   // after the action depending on kPolUseOREval.
 
   for (size_t ix = 0; ix != count; ++ix) {
-    PolicyOpcode& opcode = policy_->opcodes[ix];
+    PolicyOpcode& opcode = UNSAFE_TODO(policy_->opcodes[ix]);
     // Skipping block.
     if (skip_group) {
       if (SkipOpcode(opcode, &context, &skip_group))
diff --git a/sandbox/win/src/policy_low_level.cc b/sandbox/win/src/policy_low_level.cc
index fce6bf8..fef88d68 100644
--- a/sandbox/win/src/policy_low_level.cc
+++ b/sandbox/win/src/policy_low_level.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "sandbox/win/src/policy_low_level.h"
 
 #include <stddef.h>
@@ -82,8 +77,8 @@
   }
 
   PolicyBuffer* current_buffer = &policy_store_->data[0];
-  char* buffer_end =
-      reinterpret_cast<char*>(current_buffer) + policy_store_->data_size;
+  char* buffer_end = UNSAFE_TODO(reinterpret_cast<char*>(current_buffer) +
+                                 policy_store_->data_size);
   size_t avail_size = policy_store_->data_size;
 
   for (Mmap::iterator it = mmap.begin(); it != mmap.end(); ++it) {
@@ -91,7 +86,8 @@
     if (service > IpcTag::kMaxValue) {
       return false;
     }
-    policy_store_->entry[static_cast<size_t>(service)] = current_buffer;
+    UNSAFE_TODO(policy_store_->entry[static_cast<size_t>(service)]) =
+        current_buffer;
 
     RuleList::iterator rules_it = (*it).second.begin();
     RuleList::iterator rules_it_end = (*it).second.end();
@@ -107,13 +103,14 @@
         return false;
       }
       size_t data_size = avail_size - opcodes_size;
-      PolicyOpcode* opcodes_start = &current_buffer->opcodes[svc_opcode_count];
+      PolicyOpcode* opcodes_start =
+          &UNSAFE_TODO(current_buffer->opcodes[svc_opcode_count]);
       if (!rule->RebindCopy(opcodes_start, opcodes_size, buffer_end,
                             &data_size)) {
         return false;
       }
       size_t used = avail_size - data_size;
-      buffer_end -= used;
+      UNSAFE_TODO(buffer_end -= used);
       avail_size -= used;
       svc_opcode_count += op_count;
     }
@@ -121,7 +118,7 @@
     current_buffer->opcode_count = svc_opcode_count;
     size_t policy_buffers_occupied =
         (svc_opcode_count * sizeof(PolicyOpcode)) / sizeof(current_buffer[0]);
-    current_buffer = &current_buffer[policy_buffers_occupied + 1];
+    current_buffer = &UNSAFE_TODO(current_buffer[policy_buffers_occupied + 1]);
   }
 
   return true;
@@ -143,10 +140,11 @@
   size_t buffer_size = sizeof(PolicyBuffer) + kRuleBufferSize;
   char* memory = new char[buffer_size];
   buffer_ = reinterpret_cast<PolicyBuffer*>(memory);
-  memcpy(buffer_, other.buffer_, buffer_size);
+  UNSAFE_TODO(memcpy(buffer_, other.buffer_, buffer_size));
 
   char* opcode_buffer = reinterpret_cast<char*>(&buffer_->opcodes[0]);
-  char* next_opcode = &opcode_buffer[GetOpcodeCount() * sizeof(PolicyOpcode)];
+  char* next_opcode =
+      &UNSAFE_TODO(opcode_buffer[GetOpcodeCount() * sizeof(PolicyOpcode)]);
   opcode_factory_ =
       new OpcodeFactory(next_opcode, other.opcode_factory_->memory_size());
 }
@@ -189,7 +187,7 @@
     // the previous opcode because it was really the last but we did not know
     // it at that time.
     if (last_call && (buffer_->opcode_count > 0)) {
-      op = &buffer_->opcodes[buffer_->opcode_count - 1];
+      op = &UNSAFE_TODO(buffer_->opcodes[buffer_->opcode_count - 1]);
       op->SetOptions(options);
     }
     return true;
@@ -244,13 +242,13 @@
         break;
       case L'/':
         // Check that someone isn't using the old syntax.
-        CHECK(L'?' != current_char[1]);
+        CHECK(L'?' != UNSAFE_TODO(current_char[1]));
         [[fallthrough]];
       default:
         fragment += *current_char;
         last_char = kLastCharIsAlpha;
     }
-    ++current_char;
+    UNSAFE_TODO(++current_char);
   }
 
   return GenStringOpcode(rule_type, parameter, state, true, &skip_count,
@@ -298,7 +296,7 @@
     if (opcode_size < sizeof(PolicyOpcode)) {
       return false;
     }
-    PolicyOpcode& opcode = buffer_->opcodes[ix];
+    PolicyOpcode& opcode = UNSAFE_TODO(buffer_->opcodes[ix]);
     *opcode_start = opcode;
     if (OP_WSTRING_MATCH == opcode.GetID()) {
       // For this opcode argument 0 is a delta to the string and argument 1
@@ -311,13 +309,13 @@
         return false;
       }
       *data_size -= str_len;
-      data_start -= str_len;
-      memcpy(data_start, str, str_len);
+      UNSAFE_TODO(data_start -= str_len);
+      UNSAFE_TODO(memcpy(data_start, str, str_len));
       // Recompute the string displacement
       ptrdiff_t delta = data_start - reinterpret_cast<char*>(opcode_start);
       opcode_start->SetArgument(0, delta);
     }
-    ++opcode_start;
+    UNSAFE_TODO(++opcode_start);
     opcode_size -= sizeof(PolicyOpcode);
   }
 
diff --git a/sandbox/win/src/policy_low_level.h b/sandbox/win/src/policy_low_level.h
index c2be4543..86d98aa8 100644
--- a/sandbox/win/src/policy_low_level.h
+++ b/sandbox/win/src/policy_low_level.h
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #ifndef SANDBOX_WIN_SRC_POLICY_LOW_LEVEL_H_
 #define SANDBOX_WIN_SRC_POLICY_LOW_LEVEL_H_
 
@@ -14,9 +9,9 @@
 #include <stdint.h>
 
 #include <list>
-
 #include <string>
 
+#include "base/compiler_specific.h"
 #include "base/memory/raw_ptr.h"
 #include "sandbox/win/src/ipc_tags.h"
 #include "sandbox/win/src/policy_engine_opcodes.h"
@@ -77,7 +72,7 @@
   // Returns true if the IPC for `service` should be registered for the target.
   // Should only be called after Done() has been called to finalize the setup.
   bool NeedsIpc(IpcTag service) {
-    return entry[static_cast<size_t>(service)] != nullptr;
+    return UNSAFE_TODO(entry[static_cast<size_t>(service)]) != nullptr;
   }
 
   PolicyBuffer* entry[kSandboxIpcCount];
diff --git a/sandbox/win/src/policy_low_level_unittest.cc b/sandbox/win/src/policy_low_level_unittest.cc
index 844e5fd..59536417 100644
--- a/sandbox/win/src/policy_low_level_unittest.cc
+++ b/sandbox/win/src/policy_low_level_unittest.cc
@@ -2,16 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "sandbox/win/src/policy_low_level.h"
 
 #include <stddef.h>
 #include <stdint.h>
 
+#include "base/compiler_specific.h"
 #include "sandbox/win/src/policy_engine_params.h"
 #include "sandbox/win/src/policy_engine_processor.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -43,7 +39,7 @@
 PolicyGlobal* MakePolicyMemory() {
   const size_t kTotalPolicySz = 4096 * 8;
   char* mem = new char[kTotalPolicySz];
-  memset(mem, 0, kTotalPolicySz);
+  UNSAFE_TODO(memset(mem, 0, kTotalPolicySz));
   PolicyGlobal* policy = reinterpret_cast<PolicyGlobal*>(mem);
   policy->data_size = kTotalPolicySz - sizeof(PolicyGlobal);
   return policy;
@@ -384,22 +380,25 @@
   EXPECT_EQ(
       OP_NUMBER_AND_MATCH,
       policy->entry[static_cast<size_t>(kNtFakeNone)]->opcodes[0].GetID());
-  EXPECT_EQ(OP_ACTION, policy->entry[static_cast<size_t>(kNtFakeNone)]
-                           ->opcodes[tc1 - 1]
-                           .GetID());
+  EXPECT_EQ(OP_ACTION,
+            UNSAFE_TODO(policy->entry[static_cast<size_t>(kNtFakeNone)])
+                ->opcodes[tc1 - 1]
+                .GetID());
   EXPECT_EQ(OP_WSTRING_MATCH,
             policy->entry[static_cast<size_t>(kNtFakeCreateFile)]
                 ->opcodes[0]
                 .GetID());
-  EXPECT_EQ(OP_ACTION, policy->entry[static_cast<size_t>(kNtFakeCreateFile)]
-                           ->opcodes[tc2 - 1]
-                           .GetID());
+  EXPECT_EQ(OP_ACTION,
+            UNSAFE_TODO(policy->entry[static_cast<size_t>(kNtFakeCreateFile)])
+                ->opcodes[tc2 - 1]
+                .GetID());
   EXPECT_EQ(
       OP_WSTRING_MATCH,
       policy->entry[static_cast<size_t>(kNtFakeOpenFile)]->opcodes[0].GetID());
-  EXPECT_EQ(OP_ACTION, policy->entry[static_cast<size_t>(kNtFakeOpenFile)]
-                           ->opcodes[tc3 - 1]
-                           .GetID());
+  EXPECT_EQ(OP_ACTION,
+            UNSAFE_TODO(policy->entry[static_cast<size_t>(kNtFakeOpenFile)])
+                ->opcodes[tc3 - 1]
+                .GetID());
 
   // Test the policy evaluation.
 
diff --git a/sandbox/win/src/policy_target.cc b/sandbox/win/src/policy_target.cc
index d7bd48b..e79b513 100644
--- a/sandbox/win/src/policy_target.cc
+++ b/sandbox/win/src/policy_target.cc
@@ -2,16 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "sandbox/win/src/policy_target.h"
 
 #include <ntstatus.h>
 #include <stddef.h>
 
+#include "base/compiler_specific.h"
 #include "sandbox/win/src/crosscall_client.h"
 #include "sandbox/win/src/ipc_tags.h"
 #include "sandbox/win/src/policy_engine_processor.h"
@@ -44,16 +40,17 @@
   PolicyGlobal* global_policy =
       reinterpret_cast<PolicyGlobal*>(g_shared_policy_memory);
 
-  if (!global_policy->entry[static_cast<size_t>(ipc_id)])
+  if (!UNSAFE_TODO(global_policy->entry[static_cast<size_t>(ipc_id)])) {
     return false;
+  }
 
   PolicyBuffer* policy = reinterpret_cast<PolicyBuffer*>(
-      reinterpret_cast<char*>(g_shared_policy_memory) +
-      reinterpret_cast<size_t>(
-          global_policy->entry[static_cast<size_t>(ipc_id)]));
+      UNSAFE_TODO(reinterpret_cast<char*>(g_shared_policy_memory) +
+                  reinterpret_cast<size_t>(
+                      global_policy->entry[static_cast<size_t>(ipc_id)])));
 
   if ((reinterpret_cast<size_t>(
-           global_policy->entry[static_cast<size_t>(ipc_id)]) >
+           UNSAFE_TODO(global_policy->entry[static_cast<size_t>(ipc_id)])) >
        global_policy->data_size) ||
       (g_shared_policy_size < global_policy->data_size)) {
     NOTREACHED_NT();
@@ -61,7 +58,7 @@
   }
 
   for (size_t i = 0; i < params->count; i++) {
-    if (!params->parameters[i].IsValid()) {
+    if (!UNSAFE_TODO(params->parameters[i]).IsValid()) {
       NOTREACHED_NT();
       return false;
     }
diff --git a/sandbox/win/src/process_mitigations_deathtest.cc b/sandbox/win/src/process_mitigations_deathtest.cc
index 4af304c..eb91b95d 100644
--- a/sandbox/win/src/process_mitigations_deathtest.cc
+++ b/sandbox/win/src/process_mitigations_deathtest.cc
@@ -2,15 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
-#include "sandbox/win/src/process_mitigations.h"
-
+#include "base/compiler_specific.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_number_conversions_win.h"
+#include "sandbox/win/src/process_mitigations.h"
 #include "sandbox/win/tests/common/controller.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -34,7 +29,7 @@
 
   for (int i = 0; i < argc; i++) {
     int test;
-    if (!base::StringToInt(argv[i], &test)) {
+    if (!base::StringToInt(UNSAFE_TODO(argv[i]), &test)) {
       return SBOX_TEST_INVALID_PARAMETER;
     }
 
diff --git a/sandbox/win/src/process_mitigations_dyncode_unittest.cc b/sandbox/win/src/process_mitigations_dyncode_unittest.cc
index eaedb5d2..ab6a7ea 100644
--- a/sandbox/win/src/process_mitigations_dyncode_unittest.cc
+++ b/sandbox/win/src/process_mitigations_dyncode_unittest.cc
@@ -2,15 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include <windows.h>
 
 #include <string>
 
+#include "base/compiler_specific.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/memory/raw_ptr.h"
@@ -368,7 +364,7 @@
   // [OPTIONAL] Arg2
   wchar_t* path = nullptr;
   if (argc > 1)
-    path = argv[1];
+    path = UNSAFE_TODO(argv[1]);
 
   return DynamicCodeTest(static_cast<DynCodeAPI>(test), path);
 }
@@ -380,23 +376,25 @@
 // - [OPTIONAL] If Arg2 is MAPVIEWFILE, Arg3 is a file path to map.
 SBOX_TESTS_COMMAND int TestWin10DynamicCodeWithOptOut(int argc,
                                                       wchar_t** argv) {
-  if (argc < 2 || !argv[0] || !argv[1])
+  if (argc < 2 || !argv[0] || !UNSAFE_TODO(argv[1])) {
     return SBOX_TEST_INVALID_PARAMETER;
+  }
 
   // Arg1
   bool opt_out = false;
-  if (::wcsicmp(argv[0], L"true") == 0)
+  if (UNSAFE_TODO(::wcsicmp(argv[0], L"true")) == 0) {
     opt_out = true;
+  }
 
   // Arg2
-  int test = ::_wtoi(argv[1]);
+  int test = ::_wtoi(UNSAFE_TODO(argv[1]));
   if (test <= 0 || test >= NOTSUPPORTED)
     return SBOX_TEST_INVALID_PARAMETER;
 
   // [OPTIONAL] Arg3
   wchar_t* path = nullptr;
   if (argc > 2)
-    path = argv[2];
+    path = UNSAFE_TODO(argv[2]);
 
   // Spawn new thread and wait for it to finish!
   DynamicCodeOptOutThread opt_out_thread(opt_out, static_cast<DynCodeAPI>(test),
diff --git a/sandbox/win/src/process_mitigations_unittest.cc b/sandbox/win/src/process_mitigations_unittest.cc
index 9e24fde..da27817 100644
--- a/sandbox/win/src/process_mitigations_unittest.cc
+++ b/sandbox/win/src/process_mitigations_unittest.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "sandbox/win/src/process_mitigations.h"
 
 #include <windows.h>
@@ -15,6 +10,7 @@
 #include <ktmw32.h>
 #include <ntstatus.h>
 
+#include "base/compiler_specific.h"
 #include "base/files/file.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/path_service.h"
@@ -536,7 +532,8 @@
     return SBOX_TEST_NOT_FOUND;
   font_data.resize(len);
 
-  int read = file.Read(0, &font_data[0], base::checked_cast<int>(len));
+  int read =
+      UNSAFE_TODO(file.Read(0, &font_data[0], base::checked_cast<int>(len)));
   file.Close();
 
   if (read != len)
@@ -574,13 +571,13 @@
     return SBOX_TEST_INVALID_PARAMETER;
 
   bool process_finishes = true;
-  std::wstring arg2 = argv[1];
+  std::wstring arg2 = UNSAFE_TODO(argv[1]);
   if (arg2.compare(L"false") == 0)
     process_finishes = false;
 
   int desired_exit_code = 0;
   if (argc == 3) {
-    desired_exit_code = wcstoul(argv[2], nullptr, 0);
+    desired_exit_code = UNSAFE_TODO(wcstoul(argv[2], nullptr, 0));
   }
 
   std::wstring cmd = argv[0];
diff --git a/sandbox/win/src/restricted_token_test.cc b/sandbox/win/src/restricted_token_test.cc
index 41be7464..62d8d64 100644
--- a/sandbox/win/src/restricted_token_test.cc
+++ b/sandbox/win/src/restricted_token_test.cc
@@ -2,17 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 // Integration tests for restricted tokens.
 
 #include <stddef.h>
-#include <string>
 
 #include <optional>
+#include <string>
+
+#include "base/compiler_specific.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/win/access_token.h"
@@ -124,7 +121,7 @@
   DWORD pid = _wtoi(argv[0]);
   if (pid == 0)
     return SBOX_TEST_NOT_FOUND;
-  DWORD desired_access = wcstoul(argv[1], nullptr, 0);
+  DWORD desired_access = UNSAFE_TODO(wcstoul(argv[1], nullptr, 0));
   base::win::ScopedHandle process_handle(
       ::OpenProcess(desired_access, false, pid));
   if (process_handle.is_valid()) {
@@ -139,7 +136,7 @@
                                                               wchar_t** argv) {
   if (argc < 1)
     return SBOX_TEST_NOT_FOUND;
-  DWORD desired_access = wcstoul(argv[0], nullptr, 0);
+  DWORD desired_access = UNSAFE_TODO(wcstoul(argv[0], nullptr, 0));
 
   HANDLE dup_handle;
   if (!::DuplicateHandle(::GetCurrentProcess(), ::GetCurrentProcess(),
diff --git a/sandbox/win/src/sandbox_nt_util.h b/sandbox/win/src/sandbox_nt_util.h
index fea61a7..55bae72d 100644
--- a/sandbox/win/src/sandbox_nt_util.h
+++ b/sandbox/win/src/sandbox_nt_util.h
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #ifndef SANDBOX_WIN_SRC_SANDBOX_NT_UTIL_H_
 #define SANDBOX_WIN_SRC_SANDBOX_NT_UTIL_H_
 
@@ -18,6 +13,7 @@
 #include <optional>
 #include <string_view>
 
+#include "base/compiler_specific.h"
 #include "base/containers/span.h"
 #include "base/memory/raw_ptr_exclusion.h"
 #include "sandbox/win/src/nt_internals.h"
@@ -228,7 +224,7 @@
 __forceinline void Memset(void* ptr, int value, size_t num_bytes) {
   unsigned char* byte_ptr = static_cast<unsigned char*>(ptr);
   while (num_bytes--) {
-    *byte_ptr++ = static_cast<unsigned char>(value);
+    *UNSAFE_TODO(byte_ptr++) = static_cast<unsigned char>(value);
   }
 }
 
diff --git a/sandbox/win/src/sandbox_policy_diagnostic.cc b/sandbox/win/src/sandbox_policy_diagnostic.cc
index d200139..ebae0fb 100644
--- a/sandbox/win/src/sandbox_policy_diagnostic.cc
+++ b/sandbox/win/src/sandbox_policy_diagnostic.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "sandbox/win/src/sandbox_policy_diagnostic.h"
 
 #include <windows.h>
@@ -21,6 +16,7 @@
 #include <vector>
 
 #include "base/check.h"
+#include "base/compiler_specific.h"
 #include "base/json/json_writer.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/string_util.h"
@@ -303,15 +299,16 @@
                                    IpcTag service) {
   base::Value::List entry;
   PolicyBuffer* policy_buffer =
-      policy_rules->entry[static_cast<size_t>(service)];
+      UNSAFE_TODO(policy_rules->entry[static_cast<size_t>(service)]);
   // Build up rules and emit when we hit an action.
   std::string cur_rule;
   for (size_t i = 0; i < policy_buffer->opcode_count; i++) {
-    const PolicyOpcode* opcode = &policy_buffer->opcodes[i];
+    const PolicyOpcode* opcode = &UNSAFE_TODO(policy_buffer->opcodes[i]);
     if (opcode->GetID() != OP_ACTION) {
       DCHECK(i + 1 < policy_buffer->opcode_count)
           << "Non-actions should not terminate rules";
-      bool peak = policy_buffer->opcodes[i + 1].GetID() != OP_ACTION;
+      bool peak =
+          UNSAFE_TODO(policy_buffer->opcodes[i + 1]).GetID() != OP_ACTION;
       cur_rule += GetPolicyOpcode(opcode, peak);
     } else {
       cur_rule += " -> ";
@@ -329,7 +326,8 @@
   base::Value::Dict results;
 
   for (auto ipc : ipcs) {
-    if (policy_rules && policy_rules->entry[static_cast<size_t>(ipc)]) {
+    if (policy_rules &&
+        UNSAFE_TODO(policy_rules->entry[static_cast<size_t>(ipc)])) {
       results.Set(GetIpcTagAsString(ipc), GetPolicyOpcodes(policy_rules, ipc));
     } else {
       results.Set(GetIpcTagAsString(ipc), base::Value::List());
@@ -407,16 +405,16 @@
     size_t policy_mem_size = original_rules->data_size + sizeof(PolicyGlobal);
     policy_rules_.reset(
         static_cast<sandbox::PolicyGlobal*>(::operator new(policy_mem_size)));
-    memcpy(policy_rules_.get(), original_rules, policy_mem_size);
+    UNSAFE_TODO(memcpy(policy_rules_.get(), original_rules, policy_mem_size));
     // Fixup pointers (see |PolicyGlobal| in policy_low_level.h).
     PolicyBuffer** original_entries = original_rules->entry;
     PolicyBuffer** copy_base = policy_rules_->entry;
     for (size_t i = 0; i < kSandboxIpcCount; i++) {
-      if (policy_rules_->entry[i]) {
-        policy_rules_->entry[i] = reinterpret_cast<PolicyBuffer*>(
-            reinterpret_cast<char*>(copy_base) +
-            (reinterpret_cast<char*>(original_entries[i]) -
-             reinterpret_cast<char*>(original_entries)));
+      if (UNSAFE_TODO(policy_rules_->entry[i])) {
+        UNSAFE_TODO(policy_rules_->entry[i]) = reinterpret_cast<PolicyBuffer*>(
+            UNSAFE_TODO(reinterpret_cast<char*>(copy_base) +
+                        (reinterpret_cast<char*>(original_entries[i]) -
+                         reinterpret_cast<char*>(original_entries))));
       }
     }
   }
diff --git a/sandbox/win/src/sharedmem_ipc_client.cc b/sandbox/win/src/sharedmem_ipc_client.cc
index e41ab2f..3228194c 100644
--- a/sandbox/win/src/sharedmem_ipc_client.cc
+++ b/sandbox/win/src/sharedmem_ipc_client.cc
@@ -2,17 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "sandbox/win/src/sharedmem_ipc_client.h"
 
 #include <stddef.h>
 #include <string.h>
 
 #include "base/check_op.h"
+#include "base/compiler_specific.h"
 #include "sandbox/win/src/crosscall_client.h"
 #include "sandbox/win/src/crosscall_params.h"
 #include "sandbox/win/src/sandbox.h"
@@ -57,8 +53,8 @@
   if (failure) {
     return nullptr;
   }
-  return reinterpret_cast<char*>(control_) +
-         control_->channels[ix].channel_base;
+  return UNSAFE_TODO(reinterpret_cast<char*>(control_) +
+                     control_->channels[ix].channel_base);
 }
 
 // If we need to cancel an IPC before issuing DoCall
@@ -67,7 +63,8 @@
 void SharedMemIPCClient::FreeBuffer(void* buffer) {
   size_t num = ChannelIndexFromBuffer(buffer);
   ChannelControl* channel = control_->channels;
-  LONG result = ::InterlockedExchange(&channel[num].state, kFreeChannel);
+  LONG result =
+      ::InterlockedExchange(&UNSAFE_TODO(channel[num]).state, kFreeChannel);
   DCHECK_NE(kFreeChannel, static_cast<ChannelState>(result));
 }
 
@@ -76,8 +73,8 @@
 // and should be constructed per call.
 SharedMemIPCClient::SharedMemIPCClient(void* shared_mem)
     : control_(reinterpret_cast<IPCControl*>(shared_mem)) {
-  first_base_ =
-      reinterpret_cast<char*>(shared_mem) + control_->channels[0].channel_base;
+  first_base_ = UNSAFE_TODO(reinterpret_cast<char*>(shared_mem) +
+                            control_->channels[0].channel_base);
   // There must be at least one channel.
   DCHECK(0 != control_->channels_count);
 }
@@ -95,7 +92,7 @@
   // Note that the IPC tag goes outside the buffer as well inside
   // the buffer. This should enable the server to prioritize based on
   // IPC tags without having to de-serialize the entire message.
-  channel[num].ipc_tag = params->GetTag();
+  UNSAFE_TODO(channel[num]).ipc_tag = params->GetTag();
 
   // Wait for the server to service this IPC call. After kIPCWaitTimeOut1
   // we check if the server_alive mutex was abandoned which will indicate
@@ -103,8 +100,9 @@
 
   // While the atomic signaling and waiting is not a requirement, it
   // is nice because we save a trip to kernel.
-  DWORD wait = SignalObjectAndWaitWrapper(
-      channel[num].ping_event, channel[num].pong_event, kIPCWaitTimeOut1);
+  DWORD wait = SignalObjectAndWaitWrapper(UNSAFE_TODO(channel[num]).ping_event,
+                                          UNSAFE_TODO(channel[num]).pong_event,
+                                          kIPCWaitTimeOut1);
   if (WAIT_TIMEOUT == wait) {
     // The server is taking too long. Enter a loop were we check if the
     // server_alive mutex has been abandoned which would signal a server crash
@@ -113,7 +111,7 @@
       wait = WaitForSingleObjectWrapper(control_->server_alive, 0);
       if (WAIT_TIMEOUT == wait) {
         // Server seems still alive. We already signaled so here we just wait.
-        wait = WaitForSingleObjectWrapper(channel[num].pong_event,
+        wait = WaitForSingleObjectWrapper(UNSAFE_TODO(channel[num]).pong_event,
                                           kIPCWaitTimeOut1);
         if (WAIT_OBJECT_0 == wait) {
           // The server took a long time but responded.
@@ -126,7 +124,8 @@
       } else {
         // The server has crashed and windows has signaled the mutex as
         // abandoned.
-        ::InterlockedExchange(&channel[num].state, kAbandonedChannel);
+        ::InterlockedExchange(&UNSAFE_TODO(channel[num]).state,
+                              kAbandonedChannel);
         control_->server_alive = 0;
         return SBOX_ERROR_CHANNEL_ERROR;
       }
@@ -158,8 +157,9 @@
   ChannelControl* channel = control_->channels;
   do {
     for (size_t ix = 0; ix != control_->channels_count; ++ix) {
-      if (kFreeChannel == ::InterlockedCompareExchange(
-                              &channel[ix].state, kBusyChannel, kFreeChannel)) {
+      if (kFreeChannel ==
+          ::InterlockedCompareExchange(&UNSAFE_TODO(channel[ix]).state,
+                                       kBusyChannel, kFreeChannel)) {
         *severe_failure = false;
         return ix;
       }
diff --git a/sandbox/win/src/sharedmem_ipc_server.cc b/sandbox/win/src/sharedmem_ipc_server.cc
index c00fca6..423aa37e 100644
--- a/sandbox/win/src/sharedmem_ipc_server.cc
+++ b/sandbox/win/src/sharedmem_ipc_server.cc
@@ -2,17 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "sandbox/win/src/sharedmem_ipc_server.h"
 
 #include <stddef.h>
 #include <stdint.h>
 
 #include "base/check.h"
+#include "base/compiler_specific.h"
 #include "base/functional/callback.h"
 #include "base/memory/ptr_util.h"
 #include "base/notreached.h"
@@ -105,7 +101,8 @@
   // 4) initialize the server side of the channel (service_context).
   // 5) call the thread provider RegisterWait to register the ping events.
   for (size_t ix = 0; ix != channel_count; ++ix) {
-    ChannelControl* client_context = &client_control_->channels[ix];
+    ChannelControl* client_context =
+        &UNSAFE_TODO(client_control_->channels[ix]);
     ServerControl* service_context = new ServerControl;
     server_contexts_.push_back(base::WrapUnique(service_context));
 
@@ -125,8 +122,8 @@
     service_context->shared_base = reinterpret_cast<char*>(shared_mem);
     service_context->channel_size = channel_size;
     service_context->channel = client_context;
-    service_context->channel_buffer =
-        service_context->shared_base + client_context->channel_base;
+    service_context->channel_buffer = UNSAFE_TODO(service_context->shared_base +
+                                                  client_context->channel_base);
     service_context->dispatcher = call_dispatcher_;
     service_context->target_info.process = target_process_;
     service_context->target_info.process_id = target_process_id_;
@@ -277,12 +274,13 @@
     if (handler)
       SetCallError(SBOX_ERROR_FAILED_IPC, call_result);
   } else {
-    memcpy(call_result, &ipc_info.return_info, sizeof(*call_result));
+    UNSAFE_TODO(
+        memcpy(call_result, &ipc_info.return_info, sizeof(*call_result)));
     SetCallSuccess(call_result);
     if (params->IsInOut()) {
       // Maybe the params got changed by the broker. We need to upadte the
       // memory section.
-      memcpy(ipc_buffer, params.get(), output_size);
+      UNSAFE_TODO(memcpy(ipc_buffer, params.get(), output_size));
     }
   }
 
@@ -320,7 +318,8 @@
   // Copy the answer back into the channel and signal the pong event. This
   // should wake up the client so it can finish the ipc cycle.
   CrossCallParams* call_params = reinterpret_cast<CrossCallParams*>(buffer);
-  memcpy(call_params->GetCallReturn(), &call_result, sizeof(call_result));
+  UNSAFE_TODO(
+      memcpy(call_params->GetCallReturn(), &call_result, sizeof(call_result)));
   ::InterlockedExchange(&service_context->channel->state, kAckChannel);
   ::SetEvent(service_context->pong_event.get());
 }
diff --git a/sandbox/win/src/target_interceptions.cc b/sandbox/win/src/target_interceptions.cc
index bcc5663..89fba3e 100644
--- a/sandbox/win/src/target_interceptions.cc
+++ b/sandbox/win/src/target_interceptions.cc
@@ -2,15 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "sandbox/win/src/target_interceptions.h"
 
 #include <ntstatus.h>
 
+#include "base/compiler_specific.h"
 #include "base/win/static_constants.h"
 #include "sandbox/win/src/interception_agent.h"
 #include "sandbox/win/src/sandbox_factory.h"
@@ -59,9 +55,9 @@
       // find what looks like a valid export directory for a PE module but the
       // pointer to the module name will be pointing to invalid memory.
       __try {
-        if (ansi_module_name &&
-            (GetNtExports()->_strnicmp(ansi_module_name, KERNEL32_DLL_NAME,
-                                       sizeof(KERNEL32_DLL_NAME)) == 0)) {
+        if (ansi_module_name && (UNSAFE_TODO(GetNtExports()->_strnicmp)(
+                                     ansi_module_name, KERNEL32_DLL_NAME,
+                                     sizeof(KERNEL32_DLL_NAME)) == 0)) {
           s_state = kAfterKernel32;
         }
       } __except (EXCEPTION_EXECUTE_HANDLER) {
diff --git a/sandbox/win/src/top_level_dispatcher.cc b/sandbox/win/src/top_level_dispatcher.cc
index b1db56e0..fd8da61 100644
--- a/sandbox/win/src/top_level_dispatcher.cc
+++ b/sandbox/win/src/top_level_dispatcher.cc
@@ -2,17 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "sandbox/win/src/top_level_dispatcher.h"
 
 #include <stdint.h>
 #include <string.h>
 
 #include "base/check.h"
+#include "base/compiler_specific.h"
 #include "base/notreached.h"
 #include "sandbox/win/src/crosscall_server.h"
 #include "sandbox/win/src/filesystem_dispatcher.h"
@@ -28,7 +24,7 @@
 
 TopLevelDispatcher::TopLevelDispatcher(PolicyBase* policy) : policy_(policy) {
   // Initialize the IPC dispatcher array.
-  memset(ipc_targets_, 0, sizeof(ipc_targets_));
+  UNSAFE_TODO(memset(ipc_targets_, 0, sizeof(ipc_targets_)));
 
   ConfigBase* config = policy_->config();
   CHECK(config->IsConfigured());
@@ -41,7 +37,8 @@
         filesystem_dispatcher_ =
             std::make_unique<FilesystemDispatcher>(policy_);
       }
-      ipc_targets_[static_cast<size_t>(service)] = filesystem_dispatcher_.get();
+      UNSAFE_TODO(ipc_targets_[static_cast<size_t>(service)]) =
+          filesystem_dispatcher_.get();
     }
   }
 
@@ -52,7 +49,7 @@
         thread_process_dispatcher_ =
             std::make_unique<ThreadProcessDispatcher>();
       }
-      ipc_targets_[static_cast<size_t>(service)] =
+      UNSAFE_TODO(ipc_targets_[static_cast<size_t>(service)]) =
           thread_process_dispatcher_.get();
     }
   }
@@ -67,7 +64,7 @@
       }
       // Technically we don't need to register for IPCs but we do need this
       // here to write the intercepts in SetupService.
-      ipc_targets_[static_cast<size_t>(service)] =
+      UNSAFE_TODO(ipc_targets_[static_cast<size_t>(service)]) =
           process_mitigations_win32k_dispatcher_.get();
     }
   }
@@ -84,7 +81,7 @@
 std::vector<IpcTag> TopLevelDispatcher::ipc_targets() {
   std::vector<IpcTag> results = {IpcTag::PING1, IpcTag::PING2};
   for (size_t ipc = 0; ipc < kSandboxIpcCount; ipc++) {
-    if (ipc_targets_[ipc]) {
+    if (UNSAFE_TODO(ipc_targets_[ipc])) {
       results.push_back(static_cast<IpcTag>(ipc));
     }
   }
@@ -158,7 +155,7 @@
     return nullptr;
   }
 
-  return ipc_targets_[static_cast<size_t>(ipc_tag)];
+  return UNSAFE_TODO(ipc_targets_[static_cast<size_t>(ipc_tag)]);
 }
 
 }  // namespace sandbox
diff --git a/sandbox/win/src/unload_dll_test.cc b/sandbox/win/src/unload_dll_test.cc
index 3fa080b..9ea364a 100644
--- a/sandbox/win/src/unload_dll_test.cc
+++ b/sandbox/win/src/unload_dll_test.cc
@@ -2,11 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
+#include "base/compiler_specific.h"
 #include "base/win/scoped_handle.h"
 #include "build/build_config.h"
 #include "sandbox/win/src/sandbox.h"
@@ -26,12 +22,12 @@
 
   wchar_t option = (argv[0])[0];
   if ((option == L'L') || (option == L'B')) {
-    HMODULE module1 = ::LoadLibraryW(argv[1]);
+    HMODULE module1 = ::LoadLibraryW(UNSAFE_TODO(argv[1]));
     rv = (!module1) ? SBOX_TEST_FAILED : SBOX_TEST_SUCCEEDED;
   }
 
   if ((option == L'U') || (option == L'B')) {
-    HMODULE module2 = ::GetModuleHandleW(argv[1]);
+    HMODULE module2 = ::GetModuleHandleW(UNSAFE_TODO(argv[1]));
     rv = ::FreeLibrary(module2) ? SBOX_TEST_SUCCEEDED : SBOX_TEST_FAILED;
   }
   return rv;
diff --git a/sandbox/win/src/win_utils.cc b/sandbox/win/src/win_utils.cc
index 7c5923c..0f30bcca 100644
--- a/sandbox/win/src/win_utils.cc
+++ b/sandbox/win/src/win_utils.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "sandbox/win/src/win_utils.h"
 
 #include <windows.h>
@@ -23,6 +18,7 @@
 #include <vector>
 
 #include "base/check.h"
+#include "base/compiler_specific.h"
 #include "base/containers/span.h"
 #include "base/numerics/safe_math.h"
 #include "base/strings/string_util.h"
@@ -115,7 +111,7 @@
   if (!buffer)
     return std::nullopt;
   OBJECT_NAME_INFORMATION* name =
-      reinterpret_cast<OBJECT_NAME_INFORMATION*>(buffer->data());
+      UNSAFE_TODO(reinterpret_cast<OBJECT_NAME_INFORMATION*>(buffer->data()));
   return std::wstring(
       name->ObjectName.Buffer,
       name->ObjectName.Length / sizeof(name->ObjectName.Buffer[0]));
@@ -128,7 +124,7 @@
   if (!buffer)
     return std::nullopt;
   OBJECT_TYPE_INFORMATION* name =
-      reinterpret_cast<OBJECT_TYPE_INFORMATION*>(buffer->data());
+      UNSAFE_TODO(reinterpret_cast<OBJECT_TYPE_INFORMATION*>(buffer->data()));
   return std::wstring(name->Name.Buffer,
                       name->Name.Length / sizeof(name->Name.Buffer[0]));
 }
diff --git a/sandbox/win/tests/common/controller.cc b/sandbox/win/tests/common/controller.cc
index 08a7037..955a05d 100644
--- a/sandbox/win/tests/common/controller.cc
+++ b/sandbox/win/tests/common/controller.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "sandbox/win/tests/common/controller.h"
 
 #include <memory>
@@ -14,6 +9,7 @@
 #include <string_view>
 
 #include "base/check.h"
+#include "base/compiler_specific.h"
 #include "base/functional/callback.h"
 #include "base/memory/platform_shared_memory_region.h"
 #include "base/memory/read_only_shared_memory_region.h"
@@ -426,20 +422,21 @@
     return SBOX_TEST_INVALID_PARAMETER;
 
   // We hard code two tests to avoid dispatch failures.
-  if (0 == _wcsicmp(argv[3], L"wait")) {
-      Sleep(INFINITE);
-      return SBOX_TEST_TIMED_OUT;
+  if (0 == _wcsicmp(UNSAFE_TODO(argv[3]), L"wait")) {
+    Sleep(INFINITE);
+    return SBOX_TEST_TIMED_OUT;
   }
 
-  if (0 == _wcsicmp(argv[3], L"ping"))
-      return SBOX_TEST_PING_OK;
+  if (0 == _wcsicmp(UNSAFE_TODO(argv[3]), L"ping")) {
+    return SBOX_TEST_PING_OK;
+  }
 
   // If the caller shared a shared memory handle with us attempt to open it
   // in read only mode and sleep infinitely if we succeed.
-  if (0 == _wcsicmp(argv[3], L"shared_memory_handle")) {
+  if (0 == _wcsicmp(UNSAFE_TODO(argv[3]), L"shared_memory_handle")) {
     HANDLE raw_handle = nullptr;
     std::string_view test_contents = "Hello World";
-    base::StringToUint(base::AsStringPiece16(argv[4]),
+    base::StringToUint(base::AsStringPiece16(UNSAFE_TODO(argv[4])),
                        reinterpret_cast<unsigned int*>(&raw_handle));
     if (raw_handle == nullptr)
       return SBOX_TEST_INVALID_PARAMETER;
@@ -471,7 +468,8 @@
     return SBOX_TEST_TIMED_OUT;
   }
 
-  SboxTestsState state = static_cast<SboxTestsState>(_wtoi(argv[2]));
+  SboxTestsState state =
+      static_cast<SboxTestsState>(_wtoi(UNSAFE_TODO(argv[2])));
   if ((state <= MIN_STATE) || (state >= MAX_STATE))
     return SBOX_TEST_INVALID_PARAMETER;
 
@@ -481,16 +479,17 @@
                          reinterpret_cast<wchar_t*>(&DispatchCall), &module))
     return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND;
 
-  std::string command_name = base::SysWideToMultiByte(argv[3], CP_UTF8);
+  std::string command_name =
+      base::SysWideToMultiByte(UNSAFE_TODO(argv[3]), CP_UTF8);
   CommandFunction command = reinterpret_cast<CommandFunction>(
                                 ::GetProcAddress(module, command_name.c_str()));
   if (!command)
     return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND;
 
   if (BEFORE_INIT == state)
-    return command(argc - 4, argv + 4);
+    return command(argc - 4, UNSAFE_TODO(argv + 4));
   else if (EVERY_STATE == state)
-    command(argc - 4, argv + 4);
+    command(argc - 4, UNSAFE_TODO(argv + 4));
 
   TargetServices* target = SandboxFactory::GetTargetServices();
   if (target) {
@@ -498,9 +497,9 @@
       return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND;
 
     if (BEFORE_REVERT == state)
-      return command(argc - 4, argv + 4);
+      return command(argc - 4, UNSAFE_TODO(argv + 4));
     else if (EVERY_STATE == state)
-      command(argc - 4, argv + 4);
+      command(argc - 4, UNSAFE_TODO(argv + 4));
 
 #if defined(ADDRESS_SANITIZER) || CHECK_WILL_STREAM()
     // Bind and leak dbghelp.dll before the token is lowered, otherwise some
@@ -512,11 +511,11 @@
 #endif
 
     target->LowerToken();
-  } else if (0 != _wcsicmp(argv[1], L"-child-no-sandbox")) {
+  } else if (0 != _wcsicmp(UNSAFE_TODO(argv[1]), L"-child-no-sandbox")) {
     return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND;
   }
 
-  return command(argc - 4, argv + 4);
+  return command(argc - 4, UNSAFE_TODO(argv + 4));
 }
 
 }  // namespace sandbox
diff --git a/sandbox/win/tests/integration_tests/integration_tests.cc b/sandbox/win/tests/integration_tests/integration_tests.cc
index 9995eeba..1bb9545 100644
--- a/sandbox/win/tests/integration_tests/integration_tests.cc
+++ b/sandbox/win/tests/integration_tests/integration_tests.cc
@@ -2,11 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
+#include "base/compiler_specific.h"
 #include "base/functional/bind.h"
 #include "base/test/launcher/unit_test_launcher.h"
 #include "base/test/test_suite.h"
@@ -27,8 +23,8 @@
 
 int wmain(int argc, wchar_t **argv) {
   if (argc >= 2) {
-    if (0 == _wcsicmp(argv[1], L"-child") ||
-        0 == _wcsicmp(argv[1], L"-child-no-sandbox")) {
+    if (0 == _wcsicmp(UNSAFE_TODO(argv[1]), L"-child") ||
+        0 == _wcsicmp(UNSAFE_TODO(argv[1]), L"-child-no-sandbox")) {
       // This inits the current commandline from GetCommandLineW().
       base::CommandLine::Init(0, nullptr);
       // This sets default timeouts.
diff --git a/sandbox/win/tests/integration_tests/integration_tests_test.cc b/sandbox/win/tests/integration_tests/integration_tests_test.cc
index 6ebed6c..b3dce99f 100644
--- a/sandbox/win/tests/integration_tests/integration_tests_test.cc
+++ b/sandbox/win/tests/integration_tests/integration_tests_test.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 // Some tests for the framework itself.
 
 #include <windows.h>
@@ -14,6 +9,7 @@
 #include <stddef.h>
 #include <stdlib.h>
 
+#include "base/compiler_specific.h"
 #include "base/debug/alias.h"
 #include "base/memory/raw_ptr.h"
 #include "base/strings/stringprintf.h"
@@ -111,8 +107,9 @@
 SBOX_TESTS_COMMAND int IntegrationTestsTest_args(int argc, wchar_t **argv) {
   for (int i = 0; i < argc; i++) {
     wchar_t argument[20];
-    size_t argument_bytes = wcslen(argv[i]) * sizeof(wchar_t);
-    memcpy(argument, argv[i], __min(sizeof(argument), argument_bytes));
+    size_t argument_bytes = wcslen(UNSAFE_TODO(argv[i])) * sizeof(wchar_t);
+    UNSAFE_TODO(
+        memcpy(argument, argv[i], __min(sizeof(argument), argument_bytes)));
   }
 
   return argc;
@@ -125,13 +122,13 @@
     return SBOX_TEST_INVALID_PARAMETER;
 
   base::win::ScopedHandle handle_started(
-      reinterpret_cast<HANDLE>(wcstoul(argv[0], nullptr, 16)));
+      reinterpret_cast<HANDLE>(UNSAFE_TODO(wcstoul(argv[0], nullptr, 16))));
   if (!handle_started.is_valid()) {
     return SBOX_TEST_NOT_FOUND;
   }
 
   base::win::ScopedHandle handle_done(
-      reinterpret_cast<HANDLE>(wcstoul(argv[1], nullptr, 16)));
+      reinterpret_cast<HANDLE>(UNSAFE_TODO(wcstoul(argv[1], nullptr, 16))));
   if (!handle_done.is_valid()) {
     return SBOX_TEST_NOT_FOUND;
   }
@@ -154,7 +151,7 @@
   }
 
   base::win::ScopedHandle handle_started(
-      reinterpret_cast<HANDLE>(wcstoul(argv[0], nullptr, 16)));
+      reinterpret_cast<HANDLE>(UNSAFE_TODO(wcstoul(argv[0], nullptr, 16))));
   if (!handle_started.is_valid()) {
     return SBOX_TEST_NOT_FOUND;
   }
diff --git a/sandbox/win/tests/unit_tests/unit_tests.cc b/sandbox/win/tests/unit_tests/unit_tests.cc
index 0250339..c5537240 100644
--- a/sandbox/win/tests/unit_tests/unit_tests.cc
+++ b/sandbox/win/tests/unit_tests/unit_tests.cc
@@ -2,11 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
+#include "base/compiler_specific.h"
 #include "base/functional/bind.h"
 #include "base/test/launcher/unit_test_launcher.h"
 #include "base/test/test_suite.h"
@@ -14,9 +10,10 @@
 
 int wmain(int argc, wchar_t **argv) {
   if (argc >= 2) {
-    if (0 == _wcsicmp(argv[1], L"-child"))
+    if (0 == _wcsicmp(UNSAFE_TODO(argv[1]), L"-child")) {
       // This instance is a child, not the test.
       return 0;
+    }
   }
 
   base::TestSuite test_suite(argc, argv);
diff --git a/sandbox/win/tests/validation_tests/commands.cc b/sandbox/win/tests/validation_tests/commands.cc
index 7c6813f..ee661743 100644
--- a/sandbox/win/tests/validation_tests/commands.cc
+++ b/sandbox/win/tests/validation_tests/commands.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "sandbox/win/tests/validation_tests/commands.h"
 
 #include <windows.h>
@@ -16,6 +11,7 @@
 
 #include <string>
 
+#include "base/compiler_specific.h"
 #include "sandbox/win/src/sandbox_factory.h"
 #include "sandbox/win/src/target_services.h"
 #include "sandbox/win/tests/common/controller.h"
@@ -90,9 +86,9 @@
 }
 
 SBOX_TESTS_COMMAND int OpenProcessCmd(int argc, wchar_t **argv) {
-  return (argc == 2) ?
-      TestOpenProcess(_wtol(argv[0]), _wtol(argv[1])) :
-      SBOX_TEST_FAILED_TO_EXECUTE_COMMAND;
+  return (argc == 2)
+             ? TestOpenProcess(_wtol(argv[0]), _wtol(UNSAFE_TODO(argv[1])))
+             : SBOX_TEST_FAILED_TO_EXECUTE_COMMAND;
 }
 
 int TestOpenProcess(DWORD process_id, DWORD access_mask) {
@@ -161,7 +157,7 @@
   // Get the subkey.
   std::wstring subkey;
   if (argc == 2) {
-    subkey = argv[1];
+    subkey = UNSAFE_TODO(argv[1]);
     trim_quote(&subkey);
   }
 
diff --git a/sandbox/win/tests/validation_tests/unit_tests.cc b/sandbox/win/tests/validation_tests/unit_tests.cc
index 3f05656..491cfc5 100644
--- a/sandbox/win/tests/validation_tests/unit_tests.cc
+++ b/sandbox/win/tests/validation_tests/unit_tests.cc
@@ -2,11 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
+#include "base/compiler_specific.h"
 #include "base/functional/bind.h"
 #include "base/test/launcher/unit_test_launcher.h"
 #include "base/test/test_suite.h"
@@ -15,8 +11,9 @@
 
 int wmain(int argc, wchar_t **argv) {
   if (argc >= 2) {
-    if (0 == _wcsicmp(argv[1], L"-child"))
+    if (0 == _wcsicmp(UNSAFE_TODO(argv[1]), L"-child")) {
       return sandbox::DispatchCall(argc, argv);
+    }
   }
 
   // Force binary unduplication for crbug.com/959223.
diff --git a/services/proxy_resolver/public/mojom/proxy_resolver.mojom b/services/proxy_resolver/public/mojom/proxy_resolver.mojom
index 5ae34af..a09166d 100644
--- a/services/proxy_resolver/public/mojom/proxy_resolver.mojom
+++ b/services/proxy_resolver/public/mojom/proxy_resolver.mojom
@@ -121,7 +121,7 @@
   [EnableIf=is_win] WinHttpStatus? win_http_status;
 };
 
-[EnableIf=is_win, ServiceSandbox=sandbox.mojom.Sandbox.kWindowsSystemProxyResolver]
+[EnableIf=is_win, ServiceSandbox=sandbox.mojom.Sandbox.kProxyResolver]
 // Implemented in the Windows utility process to proxy WinHTTP lookups and
 // invoked from the network service (or Chrome) when --use-system-proxy-resolver
 // is enabled so that proxy resolution happens with the OS configuration.
diff --git a/third_party/angle b/third_party/angle
index a096297..cdf407d 160000
--- a/third_party/angle
+++ b/third_party/angle
@@ -1 +1 @@
-Subproject commit a0962979c75102037ab975eed8db7ab2c2df5dd3
+Subproject commit cdf407db5680b68da4471c82ba8846120c0a4d38
diff --git a/third_party/blink/public/devtools_protocol/domains/CSS.pdl b/third_party/blink/public/devtools_protocol/domains/CSS.pdl
index c5b5f9f..1b67c49 100644
--- a/third_party/blink/public/devtools_protocol/domains/CSS.pdl
+++ b/third_party/blink/public/devtools_protocol/domains/CSS.pdl
@@ -500,20 +500,6 @@
       boolean inherits
       string syntax
 
-
-  # CSS font-palette-values rule representation.
-  type CSSFontPaletteValuesRule extends object
-    properties
-      # The css style sheet identifier (absent for user agent stylesheet and user-specified
-      # stylesheet rules) this rule came from.
-      optional StyleSheetId styleSheetId
-      # Parent stylesheet's origin.
-      StyleSheetOrigin origin
-      # Associated font palette name.
-      Value fontPaletteName
-      # Associated style declaration.
-      CSSStyle style
-
   # CSS generic @rule representation.
   type CSSAtRule extends object
     properties
@@ -800,8 +786,6 @@
       optional array of CSSPropertyRule cssPropertyRules
       # A list of CSS property registrations matching this node.
       optional array of CSSPropertyRegistration cssPropertyRegistrations
-      # A font-palette-values rule matching this node.
-      optional CSSFontPaletteValuesRule cssFontPaletteValuesRule
       # A list of simple @rules matching this node or its pseudo-elements.
       optional array of CSSAtRule cssAtRules
       # Id of the first parent element that does not have display: contents.
diff --git a/third_party/blink/renderer/core/css/cascade_layer.h b/third_party/blink/renderer/core/css/cascade_layer.h
index 7fc349c..2205e323 100644
--- a/third_party/blink/renderer/core/css/cascade_layer.h
+++ b/third_party/blink/renderer/core/css/cascade_layer.h
@@ -26,11 +26,6 @@
     return direct_sub_layers_;
   }
 
-  // Getting or setting the order of a layer is only valid for canonical cascade
-  // layers i.e. the unique layer representation for a particular tree scope.
-  const std::optional<uint16_t> GetOrder() const { return order_; }
-  void SetOrder(uint16_t order) { order_ = order; }
-
   CascadeLayer* GetOrAddSubLayer(const StyleRuleBase::LayerName& name);
 
   void Trace(blink::Visitor*) const;
@@ -43,9 +38,7 @@
   void ToStringInternal(StringBuilder&, const String&) const;
 
   CascadeLayer* FindDirectSubLayer(const AtomicString&) const;
-  void ComputeLayerOrderInternal(unsigned* next);
 
-  std::optional<uint16_t> order_;
   AtomicString name_;
   HeapVector<Member<CascadeLayer>> direct_sub_layers_;
 };
diff --git a/third_party/blink/renderer/core/css/cascade_layer_map.cc b/third_party/blink/renderer/core/css/cascade_layer_map.cc
index 4d38efa..8b82339 100644
--- a/third_party/blink/renderer/core/css/cascade_layer_map.cc
+++ b/third_party/blink/renderer/core/css/cascade_layer_map.cc
@@ -34,11 +34,13 @@
   }
 }
 
-void ComputeLayerOrder(CascadeLayer& layer, uint16_t& next) {
+void ComputeLayerOrder(CascadeLayer& layer,
+                       uint16_t& next,
+                       LayerOrderMap& canonical_layer_order_map) {
   for (const auto& sub_layer : layer.GetDirectSubLayers()) {
-    ComputeLayerOrder(*sub_layer, next);
+    ComputeLayerOrder(*sub_layer, next, canonical_layer_order_map);
   }
-  layer.SetOrder(next++);
+  canonical_layer_order_map.insert(&layer, next++);
 }
 
 }  // namespace
@@ -56,15 +58,16 @@
   }
 
   uint16_t next = 0;
-  ComputeLayerOrder(*canonical_root_layer, next);
+  LayerOrderMap canonical_layer_order_map;
+  ComputeLayerOrder(*canonical_root_layer, next, canonical_layer_order_map);
+  canonical_layer_order_map.Set(canonical_root_layer, kImplicitOuterLayerOrder);
 
-  canonical_root_layer->SetOrder(kImplicitOuterLayerOrder);
   canonical_root_layer_ = canonical_root_layer;
 
   for (const auto& iter : canonical_layer_map) {
     const CascadeLayer* layer_from_sheet = iter.key;
     const CascadeLayer* canonical_layer = iter.value;
-    uint16_t layer_order = canonical_layer->GetOrder().value();
+    uint16_t layer_order = canonical_layer_order_map.at(canonical_layer);
     layer_order_map_.insert(layer_from_sheet, layer_order);
 
 #if DCHECK_IS_ON()
diff --git a/third_party/blink/renderer/core/css/css_math_function_value.cc b/third_party/blink/renderer/core/css/css_math_function_value.cc
index b058ce9..b23c74ca 100644
--- a/third_party/blink/renderer/core/css/css_math_function_value.cc
+++ b/third_party/blink/renderer/core/css/css_math_function_value.cc
@@ -110,7 +110,7 @@
   if (expression_->Category() == kCalcPercent) {
     value /= 100.0;
   }
-  return std::isnan(value) ? 0.0 : value;
+  return std::isnan(value) ? 0.0 : CSSValueClampingUtils::ClampDouble(value);
 }
 
 double CSSMathFunctionValue::ComputePercentage(
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc
index 0c67a8ed..f5f82be 100644
--- a/third_party/blink/renderer/core/dom/document.cc
+++ b/third_party/blink/renderer/core/dom/document.cc
@@ -65,8 +65,6 @@
 #include "services/network/public/mojom/web_sandbox_flags.mojom-blink.h"
 #include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/common/permissions_policy/document_policy_features.h"
-#include "third_party/blink/public/common/privacy_budget/identifiability_sample_collector.h"
-#include "third_party/blink/public/common/privacy_budget/identifiability_study_settings.h"
 #include "third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h"
 #include "third_party/blink/public/mojom/css/preferred_color_scheme.mojom-blink.h"
 #include "third_party/blink/public/mojom/css/preferred_contrast.mojom-blink.h"
@@ -2351,16 +2349,6 @@
     interactive_detector->OnPageHiddenChanged(hidden());
   }
 
-  // Don't create a |ukm_recorder_| and |ukm_source_id_| unless necessary.
-  if (hidden() && IdentifiabilityStudySettings::Get()->IsActive()) {
-    // Flush UKM data here in addition to Document::Shutdown(). We want to flush
-    // the UKM data before this document becomes invisible (e.g. before entering
-    // back/forward cache) because we want to send the UKM data before the
-    // renderer process is killed.
-    IdentifiabilitySampleCollector::Get()->FlushSource(UkmRecorder(),
-                                                       UkmSourceID());
-  }
-
   GetViewTransitions().DidChangeVisibilityState();
 }
 
@@ -3463,12 +3451,6 @@
   lifecycle_.AdvanceTo(DocumentLifecycle::kStopped);
   DCHECK(!View()->IsAttached());
 
-  // Don't create a |ukm_recorder_| and |ukm_source_id_| unless necessary.
-  if (IdentifiabilityStudySettings::Get()->IsActive()) {
-    IdentifiabilitySampleCollector::Get()->FlushSource(UkmRecorder(),
-                                                       UkmSourceID());
-  }
-
   mime_handler_view_before_unload_event_listener_ = nullptr;
 
   resource_coordinator_.reset();
diff --git a/third_party/blink/renderer/core/dom/document_test.cc b/third_party/blink/renderer/core/dom/document_test.cc
index ca081ef6..2df10a5 100644
--- a/third_party/blink/renderer/core/dom/document_test.cc
+++ b/third_party/blink/renderer/core/dom/document_test.cc
@@ -42,7 +42,6 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/common/permissions_policy/document_policy_features.h"
-#include "third_party/blink/public/common/privacy_budget/identifiable_surface.h"
 #include "third_party/blink/public/platform/browser_interface_broker_proxy.h"
 #include "third_party/blink/public/web/web_print_page_description.h"
 #include "third_party/blink/renderer/bindings/core/v8/isolated_world_csp.h"
diff --git a/third_party/blink/renderer/core/events/event_type_names.json5 b/third_party/blink/renderer/core/events/event_type_names.json5
index 64f127a4..06c58a2 100644
--- a/third_party/blink/renderer/core/events/event_type_names.json5
+++ b/third_party/blink/renderer/core/events/event_type_names.json5
@@ -376,6 +376,7 @@
     "webkitspeechchange",
     "webkitvisibilitychange",
     "wheel",
+    "writablechange",
     "write",
     "writeend",
     "writestart",
diff --git a/third_party/blink/renderer/core/frame/navigator_device_memory.cc b/third_party/blink/renderer/core/frame/navigator_device_memory.cc
index 2876aad..05fa33e4 100644
--- a/third_party/blink/renderer/core/frame/navigator_device_memory.cc
+++ b/third_party/blink/renderer/core/frame/navigator_device_memory.cc
@@ -5,8 +5,6 @@
 #include "third_party/blink/renderer/core/frame/navigator_device_memory.h"
 
 #include "third_party/blink/public/common/device_memory/approximated_device_memory.h"
-#include "third_party/blink/public/common/privacy_budget/identifiability_metric_builder.h"
-#include "third_party/blink/public/common/privacy_budget/identifiability_metrics.h"
 #include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-shared.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/frame/local_dom_window.h"
diff --git a/third_party/blink/renderer/core/frame/navigator_device_memory.idl b/third_party/blink/renderer/core/frame/navigator_device_memory.idl
index e1399af3..6a57f550 100644
--- a/third_party/blink/renderer/core/frame/navigator_device_memory.idl
+++ b/third_party/blink/renderer/core/frame/navigator_device_memory.idl
@@ -5,6 +5,6 @@
 // https://github.com/w3c/device-memory#the-web-exposed-api
 
 interface mixin NavigatorDeviceMemory {
-    [HighEntropy=Direct,MeasureAs=NavigatorDeviceMemory,SecureContext]
+    [MeasureAs=NavigatorDeviceMemory,SecureContext]
     readonly attribute float deviceMemory;
 };
diff --git a/third_party/blink/renderer/core/html/html_geolocation_element.idl b/third_party/blink/renderer/core/html/html_geolocation_element.idl
index ef49603..0ba65fef9 100644
--- a/third_party/blink/renderer/core/html/html_geolocation_element.idl
+++ b/third_party/blink/renderer/core/html/html_geolocation_element.idl
@@ -2,10 +2,27 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// https://github.com/WICG/PEPC/blob/main/geolocation_explainer.md
+// TODO(https://crbug.com/461543463): Putting this here rather than in a
+// distinct file, as it's possible that we'll rename it in the near future.
+// 
+// https://wicg.github.io/PEPC/permission-elements.html#permission-mixin
+interface mixin InPagePermissionMixin {
+  readonly attribute boolean isValid;
+  // TODO(https://crbug.com/461543463): This should be
+  // `InPagePermissionMixinBlockerReason`, but that will require changing
+  // `HTMLPermissionElement` too.
+  readonly attribute DOMString invalidReason;
+  readonly attribute PermissionState initialPermissionStatus;
+  readonly attribute PermissionState permissionStatus;
 
+  attribute EventHandler onpromptaction;
+  attribute EventHandler onpromptdismiss;
+  attribute EventHandler onvalidationstatuschange;
+};
+
+// https://wicg.github.io/PEPC/permission-elements.html#geolocation-element
 [RuntimeEnabled=GeolocationElement, Exposed=Window]
-interface HTMLGeolocationElement : HTMLPermissionElement {
+interface HTMLGeolocationElement : HTMLElement {
   [HTMLConstructor] constructor();
 
   attribute EventHandler onlocation;
@@ -17,3 +34,4 @@
   [CEReactions, Reflect] attribute boolean autolocate;
   [CEReactions, Reflect] attribute boolean watch;
 };
+HTMLGeolocationElement includes InPagePermissionMixin;
diff --git a/third_party/blink/renderer/core/inspector/inspector_css_agent.cc b/third_party/blink/renderer/core/inspector/inspector_css_agent.cc
index 5dffb4b..e4faf746 100644
--- a/third_party/blink/renderer/core/inspector/inspector_css_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_css_agent.cc
@@ -557,7 +557,7 @@
                                              nullptr, exception_state);
       case kSetStyleText:
         return style_sheet_->SetStyleText(new_range_, old_text_, nullptr,
-                                          nullptr, exception_state);
+                                          nullptr, nullptr, exception_state);
       case kSetMediaRuleText:
         return style_sheet_->SetMediaRuleText(new_range_, old_text_, nullptr,
                                               nullptr, exception_state);
@@ -589,7 +589,8 @@
         break;
       case kSetStyleText:
         css_rule_ = style_sheet_->SetStyleText(
-            old_range_, new_text_, &new_range_, &old_text_, exception_state);
+            old_range_, new_text_, &new_range_, &old_text_, &font_feature_type_,
+            exception_state);
         break;
       case kSetMediaRuleText:
         css_rule_ = style_sheet_->SetMediaRuleText(
@@ -648,6 +649,15 @@
       return style_sheet_->BuildObjectForStyle(position_try_rule->style(),
                                                nullptr);
     }
+    if (auto* font_face_rule = DynamicTo<CSSFontFaceRule>(rule)) {
+      return style_sheet_->BuildObjectForStyle(font_face_rule->style(),
+                                               nullptr);
+    }
+    if (auto* font_feature_values_rule =
+            DynamicTo<CSSFontFeatureValuesRule>(rule)) {
+      return style_sheet_->BuildStyleObjectForFontFeatureRule(
+          font_feature_values_rule, font_feature_type_);
+    }
     return nullptr;
   }
 
@@ -679,6 +689,7 @@
   String new_text_;
   SourceRange old_range_;
   SourceRange new_range_;
+  StyleRuleFontFeature::FeatureType font_feature_type_;
   Member<CSSRule> css_rule_;
 };
 
@@ -1215,23 +1226,27 @@
 
 std::unique_ptr<protocol::CSS::CSSLayerData>
 InspectorCSSAgent::BuildLayerDataObject(const CascadeLayer* layer,
-                                        unsigned& max_order) {
-  const unsigned order = layer->GetOrder().value_or(0);
-  max_order = max(max_order, order);
+                                        unsigned& order) {
+  // Build sub-layers first, as they are weaker than `layer`, and must
+  // therefore get a smaller `order` value.
+  const HeapVector<Member<CascadeLayer>>& sublayers =
+      layer->GetDirectSubLayers();
+  std::unique_ptr<protocol::Array<protocol::CSS::CSSLayerData>> sublayers_data;
+  if (!sublayers.empty()) {
+    sublayers_data =
+        std::make_unique<protocol::Array<protocol::CSS::CSSLayerData>>();
+    for (const CascadeLayer* sublayer : sublayers) {
+      sublayers_data->emplace_back(BuildLayerDataObject(sublayer, order));
+    }
+  }
   std::unique_ptr<protocol::CSS::CSSLayerData> layer_data =
       protocol::CSS::CSSLayerData::create()
           .setName(layer->GetName())
-          .setOrder(order)
+          .setOrder(order++)
           .build();
-  const auto& sublayers = layer->GetDirectSubLayers();
-  if (sublayers.empty())
-    return layer_data;
-
-  auto sublayers_data =
-      std::make_unique<protocol::Array<protocol::CSS::CSSLayerData>>();
-  for (const CascadeLayer* sublayer : sublayers)
-    sublayers_data->emplace_back(BuildLayerDataObject(sublayer, max_order));
-  layer_data->setSubLayers(std::move(sublayers_data));
+  if (sublayers_data) {
+    layer_data->setSubLayers(std::move(sublayers_data));
+  }
   return layer_data;
 }
 
@@ -1246,7 +1261,7 @@
 
   *root_layer = protocol::CSS::CSSLayerData::create()
                     .setName("implicit outer layer")
-                    .setOrder(0)
+                    .setOrder(0)  // Tentative. The final value is set below.
                     .build();
 
   const auto* scoped_resolver =
@@ -1262,12 +1277,17 @@
     return protocol::Response::Success();
 
   const CascadeLayer* root = layer_map->GetRootLayer();
-  unsigned max_order = 0;
+  unsigned order = 0;
   auto sublayers_data =
       std::make_unique<protocol::Array<protocol::CSS::CSSLayerData>>();
-  for (const auto& sublayer : root->GetDirectSubLayers())
-    sublayers_data->emplace_back(BuildLayerDataObject(sublayer, max_order));
-  (*root_layer)->setOrder(max_order + 1);
+  for (const auto& sublayer : root->GetDirectSubLayers()) {
+    sublayers_data->emplace_back(BuildLayerDataObject(sublayer, order));
+  }
+  // Note that a mutable reference to `order` was passed to
+  // BuildLayerDataObject() above; its value is now equal to the total
+  // number of layers seen by that call, i.e. bigger than any other
+  // layer order.
+  (*root_layer)->setOrder(order);
   (*root_layer)->setSubLayers(std::move(sublayers_data));
 
   return protocol::Response::Success();
@@ -1425,8 +1445,6 @@
         css_property_rules,
     std::unique_ptr<protocol::Array<protocol::CSS::CSSPropertyRegistration>>*
         css_property_registrations,
-    std::unique_ptr<protocol::CSS::CSSFontPaletteValuesRule>*
-        css_font_palette_values_rule,
     std::unique_ptr<protocol::Array<protocol::CSS::CSSAtRule>>* css_at_rules,
     std::optional<int>* parent_layout_node_id,
     std::unique_ptr<protocol::Array<protocol::CSS::CSSFunctionRule>>*
@@ -1603,10 +1621,6 @@
   *css_position_try_rules =
       PositionTryRulesForElement(element, successful_position_fallback_index);
 
-  if (auto rule = FontPalettesForNode(*element)) {
-    *css_font_palette_values_rule = std::move(rule);
-  }
-
   if (auto rules = FontAtRulesForNodes(elements_to_inspect)) {
     *css_at_rules = std::move(rules);
   }
@@ -2086,39 +2100,6 @@
   return result;
 }
 
-// TODO(crbug.com/408969009): Delete this in favor of FontAtRulesForNode once
-// the devtools frontend is updated to use the new method.
-std::unique_ptr<protocol::CSS::CSSFontPaletteValuesRule>
-InspectorCSSAgent::FontPalettesForNode(Element& element) {
-  const ComputedStyle* style = element.EnsureComputedStyle();
-  const FontPalette* palette = style ? style->GetFontPalette() : nullptr;
-  if (!palette || !palette->IsCustomPalette()) {
-    return {};
-  }
-  Document& document = element.GetDocument();
-  StyleRuleFontPaletteValues* rule =
-      document.GetStyleEngine().FontPaletteValuesForNameAndFamily(
-          palette->GetPaletteValuesName(),
-          style->GetFontDescription().Family().FamilyName());
-  if (!rule) {
-    return {};
-  }
-
-  auto style_sheets = document_to_css_style_sheets_.find(&document);
-  if (style_sheets == document_to_css_style_sheets_.end()) {
-    return {};
-  }
-
-  // Find CSSOM wrapper.
-  CSSFontPaletteValuesRule* values_rule =
-      FindFontPaletteValuesRule(*style_sheets->value, rule);
-
-  InspectorStyleSheet* inspector_style_sheet =
-      BindStyleSheet(values_rule->parentStyleSheet());
-  return inspector_style_sheet->BuildObjectForFontPaletteValuesRule(
-      values_rule);
-}
-
 CSSKeyframesRule*
 InspectorCSSAgent::FindKeyframesRuleFromUAViewTransitionStylesheet(
     Element* element,
diff --git a/third_party/blink/renderer/core/inspector/inspector_css_agent.h b/third_party/blink/renderer/core/inspector/inspector_css_agent.h
index ca10c78..3eda827 100644
--- a/third_party/blink/renderer/core/inspector/inspector_css_agent.h
+++ b/third_party/blink/renderer/core/inspector/inspector_css_agent.h
@@ -192,7 +192,6 @@
       std::optional<int>*,
       std::unique_ptr<protocol::Array<protocol::CSS::CSSPropertyRule>>*,
       std::unique_ptr<protocol::Array<protocol::CSS::CSSPropertyRegistration>>*,
-      std::unique_ptr<protocol::CSS::CSSFontPaletteValuesRule>*,
       std::unique_ptr<protocol::Array<protocol::CSS::CSSAtRule>>*,
       std::optional<int>* parent_layout_node_id,
       std::unique_ptr<protocol::Array<protocol::CSS::CSSFunctionRule>>*)
@@ -403,8 +402,6 @@
       std::unique_ptr<protocol::Array<protocol::CSS::CSSPropertyRule>>,
       std::unique_ptr<protocol::Array<protocol::CSS::CSSPropertyRegistration>>>
   CustomPropertiesForNode(Element* element);
-  std::unique_ptr<protocol::CSS::CSSFontPaletteValuesRule> FontPalettesForNode(
-      Element& element);
   std::unique_ptr<protocol::Array<protocol::CSS::CSSAtRule>>
   FontAtRulesForNodes(HeapVector<Member<Element>>& elements);
 
@@ -479,7 +476,7 @@
 
   std::unique_ptr<protocol::CSS::CSSLayerData> BuildLayerDataObject(
       const CascadeLayer* layer,
-      unsigned& max_order);
+      unsigned& order);
 
   // Layers at-rule implementation
   std::unique_ptr<protocol::CSS::CSSLayer> BuildLayerObject(
diff --git a/third_party/blink/renderer/core/inspector/inspector_style_sheet.cc b/third_party/blink/renderer/core/inspector/inspector_style_sheet.cc
index 37a72fa..3ca65e9 100644
--- a/third_party/blink/renderer/core/inspector/inspector_style_sheet.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_style_sheet.cc
@@ -1261,13 +1261,18 @@
   return keyframe_rule;
 }
 
-CSSRule* InspectorStyleSheet::SetStyleText(const SourceRange& range,
-                                           const String& text,
-                                           SourceRange* new_range,
-                                           String* old_text,
-                                           ExceptionState& exception_state) {
+CSSRule* InspectorStyleSheet::SetStyleText(
+    const SourceRange& range,
+    const String& text,
+    SourceRange* new_range,
+    String* old_text,
+    StyleRuleFontFeature::FeatureType* font_feature_type,
+    ExceptionState& exception_state) {
+
   CSSRuleSourceData* source_data = FindRuleByDeclarationsRange(range);
-  if (!source_data || !source_data->HasProperties()) {
+  if (!source_data ||
+      !(source_data->HasProperties() ||
+        source_data->type == StyleRule::RuleType::kFontFeatureValues)) {
     exception_state.ThrowDOMException(
         DOMExceptionCode::kNotFoundError,
         "Source range didn't match existing style source range");
@@ -1296,33 +1301,102 @@
   if (!rule || !rule->parentStyleSheet() ||
       (!IsA<CSSStyleRule>(rule) && !IsA<CSSKeyframeRule>(rule) &&
        !IsA<CSSPropertyRule>(rule) && !IsA<CSSFontPaletteValuesRule>(rule) &&
-       !IsA<CSSPositionTryRule>(rule))) {
+       !IsA<CSSPositionTryRule>(rule) && !IsA<CSSFontFeatureValuesRule>(rule) &&
+       !IsA<CSSFontFaceRule>(rule))) {
     exception_state.ThrowDOMException(
         DOMExceptionCode::kNotFoundError,
         "Source range didn't match existing style source range");
     return nullptr;
   }
 
-  CSSStyleDeclaration* style = nullptr;
-  if (auto* style_rule = DynamicTo<CSSStyleRule>(rule)) {
-    style = style_rule->style();
-  } else if (auto* property_rule = DynamicTo<CSSPropertyRule>(rule)) {
-    style = property_rule->Style();
-  } else if (auto* font_palette_values_rule =
-                 DynamicTo<CSSFontPaletteValuesRule>(rule)) {
-    style = font_palette_values_rule->Style();
-  } else if (auto* position_try_rule = DynamicTo<CSSPositionTryRule>(rule)) {
-    style = position_try_rule->style();
+  if (auto* font_feature_values_rule =
+          DynamicTo<CSSFontFeatureValuesRule>(rule)) {
+    if (font_feature_type) {
+      *font_feature_type = source_data->font_feature_type;
+    }
+    // Get the source data for the @font-feature-values rule instead of the
+    // subsection.
+    CSSRuleSourceData* parent_source_data = SourceDataForRule(rule);
+    if (!parent_source_data) {
+      exception_state.ThrowDOMException(
+          DOMExceptionCode::kNotFoundError,
+          "Source range didn't match existing style source range");
+      return nullptr;
+    }
+
+    // Between the header range and the body range, we can make a range covering
+    // most of the rule's text. The ranges mark the text as:
+    // @font-feature-values [FontFamilyName] {[ @subsection { prop: 1; } ]}
+    // so if we extract the text from the start of the header to the end of the
+    // body, we only need to add `@font-feature-values ` and `}` to have the
+    // full rule text.
+    auto old_prefix = text_.Substring(
+        parent_source_data->rule_header_range.start,
+        range.start - parent_source_data->rule_header_range.start);
+    auto old_suffix = text_.Substring(
+        range.end, parent_source_data->rule_body_range.end - range.end);
+
+    if (!(old_prefix.EndsWith("{") && old_suffix.StartsWith("}"))) {
+      exception_state.ThrowDOMException(
+          DOMExceptionCode::kSyntaxError,
+          "Source range didn't match existing style source range");
+      return nullptr;
+    }
+
+    auto new_text =
+        String("@font-feature-values ") + old_prefix + text + old_suffix + "}";
+
+    // @font-feature-values rules don't support text replacement. Instead, we
+    // find the old rule's index in the style sheet, insert a new rule, and
+    // delete the old rule, returning the new rule.
+    CSSStyleSheet* style_sheet = font_feature_values_rule->parentStyleSheet();
+    unsigned index = kNotFound;
+    for (unsigned i = 0; i < style_sheet->length(); ++i) {
+      if (style_sheet->ItemInternal(i) == font_feature_values_rule) {
+        index = i;
+        break;
+      }
+    }
+    if (index == kNotFound ||
+        index != style_sheet->insertRule(new_text, index, exception_state) ||
+        style_sheet->ItemInternal(index) == rule ||
+        style_sheet->ItemInternal(index + 1) != rule ||
+        !DynamicTo<CSSFontFeatureValuesRule>(
+            style_sheet->ItemInternal(index))) {
+      exception_state.ThrowDOMException(
+          DOMExceptionCode::kNotFoundError,
+          "Source range didn't match existing style source range");
+      return nullptr;
+    }
+
+    // Delete the original rule and return its replacement.
+    rule = style_sheet->ItemInternal(index);
+    style_sheet->deleteRule(index + 1, exception_state);
+
   } else {
-    style = To<CSSKeyframeRule>(rule)->style();
+    CSSStyleDeclaration* style = nullptr;
+    if (auto* style_rule = DynamicTo<CSSStyleRule>(rule)) {
+      style = style_rule->style();
+    } else if (auto* property_rule = DynamicTo<CSSPropertyRule>(rule)) {
+      style = property_rule->Style();
+    } else if (auto* font_palette_values_rule =
+                   DynamicTo<CSSFontPaletteValuesRule>(rule)) {
+      style = font_palette_values_rule->Style();
+    } else if (auto* position_try_rule = DynamicTo<CSSPositionTryRule>(rule)) {
+      style = position_try_rule->style();
+    } else if (auto* font_face_rule = DynamicTo<CSSFontFaceRule>(rule)) {
+      style = font_face_rule->style();
+    } else {
+      style = To<CSSKeyframeRule>(rule)->style();
+    }
+
+    Document* owner_document = page_style_sheet_->OwnerDocument();
+    ExecutionContext* execution_context =
+        owner_document ? owner_document->GetExecutionContext() : nullptr;
+
+    style->setCSSText(execution_context, text, exception_state);
   }
 
-  Document* owner_document = page_style_sheet_->OwnerDocument();
-  ExecutionContext* execution_context =
-      owner_document ? owner_document->GetExecutionContext() : nullptr;
-
-  style->setCSSText(execution_context, text, exception_state);
-
   ReplaceText(source_data->rule_declarations_range, text, new_range, old_text);
   OnStyleSheetTextChanged();
 
@@ -2132,27 +2206,6 @@
   return result;
 }
 
-std::unique_ptr<protocol::CSS::CSSFontPaletteValuesRule>
-InspectorStyleSheet::BuildObjectForFontPaletteValuesRule(
-    CSSFontPaletteValuesRule* values_rule) {
-  std::unique_ptr<protocol::CSS::Value> name_text =
-      protocol::CSS::Value::create().setText(values_rule->name()).build();
-  CSSRuleSourceData* source_data = SourceDataForRule(values_rule);
-  if (source_data) {
-    name_text->setRange(BuildSourceRangeObject(source_data->rule_header_range));
-  }
-  std::unique_ptr<protocol::CSS::CSSFontPaletteValuesRule> result =
-      protocol::CSS::CSSFontPaletteValuesRule::create()
-          .setFontPaletteName(std::move(name_text))
-          .setOrigin(origin_)
-          .setStyle(BuildObjectForStyle(values_rule->Style(), nullptr))
-          .build();
-  if (CanBindOrigin() && !Id().empty()) {
-    result->setStyleSheetId(Id());
-  }
-  return result;
-}
-
 std::unique_ptr<protocol::CSS::CSSAtRule>
 InspectorStyleSheet::BuildAtRuleObjectForFontPaletteValuesRule(
     CSSFontPaletteValuesRule* values_rule) {
@@ -2190,8 +2243,8 @@
   return result;
 }
 
-std::unique_ptr<protocol::CSS::CSSAtRule>
-InspectorStyleSheet::BuildAtRuleObjectForFontFeatureValuesRule(
+std::unique_ptr<protocol::CSS::CSSStyle>
+InspectorStyleSheet::BuildStyleObjectForFontFeatureRule(
     CSSFontFeatureValuesRule* values_rule,
     StyleRuleFontFeature::FeatureType feature_type) {
   CSSRuleSourceData* source_data = SourceDataForRule(values_rule);
@@ -2212,6 +2265,28 @@
     return {};
   }
 
+  InspectorStyle* style =
+      MakeGarbageCollected<InspectorStyle>(nullptr, subsection_data, this);
+  return style->BuildObjectForStyle(nullptr, kPseudoIdNone, g_null_atom);
+}
+
+std::unique_ptr<protocol::CSS::CSSAtRule>
+InspectorStyleSheet::BuildAtRuleObjectForFontFeatureValuesRule(
+    CSSFontFeatureValuesRule* values_rule,
+    StyleRuleFontFeature::FeatureType feature_type) {
+  CSSRuleSourceData* source_data = SourceDataForRule(values_rule);
+  if (!source_data) {
+    // We can only build the @font-feature-values rule if we have source data
+    // for it.
+    return {};
+  }
+
+  std::unique_ptr<protocol::CSS::CSSStyle> style =
+      BuildStyleObjectForFontFeatureRule(values_rule, feature_type);
+  if (!style) {
+    return {};
+  }
+
   const char* type;
   // LINT.IfChange(FontVariantAlternatesFeatureType)
   switch (feature_type) {
@@ -2247,10 +2322,7 @@
           .setSubsection(type)
           .setName(std::move(name_text))
           .setOrigin(origin_)
-          .setStyle(
-              MakeGarbageCollected<InspectorStyle>(nullptr, subsection_data,
-                                                   this)
-                  ->BuildObjectForStyle(nullptr, kPseudoIdNone, g_null_atom))
+          .setStyle(std::move(style))
           .build();
   if (CanBindOrigin() && !Id().empty()) {
     result->setStyleSheetId(Id());
@@ -2458,6 +2530,16 @@
         rule_source_data->rule_declarations_range.end == source_range.end) {
       return rule_source_data;
     }
+    if (rule_source_data->type == StyleRule::kFontFeatureValues &&
+        rule_source_data->rule_body_range.start < source_range.start &&
+        rule_source_data->rule_body_range.end > source_range.end) {
+      for (auto& child : rule_source_data->child_rules) {
+        if (child->rule_declarations_range.start == source_range.start &&
+            child->rule_declarations_range.end == source_range.end) {
+          return child.Get();
+        }
+      }
+    }
   }
   return nullptr;
 }
@@ -2471,6 +2553,18 @@
   RemapSourceDataToCSSOMIfNecessary();
 
   wtf_size_t index = source_data_->Find(source_data);
+  if (index == kNotFound && source_data->type == StyleRule::kFontFeature) {
+    // Find the parent @font-feature-values rule, as there is no CSSOM object
+    // for the feature subsection.
+    for (wtf_size_t i = 0; i < source_data_->size(); ++i) {
+      CSSRuleSourceData* rule_source_data = source_data_->at(i).Get();
+      if (rule_source_data->type == StyleRule::kFontFeatureValues &&
+          rule_source_data->child_rules.Find(source_data) != kNotFound) {
+        index = i;
+        break;
+      }
+    }
+  }
   if (index == kNotFound) {
     return nullptr;
   }
diff --git a/third_party/blink/renderer/core/inspector/inspector_style_sheet.h b/third_party/blink/renderer/core/inspector/inspector_style_sheet.h
index a426b711..e88bfb2 100644
--- a/third_party/blink/renderer/core/inspector/inspector_style_sheet.h
+++ b/third_party/blink/renderer/core/inspector/inspector_style_sheet.h
@@ -188,6 +188,7 @@
                         const String& text,
                         SourceRange* new_range,
                         String* old_selector,
+                        StyleRuleFontFeature::FeatureType* font_feature_type,
                         ExceptionState&);
   CSSMediaRule* SetMediaRuleText(const SourceRange&,
                                  const String& selector,
@@ -230,12 +231,13 @@
                                                                     bool);
   std::unique_ptr<protocol::CSS::CSSPositionTryRule>
   BuildObjectForPositionTryRule(CSSPositionTryRule*, bool active);
-  std::unique_ptr<protocol::CSS::CSSFontPaletteValuesRule>
-  BuildObjectForFontPaletteValuesRule(CSSFontPaletteValuesRule*);
   std::unique_ptr<protocol::CSS::CSSAtRule>
   BuildAtRuleObjectForFontPaletteValuesRule(CSSFontPaletteValuesRule*);
   std::unique_ptr<protocol::CSS::CSSAtRule> BuildAtRuleObjectForFontFaceRule(
       CSSFontFaceRule*);
+  std::unique_ptr<protocol::CSS::CSSStyle> BuildStyleObjectForFontFeatureRule(
+      CSSFontFeatureValuesRule*,
+      StyleRuleFontFeature::FeatureType);
   std::unique_ptr<protocol::CSS::CSSAtRule>
   BuildAtRuleObjectForFontFeatureValuesRule(CSSFontFeatureValuesRule*,
                                             StyleRuleFontFeature::FeatureType);
diff --git a/third_party/blink/renderer/core/script/document_write_intervention.cc b/third_party/blink/renderer/core/script/document_write_intervention.cc
index 9526be01..8d736c1 100644
--- a/third_party/blink/renderer/core/script/document_write_intervention.cc
+++ b/third_party/blink/renderer/core/script/document_write_intervention.cc
@@ -25,14 +25,14 @@
 namespace {
 
 void EmitWarningMayBeBlocked(const String& url, Document& document) {
-  String message =
-      "A parser-blocking, cross site (i.e. different eTLD+1) script, " + url +
-      ", is invoked via document.write. The network request for this script "
-      "MAY be blocked by the browser in this or a future page load due to poor "
-      "network connectivity. If blocked in this page load, it will be "
-      "confirmed in a subsequent console message. "
-      "See https://www.chromestatus.com/feature/5718547946799104 "
-      "for more details.";
+  String message = StrCat(
+      {"A parser-blocking, cross site (i.e. different eTLD+1) script, ", url,
+       ", is invoked via document.write. The network request for this script "
+       "MAY be blocked by the browser in this or a future page load due to "
+       "poor network connectivity. If blocked in this page load, it will be "
+       "confirmed in a subsequent console message. See "
+       "https://www.chromestatus.com/feature/5718547946799104 for more "
+       "details."});
   document.AddConsoleMessage(MakeGarbageCollected<ConsoleMessage>(
       mojom::ConsoleMessageSource::kJavaScript,
       mojom::ConsoleMessageLevel::kWarning, message));
@@ -40,23 +40,23 @@
 }
 
 void EmitWarningNotBlocked(const String& url, Document& document) {
-  String message =
-      "The parser-blocking, cross site (i.e. different eTLD+1) script, " + url +
-      ", invoked via document.write was NOT BLOCKED on this page load, but MAY "
-      "be blocked by the browser in future page loads with poor network "
-      "connectivity.";
+  String message = StrCat(
+      {"The parser-blocking, cross site (i.e. different eTLD+1) script, ", url,
+       ", invoked via document.write was NOT BLOCKED on this page load, but "
+       "MAY be blocked by the browser in future page loads with poor network "
+       "connectivity."});
   document.AddConsoleMessage(MakeGarbageCollected<ConsoleMessage>(
       mojom::ConsoleMessageSource::kJavaScript,
       mojom::ConsoleMessageLevel::kWarning, message));
 }
 
 void EmitErrorBlocked(const String& url, Document& document) {
-  String message =
-      "Network request for the parser-blocking, cross site (i.e. different "
-      "eTLD+1) script, " +
-      url +
-      ", invoked via document.write was BLOCKED by the browser due to poor "
-      "network connectivity. ";
+  String message = StrCat(
+      {"Network request for the parser-blocking, cross site (i.e. different "
+       "eTLD+1) script, ",
+       url,
+       ", invoked via document.write was BLOCKED by the browser due to poor "
+       "network connectivity. "});
   document.AddConsoleMessage(MakeGarbageCollected<ConsoleMessage>(
       mojom::ConsoleMessageSource::kIntervention,
       mojom::ConsoleMessageLevel::kError, message));
diff --git a/third_party/blink/renderer/core/script/dynamic_module_resolver.cc b/third_party/blink/renderer/core/script/dynamic_module_resolver.cc
index 9ebe0917..377e5f3 100644
--- a/third_party/blink/renderer/core/script/dynamic_module_resolver.cc
+++ b/third_party/blink/renderer/core/script/dynamic_module_resolver.cc
@@ -129,8 +129,8 @@
     // <spec step="2.1">Let completion be Completion { [[Type]]: throw,
     // [[Value]]: a new TypeError, [[Target]]: empty }.</spec>
     v8::Local<v8::Value> error = V8ThrowException::CreateTypeError(
-        isolate,
-        "Failed to fetch dynamically imported module: " + url_.GetString());
+        isolate, StrCat({"Failed to fetch dynamically imported module: ",
+                         url_.GetString()}));
 
     // <spec step="2.2">Perform FinishDynamicImport(referencingScriptOrModule,
     // specifier, promiseCapability, completion).</spec>
@@ -143,7 +143,8 @@
   if (import_phase_ == v8::ModuleImportPhase::kSource) {
     if (!module_script->IsWasmModuleRecord()) {
       v8::Local<v8::Value> error = V8ThrowException::CreateSyntaxError(
-          isolate, url_.GetString() + kNonWasmImportInSourcePhaseError);
+          isolate,
+          StrCat({url_.GetString(), kNonWasmImportInSourcePhaseError}));
       promise_resolver_->Reject(error);
       return;
     }
@@ -260,19 +261,19 @@
     // <spec step="6">If result is null, then:</spec>
     String error_message;
     if (!url.IsValid()) {
-      error_message = "Failed to resolve module specifier '" +
-                      module_request.specifier + "'";
+      error_message = StrCat({"Failed to resolve module specifier '",
+                              module_request.specifier, "'"});
       if (referrer_info.BaseURL().IsAboutBlankURL() &&
           base_url.IsAboutBlankURL()) {
         error_message =
-            error_message +
-            ". The base URL is about:blank because import() is called from a "
-            "CORS-cross-origin script.";
+            StrCat({error_message,
+                    ". The base URL is about:blank because import() is called "
+                    "from a CORS-cross-origin script."});
       }
 
     } else {
-      error_message = "\"" + module_request.GetModuleTypeString() +
-                      "\" is not a valid module type.";
+      error_message = StrCat({"\"", module_request.GetModuleTypeString(),
+                              "\" is not a valid module type."});
     }
 
     // <spec step="6.1">Let completion be Completion { [[Type]]: throw,
diff --git a/third_party/blink/renderer/core/script/import_map.cc b/third_party/blink/renderer/core/script/import_map.cc
index 03bebbb..50c52aa 100644
--- a/third_party/blink/renderer/core/script/import_map.cc
+++ b/third_party/blink/renderer/core/script/import_map.cc
@@ -36,7 +36,7 @@
                           const String& reason) {
   logger.AddConsoleMessage(
       mojom::ConsoleMessageSource::kOther, mojom::ConsoleMessageLevel::kWarning,
-      "Ignored an import map key \"" + key + "\": " + reason);
+      StrCat({"Ignored an import map key \"", key, "\": ", reason}));
 }
 
 void AddIgnoredValueMessage(ConsoleLogger& logger,
@@ -44,7 +44,7 @@
                             const String& reason) {
   logger.AddConsoleMessage(
       mojom::ConsoleMessageSource::kOther, mojom::ConsoleMessageLevel::kWarning,
-      "Ignored an import map value of \"" + key + "\": " + reason);
+      StrCat({"Ignored an import map value of \"", key, "\": ", reason}));
 }
 
 // <specdef
@@ -97,7 +97,8 @@
       //
       // <spec step="2.5.1">Report a warning to the console that the address was
       // invalid.</spec>
-      AddIgnoredValueMessage(logger, key, "Invalid URL: " + value_string);
+      AddIgnoredValueMessage(logger, key,
+                             StrCat({"Invalid URL: ", value_string}));
 
       // <spec step="2.5.2">Set normalized[specifierKey] to null.</spec>
       //
@@ -105,7 +106,8 @@
       return NullURL();
 
     case ParsedSpecifier::Type::kBare:
-      AddIgnoredValueMessage(logger, key, "Bare specifier: " + value_string);
+      AddIgnoredValueMessage(logger, key,
+                             StrCat({"Bare specifier: ", value_string}));
       return NullURL();
 
     case ParsedSpecifier::Type::kURL:
@@ -117,8 +119,9 @@
         // specifierKey ended in a slash, so must the address.</spec>
         AddIgnoredValueMessage(
             logger, key,
-            "Since specifierKey ended in a slash, so must the address: " +
-                value_string);
+            StrCat(
+                {"Since specifierKey ended in a slash, so must the address: ",
+                 value_string}));
 
         // <spec step="2.6.2">Set normalized[specifierKey] to null.</spec>
         //
@@ -149,8 +152,8 @@
       // developer console.
       auto* message = MakeGarbageCollected<ConsoleMessage>(
           ConsoleMessage::Source::kJavaScript, ConsoleMessage::Level::kWarning,
-          "An import map rule for specifier '" + entry.key +
-              "' was removed, as it conflicted with an existing rule.");
+          StrCat({"An import map rule for specifier '", entry.key,
+                  "' was removed, as it conflicted with an existing rule."}));
       logger.AddConsoleMessage(message,
                                /*discard_duplicates=*/true);
       // 2.1.2. Continue.
@@ -274,11 +277,11 @@
         // potentialSpecifierMap is not a map, then throw a TypeError indicating
         // that the value of the scope with prefix scopePrefix must be a JSON
         // object.</spec>
-        *error_to_rethrow = ImportMapError(
-            ImportMapError::Type::kTypeError,
-            "Failed to parse import map: the value of the scope with prefix "
-            "\"" +
-                entry.first + "\" must be a JSON object.");
+        *error_to_rethrow =
+            ImportMapError(ImportMapError::Type::kTypeError,
+                           StrCat({"Failed to parse import map: the value of "
+                                   "the scope with prefix \"",
+                                   entry.first, "\" must be a JSON object."}));
         return MakeGarbageCollected<ImportMap>();
       }
 
@@ -292,10 +295,10 @@
       if (!prefix_url.IsValid()) {
         // <spec label="sort-and-normalize-scopes" step="2.3.1">Report a warning
         // to the console that the scope prefix URL was not parseable.</spec>
-        context.AddConsoleMessage(
-            mojom::ConsoleMessageSource::kOther,
-            mojom::ConsoleMessageLevel::kWarning,
-            "Ignored scope \"" + entry.first + "\": not parsable as a URL.");
+        context.AddConsoleMessage(mojom::ConsoleMessageSource::kOther,
+                                  mojom::ConsoleMessageLevel::kWarning,
+                                  StrCat({"Ignored scope \"", entry.first,
+                                          "\": not parsable as a URL."}));
 
         // <spec label="sort-and-normalize-scopes" step="2.3.2">Continue.</spec>
         continue;
@@ -572,8 +575,9 @@
   // <spec step="1.2">... either asURL is null, or asURL is special</spec>
   if (parsed_specifier.GetType() == ParsedSpecifier::Type::kURL &&
       !SchemeRegistry::IsSpecialScheme(parsed_specifier.GetUrl().Protocol())) {
-    *debug_message = "Import Map: \"" + key +
-                     "\" skips prefix match because of non-special URL scheme";
+    *debug_message =
+        StrCat({"Import Map: \"", key,
+                "\" skips prefix match because of non-special URL scheme"});
 
     return std::nullopt;
   }
@@ -584,8 +588,9 @@
   }
 
   // <spec step="2">Return null.</spec>
-  *debug_message = "Import Map: \"" + key +
-                   "\" matches with no entries and thus is not mapped.";
+  *debug_message =
+      StrCat({"Import Map: \"", key,
+              "\" matches with no entries and thus is not mapped."});
   return std::nullopt;
 }
 
@@ -605,8 +610,9 @@
   // indicating that resolution of specifierKey was blocked by a null
   // entry.</spec>
   if (!matched->value.IsValid()) {
-    *debug_message = "Import Map: \"" + key + "\" matches with \"" +
-                     matched->key + "\" but is blocked by a null value";
+    *debug_message =
+        StrCat({"Import Map: \"", key, "\" matches with \"", matched->key,
+                "\" but is blocked by a null value"});
     return NullURL();
   }
 
@@ -624,9 +630,9 @@
   // that resolution of specifierKey was blocked due to a URL parse
   // failure.</spec>
   if (!url.IsValid()) {
-    *debug_message = "Import Map: \"" + key + "\" matches with \"" +
-                     matched->key +
-                     "\" but is blocked due to relative URL parse failure";
+    *debug_message =
+        StrCat({"Import Map: \"", key, "\" matches with \"", matched->key,
+                "\" but is blocked due to relative URL parse failure"});
     return NullURL();
   }
 
@@ -635,14 +641,16 @@
   // resolution of normalizedSpecifier was blocked due to it backtracking above
   // its prefix specifierKey.</spec>
   if (!url.GetString().StartsWith(matched->value.GetString())) {
-    *debug_message = "Import Map: \"" + key + "\" matches with \"" +
-                     matched->key + "\" but is blocked due to backtracking";
+    *debug_message =
+        StrCat({"Import Map: \"", key, "\" matches with \"", matched->key,
+                "\" but is blocked due to backtracking"});
     return NullURL();
   }
 
   // <spec step="1.2.9">Return url.</spec>
-  *debug_message = "Import Map: \"" + key + "\" matches with \"" +
-                   matched->key + "\" and is mapped to " + url.ElidedString();
+  *debug_message =
+      StrCat({"Import Map: \"", key, "\" matches with \"", matched->key,
+              "\" and is mapped to ", url.ElidedString()});
   return url;
 }
 
@@ -745,9 +753,9 @@
         auto* message = MakeGarbageCollected<ConsoleMessage>(
             ConsoleMessage::Source::kJavaScript,
             ConsoleMessage::Level::kWarning,
-            "An import map scope rule for specifier '" + specifier +
-                "' was removed, as it conflicted with already resolved module "
-                "specifiers.");
+            StrCat({"An import map scope rule for specifier '", specifier,
+                    "' was removed, as it conflicted with already resolved "
+                    "module specifiers."}));
         logger.AddConsoleMessage(message, /*discard_duplicates=*/true);
         // 3.1.2.1.2. Remove scopeImports[specifier].
         scope_imports.erase(specifier);
@@ -777,6 +785,7 @@
     // 4.2 Set oldImportMap's integrity[url] to integrity.
     // Reversing the order for efficiency reasons. `insert` does nothing if the
     // key already exists.
+    AtomicString url_string = url.GetString();
     auto iter = integrity_.insert(std::move(url), new_integrity_value);
     // 4.1 If url exists in oldImportMap's integrity, then:
     if (!iter.is_new_entry) {
@@ -784,9 +793,9 @@
       // developer console.
       auto* message = MakeGarbageCollected<ConsoleMessage>(
           ConsoleMessage::Source::kJavaScript, ConsoleMessage::Level::kWarning,
-          "An import map integrity rule for url '" + url.GetString() +
-              "' was removed, as it conflicted with already defined integrity "
-              "rules.");
+          StrCat({"An import map integrity rule for url '", url_string,
+                  "' was removed, as it conflicted with already defined "
+                  "integrity rules."}));
       logger.AddConsoleMessage(message, /*discard_duplicates=*/true);
       // 4.1.2 Continue.
     }
@@ -809,9 +818,9 @@
     // developer console.
     auto* message = MakeGarbageCollected<ConsoleMessage>(
         ConsoleMessage::Source::kJavaScript, ConsoleMessage::Level::kWarning,
-        "An import map rule for specifier '" + specifier +
-            "' was removed, as it conflicted with already resolved module "
-            "specifiers.");
+        StrCat({"An import map rule for specifier '", specifier,
+                "' was removed, as it conflicted with already resolved module "
+                "specifiers."}));
     logger.AddConsoleMessage(message, /*discard_duplicates=*/true);
     // 5.2. Remove newImportMapImports[specifier].
     new_import_map_imports.erase(specifier);
diff --git a/third_party/blink/renderer/core/script/js_module_script.cc b/third_party/blink/renderer/core/script/js_module_script.cc
index 8fab584a..aaba133 100644
--- a/third_party/blink/renderer/core/script/js_module_script.cc
+++ b/third_party/blink/renderer/core/script/js_module_script.cc
@@ -95,7 +95,7 @@
     if (requested.HasInvalidImportAttributeKey(&failure_reason)) {
       // <spec step="9.1.1">Let error be a new SyntaxError exception.</spec>
       error = V8ThrowException::CreateSyntaxError(
-          isolate, "Invalid attribute key \"" + failure_reason + "\".");
+          isolate, StrCat({"Invalid attribute key \"", failure_reason, "\"."}));
 
       // <spec step="9.2">Resolve a module specifier given script and
       // requested.[[Specifier]], catching any exceptions.</spec>
@@ -104,8 +104,8 @@
                                              &failure_reason)
                     .IsValid()) {
       error = V8ThrowException::CreateTypeError(
-          isolate, "Failed to resolve module specifier \"" +
-                       requested.specifier + "\". " + failure_reason);
+          isolate, StrCat({"Failed to resolve module specifier \"",
+                           requested.specifier, "\". ", failure_reason}));
       // <spec step="9.4">Let moduleType be the result of running the module
       // type from module request steps given requested.</spec>
       //
@@ -115,8 +115,8 @@
                ModuleType::kInvalid) {
       // <spec step="9.5.1">Let error be a new TypeError exception.</spec>
       error = V8ThrowException::CreateTypeError(
-          isolate, "\"" + requested.GetModuleTypeString() +
-                       "\" is not a valid module type.");
+          isolate, StrCat({"\"", requested.GetModuleTypeString(),
+                           "\" is not a valid module type."}));
     }
 
     if (!error.IsEmpty()) {
diff --git a/third_party/blink/renderer/core/script/module_import_meta.cc b/third_party/blink/renderer/core/script/module_import_meta.cc
index b3e4e1d..c0fa53af 100644
--- a/third_party/blink/renderer/core/script/module_import_meta.cc
+++ b/third_party/blink/renderer/core/script/module_import_meta.cc
@@ -33,8 +33,8 @@
 
   if (!result.IsValid()) {
     V8ThrowException::ThrowTypeError(
-        isolate, "Failed to resolve module specifier " + specifier + ": " +
-                     failure_reason);
+        isolate, StrCat({"Failed to resolve module specifier ", specifier, ": ",
+                         failure_reason}));
   }
 
   return ScriptValue(
diff --git a/third_party/blink/renderer/core/script/module_record_resolver_impl.cc b/third_party/blink/renderer/core/script/module_record_resolver_impl.cc
index e9b8a17..d02c4ce 100644
--- a/third_party/blink/renderer/core/script/module_record_resolver_impl.cc
+++ b/third_party/blink/renderer/core/script/module_record_resolver_impl.cc
@@ -116,8 +116,8 @@
   // <spec step="9">Assert: resolved module script's record is not null.</spec>
   DCHECK(module_script);
   if (module_script->IsWasmModuleRecord()) {
-    exception_state.ThrowSyntaxError(module_request.specifier +
-                                     kWasmImportInEvaluationPhaseError);
+    exception_state.ThrowSyntaxError(
+        StrCat({module_request.specifier, kWasmImportInEvaluationPhaseError}));
     return v8::Local<v8::Module>();
   }
   v8::Local<v8::Module> record = module_script->V8Module();
@@ -139,8 +139,8 @@
   // <spec step="9">Assert: resolved module script's record is not null.</spec>
   DCHECK(module_script);
   if (!module_script->IsWasmModuleRecord()) {
-    exception_state.ThrowSyntaxError(module_request.specifier +
-                                     kNonWasmImportInSourcePhaseError);
+    exception_state.ThrowSyntaxError(
+        StrCat({module_request.specifier, kNonWasmImportInSourcePhaseError}));
     return v8::Local<v8::WasmModuleObject>();
   }
   v8::Local<v8::WasmModuleObject> module_source = module_script->WasmModule();
diff --git a/third_party/blink/renderer/core/script/script_loader.cc b/third_party/blink/renderer/core/script/script_loader.cc
index f9962dd..d19b7c08 100644
--- a/third_party/blink/renderer/core/script/script_loader.cc
+++ b/third_party/blink/renderer/core/script/script_loader.cc
@@ -261,7 +261,8 @@
     // <spec step="8">... Otherwise, el has a non-empty language attribute; let
     // the script block's type string be the concatenation of "text/" and the
     // value of el's language attribute.</spec>
-    if (MIMETypeRegistry::IsSupportedJavaScriptMIMEType("text/" + language)) {
+    if (MIMETypeRegistry::IsSupportedJavaScriptMIMEType(
+            StrCat({"text/", language}))) {
       return true;
     }
   } else if (type.empty()) {
diff --git a/third_party/blink/renderer/core/script/wasm_module_script.cc b/third_party/blink/renderer/core/script/wasm_module_script.cc
index e9f4a03..89201f5 100644
--- a/third_party/blink/renderer/core/script/wasm_module_script.cc
+++ b/third_party/blink/renderer/core/script/wasm_module_script.cc
@@ -117,7 +117,8 @@
 ScriptValue WasmModuleScript::Instantiate() const {
   v8::Isolate* isolate = settings_object_->GetScriptState()->GetIsolate();
   v8::Local<v8::Value> error = V8ThrowException::CreateSyntaxError(
-      isolate, SourceUrl().GetString() + kWasmImportInEvaluationPhaseError);
+      isolate,
+      StrCat({SourceUrl().GetString(), kWasmImportInEvaluationPhaseError}));
   return ScriptValue(isolate, error);
 }
 
diff --git a/third_party/blink/renderer/core/style/style_variables.cc b/third_party/blink/renderer/core/style/style_variables.cc
index 7d6c823..8c9c3ccf 100644
--- a/third_party/blink/renderer/core/style/style_variables.cc
+++ b/third_party/blink/renderer/core/style/style_variables.cc
@@ -62,10 +62,14 @@
                          const StyleVariables& variables) {
   stream << "[";
   variables.data_root_->Serialize(
-      [](const CSSVariableData* data) { return data->Serialize(); }, stream);
+      [](const CSSVariableData* data) {
+        return data ? data->Serialize() : "(null)";
+      },
+      stream);
   stream << "][";
   variables.values_root_->Serialize(
-      [](const CSSValue* value) { return value->CssText(); }, stream);
+      [](const CSSValue* value) { return value ? value->CssText() : "(null)"; },
+      stream);
   return stream << "]";
 }
 
diff --git a/third_party/blink/renderer/modules/BUILD.gn b/third_party/blink/renderer/modules/BUILD.gn
index 395cc90e..35746fea 100644
--- a/third_party/blink/renderer/modules/BUILD.gn
+++ b/third_party/blink/renderer/modules/BUILD.gn
@@ -298,7 +298,6 @@
     ":make_modules_generated_event_names",
     ":make_modules_generated_event_target_names",
     ":make_modules_generated_indexed_db_names",
-    ":make_modules_generated_media_capabilities_names",
     "//components/payments/mojom:mojom_blink_headers",
     "//components/schema_org/common:mojom_blink_headers",
     "//components/services/filesystem/public/mojom:mojom_blink_headers",
@@ -373,12 +372,6 @@
   deps = []  # Don't use default deps (otherwise it will be circular).
 }
 
-make_names("make_modules_generated_media_capabilities_names") {
-  in_files = [ "media_capabilities/media_capabilities_names.json5" ]
-  output_dir = blink_modules_output_dir
-  deps = []  # Don't use default deps (otherwise it will be circular).
-}
-
 blink_modules_sources("modules_generated") {
   # Targets from above that generate outputs that need to be compiled.
   # All sources declared as outputs from these targets will be compiled
@@ -388,7 +381,6 @@
     ":make_modules_generated_event_names",
     ":make_modules_generated_event_target_names",
     ":make_modules_generated_indexed_db_names",
-    ":make_modules_generated_media_capabilities_names",
   ]
 
   sources = []
diff --git a/third_party/blink/renderer/modules/media_capabilities/DEPS b/third_party/blink/renderer/modules/media_capabilities/DEPS
index bccc6c4..05eef56c 100644
--- a/third_party/blink/renderer/modules/media_capabilities/DEPS
+++ b/third_party/blink/renderer/modules/media_capabilities/DEPS
@@ -9,7 +9,6 @@
     "-third_party/blink/renderer/modules",
     "+third_party/blink/renderer/modules/encryptedmedia",
     "+third_party/blink/renderer/modules/media_capabilities",
-    "+third_party/blink/renderer/modules/media_capabilities_names.h",
     "+third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.h",
     "+third_party/blink/renderer/modules/modules_export.h",
 ]
diff --git a/third_party/blink/renderer/modules/media_capabilities/media_capabilities.cc b/third_party/blink/renderer/modules/media_capabilities/media_capabilities.cc
index a022e99..fdca582 100644
--- a/third_party/blink/renderer/modules/media_capabilities/media_capabilities.cc
+++ b/third_party/blink/renderer/modules/media_capabilities/media_capabilities.cc
@@ -54,7 +54,6 @@
 #include "third_party/blink/renderer/modules/encryptedmedia/encrypted_media_utils.h"
 #include "third_party/blink/renderer/modules/encryptedmedia/media_key_system_access.h"
 #include "third_party/blink/renderer/modules/encryptedmedia/media_key_system_access_initializer_base.h"
-#include "third_party/blink/renderer/modules/media_capabilities_names.h"
 #include "third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
@@ -387,8 +386,8 @@
   DCHECK(!parsed_content_type.GetParameters().HasDuplicatedNames());
 
   web_configuration.mime_type = parsed_content_type.MimeType().LowerASCII();
-  web_configuration.codec = parsed_content_type.ParameterValueForName(
-      media_capabilities_names::kCodecs);
+  web_configuration.codec =
+      parsed_content_type.ParameterValueForName(kCodecsMimeTypeParam);
 
   // |channels| is optional and will be set to a null WebString if not present.
   web_configuration.channels = configuration->hasChannels()
@@ -414,8 +413,8 @@
   DCHECK(parsed_content_type.IsValid());
   DCHECK(!parsed_content_type.GetParameters().HasDuplicatedNames());
   web_configuration.mime_type = parsed_content_type.MimeType().LowerASCII();
-  web_configuration.codec = parsed_content_type.ParameterValueForName(
-      media_capabilities_names::kCodecs);
+  web_configuration.codec =
+      parsed_content_type.ParameterValueForName(kCodecsMimeTypeParam);
 
   DCHECK(configuration->hasWidth());
   web_configuration.width = configuration->width();
@@ -722,8 +721,7 @@
   }
 
   *mime_type = parsed_content_type.MimeType().LowerASCII();
-  *codec = parsed_content_type.ParameterValueForName(
-      media_capabilities_names::kCodecs);
+  *codec = parsed_content_type.ParameterValueForName(kCodecsMimeTypeParam);
   return true;
 }
 
diff --git a/third_party/blink/renderer/modules/media_capabilities/media_capabilities_names.json5 b/third_party/blink/renderer/modules/media_capabilities/media_capabilities_names.json5
deleted file mode 100644
index 01f9a0f..0000000
--- a/third_party/blink/renderer/modules/media_capabilities/media_capabilities_names.json5
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  metadata: {
-    namespace: "media_capabilities_names",
-  },
-
-  data: [
-    "codecs",
-  ],
-}
diff --git a/third_party/blink/renderer/modules/modules_initializer.cc b/third_party/blink/renderer/modules/modules_initializer.cc
index 6f5f48e..e8ce2cf 100644
--- a/third_party/blink/renderer/modules/modules_initializer.cc
+++ b/third_party/blink/renderer/modules/modules_initializer.cc
@@ -75,7 +75,6 @@
 #include "third_party/blink/renderer/modules/launch/web_launch_service_impl.h"
 #include "third_party/blink/renderer/modules/manifest/manifest_manager.h"
 #include "third_party/blink/renderer/modules/media/audio/audio_renderer_sink_cache.h"
-#include "third_party/blink/renderer/modules/media_capabilities_names.h"
 #include "third_party/blink/renderer/modules/media_controls/media_controls_impl.h"
 #include "third_party/blink/renderer/modules/mediasource/media_source_registry_impl.h"
 #include "third_party/blink/renderer/modules/peerconnection/peer_connection_tracker.h"
@@ -170,7 +169,6 @@
   Document::RegisterEventFactory(EventModulesFactory::Create());
   ModuleBindingsInitializer::Init();
   indexed_db_names::Init();
-  media_capabilities_names::Init();
   AXObjectCache::Init(AXObjectCacheImpl::Create);
   DraggedIsolatedFileSystem::Init(
       DraggedIsolatedFileSystemImpl::PrepareForDataObject);
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_transport/rtc_transport.cc b/third_party/blink/renderer/modules/peerconnection/rtc_transport/rtc_transport.cc
index 501f770..f8fdfef3 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_transport/rtc_transport.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_transport/rtc_transport.cc
@@ -17,6 +17,7 @@
 #include "third_party/blink/renderer/bindings/core/v8/v8_union_string_stringsequence.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_ice_server.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_transport_config.h"
+#include "third_party/blink/renderer/core/events/message_event.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/core/frame/local_dom_window.h"
 #include "third_party/blink/renderer/core/timing/performance.h"
@@ -76,7 +77,12 @@
   // includes them.
   void OnSendError() override {}
   void OnConnectionError() override {}
-  void OnWritableChange() override {}
+  void OnWritableChange() override {
+    PostCrossThreadTask(
+        *main_task_runner_, FROM_HERE,
+        CrossThreadBindOnce(&RtcTransport::OnWritableChangeOnMainThread,
+                            MakeUnwrappingCrossThreadWeakHandle(transport_)));
+  }
 
  private:
   scoped_refptr<base::SequencedTaskRunner> main_task_runner_;
@@ -532,6 +538,10 @@
   return resolver->Promise();
 }
 
+void RtcTransport::OnWritableChangeOnMainThread() {
+  DispatchEvent(*Event::Create(event_type_names::kWritablechange));
+}
+
 void RtcTransport::Trace(Visitor* visitor) const {
   ScriptWrappable::Trace(visitor);
   EventTarget::Trace(visitor);
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_transport/rtc_transport.h b/third_party/blink/renderer/modules/peerconnection/rtc_transport/rtc_transport.h
index 391c75f..06e6a0f 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_transport/rtc_transport.h
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_transport/rtc_transport.h
@@ -98,10 +98,12 @@
   DOMArrayBuffer* fingerprint() { return DOMArrayBuffer::Create(digest_); }
 
   DEFINE_ATTRIBUTE_EVENT_LISTENER(icecandidate, kIcecandidate)
+  DEFINE_ATTRIBUTE_EVENT_LISTENER(writablechange, kWritablechange)
 
   void OnPacketReceivedOnMainThread(Vector<uint8_t> data,
                                     webrtc::Timestamp receive_time);
   void OnCandidateGatheredOnMainThread(webrtc::Candidate candidate);
+  void OnWritableChangeOnMainThread();
 
   // ScriptWrappable implementation
   void Trace(Visitor* visitor) const override;
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_transport/rtc_transport.idl b/third_party/blink/renderer/modules/peerconnection/rtc_transport/rtc_transport.idl
index 8185847d..e643cd9 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_transport/rtc_transport.idl
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_transport/rtc_transport.idl
@@ -58,5 +58,6 @@
   readonly attribute DOMString fingerprintDigestAlgorithm;
   readonly attribute ArrayBuffer fingerprint;
 
+  attribute EventHandler onwritablechange;
   [CallWith=ScriptState] Promise<boolean> writable();
 };
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_transport/rtc_transport_test.cc b/third_party/blink/renderer/modules/peerconnection/rtc_transport/rtc_transport_test.cc
index 3690331..b4844ac 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_transport/rtc_transport_test.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_transport/rtc_transport_test.cc
@@ -267,6 +267,22 @@
   EXPECT_FALSE(tester.Value().V8Value()->IsTrue());
 }
 
+TEST_F(RtcTransportTest, OnWritableChange) {
+  CreateInitializedTransport();
+
+  // Register a listener for the writablechange event.
+  auto* wait = MakeGarbageCollected<WaitForEvent>();
+  base::RunLoop run_loop;
+  wait->AddEventListener(transport_, event_type_names::kWritablechange);
+  wait->AddCompletionClosure(run_loop.QuitClosure());
+
+  // Notify of a writable change.
+  transport_->OnWritableChangeOnMainThread();
+
+  // Wait for event to be fired.
+  run_loop.Run();
+}
+
 // Regression test for crbug.com/455519961
 TEST_F(RtcTransportTest, NoCrashReceivingPacketsAfterContextDestroyed) {
   CreateInitializedTransport();
diff --git a/third_party/blink/renderer/modules/webgpu/external_texture_helper.cc b/third_party/blink/renderer/modules/webgpu/external_texture_helper.cc
index c167a6d..f73e3e2d 100644
--- a/third_party/blink/renderer/modules/webgpu/external_texture_helper.cc
+++ b/third_party/blink/renderer/modules/webgpu/external_texture_helper.cc
@@ -29,7 +29,7 @@
 
 bool DrawVideoFrameIntoResourceProvider(
     scoped_refptr<media::VideoFrame> frame,
-    CanvasResourceProvider* resource_provider,
+    CanvasResourceProviderSharedImage* resource_provider,
     viz::RasterContextProvider* raster_context_provider,
     media::PaintCanvasVideoRenderer* video_renderer) {
   DCHECK(frame);
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc
index a3cc203..993b741b 100644
--- a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc
+++ b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc
@@ -171,7 +171,32 @@
   HighEntropyCanvasOpType high_entropy_canvas_op_types =
       GetRecorderHighEntropyCanvasOpTypes();
 
-  FlushCanvas(FlushReason::kOther);
+  if (recorder_->HasReleasableDrawOps()) {
+    FlushReason reason = FlushReason::kOther;
+    ScopedRasterTimer timer(IsAccelerated() ? RasterInterface() : nullptr,
+                            *this, always_enable_raster_timers_for_testing_);
+    bool want_to_print = (IsPrinting() && reason != FlushReason::kClear) ||
+                         reason == FlushReason::kPrinting ||
+                         reason == FlushReason::kCanvasPushFrameWhilePrinting;
+    bool preserve_recording = want_to_print && clear_frame_;
+
+    // If a previous flush rasterized some paint ops, we lost part of the
+    // recording and must fallback to raster printing instead of vectorial
+    // printing.
+    clear_frame_ = false;
+    if (reason == FlushReason::kClear) {
+      clear_frame_ = true;
+    }
+    cc::PaintRecord recording;
+    recording = recorder_->ReleaseMainRecording();
+    RasterRecord(recording);
+    // Images are locked for the duration of the rasterization, in case they get
+    // used multiple times. We can unlock them once the rasterization is
+    // complete.
+    ReleaseLockedImages();
+    last_recording_ =
+        preserve_recording ? std::optional(recording) : std::nullopt;
+  }
 
   cc::PaintImage paint_image;
 
@@ -881,6 +906,14 @@
   }
 }
 
+scoped_refptr<StaticBitmapImage>
+CanvasResourceProviderSharedImage::DoExternalDrawAndSnapshot(
+    base::FunctionRef<void(MemoryManagedPaintCanvas&)> draw_callback,
+    ImageOrientation orientation /*= ImageOrientationEnum::kDefault*/) {
+  ExternalCanvasDrawHelper(draw_callback);
+  return Snapshot(orientation);
+}
+
 scoped_refptr<StaticBitmapImage> CanvasResourceProviderSharedImage::Snapshot(
     ImageOrientation orientation) {
   TRACE_EVENT0("blink", "CanvasResourceProviderSharedImage::Snapshot");
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.h b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.h
index d761405..41d46bfe 100644
--- a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.h
+++ b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.h
@@ -208,6 +208,9 @@
   virtual scoped_refptr<CanvasResource> ProduceCanvasResource(FlushReason) = 0;
   virtual scoped_refptr<StaticBitmapImage> Snapshot(
       ImageOrientation = ImageOrientationEnum::kDefault) = 0;
+  virtual scoped_refptr<StaticBitmapImage> DoExternalDrawAndSnapshot(
+      base::FunctionRef<void(MemoryManagedPaintCanvas&)> draw_callback,
+      ImageOrientation orientation = ImageOrientationEnum::kDefault) = 0;
 
   void SetDelegate(Delegate* delegate) { delegate_ = delegate; }
 
@@ -295,15 +298,6 @@
     return last_recording_;
   }
 
-  // ExternalCanvasDrawHelper() is used by clients that require the invocation
-  // of WillDrawIfNeeded() before obtaining a canvas and drawing on it. All
-  // meaningful ExternalCanvasDrawHelper() implementations should call
-  // WillDrawIfNeeded() first, and then invoke `draw_ballback`.
-  virtual void ExternalCanvasDrawHelper(
-      base::FunctionRef<void(MemoryManagedPaintCanvas&)> draw_callback) {
-    NOTREACHED();
-  }
-
  protected:
   class CanvasImageProvider;
 
@@ -340,6 +334,8 @@
 
   HighEntropyCanvasOpType GetRecorderHighEntropyCanvasOpTypes() const;
 
+  void ReleaseLockedImages();
+
  private:
   friend class FlushForImageListener;
 
@@ -359,8 +355,6 @@
   // only needed for ganesh.
   void DisableLineDrawingAsPathsIfNecessary();
 
-  void ReleaseLockedImages();
-
   base::WeakPtr<WebGraphicsContext3DProviderWrapper> context_provider_wrapper_;
   // Note that `info_` should be const, but the relevant SkImageInfo
   // constructors do not exist.
@@ -372,17 +366,17 @@
   std::unique_ptr<CanvasImageProvider> canvas_image_provider_;
   std::unique_ptr<cc::SkiaPaintCanvas> skia_canvas_;
   raw_ptr<Delegate> delegate_ = nullptr;
+
+ protected:
   // Recording accumulating draw ops. This pointer is always valid and safe to
   // dereference.
   std::unique_ptr<MemoryManagedPaintRecorder> recorder_;
 
- protected:
   const cc::PaintImage::Id snapshot_paint_image_id_;
   cc::PaintImage::ContentId snapshot_paint_image_content_id_ =
       cc::PaintImage::kInvalidContentId;
   uint32_t snapshot_sk_image_id_ = 0u;
 
- private:
   bool always_enable_raster_timers_for_testing_ = false;
 
   // The maximum number of draw ops executed on the canvas, after which the
@@ -416,16 +410,11 @@
   bool IsAccelerated() const override { return false; }
   bool SupportsDirectCompositing() const override { return false; }
   bool IsSingleBuffered() const override { return false; }
-  void ExternalCanvasDrawHelper(
-      base::FunctionRef<void(MemoryManagedPaintCanvas&)> draw_callback)
-      override {
-    draw_callback(Canvas());
-  }
   scoped_refptr<StaticBitmapImage> Snapshot(
       ImageOrientation = ImageOrientationEnum::kDefault) override;
   scoped_refptr<StaticBitmapImage> DoExternalDrawAndSnapshot(
       base::FunctionRef<void(MemoryManagedPaintCanvas&)> draw_callback,
-      ImageOrientation orientation = ImageOrientationEnum::kDefault);
+      ImageOrientation orientation = ImageOrientationEnum::kDefault) override;
 
   void RasterRecord(cc::PaintRecord last_recording) override;
   bool WritePixels(const SkImageInfo& orig_info,
@@ -531,8 +520,15 @@
       FlushReason reason) override;
   bool IsValid() const override;
   bool IsSoftwareSharedImageGpuChannelLost() const final;
+
+  // ExternalCanvasDrawHelper() is used by clients that require the invocation
+  // of WillDrawIfNeeded() before obtaining a canvas and drawing on it.
   void ExternalCanvasDrawHelper(
-      base::FunctionRef<void(MemoryManagedPaintCanvas&)> draw_callback) final;
+      base::FunctionRef<void(MemoryManagedPaintCanvas&)> draw_callback);
+
+  scoped_refptr<StaticBitmapImage> DoExternalDrawAndSnapshot(
+      base::FunctionRef<void(MemoryManagedPaintCanvas&)> draw_callback,
+      ImageOrientation orientation = ImageOrientationEnum::kDefault) final;
   void RasterRecord(cc::PaintRecord last_recording) override;
   sk_sp<SkSurface> CreateSkSurface() const override;
   void OnFlushForImage(cc::PaintImage::ContentId content_id) final;
diff --git a/third_party/blink/renderer/platform/graphics/offscreen_canvas_placeholder_test.cc b/third_party/blink/renderer/platform/graphics/offscreen_canvas_placeholder_test.cc
index 806590f..5a56d4a 100644
--- a/third_party/blink/renderer/platform/graphics/offscreen_canvas_placeholder_test.cc
+++ b/third_party/blink/renderer/platform/graphics/offscreen_canvas_placeholder_test.cc
@@ -74,7 +74,7 @@
   test::TaskEnvironment task_environment_;
   OffscreenCanvasPlaceholder placeholder_;
   std::unique_ptr<MockCanvasResourceDispatcher> dispatcher_;
-  std::unique_ptr<CanvasResourceProvider> resource_provider_;
+  std::unique_ptr<CanvasResourceProviderSharedImage> resource_provider_;
   std::unique_ptr<WebGraphicsSharedImageInterfaceProvider>
       test_web_shared_image_interface_provider_;
   unsigned placeholder_id_ = 0;
diff --git a/third_party/blink/renderer/platform/graphics/video_frame_image_util.cc b/third_party/blink/renderer/platform/graphics/video_frame_image_util.cc
index 9c2b137..c5484d08 100644
--- a/third_party/blink/renderer/platform/graphics/video_frame_image_util.cc
+++ b/third_party/blink/renderer/platform/graphics/video_frame_image_util.cc
@@ -170,13 +170,11 @@
           ? media::kNoTransformation
           : frame->metadata().transformation.value_or(media::kNoTransformation);
   params.reinterpret_as_srgb = reinterpret_video_as_srgb;
-  resource_provider->ExternalCanvasDrawHelper(
+  return resource_provider->DoExternalDrawAndSnapshot(
       [&](MemoryManagedPaintCanvas& canvas) {
         video_renderer->Paint(frame.get(), &canvas, media_flags, params,
                               raster_context_provider.get());
-      });
-
-  return resource_provider->Snapshot(
+      },
       prefer_tagged_orientation
           ? VideoTransformationToImageOrientation(transform)
           : ImageOrientationEnum::kDefault);
diff --git a/third_party/blink/renderer/platform/p2p/filtering_network_manager.cc b/third_party/blink/renderer/platform/p2p/filtering_network_manager.cc
index b1cd7363..97392dc 100644
--- a/third_party/blink/renderer/platform/p2p/filtering_network_manager.cc
+++ b/third_party/blink/renderer/platform/p2p/filtering_network_manager.cc
@@ -67,8 +67,12 @@
 
   if (!start_updating_called_) {
     start_updating_called_ = true;
-    network_manager_for_signaling_thread_->SignalNetworksChanged.connect(
-        this, &FilteringNetworkManager::OnNetworksChanged);
+    network_manager_for_signaling_thread_->SubscribeNetworksChanged(
+        [that = GetWeakPtr()] {
+          if (that) {
+            that->OnNetworksChanged();
+          }
+        });
   }
 
   // Update |pending_network_update_| and |start_count_| before calling
@@ -229,7 +233,7 @@
 }
 
 void FilteringNetworkManager::SendNetworksChangedSignal() {
-  SignalNetworksChanged();
+  NotifyNetworksChanged();
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/p2p/filtering_network_manager_test.cc b/third_party/blink/renderer/platform/p2p/filtering_network_manager_test.cc
index 59306e06..c5c2c35 100644
--- a/third_party/blink/renderer/platform/p2p/filtering_network_manager_test.cc
+++ b/third_party/blink/renderer/platform/p2p/filtering_network_manager_test.cc
@@ -78,7 +78,7 @@
   // StartUpdating() will trigger another one.
   void StartUpdating() override {
     if (sent_first_update_)
-      SignalNetworksChanged();
+      NotifyNetworksChanged();
   }
   void StopUpdating() override {}
 
@@ -88,7 +88,7 @@
 
   void SendNetworksChanged() {
     sent_first_update_ = true;
-    SignalNetworksChanged();
+    NotifyNetworksChanged();
   }
 
   webrtc::MdnsResponderInterface* GetMdnsResponder() const override {
@@ -194,8 +194,7 @@
       network_manager_.reset(new EmptyNetworkManager(
           base_network_manager_.get(), base_network_manager_->AsWeakPtr()));
     }
-    network_manager_->SignalNetworksChanged.connect(
-        this, &FilteringNetworkManagerTest::OnNetworksChanged);
+    network_manager_->SubscribeNetworksChanged([this] { OnNetworksChanged(); });
   }
 
   void RunTests(base::span<TestEntry> tests) {
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index ca12aae9..6093961f 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -3558,7 +3558,8 @@
       // This is a spec change since anchor positioning was shipped in Blink.
       // https://issues.chromium.org/issues/408223892
       name: "OriginatingElementIsImplicitAnchor",
-      status: "experimental",
+      depends_on: ["CSSPositionAnchorNone"],
+      status: "stable",
     },
     {
       name: "OriginIsolationHeader",
diff --git a/third_party/blink/renderer/platform/video_capture/video_capture_impl_test.cc b/third_party/blink/renderer/platform/video_capture/video_capture_impl_test.cc
index b94c230..a418068 100644
--- a/third_party/blink/renderer/platform/video_capture/video_capture_impl_test.cc
+++ b/third_party/blink/renderer/platform/video_capture/video_capture_impl_test.cc
@@ -69,9 +69,6 @@
     : sii_(base::MakeRefCounted<gpu::TestSharedImageInterface>()),
       gpu_factories_(new media::MockGpuVideoAcceleratorFactories(sii_.get())),
       media_thread_("TestingMediaThread") {
-  // Ensure that any mappable SharedImages created via this testing platform
-  // create fake GMBs internally.
-  sii_->AlwaysBackMappableSharedImagesWithShMem();
   gpu_factories_->SetVideoFrameOutputFormat(
       media::GpuVideoAcceleratorFactories::OutputFormat::NV12);
   media_thread_.Start();
@@ -520,11 +517,11 @@
   //   2. create a SharedImage from the GpuMemoryBuffer on |media_thread_|
   //   3. invoke OnFrameReady callback on |testing_io_thread|
   auto create_and_queue_buffer = [&]() {
-    gfx::GpuMemoryBufferHandle gmb_handle;
-    gmb_handle.type = gfx::SHARED_MEMORY_BUFFER;
-
     StartCapture(0, params_small_);
-    SimulateGpuMemoryBufferCreated(kArbitraryBufferId, std::move(gmb_handle));
+    SimulateGpuMemoryBufferCreated(
+        kArbitraryBufferId, gpu::TestSharedImageInterface::CreateGMBHandle(
+                                viz::MultiPlaneFormat::kNV12,
+                                params_small_.requested_format.frame_size));
     SimulateBufferReceived(BufferDescription(
         kArbitraryBufferId, params_small_.requested_format.frame_size,
         media::PIXEL_FORMAT_NV12));
diff --git a/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials b/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials
index d2f5ec0..e25385c 100644
--- a/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials
+++ b/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials
@@ -116,8 +116,6 @@
 crbug.com/626703 external/wpt/geolocation-API/enabled-by-permissions-policy.https.sub.html [ Timeout ]
 crbug.com/626703 external/wpt/geolocation-API/enabled-on-self-origin-by-permissions-policy.https.sub.html [ Timeout ]
 crbug.com/626703 external/wpt/screen-orientation/active-lock.html [ Timeout ]
-crbug.com/626703 external/wpt/css/selectors/media/media-loading-state.html [ Timeout ]
-crbug.com/626703 external/wpt/css/selectors/media/media-playback-state.html [ Timeout ]
 crbug.com/626703 external/wpt/webaudio/the-audio-api/the-audiocontext-interface/audiocontext-suspend-resume-close.html [ Timeout ]
 crbug.com/626703 external/wpt/editing/crashtests/inserthorizontalrule-in-textarea-in-editor-and-undo-on-error-events.html [ Timeout ]
 crbug.com/626703 external/wpt/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/same-document-traversal-same-document-traversal-hashchange.html [ Timeout ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index fdac3f6..3d133b57 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -1485,10 +1485,6 @@
 crbug.com/248894 external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-justify.html [ Failure ]
 crbug.com/248894 external/wpt/web-animations/responsive/textIndent.html [ Failure ]
 
-crbug.com/1377648 external/wpt/css/selectors/media/media-loading-state.html [ Skip Timeout ]
-crbug.com/1377648 external/wpt/css/selectors/media/media-playback-state.html [ Timeout ]
-crbug.com/1383480 external/wpt/css/selectors/invalidation/media-pseudo-classes-in-has.html [ Timeout ]
-crbug.com/1383480 external/wpt/css/selectors/invalidation/media-loading-pseudo-classes-in-has.html [ Skip Timeout ]
 crbug.com/1475378 external/wpt/css/css-color/currentcolor-004.html [ Failure ]
 
 crbug.com/1491198 external/wpt/css/selectors/selectors-4/lang-002.html [ Failure ]
@@ -2689,6 +2685,8 @@
 crbug.com/420746629 [ Win11 ] virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/l2Pool2d.https.any.html?gpu [ Failure ]  # Flaky output
 crbug.com/420746629 [ Win11 ] virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/maxPool2d.https.any.html?gpu [ Failure ]  # Flaky output
 crbug.com/429276267 [ Win11 ] virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/tile.https.any.html?gpu [ Crash ]
+crbug.com/462389640 [ Mac ] virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/tensor.https.any.serviceworker.html?gpu [ Failure ] # Flaky output
+crbug.com/462389640 [ Mac ] virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/tensor.https.any.sharedworker.html?gpu [ Failure ] # Flaky output
 
 # `wdspec` tests
 external/wpt/webdriver/tests/classic/element_send_keys/interactability.py [ Failure ]  # Flaky output
@@ -3028,7 +3026,6 @@
 # `*-blink-rel` builders don't.
 crbug.com/626703 external/wpt/css/css-fonts/parsing/font-variant-invalid.html [ Crash Pass ]
 crbug.com/626703 external/wpt/html/dom/elements/global-attributes/dir-auto-form-associated.window.html [ Crash Failure ]
-crbug.com/626703 external/wpt/css/css-page/page-name-unnamed-trailing-001-print.html [ Crash Failure Timeout ]
 
 # This test is flaky on Linux only
 crbug.com/342630979 [ Linux ] external/wpt/css/css-page/background-image-only-for-print.html [ Failure Pass ]
@@ -5037,6 +5034,7 @@
 crbug.com/1494838 external/wpt/css/css-page/page-name-img-003-print.html [ Failure ]
 crbug.com/1494838 external/wpt/css/css-page/page-name-img-004-print.html [ Failure ]
 crbug.com/1494847 external/wpt/css/css-page/page-name-margin-001-print.html [ Failure ]
+crbug.com/462233640 external/wpt/css/css-page/page-name-unnamed-trailing-001-print.html [ Crash Failure Timeout ]
 crbug.com/1494863 external/wpt/css/css-page/page-name-zero-height-001-print.html [ Failure ]
 crbug.com/346088869 external/wpt/css/css-page/page-size-011-print.html [ Pass Timeout ]
 
@@ -5176,18 +5174,6 @@
 # disabled, the subtest will pass. 2) Module cases always fail.
 crbug.com/1244145 external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/v8-code-cache.html [ Failure ]
 
-# Temporarily disabled for https://crrev.com/c/7170521 to land.
-crbug.com/451502260 http/tests/devtools/components/widget-focus.js [ Failure Pass ]
-crbug.com/451502260 http/tests/devtools/console/viewport-testing/console-clicking-messages.js [ Failure Pass ]
-crbug.com/451502260 http/tests/devtools/console/viewport-testing/console-key-links.js [ Failure Pass ]
-crbug.com/451502260 http/tests/devtools/elements/edit/edit-after-model-changed.js [ Failure Pass ]
-crbug.com/451502260 http/tests/devtools/elements/navigate-styles-sidebar-with-arrow-keys.js [ Failure Pass ]
-crbug.com/451502260 http/tests/devtools/elements/styles-3/style-autocomplete.js [ Failure Pass ]
-crbug.com/451502260 http/tests/devtools/elements/styles-4/styles-edit-slow-completions.js [ Failure Pass ]
-crbug.com/451502260 http/tests/devtools/elements/styles/styles-mouse-test.js [ Failure Pass ]
-crbug.com/451502260 http/tests/devtools/unit/soft-context-menu.js [ Failure Pass ]
-crbug.com/451502260 http/tests/devtools/unit/soft-drop-down.js [ Failure Pass ]
-
 # ShadowRealm tests that crash in Modulator::From
 crbug.com/376786819 virtual/shadow-realm-enabled/external/wpt/* [ Crash Skip Timeout ]
 crbug.com/376786819 virtual/shadow-realm-enabled/external/wpt/compression/compression-bad-chunks.https.any.shadowrealm-in-audioworklet.html [ Pass Timeout ]
diff --git a/third_party/blink/web_tests/TestLists/content_shell.filter b/third_party/blink/web_tests/TestLists/content_shell.filter
index 9d0df79..2f1893f 100644
--- a/third_party/blink/web_tests/TestLists/content_shell.filter
+++ b/third_party/blink/web_tests/TestLists/content_shell.filter
@@ -472,7 +472,6 @@
 external/wpt/css/selectors/user-valid.html
 external/wpt/css/selectors/selectors-4/lang-024.html
 external/wpt/css/selectors/invalidation/lang-pseudo-class-in-has-multiple-document-elements.html
-external/wpt/css/selectors/media/media-loading-state.html
 external/wpt/css/selectors/open-pseudo.html
 external/wpt/css/selectors/user-invalid-form-submission-invalidation.html
 external/wpt/density-size-correction/density-corrected-image-in-canvas.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/highlight-cascade/highlight-cascade-009.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/highlight-cascade/highlight-cascade-009.html
index f063c11d..db43d86 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-pseudo/highlight-cascade/highlight-cascade-009.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/highlight-cascade/highlight-cascade-009.html
@@ -34,11 +34,11 @@
     test(() => void assert_equals(body_selection.getPropertyValue("--background-color"), "green"),
         "body ::selection uses the originating custom property");
     test(() => void assert_equals(body_selection.getPropertyValue("--decoration-color"), "purple"),
-        "body ::selection does not use its own custom property");
+        "body ::selection uses its own custom property");
     test(() => void assert_equals(div_selection.getPropertyValue("--decoration-color"), "green"),
         "div::selection uses the originating element custom property");
     test(() => void assert_equals(div_selection.getPropertyValue("--background-color"), "blue"),
-        "div::selection does not use its own custom property");
+        "div::selection uses its own custom property");
     test(() => void assert_equals(div_style.getPropertyValue("--background-color"), "green"),
         "div::selection properties are not present on the originating element");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/calc-infinity-nan-computed.html b/third_party/blink/web_tests/external/wpt/css/css-values/calc-infinity-nan-computed.html
index f4067c4..9ceee7a 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-values/calc-infinity-nan-computed.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-values/calc-infinity-nan-computed.html
@@ -76,6 +76,11 @@
 testTransformValuesCloseTo("rotate(calc(-infinity * 1grad))", 0.0001, "rotate(0deg)");
 testTransformValuesCloseTo("rotate(calc(NaN * 1grad))", 0.0001, "rotate(0deg)");
 
+// For <number>
+testComputedValueGreaterOrLowerThan("scale", "calc(max(infinity, 10))", REALLY_LARGE);
+testComputedValueGreaterOrLowerThan("scale", "calc(infinity)", REALLY_LARGE);
+testComputedValueGreaterOrLowerThan("scale", "calc(-infinity * 10)", REALLY_LARGE_NEGATIVE);
+
 </script>
 </body>
 </html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/scoped/clipper-non-containing-block-ref.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/scoped/clipper-non-containing-block-ref.html
new file mode 100644
index 0000000..7368ec8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/scoped/clipper-non-containing-block-ref.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<meta name="title" content="Test that a clipper clips the view transition (ref)">
+<meta name="author" content="mailto:vmpstr@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-view-transitions-2/">
+
+<style>
+div {
+  background: blue;
+  width: 100px;
+  height: 100px;
+}
+</style>
+
+<div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/scoped/clipper-non-containing-block.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/scoped/clipper-non-containing-block.html
new file mode 100644
index 0000000..4d3f41b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/scoped/clipper-non-containing-block.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<meta charset="utf-8">
+<meta name="title" content="Test that a clipper clips the view transition">
+<meta name="author" content="mailto:vmpstr@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-view-transitions-2/">
+<link rel="match" href="clipper-non-containing-block-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/web-animations/testcommon.js"></script>
+<style>
+.clipper {
+  overflow: clip;
+  width: 100px;
+  height: 100px;
+}
+#target {
+  width: 200px;
+  height: 300px;
+  background: blue;
+}
+::view-transition-group(*) {
+  animation-play-state: paused;
+}
+::view-transition-old(*) {
+  animation: unset;
+  opacity: 1;
+}
+::view-transition-new(*) {
+  animation: unset;
+  opacity: 0;
+}
+#target.after {
+  background: red;
+}
+</style>
+
+<div class=clipper>
+  <div id=target></div>
+</div>
+
+<script>
+failIfNot(target.startViewTransition, "Missing element.startViewTransition");
+
+function runTest() {
+  target.startViewTransition(() => {
+    target.classList.add("after");
+  }).ready.then(takeScreenshot);
+}
+
+waitForCompositorReady().then(runTest);
+</script>
+
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/media-loading-pseudo-classes-in-has-expected.txt b/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/media-loading-pseudo-classes-in-has-expected.txt
new file mode 100644
index 0000000..065681d3
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/media-loading-pseudo-classes-in-has-expected.txt
@@ -0,0 +1,7 @@
+This is a testharness.js-based test.
+[FAIL] Test :has(:stalled) invalidation
+  assert_implements: :stalled is not supported undefined
+[FAIL] Test :has(:buffering) invalidation
+  assert_implements: :buffering is not supported undefined
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/media-loading-pseudo-classes-in-has.html b/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/media-loading-pseudo-classes-in-has.html
index 07ab608..fb211501 100644
--- a/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/media-loading-pseudo-classes-in-has.html
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/media-loading-pseudo-classes-in-has.html
@@ -20,6 +20,7 @@
 
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
+<script src="/common/media.js"></script>
 <script>
 const BLUE = "rgb(0, 0, 255)";
 const GREEN = "rgb(0, 128, 0)";
@@ -39,11 +40,12 @@
 }
 
 promise_test(async (t) => {
+    assert_implements(CSS.supports("selector(:stalled)"), ":stalled is not supported");
     const video = document.querySelector("video");
     assert_stalled_state(false);
     await new Promise((r) => {
         video.addEventListener("stalled", r, { once: true });
-        video.src = `/media/counting.mp4?pipe=trickle(100:d1:r2)&random=${Math.random()}`;
+        video.src = `${getVideoURI("/media/counting")}?pipe=trickle(100:d1:r2)&random=${Math.random()}`;
     });
     assert_stalled_state(false);
     const promise = video.play();
@@ -58,11 +60,12 @@
 }, "Test :has(:stalled) invalidation");
 
 promise_test(async (t) => {
+    assert_implements(CSS.supports("selector(:buffering)"), ":buffering is not supported");
     const video = document.querySelector("video");
     assert_buffering_state(false);
     await new Promise((r) => {
         video.addEventListener("stalled", r, { once: true });
-        video.src = `/media/counting.mp4?pipe=trickle(100:d1:r2)&random=${Math.random()}`;
+        video.src = `${getVideoURI("/media/counting")}?pipe=trickle(100:d1:r2)&random=${Math.random()}`;
     });
     video.currentTime = 10;
     assert_buffering_state(false);
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/media-pseudo-classes-in-has-expected.txt b/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/media-pseudo-classes-in-has-expected.txt
new file mode 100644
index 0000000..1c4bd18
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/media-pseudo-classes-in-has-expected.txt
@@ -0,0 +1,9 @@
+This is a testharness.js-based test.
+[FAIL] Test :playing pseudo-class
+  assert_equals: expected "rgb(255, 0, 0)" but got "rgb(0, 0, 0)"
+[FAIL] Test :seeking pseudo-class
+  assert_implements: :seeking is not supported undefined
+[FAIL] Test :muted pseudo-class
+  assert_implements: :muted is not supported undefined
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/media-pseudo-classes-in-has.html b/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/media-pseudo-classes-in-has.html
index 881ba8f3..ffa82ba 100644
--- a/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/media-pseudo-classes-in-has.html
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/media-pseudo-classes-in-has.html
@@ -31,6 +31,7 @@
   </div>
   <script src="/resources/testharness.js"></script>
   <script src="/resources/testharnessreport.js"></script>
+  <script src="/common/media.js"></script>
   <script>
     const GREEN = "rgb(0, 128, 0)";
     const ORANGE = "rgb(255, 165, 0)";
@@ -52,6 +53,7 @@
     }
 
     promise_test(async (t) => {
+      assert_implements(CSS.supports("selector(:playing)"), ":playing is not supported");
       t.add_cleanup(() => {
         video.muted = false;
         video.pause();
@@ -63,7 +65,7 @@
       assert_matches_seeking(false);
       await new Promise((r) => {
         video.addEventListener("canplay", r, { once: true });
-        video.src = "/media/counting.mp4";
+        video.src = getVideoURI("/media/counting");
       });
       video.muted = true; // allows us to play the video
       assert_matches_muted(true);
@@ -72,9 +74,10 @@
         video.play();
       });
       assert_matches_playing(true);
-    }, "Test :playing pseudo-classes");
+    }, "Test :playing pseudo-class");
 
     promise_test(async (t) => {
+      assert_implements(CSS.supports("selector(:seeking)"), ":seeking is not supported");
       t.add_cleanup(() => {
         video.removeAttribute("src");
       });
@@ -84,7 +87,7 @@
       assert_matches_seeking(false);
       await new Promise((r) => {
         video.addEventListener("canplay", r, { once: true });
-        video.src = "/media/counting.mp4";
+        video.src = getVideoURI("/media/counting");
       });
 
       assert_matches_seeking(false);
@@ -96,13 +99,14 @@
     }, "Test :seeking pseudo-class");
 
     promise_test(async (t) => {
+      assert_implements(CSS.supports("selector(:muted)"), ":muted is not supported");
       t.add_cleanup(() => {
         video.removeAttribute("src");
       });
       const video = document.querySelector("video");
       await new Promise((r) => {
         video.addEventListener("canplay", r, { once: true });
-        video.src = "/media/counting.mp4";
+        video.src = getVideoURI("/media/counting");
       });
       assert_matches_muted(false);
       video.muted = true;
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/media/media-loading-state-expected.txt b/third_party/blink/web_tests/external/wpt/css/selectors/media/media-loading-state-expected.txt
new file mode 100644
index 0000000..4de3618
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/media/media-loading-state-expected.txt
@@ -0,0 +1,9 @@
+This is a testharness.js-based test.
+[FAIL] Test :pseudo-class syntax is supported without throwing a SyntaxError
+  assert_unreached: :buffering is not supported Reached unreachable code
+[FAIL] Test :stalled pseudo-class
+  assert_implements: :stalled is not supported undefined
+[FAIL] Test :buffering pseudo-class
+  assert_implements: :buffering is not supported undefined
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/media/media-loading-state.html b/third_party/blink/web_tests/external/wpt/css/selectors/media/media-loading-state.html
index 6bead20a..d054d12 100644
--- a/third_party/blink/web_tests/external/wpt/css/selectors/media/media-loading-state.html
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/media/media-loading-state.html
@@ -7,6 +7,7 @@
 />
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
+<script src="/common/media.js"></script>
 <body>
   <video width="300" height="300" muted loop controls></video>
   <script type="module">
@@ -21,10 +22,11 @@
     }, "Test :pseudo-class syntax is supported without throwing a SyntaxError");
 
     promise_test(async (t) => {
+      assert_implements(CSS.supports("selector(:stalled)"), ":stalled is not supported");
       const video = document.querySelector("video");
       await new Promise((r) => {
         video.addEventListener("stalled", r, { once: true });
-        video.src = `/media/counting.mp4?pipe=trickle(100:d1:r2)&random=${Math.random()}`;
+        video.src = `${getVideoURI("/media/counting")}?pipe=trickle(100:d1:r2)&random=${Math.random()}`;
       });
       const promise = video.play();
       assert_equals(
@@ -40,10 +42,11 @@
     }, "Test :stalled pseudo-class");
 
     promise_test(async (t) => {
+      assert_implements(CSS.supports("selector(:buffering)"), ":buffering is not supported");
       const video = document.querySelector("video");
       await new Promise((r) => {
         video.addEventListener("stalled", r, { once: true });
-        video.src = `/media/counting.mp4?pipe=trickle(100:d1:r2)&random=${Math.random()}`;
+        video.src = `${getVideoURI("/media/counting")}?pipe=trickle(100:d1:r2)&random=${Math.random()}`;
       });
       video.currentTime = 10;
       const promise = video.play();
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/media/media-playback-state-expected.txt b/third_party/blink/web_tests/external/wpt/css/selectors/media/media-playback-state-expected.txt
new file mode 100644
index 0000000..2e755dd
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/media/media-playback-state-expected.txt
@@ -0,0 +1,7 @@
+This is a testharness.js-based test.
+[FAIL] Test :pseudo-class syntax is supported without throwing a SyntaxError
+  assert_unreached: :seeking is not supported Reached unreachable code
+[FAIL] Test :seeking pseudo-class
+  assert_implements: :seeking is not supported undefined
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/media/media-playback-state.html b/third_party/blink/web_tests/external/wpt/css/selectors/media/media-playback-state.html
index c034dbb..6ce4584 100644
--- a/third_party/blink/web_tests/external/wpt/css/selectors/media/media-playback-state.html
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/media/media-playback-state.html
@@ -8,6 +8,7 @@
 />
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
+<script src="/common/media.js"></script>
 <body>
   <video width="300" height="300" muted loop></video>
   <script>
@@ -22,10 +23,11 @@
     }, "Test :pseudo-class syntax is supported without throwing a SyntaxError");
 
     promise_test(async (t) => {
+      assert_implements(CSS.supports("selector(:playing)"), ":playing is not supported");
       const video = document.querySelector("video");
       await new Promise((r) => {
         video.addEventListener("canplay", r, { once: true });
-        video.src = "/media/counting.mp4";
+        video.src = getVideoURI("/media/counting");
       });
       video.muted = true; // allows us to play the video
       assert_true(video.muted, "video is muted");
@@ -39,26 +41,28 @@
       assert_equals(document.querySelector("video:not(:playing)"), null);
       assert_equals(document.querySelector("video:paused"), null);
       assert_equals(document.querySelector("video:not(:paused)"), video);
-    }, "Test :playing pseudo-classes");
+    }, "Test :playing pseudo-class");
 
     promise_test(async (t) => {
+      assert_implements(CSS.supports("selector(:paused)"), ":paused is not supported");
       const video = document.querySelector("video");
       await new Promise((r) => {
         video.addEventListener("canplay", r, { once: true });
-        video.src = "/media/counting.mp4";
+        video.src = getVideoURI("/media/counting");
       });
       assert_equals(video.paused, true);
       assert_equals(document.querySelector("video:playing"), null);
       assert_equals(document.querySelector("video:not(:playing)"), video);
       assert_equals(document.querySelector("video:paused"), video);
       assert_equals(document.querySelector("video:not(:paused)"), null);
-    }, "Test :paused pseudo-classes");
+    }, "Test :paused pseudo-class");
 
     promise_test(async (t) => {
+      assert_implements(CSS.supports("selector(:seeking)"), ":seeking is not supported");
       const video = document.querySelector("video");
       await new Promise((r) => {
         video.addEventListener("canplay", r, { once: true });
-        video.src = "/media/counting.mp4";
+        video.src = getVideoURI("/media/counting");
       });
       assert_equals(document.querySelector("video:seeking"), null);
       assert_equals(document.querySelector("video:not(:seeking)"), video);
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/media/sound-state-expected.txt b/third_party/blink/web_tests/external/wpt/css/selectors/media/sound-state-expected.txt
index b0d99e2e..ae2a58d 100644
--- a/third_party/blink/web_tests/external/wpt/css/selectors/media/sound-state-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/media/sound-state-expected.txt
@@ -2,6 +2,6 @@
 [FAIL] Test :pseudo-class syntax is supported without throwing a SyntaxError
   assert_unreached: :muted is not supported Reached unreachable code
 [FAIL] Test :muted pseudo-class
-  promise_test: Unhandled rejection with value: object "SyntaxError: Failed to execute 'querySelector' on 'Document': 'video:muted' is not a valid selector."
+  assert_implements: :muted is not supported undefined
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/media/sound-state.html b/third_party/blink/web_tests/external/wpt/css/selectors/media/sound-state.html
index 527bb30..e41e4ac 100644
--- a/third_party/blink/web_tests/external/wpt/css/selectors/media/sound-state.html
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/media/sound-state.html
@@ -6,6 +6,7 @@
 />
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
+<script src="/common/media.js"></script>
 <body>
   <video width="300" height="300" loop></video>
   <script type="module">
@@ -23,6 +24,7 @@
     }, "Test :pseudo-class syntax is supported without throwing a SyntaxError");
 
     promise_test(async (t) => {
+      assert_implements(CSS.supports("selector(:muted)"), ":muted is not supported");
       assert_equals(
         document.querySelector("video:muted"),
         null,
@@ -31,7 +33,7 @@
       const video = document.querySelector("video");
       await new Promise((r) => {
         video.addEventListener("canplay", r, { once: true });
-        video.src = "/media/counting.mp4";
+        video.src = getVideoURI("/media/counting");
       });
       video.muted = false;
       assert_false(video.muted, "video is unmuted");
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/permission-element/geolocation-element/idlharness.tentative.window-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/permission-element/geolocation-element/idlharness.tentative.window-expected.txt
deleted file mode 100644
index 587a183..0000000
--- a/third_party/blink/web_tests/external/wpt/html/semantics/permission-element/geolocation-element/idlharness.tentative.window-expected.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-This is a testharness.js-based test.
-[FAIL] HTMLGeolocationElement interface: existence and properties of interface object
-  assert_equals: prototype of HTMLGeolocationElement is not HTMLElement expected function "function HTMLElement() { [native code] }" but got function "function HTMLPermissionElement() { [native code] }"
-[FAIL] HTMLGeolocationElement interface: existence and properties of interface prototype object
-  assert_equals: prototype of HTMLGeolocationElement.prototype is not HTMLElement.prototype expected object "[object HTMLElement]" but got object "[object HTMLPermissionElement]"
-[FAIL] HTMLGeolocationElement interface: attribute isValid
-  assert_own_property: expected property "isValid" missing
-[FAIL] HTMLGeolocationElement interface: attribute invalidReason
-  assert_own_property: expected property "invalidReason" missing
-[FAIL] HTMLGeolocationElement interface: attribute initialPermissionStatus
-  assert_own_property: expected property "initialPermissionStatus" missing
-[FAIL] HTMLGeolocationElement interface: attribute permissionStatus
-  assert_own_property: expected property "permissionStatus" missing
-[FAIL] HTMLGeolocationElement interface: attribute onpromptaction
-  assert_own_property: expected property "onpromptaction" missing
-[FAIL] HTMLGeolocationElement interface: attribute onpromptdismiss
-  assert_own_property: expected property "onpromptdismiss" missing
-[FAIL] HTMLGeolocationElement interface: attribute onvalidationstatuschange
-  assert_own_property: expected property "onvalidationstatuschange" missing
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/http/tests/devtools/components/widget-focus.js b/third_party/blink/web_tests/http/tests/devtools/components/widget-focus.js
index 32620791..aadce20 100644
--- a/third_party/blink/web_tests/http/tests/devtools/components/widget-focus.js
+++ b/third_party/blink/web_tests/http/tests/devtools/components/widget-focus.js
@@ -96,7 +96,7 @@
   TestRunner.completeTest();
 
   function dumpFocus() {
-    var focused = Platform.DOMUtilities.deepActiveElement(document);
+    var focused = UI.DOMUtilities.deepActiveElement(document);
     var id = focused ? focused.id : '';
     TestRunner.addResult(id ? id + ' Focused' : 'No focus');
   }
diff --git a/third_party/blink/web_tests/http/tests/devtools/console/viewport-testing/console-clicking-messages.js b/third_party/blink/web_tests/http/tests/devtools/console/viewport-testing/console-clicking-messages.js
index eaae36c..9a7a011 100644
--- a/third_party/blink/web_tests/http/tests/devtools/console/viewport-testing/console-clicking-messages.js
+++ b/third_party/blink/web_tests/http/tests/devtools/console/viewport-testing/console-clicking-messages.js
@@ -6,6 +6,7 @@
 import {ConsoleTestRunner} from 'console_test_runner';
 
 import * as Platform from 'devtools/core/platform/platform.js';
+import * as UI from 'devtools/ui/legacy/legacy.js';
 import * as Console from 'devtools/panels/console/console.js';
 
 (async function() {
@@ -131,7 +132,7 @@
       TestRunner.addResult(`Is group expanded: ${expanded ? 'YES' : 'NO'}`);
     }
 
-    var element = Platform.DOMUtilities.deepActiveElement(document);
+    var element = UI.DOMUtilities.deepActiveElement(document);
     if (!element) {
       TestRunner.addResult('null');
       return;
diff --git a/third_party/blink/web_tests/http/tests/devtools/console/viewport-testing/console-key-links.js b/third_party/blink/web_tests/http/tests/devtools/console/viewport-testing/console-key-links.js
index 64fd6b1..121c9bae 100644
--- a/third_party/blink/web_tests/http/tests/devtools/console/viewport-testing/console-key-links.js
+++ b/third_party/blink/web_tests/http/tests/devtools/console/viewport-testing/console-key-links.js
@@ -5,7 +5,7 @@
 import {TestRunner} from 'test_runner';
 import {ConsoleTestRunner} from 'console_test_runner';
 
-import * as Platform from 'devtools/core/platform/platform.js';
+import * as UI from 'devtools/ui/legacy/legacy.js';
 import * as Console from 'devtools/panels/console/console.js';
 
 (async function() {
@@ -169,7 +169,7 @@
 
     if (!activeElement)
       return;
-    var element = Platform.DOMUtilities.deepActiveElement(document);
+    var element = UI.DOMUtilities.deepActiveElement(document);
     if (!element) {
       TestRunner.addResult('null');
       return;
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/edit/edit-after-model-changed.js b/third_party/blink/web_tests/http/tests/devtools/elements/edit/edit-after-model-changed.js
index 7804581..3335757 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/edit/edit-after-model-changed.js
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/edit/edit-after-model-changed.js
@@ -6,6 +6,7 @@
 import {ElementsTestRunner} from 'elements_test_runner';
 
 import * as Platform from 'devtools/core/platform/platform.js';
+import * as UI from 'devtools/ui/legacy/legacy.js';
 import * as ElementsModule from 'devtools/panels/elements/elements.js';
 
 (async function() {
@@ -43,7 +44,7 @@
   }
 
   function dumpFocus() {
-    const element = Platform.DOMUtilities.deepActiveElement(document);
+    const element = UI.DOMUtilities.deepActiveElement(document);
     TestRunner.addResult(`Active element: ${element.tagName}, ${element.className}`);
   }
 })();
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/navigate-styles-sidebar-with-arrow-keys.js b/third_party/blink/web_tests/http/tests/devtools/elements/navigate-styles-sidebar-with-arrow-keys.js
index 1c717d97..22acec4 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/navigate-styles-sidebar-with-arrow-keys.js
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/navigate-styles-sidebar-with-arrow-keys.js
@@ -77,7 +77,7 @@
 
   function dumpState() {
     TestRunner.addResult('Editing: ' + UIModule.UIUtils.isEditing())
-    TestRunner.addResult(Platform.DOMUtilities.deepActiveElement(document).innerText);
+    TestRunner.addResult(UIModule.DOMUtilities.deepActiveElement(document).innerText);
     TestRunner.addResult('');
   }
 
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/style-autocomplete.js b/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/style-autocomplete.js
index 4693eac..03f58eb 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/style-autocomplete.js
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/style-autocomplete.js
@@ -6,6 +6,7 @@
 import {ElementsTestRunner} from 'elements_test_runner';
 
 import * as Platform from 'devtools/core/platform/platform.js';
+import * as UI from 'devtools/ui/legacy/legacy.js';
 import * as ElementsModule from 'devtools/panels/elements/elements.js';
 
 (async function() {
@@ -125,7 +126,7 @@
     } else {
       selectionRange.selectNodeContents(proxyElement);
     }
-    var range = Platform.DOMUtilities.rangeOfWord(selectionRange.startContainer, selectionRange.startOffset, prompt.completionStopCharacters, proxyElement, 'backward');
+    var range = UI.DOMUtilities.rangeOfWord(selectionRange.startContainer, selectionRange.startOffset, prompt.completionStopCharacters, proxyElement, 'backward');
     var prefix = range.toString();
     prompt.buildPropertyCompletions(inputText.substring(0, inputText.length - prefix.length), prefix, force)
         .then(completions);
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/styles-4/styles-edit-slow-completions.js b/third_party/blink/web_tests/http/tests/devtools/elements/styles-4/styles-edit-slow-completions.js
index 17a5833..801ede3e 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/styles-4/styles-edit-slow-completions.js
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/styles-4/styles-edit-slow-completions.js
@@ -37,7 +37,7 @@
   TestRunner.completeTest();
 
   function dumpFocus() {
-    const element = Platform.DOMUtilities.deepActiveElement(document);
+    const element = UIModule.DOMUtilities.deepActiveElement(document);
     TestRunner.addResult(`Active element: ${element.tagName}, ${element.className}`);
   }
 })();
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/styles/styles-mouse-test.js b/third_party/blink/web_tests/http/tests/devtools/elements/styles/styles-mouse-test.js
index a2d1e434..49dbccb1 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/styles/styles-mouse-test.js
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/styles/styles-mouse-test.js
@@ -6,6 +6,7 @@
 import {ElementsTestRunner} from 'elements_test_runner';
 
 import * as Platform from 'devtools/core/platform/platform.js';
+import * as UI from 'devtools/ui/legacy/legacy.js';
 import * as Elements from 'devtools/panels/elements/elements.js';
 
 (async function() {
@@ -74,7 +75,7 @@
       TestRunner.addResult('Not editing');
       return;
     }
-    TestRunner.addResult('Editing: "' + TestRunner.textContentWithoutStyles(Platform.DOMUtilities.deepActiveElement(document)) + '"');
+    TestRunner.addResult('Editing: "' + TestRunner.textContentWithoutStyles(UI.DOMUtilities.deepActiveElement(document)) + '"');
   }
 
   function mouseDown(element, offset = 0) {
diff --git a/third_party/blink/web_tests/http/tests/devtools/unit/soft-context-menu.js b/third_party/blink/web_tests/http/tests/devtools/unit/soft-context-menu.js
index 09159d9..f474657 100644
--- a/third_party/blink/web_tests/http/tests/devtools/unit/soft-context-menu.js
+++ b/third_party/blink/web_tests/http/tests/devtools/unit/soft-context-menu.js
@@ -60,7 +60,7 @@
   TestRunner.completeTest();
 
   function pressKey(key) {
-    var element = Platform.DOMUtilities.deepActiveElement(document);
+    var element = UI.DOMUtilities.deepActiveElement(document);
     if (!element)
       return;
     element.dispatchEvent(TestRunner.createKeyEvent(key));
@@ -77,7 +77,7 @@
     }
     var selection = '';
     var subMenu = menu;
-    var activeElement = Platform.DOMUtilities.deepActiveElement(document);
+    var activeElement = UI.DOMUtilities.deepActiveElement(document);
     do {
       if (selection)
         selection += ' -> ';
diff --git a/third_party/blink/web_tests/http/tests/devtools/unit/soft-drop-down.js b/third_party/blink/web_tests/http/tests/devtools/unit/soft-drop-down.js
index 6e98d1d81..c97a6d2 100644
--- a/third_party/blink/web_tests/http/tests/devtools/unit/soft-drop-down.js
+++ b/third_party/blink/web_tests/http/tests/devtools/unit/soft-drop-down.js
@@ -71,7 +71,7 @@
   };
 
   function pressKey(key) {
-    var element = Platform.DOMUtilities.deepActiveElement(document);
+    var element = UI.DOMUtilities.deepActiveElement(document);
     if (!element)
       return;
     TestRunner.addResult(key);
diff --git a/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt b/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
index cc49be11..7873ba64 100644
--- a/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
+++ b/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
@@ -1814,6 +1814,7 @@
     getter fingerprint
     getter fingerprintDigestAlgorithm
     getter onicecandidate
+    getter onwritablechange
     method addRemoteCandidate
     method constructor
     method getReceivedPackets
@@ -1821,6 +1822,7 @@
     method setRemoteDtlsParameters
     method writable
     setter onicecandidate
+    setter onwritablechange
 interface RtcTransportIceCandidate
     attribute @@toStringTag
     getter address
diff --git a/third_party/blink/web_tests/inspector-protocol/css/css-font-palette-values-expected.txt b/third_party/blink/web_tests/inspector-protocol/css/css-font-palette-values-expected.txt
index 01f6db90..cc22796 100644
--- a/third_party/blink/web_tests/inspector-protocol/css/css-font-palette-values-expected.txt
+++ b/third_party/blink/web_tests/inspector-protocol/css/css-font-palette-values-expected.txt
@@ -1,63 +1,66 @@
 Test that font-palette-values rules are reported
-{
-    fontPaletteName : {
-        range : {
-            endColumn : 32
-            endLine : 6
-            startColumn : 23
-            startLine : 6
+[
+    [0] : {
+        name : {
+            range : {
+                endColumn : 32
+                endLine : 6
+                startColumn : 23
+                startLine : 6
+            }
+            text : --palette
         }
-        text : --palette
-    }
-    origin : regular
-    style : {
-        cssProperties : [
-            [0] : {
-                disabled : false
-                implicit : false
-                name : font-family
-                range : {
-                    endColumn : 22
-                    endLine : 7
-                    startColumn : 4
-                    startLine : 7
+        origin : regular
+        style : {
+            cssProperties : [
+                [0] : {
+                    disabled : false
+                    implicit : false
+                    name : font-family
+                    range : {
+                        endColumn : 22
+                        endLine : 7
+                        startColumn : 4
+                        startLine : 7
+                    }
+                    text : font-family: Bixa;
+                    value : Bixa
                 }
-                text : font-family: Bixa;
-                value : Bixa
-            }
-            [1] : {
-                disabled : false
-                implicit : false
-                name : override-colors
-                range : {
-                    endColumn : 27
-                    endLine : 8
-                    startColumn : 4
-                    startLine : 8
+                [1] : {
+                    disabled : false
+                    implicit : false
+                    name : override-colors
+                    range : {
+                        endColumn : 27
+                        endLine : 8
+                        startColumn : 4
+                        startLine : 8
+                    }
+                    text : override-colors: 0 red;
+                    value : 0 red
                 }
-                text : override-colors: 0 red;
-                value : 0 red
+                [2] : {
+                    name : font-family
+                    value : Bixa
+                }
+                [3] : {
+                    name : override-colors
+                    value : 0 red
+                }
+            ]
+            cssText :      font-family: Bixa;     override-colors: 0 red;   
+            range : {
+                endColumn : 2
+                endLine : 9
+                startColumn : 34
+                startLine : 6
             }
-            [2] : {
-                name : font-family
-                value : Bixa
-            }
-            [3] : {
-                name : override-colors
-                value : 0 red
-            }
-        ]
-        cssText :      font-family: Bixa;     override-colors: 0 red;   
-        range : {
-            endColumn : 2
-            endLine : 9
-            startColumn : 34
-            startLine : 6
+            shorthandEntries : [
+            ]
+            styleSheetId : <string>
         }
-        shorthandEntries : [
-        ]
         styleSheetId : <string>
+        type : font-palette-values
     }
-    styleSheetId : <string>
-}
+]
 
diff --git a/third_party/blink/web_tests/inspector-protocol/css/css-font-palette-values.js b/third_party/blink/web_tests/inspector-protocol/css/css-font-palette-values.js
index a61cc72..3cf5dd0 100644
--- a/third_party/blink/web_tests/inspector-protocol/css/css-font-palette-values.js
+++ b/third_party/blink/web_tests/inspector-protocol/css/css-font-palette-values.js
@@ -24,9 +24,9 @@
   const {result: {nodeId}} =
       await dp.DOM.querySelector({nodeId: root.nodeId, selector: 'div'});
 
-  const {result: {cssFontPaletteValuesRule}} = await dp.CSS.getMatchedStylesForNode({nodeId});
+  const {result: {cssAtRules}} = await dp.CSS.getMatchedStylesForNode({nodeId});
 
-  testRunner.log(cssFontPaletteValuesRule);
+  testRunner.log(cssAtRules);
 
   testRunner.completeTest();
 });
diff --git a/third_party/blink/web_tests/inspector-protocol/css/css-set-font-face-rule-style-text-expected.txt b/third_party/blink/web_tests/inspector-protocol/css/css-set-font-face-rule-style-text-expected.txt
new file mode 100644
index 0000000..a0d7057f
--- /dev/null
+++ b/third_party/blink/web_tests/inspector-protocol/css/css-set-font-face-rule-style-text-expected.txt
@@ -0,0 +1,13 @@
+Test that @font-face rules can be edited
+==== Style sheet text ====
+
+  div {
+    font-family: Bixa;
+  }
+
+  @font-face {
+    font-family: Bixa;
+    src: local(Papyrus);
+  }
+  
+
diff --git a/third_party/blink/web_tests/inspector-protocol/css/css-set-font-face-rule-style-text.js b/third_party/blink/web_tests/inspector-protocol/css/css-set-font-face-rule-style-text.js
new file mode 100644
index 0000000..5f00465
--- /dev/null
+++ b/third_party/blink/web_tests/inspector-protocol/css/css-set-font-face-rule-style-text.js
@@ -0,0 +1,34 @@
+(async function(/** @type {import('test_runner').TestRunner} */ testRunner) {
+  const {dp} = await testRunner.startHTML(
+      `
+  <style>
+  div {
+    font-family: Bixa;
+  }
+
+  @font-face {
+    font-family: Bixa;
+    src: local(Bixa);
+  }
+  </style>
+
+  <div>div</div>
+  `,
+      'Test that @font-face rules can be edited');
+  const CSSHelper = await testRunner.loadScript('../resources/css-helper.js');
+  const cssHelper = new CSSHelper(testRunner, dp);
+
+  await dp.DOM.enable();
+  await dp.CSS.enable();
+
+  const {result: {root}} = await dp.DOM.getDocument();
+  const {result: {nodeId}} =
+      await dp.DOM.querySelector({nodeId: root.nodeId, selector: 'div'});
+
+  const {result: {cssAtRules}} = await dp.CSS.getMatchedStylesForNode({nodeId});
+  const {styleSheetId, range} = cssAtRules[0].style;
+  await cssHelper.setStyleTexts(styleSheetId, false, [
+    {styleSheetId, range, text: '\n    font-family: Bixa;\n    src: local(Papyrus);\n  '}
+  ]);
+  testRunner.completeTest();
+});
diff --git a/third_party/blink/web_tests/inspector-protocol/css/css-set-font-feature-rule-style-text-expected.txt b/third_party/blink/web_tests/inspector-protocol/css/css-set-font-feature-rule-style-text-expected.txt
new file mode 100644
index 0000000..784fcba0
--- /dev/null
+++ b/third_party/blink/web_tests/inspector-protocol/css/css-set-font-feature-rule-style-text-expected.txt
@@ -0,0 +1,22 @@
+Test that @font-feature-values sub-rules can be edited
+==== Style sheet text ====
+
+  div {
+    font-family: Bixa;
+    font-variant-alternates: swash(fancy);
+  }
+
+  @font-feature-values Bixa {
+    @stylistic {
+      donttouch: 8;
+    }
+    @swash {
+      fancy: 2;
+      boring: 1;
+    }
+    @styleset {
+      preserve: 9;
+    }
+  }
+  
+
diff --git a/third_party/blink/web_tests/inspector-protocol/css/css-set-font-feature-rule-style-text.js b/third_party/blink/web_tests/inspector-protocol/css/css-set-font-feature-rule-style-text.js
new file mode 100644
index 0000000..4173885
--- /dev/null
+++ b/third_party/blink/web_tests/inspector-protocol/css/css-set-font-feature-rule-style-text.js
@@ -0,0 +1,42 @@
+(async function(/** @type {import('test_runner').TestRunner} */ testRunner) {
+  const {dp} = await testRunner.startHTML(
+      `
+  <style>
+  div {
+    font-family: Bixa;
+    font-variant-alternates: swash(fancy);
+  }
+
+  @font-feature-values Bixa {
+    @stylistic {
+      donttouch: 8;
+    }
+    @swash {
+      fancy: 1;
+    }
+    @styleset {
+      preserve: 9;
+    }
+  }
+  </style>
+
+  <div>div</div>
+  `,
+      'Test that @font-feature-values sub-rules can be edited');
+  const CSSHelper = await testRunner.loadScript('../resources/css-helper.js');
+  const cssHelper = new CSSHelper(testRunner, dp);
+
+  await dp.DOM.enable();
+  await dp.CSS.enable();
+
+  const {result: {root}} = await dp.DOM.getDocument();
+  const {result: {nodeId}} =
+      await dp.DOM.querySelector({nodeId: root.nodeId, selector: 'div'});
+
+  const {result: {cssAtRules}} = await dp.CSS.getMatchedStylesForNode({nodeId});
+  const {styleSheetId, range} = cssAtRules[0].style;
+  await cssHelper.setStyleTexts(styleSheetId, false, [
+    {styleSheetId, range, text: '\n      fancy: 2;\n      boring: 1;\n    '}
+  ]);
+  testRunner.completeTest();
+});
diff --git a/third_party/blink/web_tests/inspector-protocol/css/css-set-font-palette-values.js b/third_party/blink/web_tests/inspector-protocol/css/css-set-font-palette-values.js
index a097f1b..a3412e3 100644
--- a/third_party/blink/web_tests/inspector-protocol/css/css-set-font-palette-values.js
+++ b/third_party/blink/web_tests/inspector-protocol/css/css-set-font-palette-values.js
@@ -25,7 +25,7 @@
       await dp.DOM.querySelector({nodeId: root.nodeId, selector: 'div'});
 
   const styles = await dp.CSS.getMatchedStylesForNode({nodeId});
-  const {result: {cssFontPaletteValuesRule: {style: {range}, styleSheetId}}} = styles;
+  const {result: {cssAtRules: [{style: {range}, styleSheetId}]}} = styles;
 
   const edit = {
     styleSheetId,
diff --git a/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt b/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt
index dab7315..ac6dd94f 100644
--- a/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt
+++ b/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt
@@ -701,7 +701,6 @@
     property onvalidationstatuschange
     property permissionStatus
     property position
-    property type
     property watch
 html element h1
     property align
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
index 8839aba..af26f81c 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
@@ -1957,6 +1957,7 @@
 [Worker]     getter fingerprint
 [Worker]     getter fingerprintDigestAlgorithm
 [Worker]     getter onicecandidate
+[Worker]     getter onwritablechange
 [Worker]     method addRemoteCandidate
 [Worker]     method constructor
 [Worker]     method getReceivedPackets
@@ -1964,6 +1965,7 @@
 [Worker]     method setRemoteDtlsParameters
 [Worker]     method writable
 [Worker]     setter onicecandidate
+[Worker]     setter onwritablechange
 [Worker] interface RtcTransportIceCandidate
 [Worker]     attribute @@toStringTag
 [Worker]     getter address
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
index fe790e1..af399b5 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
@@ -4304,18 +4304,28 @@
     setter onunhandledrejection
     setter onunload
     setter rows
-interface HTMLGeolocationElement : HTMLPermissionElement
+interface HTMLGeolocationElement : HTMLElement
     attribute @@toStringTag
     getter accuracymode
     getter autolocate
     getter error
+    getter initialPermissionStatus
+    getter invalidReason
+    getter isValid
     getter onlocation
+    getter onpromptaction
+    getter onpromptdismiss
+    getter onvalidationstatuschange
+    getter permissionStatus
     getter position
     getter watch
     method constructor
     setter accuracymode
     setter autolocate
     setter onlocation
+    setter onpromptaction
+    setter onpromptdismiss
+    setter onvalidationstatuschange
     setter watch
 interface HTMLHRElement : HTMLElement
     attribute @@toStringTag
@@ -8353,6 +8363,7 @@
     getter fingerprint
     getter fingerprintDigestAlgorithm
     getter onicecandidate
+    getter onwritablechange
     method addRemoteCandidate
     method constructor
     method getReceivedPackets
@@ -8360,6 +8371,7 @@
     method setRemoteDtlsParameters
     method writable
     setter onicecandidate
+    setter onwritablechange
 interface RtcTransportIceCandidate
     attribute @@toStringTag
     getter address
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt
index 4a3feb3d..9de6025 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt
@@ -1730,6 +1730,7 @@
 [Worker]     getter fingerprint
 [Worker]     getter fingerprintDigestAlgorithm
 [Worker]     getter onicecandidate
+[Worker]     getter onwritablechange
 [Worker]     method addRemoteCandidate
 [Worker]     method constructor
 [Worker]     method getReceivedPackets
@@ -1737,6 +1738,7 @@
 [Worker]     method setRemoteDtlsParameters
 [Worker]     method writable
 [Worker]     setter onicecandidate
+[Worker]     setter onwritablechange
 [Worker] interface RtcTransportIceCandidate
 [Worker]     attribute @@toStringTag
 [Worker]     getter address
diff --git a/third_party/compiler-rt/src b/third_party/compiler-rt/src
index 57b9b63..1f18c88 160000
--- a/third_party/compiler-rt/src
+++ b/third_party/compiler-rt/src
@@ -1 +1 @@
-Subproject commit 57b9b63b69bbf48fef87a9950298af30d7b64089
+Subproject commit 1f18c887f7f08c2126e40c5547c08dcb0a96d1a2
diff --git a/third_party/crossbench b/third_party/crossbench
index 73f466f..466ceaf 160000
--- a/third_party/crossbench
+++ b/third_party/crossbench
@@ -1 +1 @@
-Subproject commit 73f466f9f655c3e34aebd4b2539da8067a22cea4
+Subproject commit 466ceaf0ebe84300da5cb707a74ad72267c21ee5
diff --git a/third_party/dawn b/third_party/dawn
index 3df91a3..925b6df 160000
--- a/third_party/dawn
+++ b/third_party/dawn
@@ -1 +1 @@
-Subproject commit 3df91a3161f81b61458f1e84480c2ac2d46f5df9
+Subproject commit 925b6df540472621b191a13aa7ba5f6234c52aac
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src
index b907f0c..e6f7849 160000
--- a/third_party/devtools-frontend/src
+++ b/third_party/devtools-frontend/src
@@ -1 +1 @@
-Subproject commit b907f0cd3b5b2c3c55139f5be34df4051c172dd4
+Subproject commit e6f7849cc9357708125314dc792656839d291b72
diff --git a/third_party/perfetto b/third_party/perfetto
index f331a74..849737a 160000
--- a/third_party/perfetto
+++ b/third_party/perfetto
@@ -1 +1 @@
-Subproject commit f331a746b1e24517977664389f835b3eab1ed155
+Subproject commit 849737ab5aefa224f0d889a4888f395be5c0b6c1
diff --git a/third_party/skia b/third_party/skia
index 20632e0..6284b4f 160000
--- a/third_party/skia
+++ b/third_party/skia
@@ -1 +1 @@
-Subproject commit 20632e09f6a27734d5e2fd0cd92457d87594ea0f
+Subproject commit 6284b4f09e144d9f013e8c9e6242348af8d0fc70
diff --git a/third_party/webrtc b/third_party/webrtc
index 9af1a88..d167fe9 160000
--- a/third_party/webrtc
+++ b/third_party/webrtc
@@ -1 +1 @@
-Subproject commit 9af1a88de4f9451e72d22544347898ab76fa41ae
+Subproject commit d167fe92969adbb8f5bbafe147c4ab9ebcf73e76
diff --git a/tools/clang/scripts/upload_revision.py b/tools/clang/scripts/upload_revision.py
index b35e4b3b..026cc8d 100755
--- a/tools/clang/scripts/upload_revision.py
+++ b/tools/clang/scripts/upload_revision.py
@@ -62,6 +62,7 @@
 Cq-Include-Trybots: chromium/try:chromeos-amd64-generic-cfi-thin-lto-rel
 Cq-Include-Trybots: chromium/try:dawn-win10-x86-deps-rel
 Cq-Include-Trybots: chromium/try:fuchsia-arm64-cast-receiver-rel
+Cq-Include-Trybots: chromium/try:gpu-fyi-try-mac-intel-asan
 Cq-Include-Trybots: chromium/try:ios-catalyst,win-asan,android-official
 Cq-Include-Trybots: chromium/try:linux-cast-x64-rel
 Cq-Include-Trybots: chromium/try:linux-chromeos-dbg
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 4f61ae44..13eb516 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -26909,11 +26909,6 @@
   <int value="3" label="Revoked ephemeral permission by website"/>
 </enum>
 
-<enum name="WebViewStorageAccessAppRelation">
-  <int value="0" label="The request was made under a URL defined by the app"/>
-  <int value="1" label="The request was made under a URL unrelated to the app"/>
-</enum>
-
 <enum name="WhatsNewLoadEvent">
   <int value="0" label="Load started"/>
   <int value="1" label="Load succeeded"/>
diff --git a/tools/metrics/histograms/metadata/METRIC_REVIEWER_OWNERS b/tools/metrics/histograms/metadata/METRIC_REVIEWER_OWNERS
index cfd2b6c3..fb2bcba9 100644
--- a/tools/metrics/histograms/metadata/METRIC_REVIEWER_OWNERS
+++ b/tools/metrics/histograms/metadata/METRIC_REVIEWER_OWNERS
@@ -379,6 +379,10 @@
 # profile
 alexilin@chromium.org
 rsult@google.com
+# private_metrics
+kjarosz@google.com
+# puma
+kjarosz@google.com
 # quick_answers
 xiaohuic@chromium.org
 # quota
diff --git a/tools/metrics/histograms/metadata/android/histograms.xml b/tools/metrics/histograms/metadata/android/histograms.xml
index b1da81e8..c6e29f12 100644
--- a/tools/metrics/histograms/metadata/android/histograms.xml
+++ b/tools/metrics/histograms/metadata/android/histograms.xml
@@ -7264,99 +7264,6 @@
   </summary>
 </histogram>
 
-<histogram name="Android.WebView.DigitalAssetLinks.AssetIncludes.FileSize"
-    units="bytes" expires_after="2026-06-01">
-  <owner>bewise@chromium.org</owner>
-  <owner>pbirk@chromium.org</owner>
-  <owner>src/android_webview/OWNERS</owner>
-  <summary>
-    Logs the size of loaded asset link include files (see
-    https://developers.google.com/digital-asset-links/v1/statements#scaling-to-dozens-of-statements-or-more).
-    These files are loaded to determine the full set of domains an app declares
-    a relationship with, and are currently loaded into an unbounded memory
-    buffer. This histogram will help us determine if we can apply a bounded
-    memory buffer.
-
-    The histogram is logged when an asset include file is successfully fetched,
-    but before it is parsed.
-  </summary>
-</histogram>
-
-<histogram
-    name="Android.WebView.DigitalAssetLinks.AssetIncludes.LinksInManifest"
-    units="statements" expires_after="2026-06-01">
-  <owner>bewise@chromium.org</owner>
-  <owner>pbirk@chromium.org</owner>
-  <owner>src/android_webview/OWNERS</owner>
-  <summary>
-    Records how many &quot;include&quot; links an app has declared in their
-    asset_statemenets in the app manifest. The documentation states that apps
-    can only have 10 links. This histogram logs the actual number of statements.
-
-    We want to log this to see if there are apps that define more than 10
-    include links despite the specified limit, as we truncate the list of
-    returned links to the first 10.
-
-    The histogram is logged the first time asset_statements are read, and only
-    if the kWebViewDigitalAssetLinksLoadIncludes flag is enabled.
-  </summary>
-</histogram>
-
-<histogram
-    name="Android.WebView.DigitalAssetLinks.AssetIncludes.NetworkLoadResult"
-    enum="BooleanSuccess" expires_after="2026-06-01">
-  <owner>bewise@chromium.org</owner>
-  <owner>pbirk@chromium.org</owner>
-  <owner>src/android_webview/OWNERS</owner>
-  <summary>
-    Logs whether the network load of the asset link include file succeded or
-    not. (see
-    https://developers.google.com/digital-asset-links/v1/statements#scaling-to-dozens-of-statements-or-more).
-    These files are loaded to determine the full set of domains an app declares
-    a relationship with, and are currently loaded into an unbounded memory
-    buffer.
-
-    The histogram is logged when an asset include file load attempt returns.
-  </summary>
-</histogram>
-
-<histogram name="Android.WebView.DigitalAssetLinks.AssetIncludes.ParseSuccess"
-    enum="BooleanSuccess" expires_after="2026-06-01">
-  <owner>bewise@chromium.org</owner>
-  <owner>pbirk@chromium.org</owner>
-  <owner>src/android_webview/OWNERS</owner>
-  <summary>
-    Logs whether an loaded asset link include files is successfully parsed and
-    contained at least one &quot;web&quot; relation with a valid site target.
-    (see
-    https://developers.google.com/digital-asset-links/v1/statements#scaling-to-dozens-of-statements-or-more).
-    These files are loaded to determine the full set of domains an app declares
-    a relationship with, and are currently loaded into an unbounded memory
-    buffer.
-
-    The histogram is logged when an asset include file is successfully parsed
-    but only if it was already valid JSON.
-  </summary>
-</histogram>
-
-<histogram name="Android.WebView.DigitalAssetLinks.AssetIncludes.ValidJson"
-    enum="BooleanSuccess" expires_after="2026-06-01">
-  <owner>bewise@chromium.org</owner>
-  <owner>pbirk@chromium.org</owner>
-  <owner>src/android_webview/OWNERS</owner>
-  <summary>
-    Logs whether an loaded asset link include files is successfully parsed as
-    JSON (see
-    https://developers.google.com/digital-asset-links/v1/statements#scaling-to-dozens-of-statements-or-more).
-    These files are loaded to determine the full set of domains an app declares
-    a relationship with, and are currently loaded into an unbounded memory
-    buffer.
-
-    The histogram is logged when an asset include file is successfully parsed as
-    JSON, but before the contents are inspected.
-  </summary>
-</histogram>
-
 <histogram name="Android.WebView.EnableTVSmoothing" enum="Boolean"
     expires_after="2026-08-01">
   <owner>alexmitra@chromium.org</owner>
@@ -8273,18 +8180,6 @@
   </summary>
 </histogram>
 
-<histogram name="Android.WebView.RelatedSitesVisitedWeekly" units="sites"
-    expires_after="2026-01-15">
-  <owner>mvanouwerkerk@chromium.org</owner>
-  <owner>src/android_webview/OWNERS</owner>
-  <summary>
-    This is the same as Android.WebView.SitesVisitedWeekly. The only difference
-    is this metric is filtered to only be reported for sites where the app
-    declared it has a relationship with the site. A site is considered related
-    if the app references it in its manifest through web links or app links.
-  </summary>
-</histogram>
-
 <histogram name="Android.WebView.RendererLibraryPrefetchMode"
     enum="RendererLibraryPrefetchMode" expires_after="2026-03-01">
   <owner>ashleynewson@chromium.org</owner>
@@ -9083,42 +8978,6 @@
   </token>
 </histogram>
 
-<histogram name="Android.WebView.StorageAccessAutoGrantTime" units="ms"
-    expires_after="2025-07-26">
-  <owner>bewise@chromium.org</owner>
-  <owner>src/android_webview/OWNERS</owner>
-  <summary>
-    Records the time it takes to auto grant a storage access request for calls
-    to requestStorageAccess and requestStorageAccess for.
-
-    Specifically used for WebView storage access auto grant checks which are
-    checked against asset statements. We need to make a network call to request
-    the asset statement from websites for this check. We only record this metric
-    after we have attempted to make that network call.
-  </summary>
-</histogram>
-
-<histogram name="Android.WebView.StorageAccessRelation2"
-    enum="WebViewStorageAccessAppRelation" expires_after="2026-04-05">
-  <owner>bewise@chromium.org</owner>
-  <owner>src/android_webview/OWNERS</owner>
-  <summary>
-    Records the relation the top level origin has to the WebView application
-    when requesting storage access. Recorded for both requestStorageAccess and
-    requestStorageAccessFor.
-
-    This metric can help inform future decisions for the storage access API
-    shape in Android WebView.
-
-    We deprecated Android.WebView.StorageAccessRelation in favor of this because
-    that metric checked for any manfiest reference but we only want to compare
-    storage access requests against manifest metadata moving forwards.
-
-    Note: We cache our storage access request results so this metric is only
-    recorded the first time SAA is requested pre-cache.
-  </summary>
-</histogram>
-
 <histogram name="Android.WebView.SupervisedUser.UrlCheckResult"
     enum="AndroidWebViewSupervisedUserUrlCheckResult"
     expires_after="2025-08-01">
diff --git a/tools/metrics/histograms/metadata/dev/enums.xml b/tools/metrics/histograms/metadata/dev/enums.xml
index aebd61b..8456764 100644
--- a/tools/metrics/histograms/metadata/dev/enums.xml
+++ b/tools/metrics/histograms/metadata/dev/enums.xml
@@ -852,13 +852,6 @@
   <int value="194" label="Teaser for Console Insight - Generation errored"/>
 </enum>
 
-<enum name="DevToolsAnimationPlaybackRateChanged">
-  <int value="0" label="100%"/>
-  <int value="1" label="25%"/>
-  <int value="2" label="10%"/>
-  <int value="3" label="Other"/>
-</enum>
-
 <enum name="DevToolsBuiltInAiAvailability">
   <int value="0" label="LanguageModel unavailable, has GPU"/>
   <int value="1" label="LanguageModel downloadable, has GPU"/>
diff --git a/tools/metrics/histograms/metadata/dev/histograms.xml b/tools/metrics/histograms/metadata/dev/histograms.xml
index f3b1a729..40fa378d 100644
--- a/tools/metrics/histograms/metadata/dev/histograms.xml
+++ b/tools/metrics/histograms/metadata/dev/histograms.xml
@@ -39,15 +39,6 @@
   </summary>
 </histogram>
 
-<histogram name="DevTools.AnimationPlaybackRateChanged"
-    enum="DevToolsAnimationPlaybackRateChanged" expires_after="2025-11-30">
-  <owner>yangguo@google.com</owner>
-  <owner>changhaohan@google.com</owner>
-  <owner>ergunsh@google.com</owner>
-  <component>1559716</component>
-  <summary>Playback rate is changed in Animations panel in DevTools.</summary>
-</histogram>
-
 <histogram name="DevTools.BuiltInAiAvailability"
     enum="DevToolsBuiltInAiAvailability" expires_after="2026-10-24">
   <owner>wolfi@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/ios/histograms.xml b/tools/metrics/histograms/metadata/ios/histograms.xml
index 8635c1f..86cc95e 100644
--- a/tools/metrics/histograms/metadata/ios/histograms.xml
+++ b/tools/metrics/histograms/metadata/ios/histograms.xml
@@ -5696,17 +5696,6 @@
   </summary>
 </histogram>
 
-<histogram name="IOS.SandboxMetrics.AverageGreySnapshotSize" units="KB"
-    expires_after="2026-08-01">
-  <owner>michaeldo@chromium.org</owner>
-  <owner>rohitrao@chromium.org</owner>
-  <summary>
-    The average amount of storage used by a grey snapshot image for this user.
-    Logged at application startup, maximum once every 2 weeks, if the
-    `kLogApplicationStorageSizeMetrics` flag is enabled.
-  </summary>
-</histogram>
-
 <histogram name="IOS.SandboxMetrics.ChromeCacheSize" units="MB"
     expires_after="2026-08-01">
   <owner>michaeldo@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/net/histograms.xml b/tools/metrics/histograms/metadata/net/histograms.xml
index 4793997..807345c 100644
--- a/tools/metrics/histograms/metadata/net/histograms.xml
+++ b/tools/metrics/histograms/metadata/net/histograms.xml
@@ -209,6 +209,22 @@
       summary="SRR attachment and outgoing request signing"/>
 </variants>
 
+<!-- LINT.IfChange(UnexportableKeysBackgroundTaskType) -->
+
+<variants name="UnexportableKeysBackgroundTaskType">
+  <variant name=".DeleteKey"
+      summary="operations to delete a single signing key"/>
+  <variant name=".FromWrappedKey"
+      summary="operations to create a signing key from a wrapped key"/>
+  <variant name=".GenerateKey"
+      summary="operations to generate a new signing key"/>
+  <variant name=".GetAllKeys"
+      summary="operations to get all keys known to the platform"/>
+  <variant name=".Sign" summary="signing operations"/>
+</variants>
+
+<!-- LINT.ThenChange(//components/unexportable_keys/background_task_type.h:BackgroundTaskType) -->
+
 <variants name="URLLoaderThrottleStages">
   <variant name="BeforeWillProcessResponse"/>
   <variant name="WillOnCompleteWithError"/>
@@ -524,13 +540,7 @@
     Recorded right after a TPM operation completes. Recorded only for
     {TaskType}.
   </summary>
-  <token key="TaskType">
-    <variant name=".FromWrappedKey"
-        summary="operations to create a signing key from a wrapped key"/>
-    <variant name=".GenerateKey"
-        summary="operations to generate a new signing key"/>
-    <variant name=".Sign" summary="signing operations"/>
-  </token>
+  <token key="TaskType" variants="UnexportableKeysBackgroundTaskType"/>
 </histogram>
 
 <histogram
@@ -547,13 +557,7 @@
     Recorded right after a TPM operation completes. Recorded only for
     {TaskType}.
   </summary>
-  <token key="TaskType">
-    <variant name=".FromWrappedKey"
-        summary="operations to create a signing key from a wrapped key"/>
-    <variant name=".GenerateKey"
-        summary="operations to generate a new signing key"/>
-    <variant name=".Sign" summary="signing operations"/>
-  </token>
+  <token key="TaskType" variants="UnexportableKeysBackgroundTaskType"/>
   <token key="Success">
     <variant name=".Failure" summary="failure"/>
     <variant name=".Success" summary="success"/>
@@ -582,13 +586,8 @@
 
     Recorded right after a TPM operation completes.
   </summary>
-  <token key="TaskType">
+  <token key="TaskType" variants="UnexportableKeysBackgroundTaskType">
     <variant name="" summary="all operation types"/>
-    <variant name=".FromWrappedKey"
-        summary="only operations to create a signing key from a wrapped key"/>
-    <variant name=".GenerateKey"
-        summary="only operations to generate a new signing key"/>
-    <variant name=".Sign" summary="only signing operations"/>
   </token>
 </histogram>
 
diff --git a/tools/metrics/histograms/metadata/password/enums.xml b/tools/metrics/histograms/metadata/password/enums.xml
index 94e7f88..4857f45f 100644
--- a/tools/metrics/histograms/metadata/password/enums.xml
+++ b/tools/metrics/histograms/metadata/password/enums.xml
@@ -822,9 +822,11 @@
   <int value="7" label="OTP detected"/>
   <int value="8" label="Canceled by the user"/>
   <int value="9" label="No state. The feature wasn't offered"/>
-  <int value="10" label="Login form detected in an ongoing flow"/>
+  <int value="10"
+      label="Login is unfinished. Prompting user to complete sign in."/>
   <int value="11"
-      label="Login form detected in an ongoing flow. Continue button shown."/>
+      label="Login form detected in an ongoing flow. Continue button shown.
+             (Deprecated)"/>
 </enum>
 
 <!-- LINT.ThenChange(/chrome/browser/password_manager/password_change_delegate.h) -->
@@ -856,6 +858,7 @@
   <int value="1" label="Canceled"/>
   <int value="2" label="Continue"/>
   <int value="3" label="Open password change tab"/>
+  <int value="4" label="Retry"/>
 </enum>
 
 <!-- LINT.ThenChange(/chrome/browser/ui/passwords/password_change_ui_controller.h:PasswordChangeToastEvent) -->
diff --git a/tools/metrics/histograms/metadata/password/histograms.xml b/tools/metrics/histograms/metadata/password/histograms.xml
index 955337d1..c028ad1 100644
--- a/tools/metrics/histograms/metadata/password/histograms.xml
+++ b/tools/metrics/histograms/metadata/password/histograms.xml
@@ -2756,20 +2756,6 @@
   </summary>
 </histogram>
 
-<histogram
-    name="PasswordManager.PasswordChange.WaitingForUserSignInToastWithContinue"
-    enum="PasswordChangeToastEvent" expires_after="2026-05-30">
-  <owner>vsemeniuk@google.com</owner>
-  <owner>rgod@google.com</owner>
-  <summary>
-    Records password change toast events. This toast is diplayed during password
-    change flow when the user initiated the flow, but there is still some 2FA
-    visible on screen that user has to resolve before the flow can continue.
-    Users have an option to Continue. This metric can include user interactions
-    with the toast or events that happen automatically.
-  </summary>
-</histogram>
-
 <histogram name="PasswordManager.PasswordChangeAvailability"
     enum="PasswordChangeAvailability" expires_after="2026-04-05">
   <owner>vsemeniuk@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/private_metrics/OWNERS b/tools/metrics/histograms/metadata/private_metrics/OWNERS
new file mode 100644
index 0000000..5a5b708
--- /dev/null
+++ b/tools/metrics/histograms/metadata/private_metrics/OWNERS
@@ -0,0 +1,5 @@
+per-file OWNERS=file://tools/metrics/histograms/metadata/METRIC_REVIEWER_OWNERS
+
+# Prefer sending CLs to the owners listed below.
+# Use chromium-metrics-reviews@google.com as a backup.
+kjarosz@google.com
diff --git a/tools/metrics/histograms/metadata/storage/histograms.xml b/tools/metrics/histograms/metadata/storage/histograms.xml
index 47d5d9b..4287b92 100644
--- a/tools/metrics/histograms/metadata/storage/histograms.xml
+++ b/tools/metrics/histograms/metadata/storage/histograms.xml
@@ -294,42 +294,46 @@
 </histogram>
 
 <histogram
-    name="IndexedDB.BackingStore.CreateIfMissing.{IndexedDBBackingStoreType}"
+    name="IndexedDB.BackingStore.{Operation}.{IndexedDBBackingStoreType}"
     enum="IndexedDbStatusType" expires_after="2026-10-01">
   <owner>leimy@chromium.org</owner>
   <owner>evanstade@microsoft.com</owner>
   <owner>abhishek.shanthkumar@microsoft.com</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>
-    Logs the result of each attempt to initialize the backing store with
-    create_if_missing=true, i.e., when serving an IDBFactory::Open() request.
+    Logs the result of the operation {Operation} on an
+    {IndexedDBBackingStoreType} backing store. An operation is a group of one or
+    more calls into the backing store performed together (i.e., synchronously).
+    Collectively, these histograms gate rollout of the SQLite backing store.
   </summary>
-</histogram>
-
-<histogram
-    name="IndexedDB.BackingStore.CreateOrOpenDatabase.{IndexedDBBackingStoreType}"
-    enum="IndexedDbStatusType" expires_after="2026-10-01">
-  <owner>leimy@chromium.org</owner>
-  <owner>evanstade@microsoft.com</owner>
-  <owner>abhishek.shanthkumar@microsoft.com</owner>
-  <owner>chrome-owp-storage@google.com</owner>
-  <summary>
-    Logs the result of the call to BackingStore::CreateOrOpenDatabase() when
-    serving an IDBFactory::Open() or ::DeleteDatabase() request.
-  </summary>
-</histogram>
-
-<histogram
-    name="IndexedDB.BackingStore.GetDatabaseNamesAndVersions.{IndexedDBBackingStoreType}"
-    enum="IndexedDbStatusType" expires_after="2026-10-01">
-  <owner>leimy@chromium.org</owner>
-  <owner>evanstade@microsoft.com</owner>
-  <owner>abhishek.shanthkumar@microsoft.com</owner>
-  <owner>chrome-owp-storage@google.com</owner>
-  <summary>
-    Logs the result of the call to BackingStore::GetDatabaseNamesAndVersions()
-    when serving an IDBFactory::GetDatabaseInfo() request.
-  </summary>
+  <token key="Operation">
+    <variant name="AdvanceCursor"/>
+    <variant name="BeginTransaction"/>
+    <variant name="ChangeDatabaseVersion"/>
+    <variant name="ClearObjectStore"/>
+    <variant name="CommitPhaseOne"/>
+    <variant name="CommitPhaseTwo"/>
+    <variant name="ContinueCursor"/>
+    <variant name="CountRecords"/>
+    <variant name="CreateIfMissing"/>
+    <variant name="CreateIndex"/>
+    <variant name="CreateObjectStore"/>
+    <variant name="CreateOrOpenDatabase"/>
+    <variant name="DeleteDatabase"/>
+    <variant name="DeleteIndex"/>
+    <variant name="DeleteObjectStore"/>
+    <variant name="DeleteRecordRange"/>
+    <variant name="GetAllRecords"/>
+    <variant name="GetDatabaseNamesAndVersions"/>
+    <variant name="GetKeyGeneratorCurrentNumber"/>
+    <variant name="GetRecord"/>
+    <variant name="OpenCursor"/>
+    <variant name="PrefetchCursor"/>
+    <variant name="PutRecord"/>
+    <variant name="RenameIndex"/>
+    <variant name="RenameObjectStore"/>
+    <variant name="SetIndexKeys"/>
+  </token>
 </histogram>
 
 <histogram name="IndexedDB.BackingStoreCloseDuration" units="ms"
diff --git a/tools/metrics/histograms/metadata/sync/enums.xml b/tools/metrics/histograms/metadata/sync/enums.xml
index 7295adb..6a6dfaa 100644
--- a/tools/metrics/histograms/metadata/sync/enums.xml
+++ b/tools/metrics/histograms/metadata/sync/enums.xml
@@ -1064,6 +1064,7 @@
   <int value="5" label="Sync settings not confirmed"/>
   <int value="6" label="Sync needs trusted vault key"/>
   <int value="7" label="Sync trusted vault recoverability degraded"/>
+  <int value="8" label="Bookmarks limit exceeded"/>
 </enum>
 
 <!-- LINT.ThenChange(/ios/chrome/browser/settings/model/sync/utils/sync_util.mm:SyncErrorInfobarTypes) -->
@@ -1624,6 +1625,7 @@
   <int value="8" label="Unrecoverable error"/>
   <int value="9" label="Needs UPM backend upgrade"/>
   <int value="10" label="Needs client upgrade"/>
+  <int value="11" label="Bookmarks limit exceeded"/>
 </enum>
 
 <!-- LINT.ThenChange(/components/sync/service/sync_service.h:UserActionableError) -->
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index 20931a3..cb4ba133 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -6,7 +6,7 @@
         },
         "win": {
             "hash": "d99725e912e5552ec645de0242f54721a5fb42bb",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/f331a746b1e24517977664389f835b3eab1ed155/trace_processor_shell.exe"
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/b48ac8a0637ec64750d7b00c6fa16ecc3bf00b7d/trace_processor_shell.exe"
         },
         "linux_arm": {
             "hash": "46d798c1864490cbb2ee053d6eda436184470e69",
@@ -21,8 +21,8 @@
             "full_remote_path": "perfetto-luci-artifacts/ebf44e57a3b734c5281bdff53d9945805486004e/mac-arm64/trace_processor_shell"
         },
         "linux": {
-            "hash": "9470da5b1167c3565881f4a4d9288c0a5f321a16",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/f331a746b1e24517977664389f835b3eab1ed155/trace_processor_shell"
+            "hash": "f649398df490a0a7c72a09ea1f117d19d12a9513",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/0bfd4e36cb45a8c7c2abc4fc96c1a712a15e0347/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/tools/traffic_annotation/summary/annotations.xml b/tools/traffic_annotation/summary/annotations.xml
index 09bc659..71bb1a0 100644
--- a/tools/traffic_annotation/summary/annotations.xml
+++ b/tools/traffic_annotation/summary/annotations.xml
@@ -453,7 +453,6 @@
  <item id="lens_overlay_save" added_in_milestone="130" content_hash_code="07f4c171" os_list="linux,windows,chromeos" file_path="chrome/browser/ui/lens/lens_overlay_controller.cc" />
  <item id="iwa_web_app_internals_update_manifest" added_in_milestone="130" type="partial" second_id="iwa_update_manifest_fetcher" content_hash_code="04b02418" os_list="linux,windows,chromeos" semantics_fields="1,2,3" policy_fields="3,5" file_path="chrome/browser/ui/webui/web_app_internals/iwa_internals_handler.cc" />
  <item id="iwa_web_app_internals_web_bundle" added_in_milestone="130" type="partial" second_id="iwa_bundle_downloader" content_hash_code="01076400" os_list="linux,windows,chromeos" semantics_fields="1,2,3" policy_fields="3,5" file_path="chrome/browser/web_applications/isolated_web_apps/install/isolated_web_app_installation_manager.cc" />
- <item id="digital_asset_links_include" added_in_milestone="130" content_hash_code="05cd869e" os_list="android" file_path="android_webview/browser/aw_asset_domain_list_include_handler.cc" />
  <item id="remoting_cloud_send_heartbeat" added_in_milestone="131" content_hash_code="07e72ee4" os_list="linux,windows,android,chromeos" file_path="remoting/base/cloud_service_client.cc" />
  <item id="remoting_cloud_update_remote_access_host" added_in_milestone="131" content_hash_code="0628eb6e" os_list="linux,windows,android,chromeos" file_path="remoting/base/cloud_service_client.cc" />
  <item id="remoting_directory_legacy_heartbeat" added_in_milestone="131" content_hash_code="00a4acfc" os_list="linux,windows,android,chromeos" file_path="remoting/base/directory_service_client.cc" />
@@ -494,7 +493,7 @@
  <item id="payments_autofill" added_in_milestone="135" content_hash_code="04acbe74" os_list="linux,windows,android,chromeos" file_path="components/autofill/core/browser/payments/multiple_request_payments_network_interface_base.cc" />
  <item id="client_download_request_desktop" added_in_milestone="135" type="branchedcompleting" second_id="client_download_request_for_platform" content_hash_code="01222414" os_list="linux,windows,chromeos" semantics_fields="2,3,4,8,9" file_path="chrome/browser/safe_browsing/download_protection/download_protection_delegate_desktop.cc" />
  <item id="chromeos_scanner_provider" added_in_milestone="135" content_hash_code="04db096b" os_list="chromeos" file_path="components/manta/scanner_provider.cc" />
- <item id="glic_fre_preconnect" added_in_milestone="136" content_hash_code="03edfcd5" os_list="linux,windows" file_path="chrome/browser/glic/fre/glic_fre_controller.cc" />
+ <item id="glic_fre_preconnect" added_in_milestone="136" content_hash_code="03edfcd5" os_list="linux,windows,chromeos" file_path="chrome/browser/glic/fre/glic_fre_controller.cc" />
  <item id="client_download_request_android" added_in_milestone="136" type="branchedcompleting" second_id="client_download_request_for_platform" content_hash_code="0829498b" os_list="android" semantics_fields="2,3,4,8,9" file_path="chrome/browser/safe_browsing/download_protection/download_protection_delegate_android.cc" />
  <item id="chromeos_lens_web_image_search" added_in_milestone="136" content_hash_code="04375d14" os_list="chromeos" file_path="chrome/browser/ui/ash/capture_mode/chrome_capture_mode_delegate.cc" />
  <item id="chromeos_inline_image_request" added_in_milestone="136" content_hash_code="014aba50" os_list="chromeos" file_path="chrome/browser/ash/lobster/lobster_image_provider_from_snapper.cc" />
@@ -502,7 +501,7 @@
  <item id="chromeos_walrus_provider" added_in_milestone="136" content_hash_code="0671ae94" os_list="chromeos" file_path="components/manta/walrus_provider.cc" />
  <item id="autofill_image_fetcher" added_in_milestone="137" content_hash_code="019e07fc" os_list="linux,windows,chromeos" file_path="components/autofill/core/browser/ui/autofill_image_fetcher.cc" />
  <item id="forms_classifications_model_execution" added_in_milestone="137" content_hash_code="051d9c71" os_list="linux,windows,chromeos,android" file_path="components/optimization_guide/core/model_execution/model_execution_fetcher_impl.cc" />
- <item id="gemini_user_status" added_in_milestone="137" content_hash_code="03367c07" os_list="linux,windows" file_path="chrome/browser/glic/glic_user_status_fetcher.cc" />
+ <item id="gemini_user_status" added_in_milestone="137" content_hash_code="03367c07" os_list="linux,windows,chromeos" file_path="chrome/browser/glic/glic_user_status_fetcher.cc" />
  <item id="notification_telemetry" added_in_milestone="137" content_hash_code="07930dca" os_list="linux,windows,android,chromeos" file_path="chrome/browser/safe_browsing/notification_telemetry/notification_telemetry_service.cc" />
  <item id="corp_register_support_host_request" added_in_milestone="138" content_hash_code="03509e36" os_list="linux,windows,chromeos" file_path="remoting/host/corp_register_support_host_request.cc" />
  <item id="zero_state_suggestions_model_execution" added_in_milestone="138" content_hash_code="04362741" os_list="linux,windows,chromeos,android" file_path="components/optimization_guide/core/model_execution/model_execution_fetcher_impl.cc" />
@@ -512,8 +511,8 @@
  <item id="iwa_dev_tools_installation_web_bundle" added_in_milestone="139" type="partial" second_id="iwa_bundle_downloader" content_hash_code="00669d7d" os_list="linux,windows,chromeos" semantics_fields="1,2,3" policy_fields="3,5" file_path="chrome/browser/web_applications/isolated_web_apps/install/isolated_web_app_installation_manager.cc" />
  <item id="ntp_composebox_query_controller" added_in_milestone="139" content_hash_code="06439b42" os_list="linux,windows,chromeos,android" file_path="components/contextual_search/internal/composebox_query_controller.cc" />
  <item id="password_change_submission_model_execution" added_in_milestone="140" content_hash_code="05159063" os_list="linux,windows,chromeos,android" file_path="components/optimization_guide/core/model_execution/model_execution_fetcher_impl.cc" />
- <item id="glic_web_ui" added_in_milestone="140" content_hash_code="028a379c" os_list="linux,windows" file_path="chrome/browser/glic/glic_net_log.cc" />
- <item id="glic_fre_web_ui" added_in_milestone="140" content_hash_code="022f9e24" os_list="linux,windows" file_path="chrome/browser/glic/glic_net_log.cc" />
+ <item id="glic_web_ui" added_in_milestone="140" content_hash_code="028a379c" os_list="linux,windows,chromeos" file_path="chrome/browser/glic/glic_net_log.cc" />
+ <item id="glic_fre_web_ui" added_in_milestone="140" content_hash_code="022f9e24" os_list="linux,windows,chromeos" file_path="chrome/browser/glic/glic_net_log.cc" />
  <item id="webview_preconnect" added_in_milestone="140" content_hash_code="03d15024" os_list="android" file_path="android_webview/browser/aw_preconnector.cc" />
  <item id="aim_eligibility_fetch" added_in_milestone="141" content_hash_code="00755d9b" os_list="linux,windows,android,chromeos" file_path="components/omnibox/browser/aim_eligibility_service.cc" />
  <item id="enterprise_logo_fetcher_for_browser" added_in_milestone="141" content_hash_code="03eb36e5" os_list="linux,windows,chromeos,android" file_path="chrome/browser/enterprise/util/managed_browser_utils.cc" />
diff --git a/tools/traffic_annotation/summary/grouping.xml b/tools/traffic_annotation/summary/grouping.xml
index 917e707..636b1d5 100644
--- a/tools/traffic_annotation/summary/grouping.xml
+++ b/tools/traffic_annotation/summary/grouping.xml
@@ -326,7 +326,6 @@
       <annotation id="iwa_web_app_internals_update_manifest"/>
       <annotation id="iwa_web_app_internals_web_bundle"/>
       <annotation id="iwa_dev_tools_installation_web_bundle"/>
-      <annotation id="digital_asset_links_include"/>
       <annotation id="remoting_cloud_send_heartbeat"/>
       <annotation id="remoting_cloud_update_remote_access_host"/>
       <annotation id="remoting_directory_legacy_heartbeat"/>
diff --git a/tools/typescript/validate_tsconfig.py b/tools/typescript/validate_tsconfig.py
index 576f5acb..6f8b15d 100644
--- a/tools/typescript/validate_tsconfig.py
+++ b/tools/typescript/validate_tsconfig.py
@@ -162,9 +162,6 @@
 
   # Specific exceptions for directories that are still migrating to TS.
   migrating_directories = [
-      # TODO(crbug.com/40848285): Migrate bluetooth-internals to TypeScript and
-      # remove exception.
-      'chrome/browser/resources/bluetooth_internals',
       # TODO(crbug.com/41484340): Migrate to TypeScript.
       'chrome/browser/resources/device_log',
       # TODO(crbug.com/385341235): Migrate inspect to TypeScript.
diff --git a/ui/accessibility/ax_event_generator.cc b/ui/accessibility/ax_event_generator.cc
index d823830..597b68b 100644
--- a/ui/accessibility/ax_event_generator.cc
+++ b/ui/accessibility/ax_event_generator.cc
@@ -388,8 +388,17 @@
   AddEvent(unignored_parent, Event::CHILDREN_CHANGED);
 
   AddEvent(node, Event::IGNORED_CHANGED);
-  if (!is_ignored_new_value)
+  if (!is_ignored_new_value) {
     AddEvent(node, Event::SUBTREE_CREATED);
+    // Fire alert events when a node with alert role becomes unignored.
+    // This handles cases where role and ignored state change simultaneously
+    // (e.g. visibility:hidden->visible + role="alert" on the same element),
+    // which don't trigger OnRoleChanged due to early returns in
+    // NotifyNodeAttributesHaveBeenChanged for ignored state transitions.
+    if (IsAlert(node->GetRole())) {
+      AddEvent(node, Event::ALERT);
+    }
+  }
   if (node->GetRole() == ax::mojom::Role::kMenu) {
     if (is_ignored_new_value) {
       AddEvent(node, Event::MENU_POPUP_END);
diff --git a/ui/accessibility/ax_event_generator_unittest.cc b/ui/accessibility/ax_event_generator_unittest.cc
index aa9b56cd..89631cc 100644
--- a/ui/accessibility/ax_event_generator_unittest.cc
+++ b/ui/accessibility/ax_event_generator_unittest.cc
@@ -13,6 +13,7 @@
 #include "ui/accessibility/ax_serializable_tree.h"
 #include "ui/accessibility/ax_tree.h"
 #include "ui/accessibility/ax_tree_serializer.h"
+#include "ui/accessibility/test_ax_tree_update.h"
 
 namespace ui {
 
@@ -823,6 +824,33 @@
           HasEventAtNode(AXEventGenerator::Event::SUBTREE_CREATED, 4)));
 }
 
+TEST(AXEventGeneratorTest, AlertBecomingUnignored) {
+  // Test that when a node with alert role becomes unignored, an ALERT event
+  // is fired. This handles cases where role and ignored state change
+  // simultaneously (e.g. visibility:hidden->visible + role="alert").
+  TestAXTreeUpdate initial_state(std::string(R"HTML(
+    ++1 kRootWebArea
+    ++++2 kAlert state=kIgnored
+  )HTML"));
+
+  AXTree tree(initial_state);
+  AXEventGenerator event_generator(&tree);
+  ASSERT_THAT(event_generator, IsEmpty());
+
+  // Update: make the alert node unignored.
+  AXTreeUpdate update = initial_state;
+  update.nodes[1].RemoveState(ax::mojom::State::kIgnored);
+
+  ASSERT_TRUE(tree.Unserialize(update));
+  EXPECT_THAT(
+      event_generator,
+      UnorderedElementsAre(
+          HasEventAtNode(AXEventGenerator::Event::ALERT, 2),
+          HasEventAtNode(AXEventGenerator::Event::IGNORED_CHANGED, 2),
+          HasEventAtNode(AXEventGenerator::Event::SUBTREE_CREATED, 2),
+          HasEventAtNode(AXEventGenerator::Event::CHILDREN_CHANGED, 1)));
+}
+
 TEST(AXEventGeneratorTest, LiveRegionChanged) {
   AXTreeUpdate initial_state;
   initial_state.root_id = 1;
diff --git a/ui/android/javatests/src/org/chromium/ui/test/util/TestViewAndroidDelegate.java b/ui/android/javatests/src/org/chromium/ui/test/util/TestViewAndroidDelegate.java
index 6a91074..7955891 100644
--- a/ui/android/javatests/src/org/chromium/ui/test/util/TestViewAndroidDelegate.java
+++ b/ui/android/javatests/src/org/chromium/ui/test/util/TestViewAndroidDelegate.java
@@ -5,10 +5,12 @@
 package org.chromium.ui.test.util;
 
 import android.view.ViewGroup;
+import android.widget.FrameLayout;
 
 import org.jni_zero.CalledByNative;
 import org.jni_zero.JNINamespace;
 
+import org.chromium.base.ContextUtils;
 import org.chromium.build.annotations.Nullable;
 import org.chromium.ui.base.ViewAndroidDelegate;
 
@@ -35,7 +37,10 @@
      */
     @CalledByNative
     private static TestViewAndroidDelegate create() {
-        return new TestViewAndroidDelegate(/* containerView= */ null);
+        FrameLayout layout = new FrameLayout(ContextUtils.getApplicationContext());
+        layout.setFocusable(true);
+        layout.setFocusableInTouchMode(true);
+        return new TestViewAndroidDelegate(layout);
     }
 
     /**
diff --git a/ui/base/interaction/element_tracker.cc b/ui/base/interaction/element_tracker.cc
index e00d65e..57d2980 100644
--- a/ui/base/interaction/element_tracker.cc
+++ b/ui/base/interaction/element_tracker.cc
@@ -21,6 +21,22 @@
 
 namespace ui {
 
+namespace {
+
+ElementTracker::Callback FilterCallback(ElementTracker::Callback callback,
+                                        ElementIdentifier id) {
+  return base::BindRepeating(
+      [](const ElementTracker::Callback& callback, ElementIdentifier id,
+         TrackedElement* el) {
+        if (el->identifier() == id) {
+          callback.Run(el);
+        }
+      },
+      std::move(callback), id);
+}
+
+}  // namespace
+
 DEFINE_CLASS_ELEMENT_IDENTIFIER_VALUE(ElementTracker, kTemporaryIdentifier);
 
 class ElementTracker::ElementData {
@@ -382,6 +398,32 @@
       ->AddCustomEventCallback(callback);
 }
 
+ElementTracker::Subscription ElementTracker::AddCustomEventCallback(
+    CustomElementEventType event_type,
+    ElementIdentifier id,
+    ElementContext context,
+    Callback callback) {
+  DCHECK(event_type);
+  DCHECK(context);
+  // Because custom event callbacks are indexed by event type (and because we
+  // use the same underlying type for both element ids and custom events), we
+  // can store both in the same lookup table.
+  return GetOrAddElementData(event_type, context)
+      ->AddCustomEventCallback(FilterCallback(std::move(callback), id));
+}
+
+ElementTracker::Subscription ElementTracker::AddCustomEventInAnyContextCallback(
+    CustomElementEventType event_type,
+    ElementIdentifier id,
+    Callback callback) {
+  DCHECK(event_type);
+  // Because custom event callbacks are indexed by event type (and because we
+  // use the same underlying type for both element ids and custom events), we
+  // can store both in the same lookup table.
+  return GetOrAddElementData(event_type, ElementContext())
+      ->AddCustomEventCallback(FilterCallback(std::move(callback), id));
+}
+
 ElementTracker::ElementTracker()
     : gc_(std::make_unique<GarbageCollector>(this)) {}
 
diff --git a/ui/base/interaction/element_tracker.h b/ui/base/interaction/element_tracker.h
index fe1e33c7..0a77dc1 100644
--- a/ui/base/interaction/element_tracker.h
+++ b/ui/base/interaction/element_tracker.h
@@ -214,11 +214,25 @@
                                       Callback callback);
 
   // Adds a callback that will be called whenever an event of `event_type` is
-  // generated within any context.
+  // generated within any context by any element.
   Subscription AddCustomEventInAnyContextCallback(
       CustomElementEventType event_type,
       Callback callback);
 
+  // Adds a callback that will be called whenever an event of `event_type` is
+  // generated within `context` by an element with identifier `id`.
+  Subscription AddCustomEventCallback(CustomElementEventType event_type,
+                                      ElementIdentifier id,
+                                      ElementContext context,
+                                      Callback callback);
+
+  // Adds a callback that will be called whenever an event of `event_type` is
+  // generated within any context by an element with identifier `id`.
+  Subscription AddCustomEventInAnyContextCallback(
+      CustomElementEventType event_type,
+      ElementIdentifier id,
+      Callback callback);
+
   // Returns all known contexts.
   Contexts GetAllContextsForTesting() const;
 
diff --git a/ui/base/interaction/element_tracker_unittest.cc b/ui/base/interaction/element_tracker_unittest.cc
index b5d9d00c..b6a7964 100644
--- a/ui/base/interaction/element_tracker_unittest.cc
+++ b/ui/base/interaction/element_tracker_unittest.cc
@@ -513,6 +513,26 @@
                                                             kCustomEventType1);
 }
 
+TEST(ElementTrackerTest, AddCustomEventCallbackWithId) {
+  UNCALLED_MOCK_CALLBACK(ElementTracker::Callback, callback);
+  auto subscription =
+      ElementTracker::GetElementTracker()->AddCustomEventCallback(
+          kCustomEventType1, kElementIdentifier1, kElementContext1,
+          callback.Get());
+  test::TestElementPtr e1 = std::make_unique<test::TestElement>(
+      kElementIdentifier1, kElementContext1);
+  test::TestElementPtr e2 = std::make_unique<test::TestElement>(
+      kElementIdentifier2, kElementContext1);
+  e1->Show();
+  e2->Show();
+  EXPECT_CALL_IN_SCOPE(
+      callback, Run(e1.get()),
+      ElementTracker::GetFrameworkDelegate()->NotifyCustomEvent(
+          e1.get(), kCustomEventType1));
+  ElementTracker::GetFrameworkDelegate()->NotifyCustomEvent(e2.get(),
+                                                            kCustomEventType1);
+}
+
 TEST(ElementTrackerTest, AddCustomEventInAnyContextCallback) {
   UNCALLED_MOCK_CALLBACK(ElementTracker::Callback, callback);
   auto subscription =
@@ -521,10 +541,37 @@
   test::TestElementPtr e1 = std::make_unique<test::TestElement>(
       kElementIdentifier1, kElementContext1);
   test::TestElementPtr e2 = std::make_unique<test::TestElement>(
-      kElementIdentifier1, kElementContext2);
+      kElementIdentifier2, kElementContext2);
   e1->Show();
   e2->Show();
 
+  // These elements have different identifiers and contexts, but should both
+  // trigger the callback.
+  EXPECT_CALL_IN_SCOPE(
+      callback, Run(e1.get()),
+      ElementTracker::GetFrameworkDelegate()->NotifyCustomEvent(
+          e1.get(), kCustomEventType1));
+  EXPECT_CALL_IN_SCOPE(
+      callback, Run(e2.get()),
+      ElementTracker::GetFrameworkDelegate()->NotifyCustomEvent(
+          e2.get(), kCustomEventType1));
+}
+
+TEST(ElementTrackerTest, AddCustomEventInAnyContextCallbackWithId) {
+  UNCALLED_MOCK_CALLBACK(ElementTracker::Callback, callback);
+  auto subscription =
+      ElementTracker::GetElementTracker()->AddCustomEventInAnyContextCallback(
+          kCustomEventType1, kElementIdentifier1, callback.Get());
+  test::TestElementPtr e1 = std::make_unique<test::TestElement>(
+      kElementIdentifier1, kElementContext1);
+  test::TestElementPtr e2 = std::make_unique<test::TestElement>(
+      kElementIdentifier1, kElementContext2);
+  test::TestElementPtr e3 = std::make_unique<test::TestElement>(
+      kElementIdentifier2, kElementContext2);
+  e1->Show();
+  e2->Show();
+  e3->Show();
+
   // Two of these elements have the specified identifier, but in different
   // contexts, while the other element does not share the identifier and should
   // not trigger the callback.
@@ -536,6 +583,8 @@
       callback, Run(e2.get()),
       ElementTracker::GetFrameworkDelegate()->NotifyCustomEvent(
           e2.get(), kCustomEventType1));
+  ElementTracker::GetFrameworkDelegate()->NotifyCustomEvent(e3.get(),
+                                                            kCustomEventType1);
 }
 
 TEST(ElementTrackerTest, AddClassCustomEventCallback) {
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ar.xtb b/ui/chromeos/translations/ui_chromeos_strings_ar.xtb
index 70059b90..ed98f021 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ar.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ar.xtb
@@ -543,7 +543,7 @@
 <translation id="5194713942430106590">انقر لترتيب محتوى العمود ترتيبًا تصاعديًا.</translation>
 <translation id="5211614973734216083">الفاروية</translation>
 <translation id="5218183485292899140">الفرنسية السويسرية</translation>
-<translation id="5234764350956374838">تجاهل</translation>
+<translation id="5234764350956374838">إغلاق</translation>
 <translation id="5253070652067921974">مُنشئ الملف:</translation>
 <translation id="5254207638927440400">يتعذّر نقل الملف. الملف قيد الاستخدام.</translation>
 <translation id="5257456363153333584">يعسوب</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_pt-BR.xtb b/ui/chromeos/translations/ui_chromeos_strings_pt-BR.xtb
index d6d3ad664..a3ec717 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_pt-BR.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_pt-BR.xtb
@@ -250,7 +250,7 @@
 <translation id="3003189754374775221">Rede <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, intensidade do sinal em <ph name="SIGNAL_STRENGTH" />%, conectar</translation>
 <translation id="3003633581067744647">Mudar para a visualização de miniaturas</translation>
 <translation id="3016566519832145558">Atenção: esses arquivos são temporários e podem ser excluídos automaticamente para liberar espaço em disco.</translation>
-<translation id="3029114385395636667">Ative o Documentos Google off-line para usar o Documentos, Planilhas e Apresentações off-line.</translation>
+<translation id="3029114385395636667">Ative o Google Docs off-line para usar o Documentos, Planilhas e Apresentações off-line.</translation>
 <translation id="303198083543495566">Região geográfica</translation>
 <translation id="3044404008258011032">Para restaurar esses itens, arraste-os para uma nova pasta fora da lixeira. A pasta original "<ph name="PARENT_FOLDER_NAME" />" foi excluída.</translation>
 <translation id="3047197340186497470">Chinês (dayi)</translation>
@@ -1073,7 +1073,7 @@
 <translation id="9171921933192916600">Pessoa que ama ler</translation>
 <translation id="9172592259078059678">Guzerate (transliteração)</translation>
 <translation id="9173120999827300720">Inglês (EUA) com teclado internacional</translation>
-<translation id="9183302530794969518">Documentos Google</translation>
+<translation id="9183302530794969518">Google Docs</translation>
 <translation id="9189836632794948435">Cazaque</translation>
 <translation id="9200427192836333033"><ph name="NUMBER_OF_ITEMS" /> itens extraídos.</translation>
 <translation id="9213073329713032541">Instalação iniciada.</translation>
diff --git a/v8 b/v8
index 802e662..d268c90 160000
--- a/v8
+++ b/v8
@@ -1 +1 @@
-Subproject commit 802e662c39e653c682f3e29264fe9a351b3f1a52
+Subproject commit d268c90baf4871e123b61189f9b468aefeb8b7dc