diff --git a/.gn b/.gn
index b3135a8..ea4140b 100644
--- a/.gn
+++ b/.gn
@@ -78,7 +78,6 @@
   "//chrome/browser/updates/announcement_notification:*",  # 15 errors
   "//chrome/browser/updates/internal:*",  # 8 errors
   "//chrome/browser/updates:*",  # 21 errors
-  "//chrome/install_static:*",  # 4 errors
   "//chrome/notification_helper:*",  # 4 errors
   "//chrome/services/cups_proxy/public/cpp:*",  # 2 errors
   "//chrome/services/cups_proxy:*",  # 6 errors
@@ -133,7 +132,6 @@
   "//extensions/browser/api/system_info:*",  # 8 errors
   "//extensions/browser/api/system_memory:*",  # 1 error
   "//extensions/browser/api/system_network:*",  # 2 errors
-  "//extensions/browser/api/system_power_source:*",  # 2 errors
   "//extensions/browser/api/system_storage:*",  # 6 errors
   "//extensions/browser/api/test:*",  # 1 error
   "//extensions/browser/api/usb:*",  # 12 errors
diff --git a/DEPS b/DEPS
index 73abc78..84dec7d 100644
--- a/DEPS
+++ b/DEPS
@@ -199,11 +199,11 @@
   # 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': 'caca7bfff996b38ee6bb6413eb5ca62b0c9a380f',
+  'skia_revision': '9a27566e0cbcf073d9de5930bcda5a5fd8779e6b',
   # 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': 'c1afed6d5ce09f38a9eb7f39b34b4c087cd80503',
+  'v8_revision': 'a29c88f51455adc968183aaddadaaac75965b421',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -211,7 +211,7 @@
   # 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': '5e606e5bfce2b23c139c5289cbf1299844fa4b43',
+  'angle_revision': 'bc06d145bb29926b2d8cd51c04c7c002a01f6db5',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -274,7 +274,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': '8793dbe78e44bc6eeceaed0cc8cf0e542d6efd4a',
+  'devtools_frontend_revision': 'a82fd978806685fca50a1b73a5987388b1e5d93d',
   # 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.
@@ -364,7 +364,7 @@
   # revisions.
 
   # GN CIPD package version.
-  'gn_version': 'git_revision:53d92014bf94c3893886470a1c7c1289f8818db0',
+  'gn_version': 'git_revision:0d67e272bdb8145f87d238bc0b2cb8bf80ccec90',
 
   # Also, if you change these, update buildtools/DEPS too. Also update the
   # libc++ svn_revision in //buildtools/deps_revisions.gni.
@@ -1514,7 +1514,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '3c2fe3888658d82b47ca831d59a2e07579619c2d',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + 'a45df0b3491ea72cfcf40e21106eb046c8594223',
+    Var('webrtc_git') + '/src.git' + '@' + 'b90546580ec3e8236225f39f9e5e5e7b7128c24b',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
@@ -1586,7 +1586,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@3a0cc86fe501ebb245b7d6191903579a2a7c40fe',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@07ae7a3efa65fac8623671bb0c2b29c979bb8239',
     'condition': 'checkout_src_internal',
   },
 
@@ -1594,7 +1594,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/help_app/app',
-        'version': 'qJhtBw7ouc--Fdht1yXy9-ZDPYguiqAZbixcf8MasiwC',
+        'version': 'nmFhO5_ZTTtPNJGhEylXtJ4sG_lvSsW7CgsI4mn7xzoC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -1605,7 +1605,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/media_app/app',
-        'version': 'RYs0dVeLJjwsPik_WXMr4pMuzN55DAmi4gfQCMX-evUC',
+        'version': 'y1UO1pWZtkbXGMrkLWW6WfXo6r0vs_UNcESClmGZ_bYC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/ash/system/ime_menu/ime_menu_tray.cc b/ash/system/ime_menu/ime_menu_tray.cc
index 1598b5fb..ce2dd8de 100644
--- a/ash/system/ime_menu/ime_menu_tray.cc
+++ b/ash/system/ime_menu/ime_menu_tray.cc
@@ -45,6 +45,7 @@
 #include "ui/views/controls/scroll_view.h"
 #include "ui/views/controls/separator.h"
 #include "ui/views/layout/box_layout.h"
+#include "ui/views/layout/box_layout_view.h"
 #include "ui/views/metadata/metadata_impl_macros.h"
 
 namespace ash {
@@ -118,7 +119,7 @@
 END_METADATA
 
 // The view that contains IME menu title.
-class ImeTitleView : public views::View {
+class ImeTitleView : public views::BoxLayoutView {
  public:
   METADATA_HEADER(ImeTitleView);
   ImeTitleView() {
@@ -129,10 +130,10 @@
             color_provider->GetContentLayerColor(
                 AshColorProvider::ContentLayerType::kSeparatorColor)),
         gfx::Insets(kMenuSeparatorVerticalPadding - kMenuSeparatorWidth, 0)));
-    auto box_layout = std::make_unique<views::BoxLayout>(
-        views::BoxLayout::Orientation::kHorizontal, kTitleViewPadding);
-    box_layout->set_minimum_cross_axis_size(kTrayPopupItemMinHeight);
-    views::BoxLayout* layout_ptr = SetLayoutManager(std::move(box_layout));
+    SetOrientation(views::BoxLayout::Orientation::kHorizontal);
+    SetInsideBorderInsets(kTitleViewPadding);
+    SetMinimumCrossAxisSize(kTrayPopupItemMinHeight);
+
     auto* title_label = AddChildView(std::make_unique<views::Label>(
         l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_IME)));
     title_label->SetBorder(
@@ -142,7 +143,7 @@
         AshColorProvider::ContentLayerType::kTextColorPrimary));
     TrayPopupUtils::SetLabelFontList(title_label,
                                      TrayPopupUtils::FontStyle::kPodMenuHeader);
-    layout_ptr->SetFlexForView(title_label, 1);
+    SetFlexForView(title_label, 1);
 
     settings_button_ = AddChildView(std::make_unique<TopShortcutButton>(
         base::BindRepeating([]() {
@@ -162,7 +163,7 @@
   TopShortcutButton* settings_button_ = nullptr;
 };
 
-BEGIN_METADATA(ImeTitleView, views::View)
+BEGIN_METADATA(ImeTitleView, views::BoxLayoutView)
 END_METADATA
 
 // The view that contains buttons shown on the bottom of IME menu.
diff --git a/build/android/apk_operations.py b/build/android/apk_operations.py
index d2798147..b2d4176 100755
--- a/build/android/apk_operations.py
+++ b/build/android/apk_operations.py
@@ -484,6 +484,10 @@
     awful_wrapping = r'\s*'.join('compilation_filter=')
     for m in re.finditer(awful_wrapping + r'([\s\S]+?)[\],]', package_output):
       compilation_filters.add(re.sub(r'\s+', '', m.group(1)))
+    # Starting Android Q, output looks like:
+    #  arm: [status=speed-profile] [reason=install]
+    for m in re.finditer(r'\[status=(.+?)\]', package_output):
+      compilation_filters.add(m.group(1))
     compilation_filter = ','.join(sorted(compilation_filters))
 
     data_dir_sizes = _DuHelper(d, '%s/{*,.*}' % data_dir, run_as=package_name)
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index 6966cd4..e5ec4360 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-0.20201225.3.1
+0.20201228.0.1
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index 6966cd4..e5ec4360 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-0.20201225.3.1
+0.20201228.0.1
diff --git a/buildtools/DEPS b/buildtools/DEPS
index 563d8d24..56de1b6 100644
--- a/buildtools/DEPS
+++ b/buildtools/DEPS
@@ -14,7 +14,7 @@
   #
 
   # GN CIPD package version.
-  'gn_version': 'git_revision:53d92014bf94c3893886470a1c7c1289f8818db0',
+  'gn_version': 'git_revision:0d67e272bdb8145f87d238bc0b2cb8bf80ccec90',
 
   # By default, do not checkout the re-client binaries.
   'checkout_reclient': False,
diff --git a/chrome/VERSION b/chrome/VERSION
index 15fb5e2..6d77bc5 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=89
 MINOR=0
-BUILD=4369
+BUILD=4371
 PATCH=0
diff --git a/chrome/android/chrome_test_java_sources.gni b/chrome/android/chrome_test_java_sources.gni
index f91b3f51..5b4486c 100644
--- a/chrome/android/chrome_test_java_sources.gni
+++ b/chrome/android/chrome_test_java_sources.gni
@@ -505,7 +505,6 @@
   "javatests/src/org/chromium/chrome/browser/signin/DummyAccountPickerTargetFragment.java",
   "javatests/src/org/chromium/chrome/browser/signin/IdentityManagerIntegrationTest.java",
   "javatests/src/org/chromium/chrome/browser/signin/SigninFragmentTest.java",
-  "javatests/src/org/chromium/chrome/browser/signin/SigninHelperTest.java",
   "javatests/src/org/chromium/chrome/browser/signin/SigninSignoutIntegrationTest.java",
   "javatests/src/org/chromium/chrome/browser/site_settings/ChromeSiteSettingsClientTest.java",
   "javatests/src/org/chromium/chrome/browser/site_settings/CookieControlsBridgeTest.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/AccountPickerBottomSheetTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/AccountPickerBottomSheetTest.java
index b2a01ef0..4c71ba17 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/AccountPickerBottomSheetTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/AccountPickerBottomSheetTest.java
@@ -363,10 +363,8 @@
         buildAndShowExpandedBottomSheet();
         String newFullName = "New Full Name1";
         String newGivenName = "New Given Name1";
-        TestThreadUtils.runOnUiThreadBlocking(() -> {
-            mFakeProfileDataSource.addProfileData(new ProfileDataSource.ProfileData(
-                    PROFILE_DATA1.getAccountEmail(), null, newFullName, newGivenName));
-        });
+        mFakeProfileDataSource.addProfileData(new ProfileDataSource.ProfileData(
+                PROFILE_DATA1.getAccountEmail(), null, newFullName, newGivenName));
         onVisibleView(withText(PROFILE_DATA1.getAccountEmail())).check(matches(isDisplayed()));
         onVisibleView(withText(newFullName)).check(matches(isDisplayed()));
         // Check that profile data update when the bottom sheet is expanded won't
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/signin/account_picker/AccountPickerMediatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/signin/account_picker/AccountPickerMediatorTest.java
index 61a36ccb..8632df32 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/signin/account_picker/AccountPickerMediatorTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/signin/account_picker/AccountPickerMediatorTest.java
@@ -28,7 +28,6 @@
 import org.chromium.chrome.test.util.browser.signin.AccountManagerTestRule;
 import org.chromium.components.signin.ProfileDataSource;
 import org.chromium.components.signin.test.util.FakeProfileDataSource;
-import org.chromium.content_public.browser.test.util.TestThreadUtils;
 import org.chromium.ui.modelutil.MVCListAdapter;
 import org.chromium.ui.modelutil.PropertyModel;
 
@@ -129,10 +128,8 @@
         mMediator = new AccountPickerMediator(
                 RuntimeEnvironment.application, mModelList, mListenerMock, ACCOUNT_NAME1, false);
         String fullName2 = "Full Name2";
-        TestThreadUtils.runOnUiThreadBlocking(() -> {
-            mFakeProfileDataSource.addProfileData(
-                    new ProfileDataSource.ProfileData(ACCOUNT_NAME2, null, fullName2, null));
-        });
+        mFakeProfileDataSource.addProfileData(
+                new ProfileDataSource.ProfileData(ACCOUNT_NAME2, null, fullName2, null));
         // ACCOUNT_NAME1, ACCOUNT_NAME2, ADD_ACCOUNT
         Assert.assertEquals(3, mModelList.size());
         checkItemForExistingAccountRow(0, ACCOUNT_NAME1, FULL_NAME1, /* isSelectedAccount= */ true);
diff --git a/chrome/browser/chromeos/accessibility/select_to_speak_browsertest.cc b/chrome/browser/chromeos/accessibility/select_to_speak_browsertest.cc
index 0369e7f..72d51b0 100644
--- a/chrome/browser/chromeos/accessibility/select_to_speak_browsertest.cc
+++ b/chrome/browser/chromeos/accessibility/select_to_speak_browsertest.cc
@@ -17,7 +17,6 @@
 #include "base/bind.h"
 #include "base/command_line.h"
 #include "base/memory/weak_ptr.h"
-#include "build/branding_buildflags.h"
 #include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
 #include "chrome/browser/chromeos/accessibility/speech_monitor.h"
 #include "chrome/browser/profiles/profile.h"
@@ -163,13 +162,7 @@
   }
 };
 
-// The status tray is not active on official builds.
-#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
-#define MAYBE_SpeakStatusTray DISABLED_SpeakStatusTray
-#else
-#define MAYBE_SpeakStatusTray SpeakStatusTray
-#endif
-IN_PROC_BROWSER_TEST_F(SelectToSpeakTest, MAYBE_SpeakStatusTray) {
+IN_PROC_BROWSER_TEST_F(SelectToSpeakTest, DISABLED_SpeakStatusTray) {
   gfx::Rect tray_bounds = ash::Shell::Get()
                               ->GetPrimaryRootWindowController()
                               ->GetStatusAreaWidget()
diff --git a/chrome/browser/chromeos/login/login_browsertest.cc b/chrome/browser/chromeos/login/login_browsertest.cc
index 1b37b6e6..6858ae6 100644
--- a/chrome/browser/chromeos/login/login_browsertest.cc
+++ b/chrome/browser/chromeos/login/login_browsertest.cc
@@ -20,6 +20,7 @@
 #include "chrome/browser/chromeos/login/test/fake_gaia_mixin.h"
 #include "chrome/browser/chromeos/login/test/guest_session_mixin.h"
 #include "chrome/browser/chromeos/login/test/login_manager_mixin.h"
+#include "chrome/browser/chromeos/login/test/network_portal_detector_mixin.h"
 #include "chrome/browser/chromeos/login/test/offline_login_test_mixin.h"
 #include "chrome/browser/chromeos/login/test/oobe_base_test.h"
 #include "chrome/browser/chromeos/login/test/oobe_screen_waiter.h"
@@ -88,6 +89,7 @@
   // We need Fake gaia to avoid network errors that can be caused by
   // attempts to load real GAIA.
   FakeGaiaMixin fake_gaia_{&mixin_host_, embedded_test_server()};
+  NetworkPortalDetectorMixin network_portal_detector_{&mixin_host_};
 };
 
 class LoginOfflineManagedTest : public LoginManagerTest {
@@ -211,6 +213,8 @@
 }
 
 IN_PROC_BROWSER_TEST_F(LoginOfflineTest, AuthOffline) {
+  network_portal_detector_.SimulateDefaultNetworkState(
+      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE);
   offline_login_test_mixin_.GoOffline();
   offline_login_test_mixin_.InitOfflineLogin(test_account_id_,
                                              LoginManagerTest::kPassword);
diff --git a/chrome/browser/chromeos/login/screens/welcome_screen_browsertest.cc b/chrome/browser/chromeos/login/screens/welcome_screen_browsertest.cc
index 47da418..aff72f6 100644
--- a/chrome/browser/chromeos/login/screens/welcome_screen_browsertest.cc
+++ b/chrome/browser/chromeos/login/screens/welcome_screen_browsertest.cc
@@ -718,7 +718,8 @@
 
 // Assert that the ChromeVox hint dialog behaves as a modal dialog and traps
 // focus when using tab.
-IN_PROC_BROWSER_TEST_F(WelcomeScreenChromeVoxHintTest, TrapFocus) {
+// TODO(crbug/1161398): The test is flaky.
+IN_PROC_BROWSER_TEST_F(WelcomeScreenChromeVoxHintTest, DISABLED_TrapFocus) {
   WelcomeScreen* screen = welcome_screen();
   OobeScreenWaiter(WelcomeView::kScreenId).Wait();
   TtsExtensionEngine::GetInstance()->DisableBuiltInTTSEngineForTesting();
diff --git a/chrome/browser/chromeos/policy/dlp/OWNERS b/chrome/browser/chromeos/policy/dlp/OWNERS
index 1725fcc7..bb766c68 100644
--- a/chrome/browser/chromeos/policy/dlp/OWNERS
+++ b/chrome/browser/chromeos/policy/dlp/OWNERS
@@ -1,3 +1,2 @@
 ayaelattar@chromium.org
-nikitapodguzov@chromium.org
 poromov@chromium.org
diff --git a/chrome/browser/focus_ring_browsertest.cc b/chrome/browser/focus_ring_browsertest.cc
index 254711de..c206ddd 100644
--- a/chrome/browser/focus_ring_browsertest.cc
+++ b/chrome/browser/focus_ring_browsertest.cc
@@ -8,7 +8,6 @@
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
 #include "cc/test/pixel_comparator.h"
-#include "chrome/browser/focus_ring_browsertest_mac.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/test/base/in_process_browser_test.h"
@@ -18,7 +17,6 @@
 #include "content/public/test/browser_test.h"
 #include "content/public/test/browser_test_utils.h"
 #include "ui/base/ui_base_features.h"
-#include "ui/base/ui_base_switches.h"
 
 // TODO(crbug.com/958242): Move the baselines to skia gold for easier
 //   rebaselining when all platforms are supported
@@ -55,9 +53,7 @@
 class FocusRingBrowserTest : public InProcessBrowserTest {
  public:
   FocusRingBrowserTest() {
-    feature_list_.InitWithFeatures(
-        {features::kFormControlsRefresh, features::kCSSColorSchemeUARendering},
-        {});
+    feature_list_.InitWithFeatures({features::kFormControlsRefresh}, {});
   }
 
   void SetUp() override {
@@ -71,9 +67,6 @@
     // The --disable-lcd-text flag helps text render more similarly on
     // different bots and platform.
     command_line->AppendSwitch(switches::kDisableLCDText);
-
-    // This is required to allow dark mode to be used on some platforms.
-    command_line->AppendSwitch(switches::kForceDarkMode);
   }
 
   void RunTest(const std::string& screenshot_filename,
@@ -84,7 +77,6 @@
     base::ScopedAllowBlockingForTesting allow_blocking;
 
     ASSERT_TRUE(features::IsFormControlsRefreshEnabled());
-    ASSERT_TRUE(features::IsCSSColorSchemeUARenderingEnabled());
 
     base::FilePath dir_test_data;
     ASSERT_TRUE(base::PathService::Get(chrome::DIR_TEST_DATA, &dir_test_data));
@@ -111,7 +103,8 @@
     content::WebContents* web_contents =
         browser()->tab_strip_model()->GetActiveWebContents();
     ASSERT_TRUE(content::NavigateToURL(
-        web_contents, GURL("data:text/html,<!DOCTYPE html>" + body_html)));
+        web_contents,
+        GURL("data:text/html,<!DOCTYPE html><body>" + body_html + "</body>")));
     ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
 
     EXPECT_TRUE(CompareWebContentsOutputToReference(
@@ -181,21 +174,3 @@
           /* screenshot_width */ 90,
           /* screenshot_height */ 130, comparator);
 }
-
-IN_PROC_BROWSER_TEST_F(FocusRingBrowserTest, DarkModeButton) {
-#if defined(OS_MAC)
-  if (!MacOSVersionSupportsDarkMode())
-    return;
-  cc::FuzzyPixelComparator comparator = mac_strict_comparator;
-#else
-  cc::ExactPixelComparator comparator(/*discard_alpha=*/true);
-#endif
-  RunTest("focus_ring_browsertest_dark_mode_button",
-          "<meta name=\"color-scheme\" content=\"light dark\">"
-          "<button autofocus style=\"width:40px;height:20px;\"></button>"
-          "<br>"
-          "<br>"
-          "<button style=\"width:40px;height:20px;\"></button>",
-          /* screenshot_width */ 80,
-          /* screenshot_height */ 80, comparator);
-}
diff --git a/chrome/browser/focus_ring_browsertest_mac.h b/chrome/browser/focus_ring_browsertest_mac.h
deleted file mode 100644
index 64cef70c..0000000
--- a/chrome/browser/focus_ring_browsertest_mac.h
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_FOCUS_RING_BROWSERTEST_MAC_H_
-#define CHROME_BROWSER_FOCUS_RING_BROWSERTEST_MAC_H_
-
-bool MacOSVersionSupportsDarkMode();
-
-#endif  // CHROME_BROWSER_FOCUS_RING_BROWSERTEST_MAC_H_
diff --git a/chrome/browser/focus_ring_browsertest_mac.mm b/chrome/browser/focus_ring_browsertest_mac.mm
deleted file mode 100644
index 1dc0f43..0000000
--- a/chrome/browser/focus_ring_browsertest_mac.mm
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/focus_ring_browsertest_mac.h"
-
-bool MacOSVersionSupportsDarkMode() {
-  if (@available(macOS 10.14, *))
-    return true;
-  return false;
-}
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/injected/api.js b/chrome/browser/resources/chromeos/accessibility/chromevox/injected/api.js
index afe235b..1ad4916 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/injected/api.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/injected/api.js
@@ -92,7 +92,8 @@
     } catch (e) {
     }
   };
-  window.postMessage(PORT_SETUP_MSG, '*', [channel.port2]);
+  window.postMessage(
+      PORT_SETUP_MSG, '*' /* target origin */, [channel.port2] /* transfer */);
 }
 
 /**
diff --git a/chrome/browser/signin/services/android/BUILD.gn b/chrome/browser/signin/services/android/BUILD.gn
index 06003623..1ce9456 100644
--- a/chrome/browser/signin/services/android/BUILD.gn
+++ b/chrome/browser/signin/services/android/BUILD.gn
@@ -81,6 +81,7 @@
   bypass_platform_checks = true
   testonly = true
   sources = [
+    "junit/src/org/chromium/chrome/browser/signin/services/SigninHelperTest.java",
     "junit/src/org/chromium/chrome/browser/signin/services/SigninPreferencesManagerTest.java",
     "junit/src/org/chromium/chrome/browser/signin/services/WebSigninBridgeTest.java",
   ]
@@ -89,6 +90,7 @@
     "//base:base_java_test_support",
     "//base:base_junit_test_support",
     "//chrome/browser/profiles/android:java",
+    "//chrome/test/android:chrome_java_test_support",
     "//components/signin/public/android:java",
     "//third_party/junit",
     "//third_party/mockito:mockito_java",
diff --git a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/ProfileDataCacheRenderTest.java b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/ProfileDataCacheRenderTest.java
index f4d4e95..cb831d1 100644
--- a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/ProfileDataCacheRenderTest.java
+++ b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/ProfileDataCacheRenderTest.java
@@ -141,10 +141,8 @@
                 .thenReturn(new AccountInfo(
                         new CoreAccountId("gaia-id-test"), accountEmail, "gaia-id-test", null));
 
-        TestThreadUtils.runOnUiThreadBlocking(() -> {
-            mProfileDataSource.addProfileData(new ProfileDataSource.ProfileData(
-                    accountEmail, null, "Full Name", "Given Name"));
-        });
+        mProfileDataSource.addProfileData(
+                new ProfileDataSource.ProfileData(accountEmail, null, "Full Name", "Given Name"));
         mIdentityManager.onExtendedAccountInfoUpdated(new AccountInfo(
                 new CoreAccountId("gaia-id-test"), accountEmail, "gaia-id-test", createAvatar()));
         TestThreadUtils.runOnUiThreadBlocking(() -> { checkImageIsScaled(accountEmail); });
@@ -165,14 +163,13 @@
     @MediumTest
     @Feature("RenderTest")
     public void testAvatarIsScaled() throws IOException {
+        String accountName = "test@example.com";
+        ProfileDataSource.ProfileData profileData = new ProfileDataSource.ProfileData(
+                accountName, createAvatar(), "Full Name", "Given Name");
+        mProfileDataSource.addProfileData(profileData);
         TestThreadUtils.runOnUiThreadBlocking(() -> {
-            String accountName = "test@example.com";
-            ProfileDataSource.ProfileData profileData = new ProfileDataSource.ProfileData(
-                    accountName, createAvatar(), "Full Name", "Given Name");
-            mProfileDataSource.addProfileData(profileData);
             checkImageIsScaled(accountName);
         });
-
         mRenderTestRule.render(mImageView, "profile_data_cache_avatar" + mImageSize);
     }
 
diff --git a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninHelper.java b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninHelper.java
index 7c137827..5309344 100644
--- a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninHelper.java
+++ b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninHelper.java
@@ -66,9 +66,7 @@
                     }
                 }
                 return result;
-            } catch (IOException e) {
-                Log.w(TAG, "Failed to get change events", e);
-            } catch (GoogleAuthException e) {
+            } catch (IOException | GoogleAuthException e) {
                 Log.w(TAG, "Failed to get change events", e);
             }
             return new ArrayList<>(0);
@@ -113,27 +111,29 @@
             return;
         }
 
-        Account syncAccount = CoreAccountInfo.getAndroidAccountFrom(
-                mSigninManager.getIdentityManager().getPrimaryAccountInfo(ConsentLevel.SYNC));
+        final CoreAccountInfo syncAccount =
+                mSigninManager.getIdentityManager().getPrimaryAccountInfo(ConsentLevel.SYNC);
         if (syncAccount == null) {
             return;
         }
 
         String renamedAccount = mPrefsManager.getNewSignedInAccountName();
         if (accountsChanged && renamedAccount != null) {
-            handleAccountRename(syncAccount.name, renamedAccount);
+            handleAccountRename(syncAccount.getEmail(), renamedAccount);
             return;
         }
 
+        final List<Account> accounts =
+                AccountManagerFacadeProvider.getInstance().tryGetGoogleAccounts();
         // Always check for account deleted.
-        if (!accountExists(syncAccount)) {
+        if (AccountUtils.findAccountByName(accounts, syncAccount.getEmail()) == null) {
             // It is possible that Chrome got to this point without account
             // rename notification. Let us signout before doing a rename.
             AsyncTask<Void> task = new AsyncTask<Void>() {
                 @Override
                 protected Void doInBackground() {
                     updateAccountRenameData(
-                            new SystemAccountChangeEventChecker(), syncAccount.name);
+                            new SystemAccountChangeEventChecker(), syncAccount.getEmail());
                     return null;
                 }
 
@@ -199,17 +199,6 @@
                 });
     }
 
-    private static boolean accountExists(Account account) {
-        List<Account> accounts = AccountManagerFacadeProvider.getInstance().tryGetGoogleAccounts();
-        for (int i = 0; i < accounts.size(); i++) {
-            Account a = accounts.get(i);
-            if (a.equals(account)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
     @VisibleForTesting
     public static void updateAccountRenameData(
             AccountChangeEventChecker checker, String currentName) {
@@ -225,15 +214,16 @@
         try {
         outerLoop:
             while (true) {
+                final List<Account> accounts =
+                        AccountManagerFacadeProvider.getInstance().tryGetGoogleAccounts();
                 List<String> nameChanges = checker.getAccountChangeEvents(
                         ContextUtils.getApplicationContext(), newIndex, newName);
-
                 for (String name : nameChanges) {
                     if (name != null) {
                         // We have found a rename event of the current account.
                         // We need to check if that account is further renamed.
                         newName = name;
-                        if (!accountExists(AccountUtils.createAccountFromName(newName))) {
+                        if (AccountUtils.findAccountByName(accounts, newName) == null) {
                             newIndex = 0; // Start from the beginning of the new account.
                             continue outerLoop;
                         }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninHelperTest.java b/chrome/browser/signin/services/android/junit/src/org/chromium/chrome/browser/signin/services/SigninHelperTest.java
similarity index 80%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninHelperTest.java
rename to chrome/browser/signin/services/android/junit/src/org/chromium/chrome/browser/signin/services/SigninHelperTest.java
index de307bc5b..368eb57 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninHelperTest.java
+++ b/chrome/browser/signin/services/android/junit/src/org/chromium/chrome/browser/signin/services/SigninHelperTest.java
@@ -2,39 +2,27 @@
 // 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.signin;
-
-import androidx.test.filters.SmallTest;
+package org.chromium.chrome.browser.signin.services;
 
 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.chromium.base.test.util.Batch;
-import org.chromium.chrome.browser.signin.services.SigninHelper;
-import org.chromium.chrome.browser.signin.services.SigninPreferencesManager;
-import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.chrome.test.util.browser.signin.AccountManagerTestRule;
 import org.chromium.chrome.test.util.browser.signin.MockChangeEventChecker;
 
 /**
  * Instrumentation tests for {@link SigninHelper}.
  */
-@RunWith(ChromeJUnit4ClassRunner.class)
-@Batch(Batch.UNIT_TESTS)
+@RunWith(BaseRobolectricTestRunner.class)
 public class SigninHelperTest {
     @Rule
     public final AccountManagerTestRule mAccountManagerTestRule = new AccountManagerTestRule();
 
-    private MockChangeEventChecker mEventChecker;
-
-    @Before
-    public void setUp() {
-        mEventChecker = new MockChangeEventChecker();
-    }
+    private final MockChangeEventChecker mEventChecker = new MockChangeEventChecker();
 
     @After
     public void tearDown() {
@@ -42,43 +30,43 @@
     }
 
     @Test
-    @SmallTest
     public void testSimpleAccountRename() {
         mEventChecker.insertRenameEvent("A", "B");
         SigninHelper.updateAccountRenameData(mEventChecker, "A");
         Assert.assertEquals("B", getNewSignedInAccountName());
+        checkLastAccountChangedEventIndex(0);
     }
 
     @Test
-    @SmallTest
     public void testNotSignedInAccountRename() {
         mEventChecker.insertRenameEvent("B", "C");
         SigninHelper.updateAccountRenameData(mEventChecker, "A");
         Assert.assertNull(getNewSignedInAccountName());
+        checkLastAccountChangedEventIndex(0);
     }
 
     @Test
-    @SmallTest
     public void testSimpleAccountRenameTwice() {
         mEventChecker.insertRenameEvent("A", "B");
         SigninHelper.updateAccountRenameData(mEventChecker, "A");
         Assert.assertEquals("B", getNewSignedInAccountName());
+        checkLastAccountChangedEventIndex(0);
         mEventChecker.insertRenameEvent("B", "C");
         SigninHelper.updateAccountRenameData(mEventChecker, "B");
         Assert.assertEquals("C", getNewSignedInAccountName());
+        checkLastAccountChangedEventIndex(0);
     }
 
     @Test
-    @SmallTest
     public void testNotSignedInAccountRename2() {
         mEventChecker.insertRenameEvent("B", "C");
         mEventChecker.insertRenameEvent("C", "D");
         SigninHelper.updateAccountRenameData(mEventChecker, "A");
         Assert.assertNull(getNewSignedInAccountName());
+        checkLastAccountChangedEventIndex(0);
     }
 
     @Test
-    @SmallTest
     public void testChainedAccountRename2() {
         mEventChecker.insertRenameEvent("Z", "Y"); // Unrelated.
         mEventChecker.insertRenameEvent("A", "B");
@@ -87,10 +75,10 @@
         mEventChecker.insertRenameEvent("C", "D");
         SigninHelper.updateAccountRenameData(mEventChecker, "A");
         Assert.assertEquals("D", getNewSignedInAccountName());
+        checkLastAccountChangedEventIndex(0);
     }
 
     @Test
-    @SmallTest
     public void testLoopedAccountRename() {
         mEventChecker.insertRenameEvent("Z", "Y"); // Unrelated.
         mEventChecker.insertRenameEvent("A", "B");
@@ -101,9 +89,15 @@
         mAccountManagerTestRule.addAccount("D");
         SigninHelper.updateAccountRenameData(mEventChecker, "A");
         Assert.assertEquals("D", getNewSignedInAccountName());
+        checkLastAccountChangedEventIndex(1);
     }
 
     private String getNewSignedInAccountName() {
         return SigninPreferencesManager.getInstance().getNewSignedInAccountName();
     }
+
+    private void checkLastAccountChangedEventIndex(int expectedEventIndex) {
+        Assert.assertEquals(expectedEventIndex,
+                SigninPreferencesManager.getInstance().getLastAccountChangedEventIndex());
+    }
 }
diff --git a/chrome/browser/ui/webui/chromeos/login/error_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/error_screen_handler.cc
index bb367ef..e25304e 100644
--- a/chrome/browser/ui/webui/chromeos/login/error_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/error_screen_handler.cc
@@ -40,6 +40,7 @@
 
 void ErrorScreenHandler::Hide() {
   showing_ = false;
+  show_on_init_ = false;
   if (screen_)
     screen_->DoHide();
 }
diff --git a/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.cc b/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.cc
index bf9bac61..df9d873 100644
--- a/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.cc
+++ b/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.cc
@@ -47,20 +47,26 @@
 MultiDeviceSetupDialog* MultiDeviceSetupDialog::current_instance_ = nullptr;
 
 // static
+gfx::NativeWindow MultiDeviceSetupDialog::containing_window_ = nullptr;
+
+// static
 void MultiDeviceSetupDialog::Show() {
-  // The dialog is already showing, so there is nothing to do.
-  if (current_instance_)
+  // Focus the window hosting the dialog that has already been created.
+  if (containing_window_) {
+    DCHECK(current_instance_);
+    containing_window_->Focus();
     return;
+  }
 
   current_instance_ = new MultiDeviceSetupDialog();
-  gfx::NativeWindow window = chrome::ShowWebDialog(
+  containing_window_ = chrome::ShowWebDialog(
       nullptr /* parent */, ProfileManager::GetActiveUserProfile(),
       current_instance_);
 
   // Remove the black backdrop behind the dialog window which appears in tablet
   // and full-screen mode.
-  ash::WindowBackdrop::Get(window)->SetBackdropMode(
-      ash::WindowBackdrop::BackdropMode::kDisabled);
+  ash::WindowBackdrop::Get(containing_window_)
+      ->SetBackdropMode(ash::WindowBackdrop::BackdropMode::kDisabled);
 }
 
 // static
@@ -101,6 +107,7 @@
 void MultiDeviceSetupDialog::OnDialogClosed(const std::string& json_retval) {
   DCHECK(this == current_instance_);
   current_instance_ = nullptr;
+  containing_window_ = nullptr;
 
   // Note: The call below deletes |this|, so there is no further need to keep
   // track of the pointer.
diff --git a/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.h b/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.h
index 18a4359b..eab6f4d 100644
--- a/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.h
+++ b/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.h
@@ -47,6 +47,7 @@
 
  private:
   static MultiDeviceSetupDialog* current_instance_;
+  static gfx::NativeWindow containing_window_;
 
   // List of callbacks that have registered themselves to be invoked once this
   // dialog is closed.
diff --git a/chrome/browser/web_applications/system_web_app_manager_browsertest.cc b/chrome/browser/web_applications/system_web_app_manager_browsertest.cc
index efb094b0..b4c4d3b 100644
--- a/chrome/browser/web_applications/system_web_app_manager_browsertest.cc
+++ b/chrome/browser/web_applications/system_web_app_manager_browsertest.cc
@@ -1126,7 +1126,9 @@
             GetManager().GetAppIds().size());
 }
 
-IN_PROC_BROWSER_TEST_P(SystemWebAppManagerUpgradeBrowserTest, Upgrade) {
+// Test is consistently failing: crbug/1162044
+IN_PROC_BROWSER_TEST_P(SystemWebAppManagerUpgradeBrowserTest,
+                       DISABLED_Upgrade) {
   WaitForSystemAppsSynchronized();
   const auto& app_ids = GetManager().GetAppIds();
 
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index 24f9c851..091f243 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-master-1608938443-5e2a6a5509ef0c35b284bb575c523599912f115a.profdata
+chrome-linux-master-1609156644-42cb6a035b1fe5a631f9a5a0f3f4dab0f809ccfe.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 82ffbf63..8d3110d 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-master-1608938443-813619ab6447ba11a985c78bfacde75dce409fd5.profdata
+chrome-mac-master-1609156644-74221c569e797d96fdd58cd45c2be34f02342fb7.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index c66c365..ab8ddd5 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-master-1608508387-56780dae3832c65bafd36e4cfe96756ad3b86eef.profdata
+chrome-win32-master-1609077635-95cc21097bbc828eec82ee3506f035af36a6f657.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 95774ae..fc208a8 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-master-1608913095-f136f8f83569a182f681a83edbe456e8f7d0cecd.profdata
+chrome-win64-master-1609124291-e7a0465f695fe158abf9ec0e9104d31fe42b886f.profdata
diff --git a/chrome/common/extensions/docs/templates/public/apps/system_powerSource.html b/chrome/common/extensions/docs/templates/public/apps/system_powerSource.html
deleted file mode 100644
index 139973d1..0000000
--- a/chrome/common/extensions/docs/templates/public/apps/system_powerSource.html
+++ /dev/null
@@ -1 +0,0 @@
-{{+partials.standard_apps_api api:apis.apps.system_power_source/}}
diff --git a/chrome/common/extensions/permissions/permission_set_unittest.cc b/chrome/common/extensions/permissions/permission_set_unittest.cc
index 7816ebd..70e2c32 100644
--- a/chrome/common/extensions/permissions/permission_set_unittest.cc
+++ b/chrome/common/extensions/permissions/permission_set_unittest.cc
@@ -774,7 +774,6 @@
   skip.insert(APIPermission::kSystemDisplay);
   skip.insert(APIPermission::kSystemMemory);
   skip.insert(APIPermission::kSystemNetwork);
-  skip.insert(APIPermission::kSystemPowerSource);
   skip.insert(APIPermission::kTts);
   skip.insert(APIPermission::kUnlimitedStorage);
   skip.insert(APIPermission::kWebcamPrivate);
diff --git a/chrome/install_static/BUILD.gn b/chrome/install_static/BUILD.gn
index 584965d..ea68d71 100644
--- a/chrome/install_static/BUILD.gn
+++ b/chrome/install_static/BUILD.gn
@@ -31,7 +31,7 @@
 
     sources = [
       "../app/chrome_dll_resource.h",
-      "../chrome/common/chrome_icon_resources_win.h",
+      "../common/chrome_icon_resources_win.h",
       "install_constants.h",
       "install_details.cc",
       "install_details.h",
@@ -71,6 +71,7 @@
   # process-wide InstallDetails instance (i.e., chrome_elf.dll).
   source_set("primary_module") {
     sources = [ "get_install_details_payload.cc" ]
+    deps = [ ":install_static_util" ]
   }
 
   # A source set for use by modules in a process that fetch the process-wide
@@ -102,6 +103,7 @@
       "//build:branding_buildflags",
       "//chrome/install_static:install_static_util",
       "//chrome/install_static/test:test_support",
+      "//components/version_info",
       "//testing/gmock",
       "//testing/gtest",
     ]
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index ab655a5a..d2b4077 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -6795,8 +6795,6 @@
       sources += [
         "../browser/apps/platform_apps/app_shim_interactive_uitest_mac.mm",
         "../browser/apps/platform_apps/app_shim_quit_interactive_uitest_mac.mm",
-        "../browser/focus_ring_browsertest_mac.h",
-        "../browser/focus_ring_browsertest_mac.mm",
         "../browser/global_keyboard_shortcuts_mac_browsertest.mm",
         "../browser/notifications/notification_interactive_uitest_mac.mm",
         "../browser/spellchecker/spellcheck_mac_view_interactive_uitest.mm",
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/signin/MockChangeEventChecker.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/signin/MockChangeEventChecker.java
index 9ead390..76969e89 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/signin/MockChangeEventChecker.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/signin/MockChangeEventChecker.java
@@ -18,7 +18,7 @@
  */
 public final class MockChangeEventChecker
         implements SigninHelper.AccountChangeEventChecker {
-    private Map<String, List<String>> mEvents = new HashMap<>();
+    private final Map<String, List<String>> mEvents = new HashMap<>();
 
     @Override
     public List<String> getAccountChangeEvents(
diff --git a/chrome/test/data/focus_rings/focus_ring_browsertest_dark_mode_button.png b/chrome/test/data/focus_rings/focus_ring_browsertest_dark_mode_button.png
deleted file mode 100644
index 7336590..0000000
--- a/chrome/test/data/focus_rings/focus_ring_browsertest_dark_mode_button.png
+++ /dev/null
Binary files differ
diff --git a/chrome/test/data/focus_rings/focus_ring_browsertest_dark_mode_button_mac.png b/chrome/test/data/focus_rings/focus_ring_browsertest_dark_mode_button_mac.png
deleted file mode 100644
index b0ea727..0000000
--- a/chrome/test/data/focus_rings/focus_ring_browsertest_dark_mode_button_mac.png
+++ /dev/null
Binary files differ
diff --git a/chrome/test/data/focus_rings/focus_ring_browsertest_dark_mode_button_win.png b/chrome/test/data/focus_rings/focus_ring_browsertest_dark_mode_button_win.png
deleted file mode 100644
index 03f91f2..0000000
--- a/chrome/test/data/focus_rings/focus_ring_browsertest_dark_mode_button_win.png
+++ /dev/null
Binary files differ
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM
index 470481e..f6d157b3 100644
--- a/chromeos/CHROMEOS_LKGM
+++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@
-13685.0.0
\ No newline at end of file
+13690.0.0
\ No newline at end of file
diff --git a/chromeos/components/camera_app_ui/resources/css/main.css b/chromeos/components/camera_app_ui/resources/css/main.css
index 0b88716a..2d9a259 100644
--- a/chromeos/components/camera_app_ui/resources/css/main.css
+++ b/chromeos/components/camera_app_ui/resources/css/main.css
@@ -1563,7 +1563,6 @@
   padding-top: calc(100% / 3);
   visibility: hidden;
   width: calc(100% / 3);
-  z-index: 30;
 }
 
 body.photo.scan-barcode .barcode-scan-box {
@@ -1602,10 +1601,20 @@
  * responsive window design. */
 .barcode-chip-container {
   --chip-height: 32px;
+  --chip-max-width: 420px;
+  --min-scanbox-distance: 40px;
+  --text-expand-button-height: 40px;
+  --text-line-height: 24px;
+  --text-padding-vertical: 8px;
+
   left: 50%;
+  max-width: min(80%, var(--chip-max-width));
   opacity: 1;
   position: absolute;
-  top: 10%;
+  /* Avoid collision with scan-box and preview-box */
+  top: max(8px, min(10%, 33.33% - var(--text-line-height) -
+      var(--text-expand-button-height) - 2 * var(--text-padding-vertical) -
+      var(--min-scanbox-distance)));
   transform: translateX(-50%);
   transition: opacity var(--moderate1-duration) var(--standard-easing);
   z-index: 50;
@@ -1633,6 +1642,7 @@
   background: url(/images/barcode_url.svg) no-repeat;
   content: '';
   display: inline-block;
+  flex-shrink: 0;
   height: 20px;
   margin-inline-end: 6px;
   vertical-align: middle;
@@ -1641,7 +1651,6 @@
 
 .barcode-chip-url > a {
   color: var(--blue-300);
-  max-width: 416px;
   overflow: hidden;
   text-decoration: none;
   text-overflow: ellipsis;
@@ -1678,14 +1687,13 @@
   display: flex;
   flex-direction: column;
   font: 400 15px Roboto;
+  padding: var(--text-padding-vertical) 20px;
 }
 
 #barcode-chip-text-content {
-  --line-height: 24px;
   color: var(--grey-200);
-  line-height: var(--line-height);
-  margin: 8px 20px;
-  max-width: 416px;
+  line-height: var(--text-line-height);
+  max-width: 100%;
   overflow: hidden;
   text-decoration: none;
   text-overflow: ellipsis;
@@ -1694,14 +1702,15 @@
 
 .expanded #barcode-chip-text-content {
   /* TODO(b/172879638): Make this responsive */
-  max-height: calc(var(--line-height) * 10);
+  max-height: calc(var(--text-line-height) * 10);
   white-space: normal;
-  width: 416px;
+  /* Keep the same width as before to avoid text jumping. */
+  width: var(--chip-max-width);
 }
 
 #barcode-chip-text-expand {
   background: url(/images/barcode_chevron_down.svg) center no-repeat;
-  height: 40px;
+  height: var(--text-expand-button-height);
   width: 100%;
 }
 
diff --git a/chromeos/components/camera_app_ui/resources/js/barcode_chip.js b/chromeos/components/camera_app_ui/resources/js/barcode_chip.js
index abdc00e..0bad37f 100644
--- a/chromeos/components/camera_app_ui/resources/js/barcode_chip.js
+++ b/chromeos/components/camera_app_ui/resources/js/barcode_chip.js
@@ -5,6 +5,7 @@
 import {browserProxy} from './browser_proxy/browser_proxy.js';
 import {assert} from './chrome_util.js';
 import * as dom from './dom.js';
+import {BarcodeContentType, sendBarcodeDetectedEvent} from './metrics.js';
 import * as snackbar from './snackbar.js';
 import * as state from './state.js';
 import {OneShotTimer} from './timer.js';
@@ -170,8 +171,20 @@
   currentCode = code;
 
   if (isSafeUrl(code)) {
+    sendBarcodeDetectedEvent({contentType: BarcodeContentType.URL});
     showUrl(code);
   } else {
+    sendBarcodeDetectedEvent({contentType: BarcodeContentType.TEXT});
     showText(code);
   }
 }
+
+/**
+ * Dismisses the current barcode chip if it's being shown.
+ */
+export function dismiss() {
+  if (currentTimer === null) {
+    return;
+  }
+  currentTimer.fireNow();
+}
diff --git a/chromeos/components/camera_app_ui/resources/js/metrics.js b/chromeos/components/camera_app_ui/resources/js/metrics.js
index 197de91..9bdc97dd 100644
--- a/chromeos/components/camera_app_ui/resources/js/metrics.js
+++ b/chromeos/components/camera_app_ui/resources/js/metrics.js
@@ -371,3 +371,41 @@
         [20, colNo],
       ]));
 }
+
+/**
+ * Sends the barcode enabled event.
+ */
+export function sendBarcodeEnabledEvent() {
+  sendEvent({
+    eventCategory: 'barcode',
+    eventAction: 'enable',
+  });
+}
+
+/**
+ * Types of the decoded barcode content.
+ * @enum {string}
+ */
+export const BarcodeContentType = {
+  TEXT: 'text',
+  URL: 'url',
+};
+
+/**
+ * @typedef {{
+ *   contentType: !BarcodeContentType,
+ * }}
+ */
+export let BarcodeDetectedEventParam;
+
+/**
+ * Sends the barcode detected event.
+ * @param {!BarcodeDetectedEventParam} param
+ */
+export function sendBarcodeDetectedEvent({contentType}) {
+  sendEvent({
+    eventCategory: 'barcode',
+    eventAction: 'detect',
+    eventLabel: contentType,
+  });
+}
diff --git a/chromeos/components/camera_app_ui/resources/js/models/native_file_system_entry.js b/chromeos/components/camera_app_ui/resources/js/models/native_file_system_entry.js
index 33d247f..c87189c5 100644
--- a/chromeos/components/camera_app_ui/resources/js/models/native_file_system_entry.js
+++ b/chromeos/components/camera_app_ui/resources/js/models/native_file_system_entry.js
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+import {AsyncJobQueue} from '../async_job_queue.js';
 import {assert} from '../chrome_util.js';
 import {NotImplementedError} from '../type.js';
 
@@ -116,6 +117,12 @@
 }
 
 /**
+ * Guards from name collision when creating files.
+ * @type {!AsyncJobQueue}
+ */
+const createFileJobs = new AsyncJobQueue();
+
+/**
  * The directory entry implementation for SWA.
  * @implements {AbstractDirectoryEntry}
  */
@@ -156,11 +163,40 @@
   }
 
   /**
+   * Checks if file or directory with the target name exists.
+   * @param {string} name
+   * @return {!Promise<boolean>}
+   * @private
+   */
+  async isExist_(name) {
+    try {
+      await this.getFile(name);
+      return true;
+    } catch (e) {
+      if (e.name === 'NotFoundError') {
+        return false;
+      }
+      if (e.name === 'TypeMismatchError' || e instanceof TypeError) {
+        // Directory with same name exists.
+        return true;
+      }
+      throw e;
+    }
+  }
+
+  /**
    * @override
    */
   async createFile(name) {
-    const handle = await this.handle_.getFileHandle(name, {create: true});
-    return new NativeFileEntry(handle);
+    return createFileJobs.push(async () => {
+      let uniqueName = name;
+      for (let i = 0; await this.isExist_(uniqueName);) {
+        uniqueName = name.replace(/^(.*?)(?=\.)/, `$& (${++i})`);
+      }
+      const handle =
+          await this.handle_.getFileHandle(uniqueName, {create: true});
+      return new NativeFileEntry(handle);
+    });
   }
 
   /**
diff --git a/chromeos/components/camera_app_ui/resources/js/views/camera/options.js b/chromeos/components/camera_app_ui/resources/js/views/camera/options.js
index c6421fd..6a181d5 100644
--- a/chromeos/components/camera_app_ui/resources/js/views/camera/options.js
+++ b/chromeos/components/camera_app_ui/resources/js/views/camera/options.js
@@ -8,9 +8,10 @@
 // eslint-disable-next-line no-unused-vars
 import {DeviceInfoUpdater} from '../../device/device_info_updater.js';
 import * as dom from '../../dom.js';
+import {sendBarcodeEnabledEvent} from '../../metrics.js';
 import * as nav from '../../nav.js';
 import * as state from '../../state.js';
-import {Facing, PerfEvent, ViewName} from '../../type.js';
+import {Facing, Mode, PerfEvent, ViewName} from '../../type.js';
 import * as util from '../../util.js';
 
 /**
@@ -105,6 +106,13 @@
     this.toggleMirror_.addEventListener('click', () => this.saveMirroring_());
     this.toggleBarcode_.addEventListener('click', () => this.updateBarcode_());
 
+    state.addObserver(Mode.PHOTO, (inPhotoMode) => {
+      if (!inPhotoMode) {
+        this.toggleBarcode_.checked = false;
+        this.updateBarcode_();
+      }
+    });
+
     util.bindElementAriaLabelWithState({
       element: dom.get('#toggle-timer', Element),
       state: state.State.TIMER_3SEC,
@@ -257,6 +265,9 @@
    */
   updateBarcode_() {
     state.set(state.State.SCAN_BARCODE, this.toggleBarcode_.checked);
+    if (this.toggleBarcode_.checked) {
+      sendBarcodeEnabledEvent();
+    }
   }
 
   /**
diff --git a/chromeos/components/camera_app_ui/resources/js/views/camera/preview.js b/chromeos/components/camera_app_ui/resources/js/views/camera/preview.js
index bf0c7d5..253ed54a 100644
--- a/chromeos/components/camera_app_ui/resources/js/views/camera/preview.js
+++ b/chromeos/components/camera_app_ui/resources/js/views/camera/preview.js
@@ -8,8 +8,8 @@
 import {DeviceOperator, parseMetadata} from '../../mojo/device_operator.js';
 import * as nav from '../../nav.js';
 import * as state from '../../state.js';
-import * as util from '../../util.js';
 import {Mode} from '../../type.js';
+import * as util from '../../util.js';
 
 /**
  * Creates a controller for the video preview of Camera view.
@@ -208,6 +208,7 @@
       this.scanner_.start();
     } else {
       this.scanner_.stop();
+      barcodeChip.dismiss();
     }
   }
 
diff --git a/chromeos/components/camera_app_ui/resources/views/main.html b/chromeos/components/camera_app_ui/resources/views/main.html
index 84a2678f..78e33a2 100644
--- a/chromeos/components/camera_app_ui/resources/views/main.html
+++ b/chromeos/components/camera_app_ui/resources/views/main.html
@@ -79,6 +79,30 @@
           <div class="snackbar" aria-live="polite"></div>
           <div id="camera-mode" class="centered-overlay"></div>
         </div>
+        <div id="barcode-chip-url-container"
+             class="invisible barcode-chip-container">
+          <div class="barcode-chip-url">
+            <a target="_blank"></a>
+          </div>
+          <div class="circle">
+            <button class="barcode-copy-button" tabindex="0"
+              i18n-label="barcode_copy_link_button"></button>
+          </div>
+        </div>
+        <div id="barcode-chip-text-container"
+             class="invisible barcode-chip-container"
+             role="dialog" i18n-label="barcode_text_detected"
+             aria-live="polite" aria-describedby="barcode-chip-text-content">
+          <div class="barcode-chip-text">
+            <div id="barcode-chip-text-content"></div>
+            <button id="barcode-chip-text-expand"
+                    aria-expanded="false"></button>
+          </div>
+          <div class="circle">
+            <button class="barcode-copy-button" tabindex="0"
+              i18n-label="barcode_copy_text_button"></button>
+          </div>
+        </div>
       </div>
       <div id="video-snapshot-holder" class="buttons right-stripe circle">
         <button id="video-snapshot" tabindex="0"
@@ -406,29 +430,6 @@
       </div>
     </div>
     <div id="toast" class="centered-overlay" aria-live="polite"></div>
-    <div id="barcode-chip-url-container"
-         class="invisible barcode-chip-container">
-      <div class="barcode-chip-url">
-        <a target="_blank"></a>
-      </div>
-      <div class="circle">
-        <button class="barcode-copy-button" tabindex="0"
-          i18n-label="barcode_copy_link_button"></button>
-      </div>
-    </div>
-    <div id="barcode-chip-text-container"
-         class="invisible barcode-chip-container"
-         role="dialog" i18n-label="barcode_text_detected"
-         aria-live="polite" aria-describedby="barcode-chip-text-content">
-      <div class="barcode-chip-text">
-        <div id="barcode-chip-text-content"></div>
-        <button id="barcode-chip-text-expand" aria-expanded="false"></button>
-      </div>
-      <div class="circle">
-        <button class="barcode-copy-button" tabindex="0"
-          i18n-label="barcode_copy_text_button"></button>
-      </div>
-    </div>
     <div id="tooltip" aria-hidden="true"></div>
     <audio id="sound-tick-final" src="/sounds/tick_final.ogg"
       data-timeout="1000">
diff --git a/components/signin/core/browser/android/javatests/src/org/chromium/components/signin/test/util/AccountHolder.java b/components/signin/core/browser/android/javatests/src/org/chromium/components/signin/test/util/AccountHolder.java
index 3c8cac35..0ed3a5b 100644
--- a/components/signin/core/browser/android/javatests/src/org/chromium/components/signin/test/util/AccountHolder.java
+++ b/components/signin/core/browser/android/javatests/src/org/chromium/components/signin/test/util/AccountHolder.java
@@ -10,7 +10,9 @@
 import androidx.annotation.Nullable;
 
 import org.chromium.components.signin.AccessTokenData;
+import org.chromium.components.signin.AccountUtils;
 
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
@@ -99,6 +101,16 @@
                 && mAccount.equals(((AccountHolder) that).getAccount());
     }
 
+    /**
+     * Creates builder of {@link AccountHolder} for the given account email.
+     */
+    public static Builder builder(String accountEmail) {
+        return new Builder(AccountUtils.createAccountFromName(accountEmail));
+    }
+
+    /**
+     * Creates builder of {@link AccountHolder} for the given account.
+     */
     public static Builder builder(@NonNull Account account) {
         return new Builder(account);
     }
@@ -118,11 +130,11 @@
      * Used to construct AccountHolder instances.
      */
     public static class Builder {
-        private Account mAccount;
+        private final Account mAccount;
         private Map<String, String> mAuthTokens = new HashMap<>();
         private Map<String, Boolean> mHasBeenAccepted = new HashMap<>();
         private boolean mAlwaysAccept;
-        private Set<String> mFeatures = new HashSet<>();
+        private final Set<String> mFeatures = new HashSet<>();
 
         Builder(@NonNull Account account) {
             mAccount = account;
@@ -149,13 +161,10 @@
         }
 
         /**
-         * Sets the set of features for this account.
-         *
-         * @param features The set of account features.
-         * @return This object, for chaining method calls.
+         * Adds features to the set of features for this account.
          */
-        public Builder featureSet(@NonNull Set<String> features) {
-            mFeatures = features;
+        public Builder addFeatures(String... features) {
+            Collections.addAll(mFeatures, features);
             return this;
         }
 
diff --git a/components/signin/core/browser/android/javatests/src/org/chromium/components/signin/test/util/FakeAccountManagerFacade.java b/components/signin/core/browser/android/javatests/src/org/chromium/components/signin/test/util/FakeAccountManagerFacade.java
index 711f6bf..82f4cb7 100644
--- a/components/signin/core/browser/android/javatests/src/org/chromium/components/signin/test/util/FakeAccountManagerFacade.java
+++ b/components/signin/core/browser/android/javatests/src/org/chromium/components/signin/test/util/FakeAccountManagerFacade.java
@@ -177,7 +177,7 @@
      */
     public void addProfileData(ProfileDataSource.ProfileData profileData) {
         assert mFakeProfileDataSource != null : "ProfileDataSource was disabled!";
-        ThreadUtils.runOnUiThreadBlocking(() -> mFakeProfileDataSource.addProfileData(profileData));
+        mFakeProfileDataSource.addProfileData(profileData);
     }
 
     @GuardedBy("mLock")
diff --git a/components/signin/core/browser/android/javatests/src/org/chromium/components/signin/test/util/FakeProfileDataSource.java b/components/signin/core/browser/android/javatests/src/org/chromium/components/signin/test/util/FakeProfileDataSource.java
index 9ce003f..7c1753c 100644
--- a/components/signin/core/browser/android/javatests/src/org/chromium/components/signin/test/util/FakeProfileDataSource.java
+++ b/components/signin/core/browser/android/javatests/src/org/chromium/components/signin/test/util/FakeProfileDataSource.java
@@ -4,7 +4,6 @@
 
 package org.chromium.components.signin.test.util;
 
-import androidx.annotation.MainThread;
 import androidx.annotation.Nullable;
 
 import org.chromium.base.ObserverList;
@@ -55,12 +54,12 @@
      * If the account email of the {@link ProfileData} already exists, replace the old
      * {@link ProfileData} with the given one.
      */
-    @MainThread
     public void addProfileData(ProfileData profileData) {
-        ThreadUtils.assertOnUiThread();
-        mProfileDataMap.put(profileData.getAccountEmail(), profileData);
-        for (Observer observer : mObservers) {
-            observer.onProfileDataUpdated(profileData);
-        }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            mProfileDataMap.put(profileData.getAccountEmail(), profileData);
+            for (Observer observer : mObservers) {
+                observer.onProfileDataUpdated(profileData);
+            }
+        });
     }
 }
diff --git a/components/signin/core/browser/android/junit/src/org/chromium/components/signin/test/AccountManagerFacadeRobolectricTest.java b/components/signin/core/browser/android/junit/src/org/chromium/components/signin/test/AccountManagerFacadeRobolectricTest.java
index ab862ca..6e5c80a 100644
--- a/components/signin/core/browser/android/junit/src/org/chromium/components/signin/test/AccountManagerFacadeRobolectricTest.java
+++ b/components/signin/core/browser/android/junit/src/org/chromium/components/signin/test/AccountManagerFacadeRobolectricTest.java
@@ -37,8 +37,6 @@
 import org.chromium.components.signin.test.util.FakeAccountManagerDelegate;
 import org.chromium.testing.local.CustomShadowUserManager;
 
-import java.util.Arrays;
-import java.util.HashSet;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -225,15 +223,14 @@
         assertChildAccountStatus(bothAccount, ChildAccountStatus.REGULAR_CHILD);
     }
 
-    private Account addTestAccount(String accountName, String... features) {
-        Account account = AccountUtils.createAccountFromName(accountName);
-        AccountHolder holder = AccountHolder.builder(account)
+    private Account addTestAccount(String accountEmail, String... features) {
+        AccountHolder holder = AccountHolder.builder(accountEmail)
                                        .alwaysAccept(true)
-                                       .featureSet(new HashSet<>(Arrays.asList(features)))
+                                       .addFeatures(features)
                                        .build();
         mDelegate.addAccountHolderExplicitly(holder);
         Assert.assertFalse(((AccountManagerFacadeImpl) mFacade).isUpdatePending().get());
-        return account;
+        return holder.getAccount();
     }
 
     private void removeTestAccount(Account account) {
diff --git a/content/browser/direct_sockets/direct_sockets_service_impl.cc b/content/browser/direct_sockets/direct_sockets_service_impl.cc
index 9f6a9ef..92c70ce 100644
--- a/content/browser/direct_sockets/direct_sockets_service_impl.cc
+++ b/content/browser/direct_sockets/direct_sockets_service_impl.cc
@@ -74,8 +74,8 @@
     return;
   }
 
-  // TODO(crbug.com/905818): Populate local_addr from options.
-  const base::Optional<net::IPEndPoint> local_addr = base::nullopt;
+  base::Optional<net::IPEndPoint> local_addr = base::nullopt;
+  PopulateLocalAddr(*options, local_addr);
 
   network::mojom::TCPConnectedSocketOptionsPtr tcp_connected_socket_options =
       network::mojom::TCPConnectedSocketOptions::New();
@@ -182,6 +182,19 @@
   return net::ERR_NOT_IMPLEMENTED;
 }
 
+void DirectSocketsServiceImpl::PopulateLocalAddr(
+    const blink::mojom::DirectSocketOptions& options,
+    base::Optional<net::IPEndPoint>& local_addr) {
+  DCHECK(!local_addr);
+  if (!options.local_hostname)
+    return;
+
+  net::IPAddress local_address;
+  bool success = local_address.AssignFromIPLiteral(*options.local_hostname);
+  if (success)
+    local_addr = net::IPEndPoint(local_address, options.local_port);
+}
+
 network::mojom::NetworkContext* DirectSocketsServiceImpl::GetNetworkContext() {
   if (network::mojom::NetworkContext* network_context =
           GetNetworkContextForTesting()) {
diff --git a/content/browser/direct_sockets/direct_sockets_service_impl.h b/content/browser/direct_sockets/direct_sockets_service_impl.h
index 227b16758..c705e66d 100644
--- a/content/browser/direct_sockets/direct_sockets_service_impl.h
+++ b/content/browser/direct_sockets/direct_sockets_service_impl.h
@@ -71,6 +71,10 @@
   net::Error ValidateOptions(const blink::mojom::DirectSocketOptions& options,
                              net::IPAddress& remote_address);
 
+  // Populate |local_addr| from options.
+  void PopulateLocalAddr(const blink::mojom::DirectSocketOptions& options,
+                         base::Optional<net::IPEndPoint>& local_addr);
+
   network::mojom::NetworkContext* GetNetworkContext();
 
   RenderFrameHost* frame_host_;
diff --git a/content/browser/direct_sockets/direct_sockets_unittest.cc b/content/browser/direct_sockets/direct_sockets_unittest.cc
index ce023ed..843cabe 100644
--- a/content/browser/direct_sockets/direct_sockets_unittest.cc
+++ b/content/browser/direct_sockets/direct_sockets_unittest.cc
@@ -36,6 +36,11 @@
     return direct_sockets_service().ValidateOptions(options, remote_address);
   }
 
+  void PopulateLocalAddr(const blink::mojom::DirectSocketOptions& options,
+                         base::Optional<net::IPEndPoint>& local_addr) {
+    return direct_sockets_service().PopulateLocalAddr(options, local_addr);
+  }
+
  private:
   base::test::ScopedFeatureList feature_list_;
   std::unique_ptr<DirectSocketsServiceImpl> direct_sockets_service_;
@@ -61,4 +66,35 @@
   EXPECT_EQ(ValidateOptions(options), net::ERR_NAME_NOT_RESOLVED);
 }
 
+TEST_F(DirectSocketsUnitTest, PopulateLocalAddr) {
+  blink::mojom::DirectSocketOptions options;
+
+  // Test for default condition.
+  base::Optional<net::IPEndPoint> local_addr = base::nullopt;
+  PopulateLocalAddr(options, local_addr);
+  EXPECT_EQ(local_addr, base::nullopt);
+
+  // Test with IPv4 address and default port(0) provided.
+  local_addr = base::nullopt;
+  options.local_hostname = "12.34.56.78";
+  PopulateLocalAddr(options, local_addr);
+  const uint8_t ipv4[net::IPAddress::kIPv4AddressSize] = {12, 34, 56, 78};
+  EXPECT_EQ(local_addr, net::IPEndPoint(net::IPAddress(ipv4), 0));
+
+  // Test with IPv6 address and default port(0) provided.
+  local_addr = base::nullopt;
+  options.local_hostname = "fedc:ba98:7654:3210:fedc:ba98:7654:3210";
+  PopulateLocalAddr(options, local_addr);
+  const uint8_t ipv6[net::IPAddress::kIPv6AddressSize] = {
+      0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
+      0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10};
+  EXPECT_EQ(local_addr, net::IPEndPoint(net::IPAddress(ipv6), 0));
+
+  // Test with IPv6 address and port(12345) provided.
+  local_addr = base::nullopt;
+  options.local_port = 12345;
+  PopulateLocalAddr(options, local_addr);
+  EXPECT_EQ(local_addr, net::IPEndPoint(net::IPAddress(ipv6), 12345));
+}
+
 }  // namespace content
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 8056f3b..77226795 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -3957,6 +3957,11 @@
 }
 
 bool WebContentsImpl::ShouldIgnoreUnresponsiveRenderer() {
+  // Suppress unresponsive renderers if the command line asks for it.
+  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kDisableHangMonitor))
+    return true;
+
   if (suppress_unresponsive_renderer_count_ > 0)
     return true;
 
diff --git a/extensions/browser/BUILD.gn b/extensions/browser/BUILD.gn
index 7f93bfed..2dc05ba9 100644
--- a/extensions/browser/BUILD.gn
+++ b/extensions/browser/BUILD.gn
@@ -529,7 +529,6 @@
       "api/audio/audio_apitest_chromeos.cc",
       "api/cec_private/cec_private_apitest.cc",
       "api/media_perception_private/media_perception_private_apitest.cc",
-      "api/system_power_source/system_power_source_apitest.cc",
       "api/virtual_keyboard/virtual_keyboard_apitest.cc",
     ]
 
@@ -773,7 +772,6 @@
       "api/media_perception_private/conversion_utils_unittest.cc",
       "api/media_perception_private/media_perception_api_manager_unittest.cc",
       "api/networking_private/networking_private_chromeos_unittest.cc",
-      "api/system_power_source/system_power_source_api_unittest.cc",
       "api/virtual_keyboard_private/virtual_keyboard_private_api_unittest.cc",
       "api/webcam_private/visca_webcam_unittest.cc",
     ]
diff --git a/extensions/browser/api/BUILD.gn b/extensions/browser/api/BUILD.gn
index f6912aef..426b3316 100644
--- a/extensions/browser/api/BUILD.gn
+++ b/extensions/browser/api/BUILD.gn
@@ -133,7 +133,6 @@
       "//extensions/browser/api/cec_private",
       "//extensions/browser/api/clipboard",
       "//extensions/browser/api/diagnostics",
-      "//extensions/browser/api/system_power_source",
       "//extensions/browser/api/virtual_keyboard",
       "//extensions/browser/api/vpn_provider",
       "//extensions/browser/api/webcam_private",
diff --git a/extensions/browser/api/system_power_source/BUILD.gn b/extensions/browser/api/system_power_source/BUILD.gn
deleted file mode 100644
index f014563..0000000
--- a/extensions/browser/api/system_power_source/BUILD.gn
+++ /dev/null
@@ -1,19 +0,0 @@
-# Copyright 2018 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//extensions/buildflags/buildflags.gni")
-
-assert(enable_extensions,
-       "Cannot depend on extensions because enable_extensions=false.")
-
-source_set("system_power_source") {
-  sources = [
-    "system_power_source_api.cc",
-    "system_power_source_api.h",
-  ]
-
-  deps = [ "//extensions/common/api" ]
-
-  public_deps = [ "//extensions/browser:browser_sources" ]
-}
diff --git a/extensions/browser/api/system_power_source/system_power_source_api.cc b/extensions/browser/api/system_power_source/system_power_source_api.cc
deleted file mode 100644
index e99e4fc..0000000
--- a/extensions/browser/api/system_power_source/system_power_source_api.cc
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "extensions/browser/api/system_power_source/system_power_source_api.h"
-
-#include <cmath>
-
-#include "base/no_destructor.h"
-#include "chromeos/dbus/power/power_manager_client.h"
-#include "extensions/browser/event_router.h"
-#include "extensions/common/api/system_power_source.h"
-
-namespace extensions {
-
-namespace {
-
-std::unique_ptr<double> RoundDownToTwoSignificantDigits(double d) {
-  if (!std::isnormal(d) || d <= 0.0)
-    return nullptr;
-
-  int scale = std::floor(std::log10(d));
-  return std::make_unique<double>(std::floor(d / std::pow(10, scale - 1)) *
-                                  std::pow(10, scale - 1));
-}
-
-api::system_power_source::PowerSourceType PowerSourceTypeFromProtoValue(
-    power_manager::PowerSupplyProperties_PowerSource_Type type) {
-  switch (type) {
-    case power_manager::PowerSupplyProperties_PowerSource_Type_OTHER:
-      return api::system_power_source::POWER_SOURCE_TYPE_UNKNOWN;
-
-    case power_manager::PowerSupplyProperties_PowerSource_Type_MAINS:
-      return api::system_power_source::POWER_SOURCE_TYPE_MAINS;
-
-    case power_manager::PowerSupplyProperties_PowerSource_Type_USB_C:
-    case power_manager::PowerSupplyProperties_PowerSource_Type_USB_BC_1_2:
-      return api::system_power_source::POWER_SOURCE_TYPE_USB;
-  }
-  NOTREACHED();
-  return api::system_power_source::POWER_SOURCE_TYPE_UNKNOWN;
-}
-
-std::vector<api::system_power_source::PowerSourceInfo>
-PowerSourceInfoVectorFromProtoValue(
-    const power_manager::PowerSupplyProperties& proto) {
-  std::vector<api::system_power_source::PowerSourceInfo> power_sources;
-  base::Optional<std::string> external_power_source_id;
-
-  if (proto.has_external_power_source_id())
-    external_power_source_id = proto.external_power_source_id();
-
-  power_sources.reserve(proto.available_external_power_source_size());
-  for (int i = 0; i < proto.available_external_power_source_size(); ++i) {
-    const power_manager::PowerSupplyProperties_PowerSource& power_source_in =
-        proto.available_external_power_source(i);
-    api::system_power_source::PowerSourceInfo power_source_out;
-
-    power_source_out.type =
-        power_source_in.has_type()
-            ? PowerSourceTypeFromProtoValue(power_source_in.type())
-            : api::system_power_source::POWER_SOURCE_TYPE_UNKNOWN;
-
-    if (power_source_in.has_max_power()) {
-      // Round to two significant digits for privacy reasons, to reduce the risk
-      // of finger-printing.
-      power_source_out.max_power =
-          RoundDownToTwoSignificantDigits(power_source_in.max_power());
-    }
-
-    power_source_out.active =
-        external_power_source_id.has_value() &&
-        external_power_source_id.value() == power_source_in.id();
-
-    power_sources.push_back(std::move(power_source_out));
-  }
-
-  return power_sources;
-}
-
-}  // namespace
-
-// static
-BrowserContextKeyedAPIFactory<SystemPowerSourceAPI>*
-SystemPowerSourceAPI::GetFactoryInstance() {
-  static base::NoDestructor<BrowserContextKeyedAPIFactory<SystemPowerSourceAPI>>
-      instance;
-  return instance.get();
-}
-
-SystemPowerSourceAPI::SystemPowerSourceAPI(content::BrowserContext* context)
-    : browser_context_(context), power_manager_observer_(this) {
-  power_manager_observer_.Add(chromeos::PowerManagerClient::Get());
-}
-
-SystemPowerSourceAPI::~SystemPowerSourceAPI() = default;
-
-void SystemPowerSourceAPI::PowerChanged(
-    const power_manager::PowerSupplyProperties& proto) {
-  EventRouter* event_router = EventRouter::Get(browser_context_);
-  if (!event_router)
-    return;
-
-  std::unique_ptr<base::ListValue> args =
-      api::system_power_source::OnPowerChanged::Create(
-          PowerSourceInfoVectorFromProtoValue(proto));
-
-  auto event = std::make_unique<Event>(
-      events::SYSTEM_POWER_SOURCE_ONPOWERCHANGED,
-      api::system_power_source::OnPowerChanged::kEventName, std::move(args));
-  event_router->BroadcastEvent(std::move(event));
-}
-
-SystemPowerSourceGetPowerSourceInfoFunction::
-    SystemPowerSourceGetPowerSourceInfoFunction() = default;
-
-SystemPowerSourceGetPowerSourceInfoFunction::
-    ~SystemPowerSourceGetPowerSourceInfoFunction() = default;
-
-ExtensionFunction::ResponseAction
-SystemPowerSourceGetPowerSourceInfoFunction::Run() {
-  const base::Optional<power_manager::PowerSupplyProperties>&
-      power_supply_properties =
-          chromeos::PowerManagerClient::Get()->GetLastStatus();
-
-  if (!power_supply_properties.has_value())
-    return RespondNow(NoArguments());
-
-  return RespondNow(ArgumentList(
-      api::system_power_source::GetPowerSourceInfo::Results::Create(
-          PowerSourceInfoVectorFromProtoValue(*power_supply_properties))));
-}
-
-SystemPowerSourceRequestStatusUpdateFunction::
-    SystemPowerSourceRequestStatusUpdateFunction() = default;
-
-SystemPowerSourceRequestStatusUpdateFunction::
-    ~SystemPowerSourceRequestStatusUpdateFunction() = default;
-
-ExtensionFunction::ResponseAction
-SystemPowerSourceRequestStatusUpdateFunction::Run() {
-  chromeos::PowerManagerClient::Get()->RequestStatusUpdate();
-  return RespondNow(NoArguments());
-}
-
-}  // namespace extensions
diff --git a/extensions/browser/api/system_power_source/system_power_source_api.h b/extensions/browser/api/system_power_source/system_power_source_api.h
deleted file mode 100644
index 0ea3474..0000000
--- a/extensions/browser/api/system_power_source/system_power_source_api.h
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef EXTENSIONS_BROWSER_API_SYSTEM_POWER_SOURCE_SYSTEM_POWER_SOURCE_API_H_
-#define EXTENSIONS_BROWSER_API_SYSTEM_POWER_SOURCE_SYSTEM_POWER_SOURCE_API_H_
-
-#include "base/scoped_observer.h"
-#include "chromeos/dbus/power/power_manager_client.h"
-#include "extensions/browser/browser_context_keyed_api_factory.h"
-#include "extensions/browser/extension_function.h"
-#include "extensions/browser/extension_function_histogram_value.h"
-
-namespace extensions {
-
-class SystemPowerSourceAPI : public BrowserContextKeyedAPI,
-                             public chromeos::PowerManagerClient::Observer {
- public:
-  explicit SystemPowerSourceAPI(content::BrowserContext* context);
-  ~SystemPowerSourceAPI() override;
-
-  // BrowserContextKeyedAPI implementation.
-  static BrowserContextKeyedAPIFactory<SystemPowerSourceAPI>*
-  GetFactoryInstance();
-
- private:
-  friend class BrowserContextKeyedAPIFactory<SystemPowerSourceAPI>;
-
-  // BrowserContextKeyedAPI implementation.
-  static const char* service_name() { return "SystemPowerSourceAPI"; }
-  static const bool kServiceIsNULLWhileTesting = true;
-
-  // Overridden from PowerManagerClient::Observer.
-  void PowerChanged(const power_manager::PowerSupplyProperties& proto) override;
-
-  content::BrowserContext* const browser_context_;
-  ScopedObserver<chromeos::PowerManagerClient,
-                 chromeos::PowerManagerClient::Observer>
-      power_manager_observer_;
-
-  DISALLOW_COPY_AND_ASSIGN(SystemPowerSourceAPI);
-};
-
-class SystemPowerSourceGetPowerSourceInfoFunction : public ExtensionFunction {
- public:
-  SystemPowerSourceGetPowerSourceInfoFunction();
-
-  DECLARE_EXTENSION_FUNCTION("system.powerSource.getPowerSourceInfo",
-                             SYSTEM_POWER_SOURCE_GETPOWERSOURCEINFO)
-
- protected:
-  ~SystemPowerSourceGetPowerSourceInfoFunction() override;
-
-  ResponseAction Run() override;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(SystemPowerSourceGetPowerSourceInfoFunction);
-};
-
-class SystemPowerSourceRequestStatusUpdateFunction : public ExtensionFunction {
- public:
-  SystemPowerSourceRequestStatusUpdateFunction();
-
-  DECLARE_EXTENSION_FUNCTION("system.powerSource.requestStatusUpdate",
-                             SYSTEM_POWER_SOURCE_REQUESTSTATUSUPDATE)
-
- protected:
-  ~SystemPowerSourceRequestStatusUpdateFunction() override;
-
-  ResponseAction Run() override;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(SystemPowerSourceRequestStatusUpdateFunction);
-};
-
-}  // namespace extensions
-
-#endif  // EXTENSIONS_BROWSER_API_SYSTEM_POWER_SOURCE_SYSTEM_POWER_SOURCE_API_H_
diff --git a/extensions/browser/api/system_power_source/system_power_source_api_unittest.cc b/extensions/browser/api/system_power_source/system_power_source_api_unittest.cc
deleted file mode 100644
index c7605ed..0000000
--- a/extensions/browser/api/system_power_source/system_power_source_api_unittest.cc
+++ /dev/null
@@ -1,397 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <limits>
-
-#include "base/bind.h"
-#include "chromeos/dbus/power/fake_power_manager_client.h"
-#include "extensions/browser/api/system_power_source/system_power_source_api.h"
-#include "extensions/browser/api_test_utils.h"
-#include "extensions/browser/api_unittest.h"
-#include "extensions/browser/event_router.h"
-#include "extensions/browser/event_router_factory.h"
-#include "extensions/common/api/system_power_source.h"
-#include "extensions/common/extension_builder.h"
-
-using extensions::api::system_power_source::PowerSourceInfo;
-using extensions::api_test_utils::RunFunctionAndReturnSingleResult;
-namespace power_source_api = extensions::api::system_power_source;
-
-namespace extensions {
-
-namespace {
-
-class SystemPowerSourceApiUnitTest : public ApiUnitTest {
- public:
-  SystemPowerSourceApiUnitTest() = default;
-  ~SystemPowerSourceApiUnitTest() override = default;
-
-  void SetUp() override {
-    ApiUnitTest::SetUp();
-    chromeos::PowerManagerClient::InitializeFake();
-  }
-
-  void TearDown() override {
-    chromeos::PowerManagerClient::Shutdown();
-    ApiUnitTest::TearDown();
-  }
-
-  std::unique_ptr<base::Value> RunGetPowerSourceInfoFunction() {
-    scoped_refptr<SystemPowerSourceGetPowerSourceInfoFunction>
-        get_power_source_info_function(
-            new SystemPowerSourceGetPowerSourceInfoFunction());
-
-    get_power_source_info_function->set_extension(extension());
-    get_power_source_info_function->set_has_callback(true);
-
-    return RunFunctionAndReturnSingleResult(
-        get_power_source_info_function.get(), "[]", browser_context());
-  }
-
-  std::unique_ptr<base::Value> RunRequestStatusUpdateFunction() {
-    scoped_refptr<SystemPowerSourceRequestStatusUpdateFunction>
-        request_status_update_function(
-            new SystemPowerSourceRequestStatusUpdateFunction());
-
-    request_status_update_function->set_extension(extension());
-
-    return RunFunctionAndReturnSingleResult(
-        request_status_update_function.get(), "[]", browser_context());
-  }
-
-  chromeos::FakePowerManagerClient* power_manager_client() {
-    return chromeos::FakePowerManagerClient::Get();
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(SystemPowerSourceApiUnitTest);
-};
-
-class TestEventRouter : public EventRouter {
- public:
-  explicit TestEventRouter(content::BrowserContext* context)
-      : EventRouter(context, nullptr) {}
-  ~TestEventRouter() override = default;
-
-  void BroadcastEvent(std::unique_ptr<Event> event) override {
-    if (event->event_name !=
-        api::system_power_source::OnPowerChanged::kEventName) {
-      return;
-    }
-    ASSERT_TRUE(event->event_args);
-    ASSERT_EQ(1u, event->event_args->GetList().size());
-    power_source_info_.emplace_back(event->event_args->GetList()[0].Clone());
-  }
-
-  const std::vector<base::Value>& power_source_info() const {
-    return power_source_info_;
-  }
-
-  void clear_power_source_info() { power_source_info_.clear(); }
-
- private:
-  std::vector<base::Value> power_source_info_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestEventRouter);
-};
-
-std::unique_ptr<KeyedService> TestEventRouterFactoryFunction(
-    content::BrowserContext* context) {
-  return std::make_unique<TestEventRouter>(context);
-}
-
-power_manager::PowerSupplyProperties MakePowerSupplyProperties(
-    const base::Optional<std::string>& external_power_source_id,
-    const std::vector<power_manager::PowerSupplyProperties_PowerSource>&
-        power_sources) {
-  power_manager::PowerSupplyProperties props;
-  if (external_power_source_id)
-    props.set_external_power_source_id(*external_power_source_id);
-
-  for (const auto& power_source : power_sources)
-    *props.add_available_external_power_source() = power_source;
-
-  return props;
-}
-
-power_manager::PowerSupplyProperties_PowerSource MakePowerSource(
-    const std::string& id,
-    power_manager::PowerSupplyProperties_PowerSource_Type type,
-    double max_power) {
-  power_manager::PowerSupplyProperties_PowerSource power_source;
-  power_source.set_id(id);
-  power_source.set_type(type);
-  power_source.set_max_power(max_power);
-  return power_source;
-}
-
-}  // namespace
-
-// Barrel jack connected
-TEST_F(SystemPowerSourceApiUnitTest, GetPowerSourceAc) {
-  power_manager_client()->UpdatePowerProperties(MakePowerSupplyProperties(
-      "AC",
-      {MakePowerSource(
-          "AC", power_manager::PowerSupplyProperties_PowerSource_Type_MAINS,
-          0)}));
-
-  std::unique_ptr<base::Value> result = RunGetPowerSourceInfoFunction();
-  ASSERT_TRUE(result);
-
-  std::unique_ptr<base::Value> expected_result =
-      ListBuilder()
-          .Append(DictionaryBuilder()
-                      .Set("type", "mains")
-                      .Set("active", true)
-                      .Build())
-          .Build();
-
-  EXPECT_EQ(*expected_result, *result);
-}
-
-// USB-C PD charger connected
-TEST_F(SystemPowerSourceApiUnitTest, GetPowerSourceUsb) {
-  power_manager_client()->UpdatePowerProperties(MakePowerSupplyProperties(
-      "CROS_USB_PD_CHARGER0",
-      {{MakePowerSource(
-          "CROS_USB_PD_CHARGER0",
-          power_manager::PowerSupplyProperties_PowerSource_Type_USB_C, 60)}}));
-
-  std::unique_ptr<base::Value> result = RunGetPowerSourceInfoFunction();
-  ASSERT_TRUE(result);
-
-  std::unique_ptr<base::Value> expected_result =
-      ListBuilder()
-          .Append(DictionaryBuilder()
-                      .Set("type", "usb")
-                      .Set("maxPower", 60.0)
-                      .Set("active", true)
-                      .Build())
-          .Build();
-
-  EXPECT_EQ(*expected_result, *result);
-}
-
-// Barrel Jack + USB-C PD charger connected; Barrel Jack active
-TEST_F(SystemPowerSourceApiUnitTest, GetPowerSourceAcActiveAndUsbInactive) {
-  power_manager_client()->UpdatePowerProperties(MakePowerSupplyProperties(
-      "AC",
-      {{MakePowerSource(
-            "AC", power_manager::PowerSupplyProperties_PowerSource_Type_MAINS,
-            0),
-        MakePowerSource(
-            "CROS_USB_PD_CHARGER0",
-            power_manager::PowerSupplyProperties_PowerSource_Type_USB_C,
-            60)}}));
-
-  std::unique_ptr<base::Value> result = RunGetPowerSourceInfoFunction();
-  ASSERT_TRUE(result);
-
-  std::unique_ptr<base::Value> expected_result =
-      ListBuilder()
-          .Append(DictionaryBuilder()
-                      .Set("type", "mains")
-                      .Set("active", true)
-                      .Build())
-          .Append(DictionaryBuilder()
-                      .Set("type", "usb")
-                      .Set("maxPower", 60.0)
-                      .Set("active", false)
-                      .Build())
-          .Build();
-
-  EXPECT_EQ(*expected_result, *result);
-}
-
-// Barrel Jack + USB-C PD charger connected; USB-C charger active
-TEST_F(SystemPowerSourceApiUnitTest, GetPowerSourceAcInactiveAndUsbActive) {
-  power_manager_client()->UpdatePowerProperties(MakePowerSupplyProperties(
-      "CROS_USB_PD_CHARGER0",
-      {{MakePowerSource(
-            "AC", power_manager::PowerSupplyProperties_PowerSource_Type_MAINS,
-            0),
-        MakePowerSource(
-            "CROS_USB_PD_CHARGER0",
-            power_manager::PowerSupplyProperties_PowerSource_Type_USB_C,
-            60)}}));
-
-  std::unique_ptr<base::Value> result = RunGetPowerSourceInfoFunction();
-  ASSERT_TRUE(result);
-
-  std::unique_ptr<base::Value> expected_result =
-      ListBuilder()
-          .Append(DictionaryBuilder()
-                      .Set("type", "mains")
-                      .Set("active", false)
-                      .Build())
-          .Append(DictionaryBuilder()
-                      .Set("type", "usb")
-                      .Set("maxPower", 60.0)
-                      .Set("active", true)
-                      .Build())
-          .Build();
-
-  EXPECT_EQ(*expected_result, *result);
-}
-
-// Barrel Jack + USB-C PD charger connected; neither active
-TEST_F(SystemPowerSourceApiUnitTest, GetPowerSourceNoneActive) {
-  power_manager_client()->UpdatePowerProperties(MakePowerSupplyProperties(
-      base::nullopt,
-      {{MakePowerSource(
-            "AC", power_manager::PowerSupplyProperties_PowerSource_Type_MAINS,
-            0),
-        MakePowerSource(
-            "CROS_USB_PD_CHARGER0",
-            power_manager::PowerSupplyProperties_PowerSource_Type_USB_C,
-            60)}}));
-
-  std::unique_ptr<base::Value> result = RunGetPowerSourceInfoFunction();
-  ASSERT_TRUE(result);
-
-  std::unique_ptr<base::Value> expected_result =
-      ListBuilder()
-          .Append(DictionaryBuilder()
-                      .Set("type", "mains")
-                      .Set("active", false)
-                      .Build())
-          .Append(DictionaryBuilder()
-                      .Set("type", "usb")
-                      .Set("maxPower", 60.0)
-                      .Set("active", false)
-                      .Build())
-          .Build();
-
-  EXPECT_EQ(*expected_result, *result);
-}
-
-// Connected USB chargers with fractional max power gets rounded down to
-// two significant digits (for privacy reasons, to reduce the risk of
-// finger-printing).  Chargers with a max power that is not a normal value
-// larger than zero are reported as not having a max power value.
-TEST_F(SystemPowerSourceApiUnitTest, GetPowerSourceRounding) {
-  power_manager_client()->UpdatePowerProperties(MakePowerSupplyProperties(
-      "CROS_USB_PD_CHARGER0",
-      {{MakePowerSource(
-            "CROS_USB_PD_CHARGER0",
-            power_manager::PowerSupplyProperties_PowerSource_Type_USB_C, 111.0),
-        MakePowerSource(
-            "CROS_USB_PD_CHARGER1",
-            power_manager::PowerSupplyProperties_PowerSource_Type_USB_C, 11.1),
-        MakePowerSource(
-            "CROS_USB_PD_CHARGER2",
-            power_manager::PowerSupplyProperties_PowerSource_Type_USB_C, 1.11),
-        MakePowerSource(
-            "CROS_USB_PD_CHARGER3",
-            power_manager::PowerSupplyProperties_PowerSource_Type_USB_C, 0.111),
-        MakePowerSource(
-            "CROS_USB_PD_CHARGER4",
-            power_manager::PowerSupplyProperties_PowerSource_Type_USB_C, -1),
-        MakePowerSource(
-            "CROS_USB_PD_CHARGER5",
-            power_manager::PowerSupplyProperties_PowerSource_Type_USB_C,
-            std::nan("")),
-        MakePowerSource(
-            "CROS_USB_PD_CHARGER6",
-            power_manager::PowerSupplyProperties_PowerSource_Type_USB_C,
-            std::numeric_limits<double>::infinity())}}));
-
-  std::unique_ptr<base::Value> result = RunGetPowerSourceInfoFunction();
-  ASSERT_TRUE(result);
-
-  std::unique_ptr<base::Value> expected_result =
-      ListBuilder()
-          .Append(DictionaryBuilder()
-                      .Set("type", "usb")
-                      .Set("maxPower", 110.0)
-                      .Set("active", true)
-                      .Build())
-          .Append(DictionaryBuilder()
-                      .Set("type", "usb")
-                      .Set("maxPower", 11.0)
-                      .Set("active", false)
-                      .Build())
-          .Append(DictionaryBuilder()
-                      .Set("type", "usb")
-                      .Set("maxPower", 1.1)
-                      .Set("active", false)
-                      .Build())
-          .Append(DictionaryBuilder()
-                      .Set("type", "usb")
-                      .Set("maxPower", 0.11)
-                      .Set("active", false)
-                      .Build())
-          .Append(DictionaryBuilder()
-                      .Set("type", "usb")
-                      .Set("active", false)
-                      .Build())
-          .Append(DictionaryBuilder()
-                      .Set("type", "usb")
-                      .Set("active", false)
-                      .Build())
-          .Append(DictionaryBuilder()
-                      .Set("type", "usb")
-                      .Set("active", false)
-                      .Build())
-          .Build();
-
-  EXPECT_EQ(*expected_result, *result);
-}
-
-TEST_F(SystemPowerSourceApiUnitTest, OnPowerChangedEvent) {
-  TestEventRouter* event_router = static_cast<TestEventRouter*>(
-      EventRouterFactory::GetInstance()->SetTestingFactoryAndUse(
-          browser_context(),
-          base::BindRepeating(&TestEventRouterFactoryFunction)));
-  SystemPowerSourceAPI system_power_source_api(browser_context());
-
-  power_manager_client()->UpdatePowerProperties(MakePowerSupplyProperties(
-      "AC",
-      {MakePowerSource(
-          "AC", power_manager::PowerSupplyProperties_PowerSource_Type_MAINS,
-          0)}));
-
-  std::unique_ptr<base::Value> expected_result =
-      ListBuilder()
-          .Append(DictionaryBuilder()
-                      .Set("type", "mains")
-                      .Set("active", true)
-                      .Build())
-          .Build();
-
-  ASSERT_EQ(1U, event_router->power_source_info().size());
-  EXPECT_EQ(*expected_result, event_router->power_source_info()[0]);
-}
-
-TEST_F(SystemPowerSourceApiUnitTest, RequestStatusUpdate) {
-  TestEventRouter* event_router = static_cast<TestEventRouter*>(
-      EventRouterFactory::GetInstance()->SetTestingFactoryAndUse(
-          browser_context(),
-          base::BindRepeating(&TestEventRouterFactoryFunction)));
-  SystemPowerSourceAPI system_power_source_api(browser_context());
-
-  power_manager_client()->UpdatePowerProperties(MakePowerSupplyProperties(
-      "AC",
-      {MakePowerSource(
-          "AC", power_manager::PowerSupplyProperties_PowerSource_Type_MAINS,
-          0)}));
-
-  event_router->clear_power_source_info();
-
-  RunRequestStatusUpdateFunction();
-  base::RunLoop().RunUntilIdle();
-
-  std::unique_ptr<base::Value> expected_result =
-      ListBuilder()
-          .Append(DictionaryBuilder()
-                      .Set("type", "mains")
-                      .Set("active", true)
-                      .Build())
-          .Build();
-
-  ASSERT_EQ(1U, event_router->power_source_info().size());
-  EXPECT_EQ(*expected_result, event_router->power_source_info()[0]);
-}
-
-}  // namespace extensions
diff --git a/extensions/browser/api/system_power_source/system_power_source_apitest.cc b/extensions/browser/api/system_power_source/system_power_source_apitest.cc
deleted file mode 100644
index e937a20..0000000
--- a/extensions/browser/api/system_power_source/system_power_source_apitest.cc
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <memory>
-#include <utility>
-
-#include "base/macros.h"
-#include "chromeos/dbus/power/fake_power_manager_client.h"
-#include "chromeos/dbus/power_manager/power_supply_properties.pb.h"
-#include "extensions/common/features/feature_session_type.h"
-#include "extensions/common/mojom/feature_session_type.mojom.h"
-#include "extensions/shell/test/shell_apitest.h"
-#include "extensions/test/result_catcher.h"
-
-namespace extensions {
-
-namespace {
-
-using SystemPowerSourceApiTest = ShellApiTest;
-
-}  // namespace
-
-IN_PROC_BROWSER_TEST_F(SystemPowerSourceApiTest, TestAllApiFunctions) {
-  std::unique_ptr<base::AutoReset<mojom::FeatureSessionType>> session_type =
-      ScopedCurrentFeatureSessionType(mojom::FeatureSessionType::kKiosk);
-
-  // These values must match the assertions in
-  // extensions/test/data/api_test/system_power_source/api/background.js.
-  power_manager::PowerSupplyProperties_PowerSource power_source;
-  power_source.set_id("AC");
-  power_source.set_type(
-      power_manager::PowerSupplyProperties_PowerSource_Type_MAINS);
-  power_source.set_max_power(0);
-
-  power_manager::PowerSupplyProperties props;
-  props.set_external_power_source_id("AC");
-  *props.add_available_external_power_source() = power_source;
-
-  chromeos::FakePowerManagerClient::Get()->UpdatePowerProperties(props);
-
-  EXPECT_TRUE(RunAppTest("api_test/system_power_source/api"));
-}
-
-}  // namespace extensions
diff --git a/extensions/browser/browser_context_keyed_service_factories.cc b/extensions/browser/browser_context_keyed_service_factories.cc
index 6f0475c..1647fa88 100644
--- a/extensions/browser/browser_context_keyed_service_factories.cc
+++ b/extensions/browser/browser_context_keyed_service_factories.cc
@@ -48,16 +48,11 @@
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 #include "extensions/browser/api/clipboard/clipboard_api.h"
-#include "extensions/browser/api/system_power_source/system_power_source_api.h"
 #include "extensions/browser/api/virtual_keyboard_private/virtual_keyboard_private_api.h"
 #include "extensions/browser/api/vpn_provider/vpn_service_factory.h"
 #include "extensions/browser/api/webcam_private/webcam_private_api.h"
 #endif
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "extensions/browser/api/system_power_source/system_power_source_api.h"
-#endif
-
 namespace extensions {
 
 void EnsureBrowserContextKeyedServiceFactoriesBuilt() {
@@ -103,9 +98,6 @@
   RuntimeAPI::GetFactoryInstance();
   StorageFrontend::GetFactoryInstance();
   SystemInfoAPI::GetFactoryInstance();
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-  SystemPowerSourceAPI::GetFactoryInstance();
-#endif
   UpdateServiceFactory::GetInstance();
   UsbDeviceManager::GetFactoryInstance();
 #if BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/extensions/browser/extension_event_histogram_value.h b/extensions/browser/extension_event_histogram_value.h
index a251b066..9763a6d 100644
--- a/extensions/browser/extension_event_histogram_value.h
+++ b/extensions/browser/extension_event_histogram_value.h
@@ -442,7 +442,7 @@
   SAFE_BROWSING_PRIVATE_ON_SECURITY_INTERSTITIAL_PROCEEDED = 420,
   ACCESSIBILITY_PRIVATE_ON_SELECT_TO_SPEAK_STATE_CHANGE_REQUESTED = 421,
   INPUT_METHOD_PRIVATE_ON_FOCUS = 422,
-  SYSTEM_POWER_SOURCE_ONPOWERCHANGED = 423,
+  DELETED_SYSTEM_POWER_SOURCE_ONPOWERCHANGED = 423,
   WEB_REQUEST_ON_ACTION_IGNORED = 424,
   ARC_APPS_PRIVATE_ON_INSTALLED = 425,
   FILE_MANAGER_PRIVATE_ON_CROSTINI_CHANGED = 426,
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h
index c11d02b..9056ec1 100644
--- a/extensions/browser/extension_function_histogram_value.h
+++ b/extensions/browser/extension_function_histogram_value.h
@@ -1319,8 +1319,8 @@
   USERSPRIVATE_GETCURRENTUSER = 1256,
   WALLPAPERPRIVATE_GETSURPRISEMEIMAGE = 1257,
   VIRTUALKEYBOARDPRIVATE_SETOCCLUDEDBOUNDS = 1258,
-  SYSTEM_POWER_SOURCE_GETPOWERSOURCEINFO = 1259,
-  SYSTEM_POWER_SOURCE_REQUESTSTATUSUPDATE = 1260,
+  DELETED_SYSTEM_POWER_SOURCE_GETPOWERSOURCEINFO = 1259,
+  DELETED_SYSTEM_POWER_SOURCE_REQUESTSTATUSUPDATE = 1260,
   INPUTMETHODPRIVATE_GETSURROUNDINGTEXT = 1261,
   USERSPRIVATE_GETLOGINSTATUS = 1262,
   FILEMANAGERPRIVATEINTERNAL_INSTALLLINUXPACKAGE = 1263,
diff --git a/extensions/common/api/_api_features.json b/extensions/common/api/_api_features.json
index 3fb6dcf..11b93cb9 100644
--- a/extensions/common/api/_api_features.json
+++ b/extensions/common/api/_api_features.json
@@ -565,10 +565,6 @@
     "dependencies": ["permission:system.network"],
     "contexts": ["blessed_extension"]
   },
-  "system.powerSource": {
-    "dependencies": ["permission:system.powerSource"],
-    "contexts": ["blessed_extension"]
-  },
   "system.storage": {
     "dependencies": ["permission:system.storage"],
     "contexts": ["blessed_extension"]
diff --git a/extensions/common/api/_permission_features.json b/extensions/common/api/_permission_features.json
index 77163f2..e513c56 100644
--- a/extensions/common/api/_permission_features.json
+++ b/extensions/common/api/_permission_features.json
@@ -633,12 +633,6 @@
       "whitelist": ["B44D08FD98F1523ED5837D78D0A606EA9D6206E5"]  // Web Store
     }
   ],
-  "system.powerSource": {
-    "channel": "stable",
-    "extension_types": ["platform_app"],
-    "platforms": ["chromeos"],
-    "session_types": ["kiosk"]
-  },
   "u2fDevices": {
     "channel": "stable",
     "extension_types": ["extension", "platform_app"],
diff --git a/extensions/common/api/schema.gni b/extensions/common/api/schema.gni
index 6cbdf780..aaab96e8 100644
--- a/extensions/common/api/schema.gni
+++ b/extensions/common/api/schema.gni
@@ -51,7 +51,6 @@
   "system_display.idl",
   "system_memory.idl",
   "system_network.idl",
-  "system_power_source.idl",
   "system_storage.idl",
   "test.json",
   "usb.idl",
diff --git a/extensions/common/api/system_power_source.idl b/extensions/common/api/system_power_source.idl
deleted file mode 100644
index 012db29..0000000
--- a/extensions/common/api/system_power_source.idl
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// The <code>chrome.system.powerSource</code> API allows Chrome Kiosk Apps to
-// query the state of connected power sources.
-[platforms=("chromeos")]
-namespace system.powerSource {
-  enum PowerSourceType {
-    // Unspecified type.
-    unknown,
-
-    // Dedicated charger. Typically single-purpose and non-USB (e.g. barrel
-    // jack plugs).
-    mains,
-
-    // USB charger, including both low-power Type-A chargers and high-power
-    // Type-C chargers using USB Power Delivery.
-    usb
-  };
-
-  dictionary PowerSourceInfo {
-    // Type of power source.
-    PowerSourceType type;
-
-    // Maximum power this source is capable of delivering if known. Reported in
-    // watts, rounded to two significant digits.
-    double? maxPower;
-
-    // Whether this power source is connected to the device.
-    boolean active;
-  };
-
-  callback PowerSourceInfoCallback =
-      void(optional PowerSourceInfo[] powerSourceInfo);
-
-  interface Functions {
-    // Requests information on attached power sources.
-    // |callback|: The callback to invoke with the results or
-    // undefined if the power source information is not known.
-    static void getPowerSourceInfo(PowerSourceInfoCallback callback);
-
-    // Requests a power source status update. Resulting power source status
-    // updates are observable using $(ref:onPowerChanged).
-    static void requestStatusUpdate();
-  };
-
-  interface Events {
-    // Event for changes in the set of connected power sources.
-    static void onPowerChanged(PowerSourceInfo[] powerSourceInfo);
-  };
-};
-
diff --git a/extensions/common/permissions/api_permission.h b/extensions/common/permissions/api_permission.h
index 08c7358..04a2e94c 100644
--- a/extensions/common/permissions/api_permission.h
+++ b/extensions/common/permissions/api_permission.h
@@ -255,7 +255,7 @@
     kCecPrivate = 211,
     kSafeBrowsingPrivate = 212,
     kFileSystemRequestDownloads = 213,
-    kSystemPowerSource = 214,
+    kDeleted_SystemPowerSource = 214,
     kArcAppsPrivate = 215,
     kEnterpriseHardwarePlatform = 216,
     kLoginScreenUi = 217,
diff --git a/extensions/common/permissions/extensions_api_permissions.cc b/extensions/common/permissions/extensions_api_permissions.cc
index 89acd1b..c0969a0 100644
--- a/extensions/common/permissions/extensions_api_permissions.cc
+++ b/extensions/common/permissions/extensions_api_permissions.cc
@@ -130,8 +130,6 @@
      APIPermissionInfo::kFlagDoesNotRequireManagedSessionFullLoginWarning},
     {APIPermission::kSystemDisplay, "system.display",
      APIPermissionInfo::kFlagDoesNotRequireManagedSessionFullLoginWarning},
-    {APIPermission::kSystemPowerSource, "system.powerSource",
-     APIPermissionInfo::kFlagDoesNotRequireManagedSessionFullLoginWarning},
     {APIPermission::kSystemStorage, "system.storage"},
     {APIPermission::kU2fDevices, "u2fDevices"},
     {APIPermission::kUnlimitedStorage, "unlimitedStorage",
diff --git a/extensions/test/data/api_test/system_power_source/api/background.js b/extensions/test/data/api_test/system_power_source/api/background.js
deleted file mode 100644
index 21efc07..0000000
--- a/extensions/test/data/api_test/system_power_source/api/background.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-chrome.test.runTests([
-  function getPowerSourceInfo() {
-    chrome.system.powerSource.getPowerSourceInfo(
-        chrome.test.callbackPass(info => {
-          chrome.test.assertEq([{active: true, type: 'mains'}], info);
-        }));
-  },
-
-  function onPowerChanged() {
-    chrome.test.listenOnce(chrome.system.powerSource.onPowerChanged, info => {
-      chrome.test.assertEq([{active: true, type: 'mains'}], info);
-    });
-    chrome.system.powerSource.requestStatusUpdate();
-  },
-]);
diff --git a/extensions/test/data/api_test/system_power_source/api/manifest.json b/extensions/test/data/api_test/system_power_source/api/manifest.json
deleted file mode 100644
index b6c4177..0000000
--- a/extensions/test/data/api_test/system_power_source/api/manifest.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "name": "chrome.system.powerSource",
-  "manifest_version": 2,
-  "version": "0.1",
-  "description": "end-to-end browser tests for chrome.system.powerSource API",
-  "app": {
-    "background": {
-      "scripts": ["background.js"]
-    }
-  },
-  "permissions": [
-    "system.powerSource"
-  ],
-  "kiosk_enabled": true
-}
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1
index d94fba5..5478a29 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@
-36b5262321411db1fde3fef494c819dff7ee1bce
\ No newline at end of file
+434981e5bf7a57af9ec13c83c8c170e796f35b76
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1
index 94c3dd1..5eaaaf13 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@
-e6219d58d76eabdcfde3a4e4a64821cbbac00d0f
\ No newline at end of file
+c3817b8563e0ff5507885760231c6f6eb3c39e5d
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1
index 1dedc26c..da5e71f 100644
--- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@
-3c0d9708365385b6badbb13255d6cb8fab95aa3d
\ No newline at end of file
+81af11f1b02de2e814a74f69bfe56b8aaddeeb13
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1
index 0923327b..23d363b 100644
--- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@
-c3c4931568b06c2fe81a9f127a66aa68dadc9eef
\ No newline at end of file
+0198468567faf84f643b63abbd05374860f02801
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1
index 4ccad41..f7ec661b 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@
-701a0e408c9ca8f312881e5cc1f7600498e72e50
\ No newline at end of file
+e110171b278311715c8862307af140b5b3ad5e83
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1
index 878622e8..2fd1b97 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@
-2adf62f62e95e284449fb069e432a3cb9f93d3e1
\ No newline at end of file
+b8f2de566cf8dc6c35de2488fd0ec8cdf31de335
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1
index 851a3da..8b16b6c 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@
-603e8ad156d67e9c8bce74c1b4626009c002912a
\ No newline at end of file
+da5ccce882cf15cc6a25e43fab4240ccb9128caf
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1
index 3114cce..65a9b2d 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@
-bf49209ebc31fd09f8fdde046c93af91d0258acf
\ No newline at end of file
+30acbacaf189ed772b097c408f0ba4f3fd6d5f36
\ No newline at end of file
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json
index 695dd49..90bc1d2 100644
--- a/testing/buildbot/chromium.android.fyi.json
+++ b/testing/buildbot/chromium.android.fyi.json
@@ -240,11 +240,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.128"
+            "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.130"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.128",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.130",
         "resultdb": {
           "enable": true
         },
@@ -254,7 +254,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M87",
-              "revision": "version:87.0.4280.128"
+              "revision": "version:87.0.4280.130"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -317,11 +317,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.62"
+            "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.64"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.62",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.64",
         "resultdb": {
           "enable": true
         },
@@ -331,7 +331,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M88",
-              "revision": "version:88.0.4324.62"
+              "revision": "version:88.0.4324.64"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -394,11 +394,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.128"
+            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.130"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.128",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.130",
         "resultdb": {
           "enable": true
         },
@@ -408,7 +408,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M87",
-              "revision": "version:87.0.4280.128"
+              "revision": "version:87.0.4280.130"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -471,11 +471,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.62"
+            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.64"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.62",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.64",
         "resultdb": {
           "enable": true
         },
@@ -485,7 +485,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M88",
-              "revision": "version:88.0.4324.62"
+              "revision": "version:88.0.4324.64"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -769,11 +769,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.128"
+            "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.130"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.128",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.130",
         "resultdb": {
           "enable": true
         },
@@ -783,7 +783,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M87",
-              "revision": "version:87.0.4280.128"
+              "revision": "version:87.0.4280.130"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -846,11 +846,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.62"
+            "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.64"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.62",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.64",
         "resultdb": {
           "enable": true
         },
@@ -860,7 +860,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M88",
-              "revision": "version:88.0.4324.62"
+              "revision": "version:88.0.4324.64"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -923,11 +923,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.128"
+            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.130"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.128",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.130",
         "resultdb": {
           "enable": true
         },
@@ -937,7 +937,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M87",
-              "revision": "version:87.0.4280.128"
+              "revision": "version:87.0.4280.130"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -1000,11 +1000,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.62"
+            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.64"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.62",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.64",
         "resultdb": {
           "enable": true
         },
@@ -1014,7 +1014,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M88",
-              "revision": "version:88.0.4324.62"
+              "revision": "version:88.0.4324.64"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -1298,11 +1298,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.128"
+            "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.130"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.128",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.130",
         "resultdb": {
           "enable": true
         },
@@ -1312,7 +1312,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M87",
-              "revision": "version:87.0.4280.128"
+              "revision": "version:87.0.4280.130"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -1375,11 +1375,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.62"
+            "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.64"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.62",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.64",
         "resultdb": {
           "enable": true
         },
@@ -1389,7 +1389,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M88",
-              "revision": "version:88.0.4324.62"
+              "revision": "version:88.0.4324.64"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -1452,11 +1452,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.128"
+            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.130"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.128",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.130",
         "resultdb": {
           "enable": true
         },
@@ -1466,7 +1466,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M87",
-              "revision": "version:87.0.4280.128"
+              "revision": "version:87.0.4280.130"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -1529,11 +1529,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.62"
+            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.64"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.62",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.64",
         "resultdb": {
           "enable": true
         },
@@ -1543,7 +1543,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M88",
-              "revision": "version:88.0.4324.62"
+              "revision": "version:88.0.4324.64"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -1827,11 +1827,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.128"
+            "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.130"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.128",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.130",
         "resultdb": {
           "enable": true
         },
@@ -1841,7 +1841,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M87",
-              "revision": "version:87.0.4280.128"
+              "revision": "version:87.0.4280.130"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -1904,11 +1904,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.62"
+            "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.64"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.62",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.64",
         "resultdb": {
           "enable": true
         },
@@ -1918,7 +1918,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M88",
-              "revision": "version:88.0.4324.62"
+              "revision": "version:88.0.4324.64"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -1981,11 +1981,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.128"
+            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.130"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.128",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.130",
         "resultdb": {
           "enable": true
         },
@@ -1995,7 +1995,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M87",
-              "revision": "version:87.0.4280.128"
+              "revision": "version:87.0.4280.130"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -2058,11 +2058,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.62"
+            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.64"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.62",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.64",
         "resultdb": {
           "enable": true
         },
@@ -2072,7 +2072,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M88",
-              "revision": "version:88.0.4324.62"
+              "revision": "version:88.0.4324.64"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl
index b79d107..8105dd2 100644
--- a/testing/buildbot/variants.pyl
+++ b/testing/buildbot/variants.pyl
@@ -319,13 +319,13 @@
       '../../weblayer/browser/android/javatests/skew/expectations.txt',
       '--impl-version=88',
     ],
-    'identifier': 'Implementation Tests For 88.0.4324.62',
+    'identifier': 'Implementation Tests For 88.0.4324.64',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M88',
-          'revision': 'version:88.0.4324.62',
+          'revision': 'version:88.0.4324.64',
         }
       ],
     },
@@ -342,13 +342,13 @@
       '../../weblayer/browser/android/javatests/skew/expectations.txt',
       '--impl-version=87',
     ],
-    'identifier': 'Implementation Tests For 87.0.4280.128',
+    'identifier': 'Implementation Tests For 87.0.4280.130',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M87',
-          'revision': 'version:87.0.4280.128',
+          'revision': 'version:87.0.4280.130',
         }
       ],
     },
@@ -388,13 +388,13 @@
       '../../weblayer/browser/android/javatests/skew/expectations.txt',
       '--client-version=88',
     ],
-    'identifier': 'Client Tests For 88.0.4324.62',
+    'identifier': 'Client Tests For 88.0.4324.64',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M88',
-          'revision': 'version:88.0.4324.62',
+          'revision': 'version:88.0.4324.64',
         }
       ],
     },
@@ -411,13 +411,13 @@
       '../../weblayer/browser/android/javatests/skew/expectations.txt',
       '--client-version=87',
     ],
-    'identifier': 'Client Tests For 87.0.4280.128',
+    'identifier': 'Client Tests For 87.0.4280.130',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M87',
-          'revision': 'version:87.0.4280.128',
+          'revision': 'version:87.0.4280.130',
         }
       ],
     },
diff --git a/third_party/blink/renderer/bindings/core/v8/script_streamer.cc b/third_party/blink/renderer/bindings/core/v8/script_streamer.cc
index a62b433..b349614 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_streamer.cc
+++ b/third_party/blink/renderer/bindings/core/v8/script_streamer.cc
@@ -24,6 +24,7 @@
 #include "third_party/blink/renderer/platform/loader/fetch/cached_metadata.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource.h"
 #include "third_party/blink/renderer/platform/loader/fetch/response_body_loader.h"
+#include "third_party/blink/renderer/platform/network/mime/mime_type_registry.h"
 #include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
 #include "third_party/blink/renderer/platform/scheduler/public/thread_scheduler.h"
 #include "third_party/blink/renderer/platform/scheduler/public/worker_pool.h"
@@ -524,6 +525,16 @@
   if (!CanStartStreaming())
     return false;
 
+  // Skip non-JS modules based on the mime-type.
+  // TODO(crbug/1132413),TODO(crbug/1061857): Disable streaming for non-JS
+  // based the specific import statements.
+  if (script_resource_->GetScriptType() == mojom::blink::ScriptType::kModule &&
+      !MIMETypeRegistry::IsSupportedJavaScriptMIMEType(
+          script_resource_->GetResponse().HttpContentType())) {
+    SuppressStreaming(NotStreamingReason::kNonJavascriptModule);
+    return false;
+  }
+
   // Even if the first data chunk is small, the script can still be big enough -
   // wait until the next data chunk comes before deciding whether to start the
   // streaming.
diff --git a/third_party/blink/renderer/bindings/core/v8/script_streamer.h b/third_party/blink/renderer/bindings/core/v8/script_streamer.h
index 2275f212..714c66a 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_streamer.h
+++ b/third_party/blink/renderer/bindings/core/v8/script_streamer.h
@@ -60,6 +60,7 @@
     kModuleScript,
     kNoDataPipe,
     kLoadingCancelled,
+    kNonJavascriptModule,
     kDisabledByFeatureList,
 
     // Pseudo values that should never be seen in reported metrics
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc b/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc
index 1cb6706ab..1286921 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc
@@ -272,58 +272,58 @@
                           referrer_info.ToV8HostDefinedOptions(isolate));
 
   v8::Local<v8::String> code = V8String(isolate, params.GetSourceText());
-  if (ScriptStreamer* streamer = params.GetScriptStreamer()) {
+  inspector_compile_script_event::V8CacheResult cache_result;
+  v8::MaybeLocal<v8::Module> script;
+  ScriptStreamer* streamer = params.GetScriptStreamer();
+  if (streamer) {
     // Final compile call for a streamed compilation.
     // Streaming compilation may involve use of code cache.
     // TODO(leszeks): Add compile timer to streaming compilation.
     DCHECK(streamer->IsFinished());
     DCHECK(!streamer->IsStreamingSuppressed());
-    return v8::ScriptCompiler::CompileModule(isolate->GetCurrentContext(),
-                                             streamer->Source(), code, origin);
-  }
-
-  v8::MaybeLocal<v8::Module> script;
-  inspector_compile_script_event::V8CacheResult cache_result;
-
-  switch (compile_options) {
-    case v8::ScriptCompiler::kNoCompileOptions:
-    case v8::ScriptCompiler::kEagerCompile: {
-      v8::ScriptCompiler::Source source(code, origin);
-      script = v8::ScriptCompiler::CompileModule(
-          isolate, &source, compile_options, no_cache_reason);
-      break;
-    }
-
-    case v8::ScriptCompiler::kConsumeCodeCache: {
-      // Compile a script, and consume a V8 cache that was generated previously.
-      SingleCachedMetadataHandler* cache_handler = params.CacheHandler();
-      DCHECK(cache_handler);
-      v8::ScriptCompiler::CachedData* cached_data =
-          V8CodeCache::CreateCachedData(cache_handler);
-      v8::ScriptCompiler::Source source(code, origin, cached_data);
-      script = v8::ScriptCompiler::CompileModule(
-          isolate, &source, compile_options, no_cache_reason);
-      if (cached_data->rejected) {
-        cache_handler->ClearCachedMetadata(
-            CachedMetadataHandler::kClearPersistentStorage);
-      } else if (InDiscardExperiment()) {
-        // Experimentally free code cache from memory after first use. See
-        // http://crbug.com/1045052.
-        cache_handler->ClearCachedMetadata(
-            CachedMetadataHandler::kDiscardLocally);
+    script = v8::ScriptCompiler::CompileModule(
+        isolate->GetCurrentContext(), streamer->Source(), code, origin);
+  } else {
+    switch (compile_options) {
+      case v8::ScriptCompiler::kNoCompileOptions:
+      case v8::ScriptCompiler::kEagerCompile: {
+        v8::ScriptCompiler::Source source(code, origin);
+        script = v8::ScriptCompiler::CompileModule(
+            isolate, &source, compile_options, no_cache_reason);
+        break;
       }
-      cache_result.consume_result = base::make_optional(
-          inspector_compile_script_event::V8CacheResult::ConsumeResult(
-              compile_options, cached_data->length, cached_data->rejected));
-      break;
+
+      case v8::ScriptCompiler::kConsumeCodeCache: {
+        // Compile a script, and consume a V8 cache that was generated
+        // previously.
+        SingleCachedMetadataHandler* cache_handler = params.CacheHandler();
+        DCHECK(cache_handler);
+        v8::ScriptCompiler::CachedData* cached_data =
+            V8CodeCache::CreateCachedData(cache_handler);
+        v8::ScriptCompiler::Source source(code, origin, cached_data);
+        script = v8::ScriptCompiler::CompileModule(
+            isolate, &source, compile_options, no_cache_reason);
+        if (cached_data->rejected) {
+          cache_handler->ClearCachedMetadata(
+              CachedMetadataHandler::kClearPersistentStorage);
+        } else if (InDiscardExperiment()) {
+          // Experimentally free code cache from memory after first use. See
+          // http://crbug.com/1045052.
+          cache_handler->ClearCachedMetadata(
+              CachedMetadataHandler::kDiscardLocally);
+        }
+        cache_result.consume_result = base::make_optional(
+            inspector_compile_script_event::V8CacheResult::ConsumeResult(
+                compile_options, cached_data->length, cached_data->rejected));
+        break;
+      }
     }
   }
 
   TRACE_EVENT_END1(kTraceEventCategoryGroup, "v8.compileModule", "data",
                    inspector_compile_script_event::Data(
-                       file_name, start_position, cache_result, false,
-                       ScriptStreamer::NotStreamingReason::kModuleScript));
-
+                       file_name, start_position, cache_result, streamer,
+                       params.NotStreamingReason()));
   return script;
 }
 
diff --git a/third_party/blink/renderer/core/inspector/inspector_trace_events.cc b/third_party/blink/renderer/core/inspector/inspector_trace_events.cc
index d518e6c..6116c07 100644
--- a/third_party/blink/renderer/core/inspector/inspector_trace_events.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_trace_events.cc
@@ -433,6 +433,8 @@
       return "no data pipe received";
     case ScriptStreamer::NotStreamingReason::kDisabledByFeatureList:
       return "streaming disabled from the feature list";
+    case ScriptStreamer::NotStreamingReason::kNonJavascriptModule:
+      return "not a javascript module";
     case ScriptStreamer::NotStreamingReason::kLoadingCancelled:
       return "loading was cancelled";
     case ScriptStreamer::NotStreamingReason::kDidntTryToStartStreaming:
diff --git a/third_party/blink/renderer/core/loader/modulescript/document_module_script_fetcher.cc b/third_party/blink/renderer/core/loader/modulescript/document_module_script_fetcher.cc
index 90743c54..d8f71f8 100644
--- a/third_party/blink/renderer/core/loader/modulescript/document_module_script_fetcher.cc
+++ b/third_party/blink/renderer/core/loader/modulescript/document_module_script_fetcher.cc
@@ -28,9 +28,13 @@
   DCHECK(fetch_client_settings_object_fetcher);
   DCHECK(!client_);
   client_ = client;
-  // TODO(crbug.com/1061857): Enable streaming.
+  // Streaming can currently only be triggered from the main thread. This
+  // currently happens only for dynamic imports in worker modules.
+  ScriptResource::StreamingAllowed streaming_allowed =
+                        IsMainThread() ? ScriptResource::kAllowStreaming
+                                       : ScriptResource::kNoStreaming;
   ScriptResource::Fetch(fetch_params, fetch_client_settings_object_fetcher,
-                        this, ScriptResource::kNoStreaming);
+                        this, streaming_allowed);
 }
 
 void DocumentModuleScriptFetcher::NotifyFinished(Resource* resource) {
diff --git a/third_party/blink/renderer/core/loader/modulescript/module_script_creation_params.h b/third_party/blink/renderer/core/loader/modulescript/module_script_creation_params.h
index 35d4008..626eb17 100644
--- a/third_party/blink/renderer/core/loader/modulescript/module_script_creation_params.h
+++ b/third_party/blink/renderer/core/loader/modulescript/module_script_creation_params.h
@@ -110,6 +110,9 @@
   }
 
   ScriptStreamer* GetScriptStreamer() const { return script_streamer_; }
+  ScriptStreamer::NotStreamingReason NotStreamingReason() const {
+    return not_streaming_reason_;
+  }
 
  private:
   // Creates an isolated copy.
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 90319094..802479a 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -5918,12 +5918,12 @@
 # Wpt importer sheriff 2020-12-23
 crbug.com/626703 external/wpt/cookies/samesite/multiple-samesite-attributes.https.html?legacy-samesite [ Failure ]
 crbug.com/626703 virtual/legacy-samesite/external/wpt/cookies/samesite/multiple-samesite-attributes.https.html [ Failure ]
-crbug.com/626703 external/wpt/html/semantics/forms/textfieldselection/select-event.html [ Failure ]
+crbug.com/626703 external/wpt/html/semantics/forms/textfieldselection/select-event.html [ Failure Timeout ]
 
 # Sheriff 2020-12-14
 crbug.com/1046784 http/tests/devtools/console/console-context-selector.js [ Pass Timeout ]
 
-#Sheriff 2020-12-22
+# Sheriff 2020-12-22
 crbug.com/1161244 [ Mac10.15 ] external/wpt/html/cross-origin-opener-policy/popup-coop-by-sw-from-coop.https.html [ Pass Timeout ]
 crbug.com/1161301 [ Mac10.15 ] external/wpt/webxr/xrSession_requestReferenceSpace_features.https.html [ Pass Timeout ]
 crbug.com/1161352 [ Mac10.14 ] virtual/controls-refresh-hc/fast/forms/color-scheme/search/search-appearance-basic.html [ Pass Timeout ]
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/import-css-module-basic.html b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/import-css-module-basic.html
index 1cb290d..4ca2bb70 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/import-css-module-basic.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/import-css-module-basic.html
@@ -19,6 +19,20 @@
         }, "A CSS Module should load");
 
         async_test(function (test) {
+            // This tests potential streaming compilation of modules in
+            // Chromium that is triggered only for large (32>KiB) files in older
+            // versions.
+            const iframe = document.createElement("iframe");
+            iframe.src = "resources/css-module-basic-large-iframe.html";
+            iframe.onload = test.step_func_done(function () {
+                assert_equals(getComputedStyle(iframe.contentDocument.querySelector('#test'))
+                    .backgroundColor, "rgb(255, 0, 0)",
+                    "CSS module import should succeed");
+            });
+            document.body.appendChild(iframe);
+        }, "A large CSS Module should load");
+
+        async_test(function (test) {
             const iframe = document.createElement("iframe");
             iframe.src = "resources/css-module-at-import-iframe.html";
             iframe.onload = test.step_func_done(function () {
@@ -41,4 +55,4 @@
             document.body.appendChild(iframe);
         }, "Malformed CSS should not load");
     </script>
-</body>
\ No newline at end of file
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/basic-large.css b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/basic-large.css
new file mode 100644
index 0000000..f5b0db5d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/basic-large.css
@@ -0,0 +1,7 @@
+#test {
+    background-color:red;
+}
+
+#test:before {
+  content: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
+}
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/css-module-basic-large-iframe.html b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/css-module-basic-large-iframe.html
new file mode 100644
index 0000000..cc5b660
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/css-module-basic-large-iframe.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<body>
+    <script>
+        window.onerror = function (errorMsg, url, lineNumber, column, errorObj)
+        {
+            document.load_error = errorObj.name;
+            return true;
+        };
+    </script>
+    <script type="module">
+        import v from "./basic-large.css";
+        document.adoptedStyleSheets = [v];
+    </script>
+
+    <div id="test">
+        I am a test div.
+    </div>
+</body>
diff --git a/third_party/blink/web_tests/http/tests/devtools/isolated-code-cache/same-origin-module-test-expected.txt b/third_party/blink/web_tests/http/tests/devtools/isolated-code-cache/same-origin-module-test-expected.txt
index 062587a..c007fa0 100644
--- a/third_party/blink/web_tests/http/tests/devtools/isolated-code-cache/same-origin-module-test-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/isolated-code-cache/same-origin-module-test-expected.txt
@@ -6,7 +6,7 @@
     data : {
         columnNumber : 1
         lineNumber : 1
-        notStreamedReason : "module script"
+        notStreamedReason : "script too small"
         streamed : <boolean>
         url : .../devtools/resources/v8-cache-script.cgi
     }
@@ -20,7 +20,7 @@
     data : {
         columnNumber : 1
         lineNumber : 1
-        notStreamedReason : "module script"
+        notStreamedReason : "already used streamed data"
         streamed : <boolean>
         url : .../devtools/resources/v8-cache-script.cgi
     }
@@ -52,7 +52,7 @@
         columnNumber : 1
         consumedCacheSize : <number>
         lineNumber : 1
-        notStreamedReason : "module script"
+        notStreamedReason : "already used streamed data"
         streamed : <boolean>
         url : .../devtools/resources/v8-cache-script.cgi
     }
@@ -66,7 +66,7 @@
     data : {
         columnNumber : 1
         lineNumber : 1
-        notStreamedReason : "module script"
+        notStreamedReason : "script too small"
         streamed : <boolean>
         url : .../devtools/resources/v8-cache-script.cgi
     }
@@ -83,7 +83,7 @@
         columnNumber : 1
         consumedCacheSize : <number>
         lineNumber : 1
-        notStreamedReason : "module script"
+        notStreamedReason : "already used streamed data"
         streamed : <boolean>
         url : .../devtools/resources/v8-cache-script.cgi
     }
@@ -100,7 +100,7 @@
         columnNumber : 1
         consumedCacheSize : <number>
         lineNumber : 1
-        notStreamedReason : "module script"
+        notStreamedReason : "script too small"
         streamed : <boolean>
         url : .../devtools/resources/v8-cache-script.cgi
     }
diff --git a/third_party/blink/web_tests/http/tests/devtools/tracing/timeline-script-module-expected.txt b/third_party/blink/web_tests/http/tests/devtools/tracing/timeline-script-module-expected.txt
index 7822c9f..559bd45 100644
--- a/third_party/blink/web_tests/http/tests/devtools/tracing/timeline-script-module-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/tracing/timeline-script-module-expected.txt
@@ -5,7 +5,7 @@
     data : {
         columnNumber : 1
         lineNumber : 1
-        notStreamedReason : "module script"
+        notStreamedReason : "already disabled streaming"
         streamed : <boolean>
         url : .../devtools/resources/inspected-page.html
     }
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 00e45c7..8486c65 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -24118,7 +24118,7 @@
   <int value="421"
       label="ACCESSIBILITY_PRIVATE_ON_SELECT_TO_SPEAK_STATE_CHANGE_REQUESTED"/>
   <int value="422" label="INPUT_METHOD_PRIVATE_ON_FOCUS"/>
-  <int value="423" label="SYSTEM_POWER_SOURCE_ONPOWERCHANGED"/>
+  <int value="423" label="DELETED_SYSTEM_POWER_SOURCE_ONPOWERCHANGED"/>
   <int value="424" label="WEB_REQUEST_ON_ACTION_IGNORED"/>
   <int value="425" label="ARC_APPS_PRIVATE_ON_INSTALLED"/>
   <int value="426" label="FILE_MANAGER_PRIVATE_ON_CROSTINI_CHANGED"/>
@@ -25493,8 +25493,8 @@
   <int value="1256" label="USERSPRIVATE_GETCURRENTUSER"/>
   <int value="1257" label="WALLPAPERPRIVATE_GETSURPRISEMEIMAGE"/>
   <int value="1258" label="VIRTUALKEYBOARDPRIVATE_SETOCCLUDEDBOUNDS"/>
-  <int value="1259" label="SYSTEM_POWER_SOURCE_GETPOWERSOURCEINFO"/>
-  <int value="1260" label="SYSTEM_POWER_SOURCE_REQUESTSTATUSUPDATE"/>
+  <int value="1259" label="DELETED_SYSTEM_POWER_SOURCE_GETPOWERSOURCEINFO"/>
+  <int value="1260" label="DELETED_SYSTEM_POWER_SOURCE_REQUESTSTATUSUPDATE"/>
   <int value="1261" label="INPUTMETHODPRIVATE_GETSURROUNDINGTEXT"/>
   <int value="1262" label="USERSPRIVATE_GETLOGINSTATUS"/>
   <int value="1263" label="FILEMANAGERPRIVATEINTERNAL_INSTALLLINUXPACKAGE"/>
@@ -26372,7 +26372,7 @@
   <int value="211" label="kCecPrivate"/>
   <int value="212" label="kSafeBrowsingPrivate"/>
   <int value="213" label="kFileSystemRequestDownloads"/>
-  <int value="214" label="kSystemPowerSource"/>
+  <int value="214" label="kDeleted_SystemPowerSource"/>
   <int value="215" label="kArcAppsPrivate"/>
   <int value="216" label="kEnterpriseHardwarePlatform"/>
   <int value="217" label="kLoginScreenUi"/>
diff --git a/ui/accessibility/extensions/chromevoxclassic/chromevox/injected/api.js b/ui/accessibility/extensions/chromevoxclassic/chromevox/injected/api.js
index 3094760..9c05e4c 100644
--- a/ui/accessibility/extensions/chromevoxclassic/chromevox/injected/api.js
+++ b/ui/accessibility/extensions/chromevoxclassic/chromevox/injected/api.js
@@ -80,7 +80,9 @@
      }
 
      channel = new MessageChannel();
-     window.postMessage(PORT_SETUP_MSG, [channel.port2], '*');
+     window.postMessage(
+         PORT_SETUP_MSG, '*' /* target origin */,
+         [channel.port2] /* transfer */);
      channel.port1.onmessage = function(event) {
        if (event.data == DISCONNECT_MSG) {
          channel = null;
diff --git a/ui/accessibility/extensions/chromevoxclassic/chromevox/injected/mathjax.js b/ui/accessibility/extensions/chromevoxclassic/chromevox/injected/mathjax.js
index 1b92672..50c99fa 100644
--- a/ui/accessibility/extensions/chromevoxclassic/chromevox/injected/mathjax.js
+++ b/ui/accessibility/extensions/chromevoxclassic/chromevox/injected/mathjax.js
@@ -38,7 +38,9 @@
     channel_.port1.onmessage = function(evt) {
       cvox.MathJax.execMessage(evt.data);
     };
-    window.postMessage('cvox.MathJaxPortSetup', '*', [channel_.port2]);
+    window.postMessage(
+        'cvox.MathJaxPortSetup', '*' /* target origin */,
+        [channel_.port2] /* transfer */);
   };
 
 
diff --git a/ui/accessibility/extensions/chromevoxclassic/chromevox/injected/pdf_processor.js b/ui/accessibility/extensions/chromevoxclassic/chromevox/injected/pdf_processor.js
index 5b23294..b443fa13 100644
--- a/ui/accessibility/extensions/chromevoxclassic/chromevox/injected/pdf_processor.js
+++ b/ui/accessibility/extensions/chromevoxclassic/chromevox/injected/pdf_processor.js
@@ -73,7 +73,7 @@
 cvox.PdfProcessor.process = function() {
   cvox.PdfProcessor.pageCount = null;
   cvox.PdfProcessor.pageIndex = null;
-  window.postMessage({'type': 'getAccessibilityJSON'}, '*');
+  window.postMessage({'type': 'getAccessibilityJSON'}, '*' /* target origin */);
 };
 
 /**
diff --git a/ui/accessibility/extensions/chromevoxclassic/common/interframe.js b/ui/accessibility/extensions/chromevoxclassic/common/interframe.js
index 8d7b7fc..d13165e 100644
--- a/ui/accessibility/extensions/chromevoxclassic/common/interframe.js
+++ b/ui/accessibility/extensions/chromevoxclassic/common/interframe.js
@@ -132,7 +132,7 @@
 cvox.Interframe.sendMessageToWindow = function(message, window) {
   var encodedMessage = cvox.Interframe.IF_MSG_PREFIX +
       cvox.ChromeVoxJSON.stringify(message, null, null);
-  window.postMessage(encodedMessage, '*');
+  window.postMessage(encodedMessage, '*' /* target origin */);
 };
 
 /**